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 }