Chever John 9c39c8cbd7
init: iloom WMS monorepo with K8s deployment manifests
Go workspace (go.work) with 5 microservices + shared library:
- gateway (8080), auth-service (8081), purchaser-service (8082)
- textile-service (8083), washing-service (8084)
- shared: proto definitions, common packages

Infrastructure: docker-compose for local dev, K8s manifests for
K3s cluster deployment (mysql/redis/etcd + traefik ingress).

Frontend (iloom-flatten) added as git submodule.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-06-14 11:33:31 +08:00

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
}