Files
qvyun/backend/app/http/tenants/service.go
2025-01-21 11:22:22 +08:00

104 lines
2.3 KiB
Go

package tenants
import (
"context"
"database/sql"
"backend/database/schemas/public/model"
"backend/database/schemas/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)
}