86 lines
2.5 KiB
Go
86 lines
2.5 KiB
Go
|
|
package repository
|
||
|
|
|
||
|
|
import (
|
||
|
|
"context"
|
||
|
|
"database/sql"
|
||
|
|
"fmt"
|
||
|
|
|
||
|
|
"github.com/muyuqingfeng/iloom/auth-service/internal/model"
|
||
|
|
)
|
||
|
|
|
||
|
|
type MemberRepo struct {
|
||
|
|
db *sql.DB
|
||
|
|
}
|
||
|
|
|
||
|
|
func NewMemberRepo(db *sql.DB) *MemberRepo {
|
||
|
|
return &MemberRepo{db: db}
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *MemberRepo) Create(ctx context.Context, m *model.CompanyMember) error {
|
||
|
|
query := `INSERT INTO ilm_company_member (id, company_id, user_id, role, is_master, created_at)
|
||
|
|
VALUES (?, ?, ?, ?, ?, ?)`
|
||
|
|
_, err := r.db.ExecContext(ctx, query,
|
||
|
|
m.ID, m.CompanyID, m.UserID, m.Role, m.IsMaster, m.CreatedAt,
|
||
|
|
)
|
||
|
|
if err != nil {
|
||
|
|
return fmt.Errorf("insert member: %w", err)
|
||
|
|
}
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *MemberRepo) Delete(ctx context.Context, id, companyID string) error {
|
||
|
|
_, err := r.db.ExecContext(ctx,
|
||
|
|
`DELETE FROM ilm_company_member WHERE id = ? AND company_id = ?`,
|
||
|
|
id, companyID,
|
||
|
|
)
|
||
|
|
if err != nil {
|
||
|
|
return fmt.Errorf("delete member: %w", err)
|
||
|
|
}
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *MemberRepo) GetByUserAndCompany(ctx context.Context, userID, companyID string) (*model.CompanyMember, error) {
|
||
|
|
query := `SELECT id, company_id, user_id, role, is_master, created_at
|
||
|
|
FROM ilm_company_member WHERE user_id = ? AND company_id = ?`
|
||
|
|
m := &model.CompanyMember{}
|
||
|
|
err := r.db.QueryRowContext(ctx, query, userID, companyID).Scan(
|
||
|
|
&m.ID, &m.CompanyID, &m.UserID, &m.Role, &m.IsMaster, &m.CreatedAt,
|
||
|
|
)
|
||
|
|
if err != nil {
|
||
|
|
if err == sql.ErrNoRows {
|
||
|
|
return nil, nil
|
||
|
|
}
|
||
|
|
return nil, fmt.Errorf("get member: %w", err)
|
||
|
|
}
|
||
|
|
return m, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *MemberRepo) ListByCompany(ctx context.Context, companyID string) ([]model.Profile, error) {
|
||
|
|
query := `SELECT su.user_id, su.username, su.real_name, su.phone, su.email, su.avatar, su.status, su.created_at,
|
||
|
|
cm.company_id, COALESCE(c.name, ''), COALESCE(c.type, ''), cm.is_master
|
||
|
|
FROM ilm_company_member cm
|
||
|
|
JOIN sys_user su ON su.user_id = cm.user_id AND su.deleted_at IS NULL
|
||
|
|
LEFT JOIN ilm_company c ON c.id = cm.company_id
|
||
|
|
WHERE cm.company_id = ?
|
||
|
|
ORDER BY cm.created_at`
|
||
|
|
rows, err := r.db.QueryContext(ctx, query, companyID)
|
||
|
|
if err != nil {
|
||
|
|
return nil, fmt.Errorf("list members by company: %w", err)
|
||
|
|
}
|
||
|
|
defer rows.Close()
|
||
|
|
|
||
|
|
var profiles []model.Profile
|
||
|
|
for rows.Next() {
|
||
|
|
var p model.Profile
|
||
|
|
if err := rows.Scan(
|
||
|
|
&p.ID, &p.Username, &p.RealName, &p.Phone, &p.Email,
|
||
|
|
&p.Avatar, &p.Status, &p.CreatedAt,
|
||
|
|
&p.CompanyID, &p.CompanyName, &p.Role, &p.IsMaster,
|
||
|
|
); err != nil {
|
||
|
|
return nil, fmt.Errorf("scan member profile: %w", err)
|
||
|
|
}
|
||
|
|
profiles = append(profiles, p)
|
||
|
|
}
|
||
|
|
return profiles, nil
|
||
|
|
}
|