package tenants import ( "context" "database/sql" "backend/database/models/qvyun_v2/public/model" "backend/database/models/qvyun_v2/public/table" "backend/providers/otel" . "github.com/go-jet/jet/v2/postgres" log "github.com/sirupsen/logrus" semconv "go.opentelemetry.io/otel/semconv/v1.15.0" ) // @provider:except type Service struct { db *sql.DB log *log.Entry `inject:"false"` } func (svc *Service) Prepare() error { svc.log = log.WithField("module", "tenants.service") _ = Int(1) return nil } // GetTenantBySlug func (svc *Service) GetTenantBySlug(ctx context.Context, slug string) (*model.Tenants, error) { ctx, span := otel.Start(ctx, "tenants.service.GetTenantBySlug") defer span.End() tbl := table.Tenants stmt := tbl. SELECT(tbl.AllColumns). WHERE(tbl.Slug.EQ(String(slug))) var tenant model.Tenants if err := stmt.QueryContext(ctx, svc.db, &tenant); err != nil { return nil, err } return &tenant, nil } // TenantHasUser func (svc *Service) TenantHasUser(ctx context.Context, tenantID, userID int64) (bool, error) { ctx, span := otel.Start(ctx, "tenants.service.TenantHasUser") defer span.End() tbl := table.TenantUsers stmt := tbl. SELECT(COUNT(tbl.ID).AS("cnt")). WHERE(tbl.TenantID.EQ(Int(tenantID))). WHERE(tbl.UserID.EQ(Int(userID))) span.SetAttributes(semconv.DBStatementKey.String(stmt.DebugSql())) var count struct { Cnt int64 } if err := stmt.QueryContext(ctx, svc.db, &count); err != nil { return false, err } return count.Cnt > 0, nil } // BindUserToTenant func (svc *Service) BindUserToTenant(ctx context.Context, tenantID, userID int64) error { ctx, span := otel.Start(ctx, "tenants.service.BindUserToTenant") defer span.End() tbl := table.TenantUsers stmt := tbl. INSERT(tbl.TenantID, tbl.UserID). VALUES(Int(tenantID), Int(userID)). ON_CONFLICT(). DO_NOTHING() span.SetAttributes(semconv.DBStatementKey.String(stmt.DebugSql())) if _, err := stmt.ExecContext(ctx, svc.db); err != nil { return err } return nil } // BindUserToTenantIfNotExists func (svc *Service) BindUserToTenantIfNotExists(ctx context.Context, tenantID, userID int64) error { ctx, span := otel.Start(ctx, "tenants.service.BindUserToTenantIfNotExists") defer span.End() has, err := svc.TenantHasUser(ctx, tenantID, userID) if err != nil { return err } if has { return nil } return svc.BindUserToTenant(ctx, tenantID, userID) }