From 8a1477e991725b34fde72f8191192ee285119ce2 Mon Sep 17 00:00:00 2001 From: Rogee Date: Thu, 12 Dec 2024 19:26:48 +0800 Subject: [PATCH] feat: support bind user to tenants --- .../20241212111730_alter_tenants.sql | 10 +++++ .../models/qvyun/public/model/tenants.go | 1 + .../models/qvyun/public/table/tenants.go | 7 +++- backend/modules/commands/tenant/bind.go | 39 +++++++++++++++++++ .../modules/commands/tenant/provider.gen.go | 14 +++++++ backend/modules/users/service.go | 17 ++++++++ backend/pkg/service/tenants/tenants.go | 27 +++++++++++++ 7 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 backend/database/migrations/20241212111730_alter_tenants.sql create mode 100644 backend/modules/commands/tenant/bind.go diff --git a/backend/database/migrations/20241212111730_alter_tenants.sql b/backend/database/migrations/20241212111730_alter_tenants.sql new file mode 100644 index 0000000..2512d58 --- /dev/null +++ b/backend/database/migrations/20241212111730_alter_tenants.sql @@ -0,0 +1,10 @@ +-- +goose Up +-- +goose StatementBegin +-- add column bind_user_id to tenants +ALTER TABLE tenants ADD COLUMN bind_user_id INT8 NOT NULL DEFAULT 0; +-- +goose StatementEnd + +-- +goose Down +-- +goose StatementBegin +DROP COLUMN bind_user_id FROM tenants; +-- +goose StatementEnd diff --git a/backend/database/models/qvyun/public/model/tenants.go b/backend/database/models/qvyun/public/model/tenants.go index 3835951..b6bbccd 100644 --- a/backend/database/models/qvyun/public/model/tenants.go +++ b/backend/database/models/qvyun/public/model/tenants.go @@ -19,4 +19,5 @@ type Tenants struct { ExpireAt time.Time `json:"expire_at"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` + BindUserID int64 `json:"bind_user_id"` } diff --git a/backend/database/models/qvyun/public/table/tenants.go b/backend/database/models/qvyun/public/table/tenants.go index 2366337..d185886 100644 --- a/backend/database/models/qvyun/public/table/tenants.go +++ b/backend/database/models/qvyun/public/table/tenants.go @@ -24,6 +24,7 @@ type tenantsTable struct { ExpireAt postgres.ColumnTimestamp CreatedAt postgres.ColumnTimestamp UpdatedAt postgres.ColumnTimestamp + BindUserID postgres.ColumnInteger AllColumns postgres.ColumnList MutableColumns postgres.ColumnList @@ -71,8 +72,9 @@ func newTenantsTableImpl(schemaName, tableName, alias string) tenantsTable { ExpireAtColumn = postgres.TimestampColumn("expire_at") CreatedAtColumn = postgres.TimestampColumn("created_at") UpdatedAtColumn = postgres.TimestampColumn("updated_at") - allColumns = postgres.ColumnList{IDColumn, NameColumn, SlugColumn, DescriptionColumn, ExpireAtColumn, CreatedAtColumn, UpdatedAtColumn} - mutableColumns = postgres.ColumnList{NameColumn, SlugColumn, DescriptionColumn, ExpireAtColumn, CreatedAtColumn, UpdatedAtColumn} + BindUserIDColumn = postgres.IntegerColumn("bind_user_id") + allColumns = postgres.ColumnList{IDColumn, NameColumn, SlugColumn, DescriptionColumn, ExpireAtColumn, CreatedAtColumn, UpdatedAtColumn, BindUserIDColumn} + mutableColumns = postgres.ColumnList{NameColumn, SlugColumn, DescriptionColumn, ExpireAtColumn, CreatedAtColumn, UpdatedAtColumn, BindUserIDColumn} ) return tenantsTable{ @@ -86,6 +88,7 @@ func newTenantsTableImpl(schemaName, tableName, alias string) tenantsTable { ExpireAt: ExpireAtColumn, CreatedAt: CreatedAtColumn, UpdatedAt: UpdatedAtColumn, + BindUserID: BindUserIDColumn, AllColumns: allColumns, MutableColumns: mutableColumns, diff --git a/backend/modules/commands/tenant/bind.go b/backend/modules/commands/tenant/bind.go new file mode 100644 index 0000000..69ac252 --- /dev/null +++ b/backend/modules/commands/tenant/bind.go @@ -0,0 +1,39 @@ +package tenant + +import ( + "context" + + "backend/modules/users" + + "github.com/pkg/errors" + log "github.com/sirupsen/logrus" +) + +// @provider +type Bind struct { + userSvc *users.Service + log *log.Entry `inject:"false"` +} + +// Prepare +func (d *Bind) Prepare() error { + d.log = log.WithField("module", "tenants.bind") + return nil +} + +func (d *Bind) RunE(slug string, userID int64) error { + d.log.Infof("bind tenant %s with user %d", slug, userID) + + tenant, err := d.userSvc.GetTenantBySlug(context.Background(), slug) + if err != nil { + return errors.Wrapf(err, "get tenant: %s", slug) + } + + err = d.userSvc.SetTenantBindUserID(context.Background(), tenant.ID, userID) + if err != nil { + return errors.Wrapf(err, "bind tenant: %s with user %d", tenant.ID, userID) + } + + d.log.Infof("bind tenant success: %s(%d) with user %d", slug, tenant.ID, userID) + return nil +} diff --git a/backend/modules/commands/tenant/provider.gen.go b/backend/modules/commands/tenant/provider.gen.go index 309ebd7..058bf96 100755 --- a/backend/modules/commands/tenant/provider.gen.go +++ b/backend/modules/commands/tenant/provider.gen.go @@ -8,6 +8,20 @@ import ( ) func Provide(opts ...opt.Option) error { + if err := container.Container.Provide(func( + userSvc *users.Service, + ) (*Bind, error) { + obj := &Bind{ + userSvc: userSvc, + } + if err := obj.Prepare(); err != nil { + return nil, err + } + return obj, nil + }); err != nil { + return err + } + if err := container.Container.Provide(func( userSvc *users.Service, ) (*Create, error) { diff --git a/backend/modules/users/service.go b/backend/modules/users/service.go index 6abf677..841079e 100644 --- a/backend/modules/users/service.go +++ b/backend/modules/users/service.go @@ -396,3 +396,20 @@ func (svc *Service) GetTenantUserBalance(ctx context.Context, tenantID, userID i } return result.Balance, nil } + +// SetTenantBindUserID +func (svc *Service) SetTenantBindUserID(ctx context.Context, tenantID, adminUserID int64) error { + log := svc.log.WithField("method", "SetTenantBindUserID") + + tbl := table.Tenants + stmt := tbl. + UPDATE(tbl.BindUserID). + SET(Int64(adminUserID)). + WHERE(tbl.ID.EQ(Int64(tenantID))) + log.Debug(stmt.DebugSql()) + + if _, err := stmt.ExecContext(ctx, db.FromContext(ctx, svc.db)); err != nil { + return errors.Wrap(err, "failed to set tenant admin user id") + } + return nil +} diff --git a/backend/pkg/service/tenants/tenants.go b/backend/pkg/service/tenants/tenants.go index fe25b52..3bdad97 100644 --- a/backend/pkg/service/tenants/tenants.go +++ b/backend/pkg/service/tenants/tenants.go @@ -14,6 +14,7 @@ import ( "git.ipao.vip/rogeecn/atom" "git.ipao.vip/rogeecn/atom/container" "github.com/pkg/errors" + "github.com/spf13/cast" "github.com/spf13/cobra" ) @@ -72,5 +73,31 @@ func Command() atom.Option { }) }), ), + + atom.Command( + atom.Name("bind"), + atom.Short("设置租户的管理员ID"), + atom.Example("bind slug user_id"), + atom.Providers(defaultProviders().With( + medias.Provide, + users.Provide, + tenant.Provide, + )), + atom.Arguments(func(cmd *cobra.Command) { + }), + atom.RunE(func(cmd *cobra.Command, args []string) error { + return container.Container.Invoke(func(t *tenant.Bind) error { + slug := args[0] + userID, err := cast.ToInt64E(args[1]) // format 2024-01-01 + if err != nil { + return errors.Wrapf(err, "parse user_id failed: %s", args[1]) + } + + // parse expire string as time.Time + + return t.RunE(slug, userID) + }) + }), + ), ) }