| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- package user
-
- import (
- "context"
- "fmt"
-
- "git.x2erp.com/qdy/go-base/ctx"
- "git.x2erp.com/qdy/go-base/logger"
- "git.x2erp.com/qdy/go-base/model/request/configreq"
- "git.x2erp.com/qdy/go-base/model/response"
- "git.x2erp.com/qdy/go-base/util"
- "git.x2erp.com/qdy/go-db/factory/database"
- "git.x2erp.com/qdy/go-svc-configure/internal/service/dao"
- )
-
- // CreateInvitationCode 创建邀请码(仅限租户管理员)
- func CreateInvitationCode(req *configreq.CreateInvitationCodeRequest, ctx context.Context, dbFactory *database.DBFactory, reqCtx *ctx.RequestContext) *response.QueryResult[string] {
- logger.Debug("CreateInvitationCode-开始创建邀请码")
-
- // 参数验证
- if req.RoleID == "" {
- logger.ErrorC(reqCtx, "角色ID不能为空")
- return util.CreateErrorResult[string]("角色ID不能为空", reqCtx)
- }
-
- // 获取当前用户信息
- currentUserID := reqCtx.UserID
- currentTenantID := reqCtx.TenantID
-
- if currentUserID == "" || currentTenantID == "" {
- logger.ErrorC(reqCtx, "用户身份信息不完整")
- return util.CreateErrorResult[string]("用户身份信息不完整", reqCtx)
- }
-
- db := dbFactory.GetDB()
-
- // 验证当前用户是否存在
- userExists, err := dao.CheckUserExists(ctx, db, currentUserID, currentTenantID)
- if err != nil {
- logger.ErrorC(reqCtx, fmt.Sprintf("检查用户存在性失败: %v", err))
- return util.CreateErrorResult[string](fmt.Sprintf("检查用户存在性失败: %v", err), reqCtx)
- }
-
- if !userExists {
- logger.ErrorC(reqCtx, "当前用户不存在")
- return util.CreateErrorResult[string]("当前用户不存在", reqCtx)
- }
-
- // 检查用户是否具有admin角色(或其他权限)
- userRoles, err := dao.GetUserRoles(ctx, db, currentUserID, currentTenantID)
- if err != nil {
- logger.ErrorC(reqCtx, fmt.Sprintf("获取用户角色失败: %v", err))
- return util.CreateErrorResult[string](fmt.Sprintf("获取用户角色失败: %v", err), reqCtx)
- }
-
- // 检查是否有admin角色
- hasAdminRole := false
- for _, role := range userRoles {
- if role == "admin" {
- hasAdminRole = true
- break
- }
- }
-
- if !hasAdminRole {
- logger.ErrorC(reqCtx, "权限不足,需要admin角色")
- return util.CreateErrorResult[string]("权限不足,需要admin角色", reqCtx)
- }
-
- // 检查角色是否存在
- _, err = dao.GetRoleByRoleID(ctx, db, req.RoleID)
- if err != nil {
- logger.ErrorC(reqCtx, fmt.Sprintf("角色 '%s' 不存在", req.RoleID))
- return util.CreateErrorResult[string](fmt.Sprintf("角色 '%s' 不存在", req.RoleID), reqCtx)
- }
-
- // 获取数据库连接并开始事务
- tx, err := db.BeginTxx(ctx, nil)
- if err != nil {
- logger.ErrorC(reqCtx, fmt.Sprintf("开始事务失败: %v", err))
- return util.CreateErrorResult[string](fmt.Sprintf("开始事务失败: %v", err), reqCtx)
- }
-
- defer func() {
- if p := recover(); p != nil {
- tx.Rollback()
- panic(p)
- }
- }()
-
- // 创建邀请码
- creator := currentUserID
- expiresDays := req.ExpiresDays
- if expiresDays <= 0 {
- expiresDays = 7 // 默认7天
- }
-
- code, err := dao.CreateInvitationCode(ctx, tx, currentTenantID, req.RoleID, creator, expiresDays)
- if err != nil {
- tx.Rollback()
- logger.ErrorC(reqCtx, fmt.Sprintf("创建邀请码失败: %v", err))
- return util.CreateErrorResult[string](fmt.Sprintf("创建邀请码失败: %v", err), reqCtx)
- }
-
- // 提交事务
- if err := tx.Commit(); err != nil {
- logger.ErrorC(reqCtx, fmt.Sprintf("提交事务失败: %v", err))
- return util.CreateErrorResult[string](fmt.Sprintf("提交事务失败: %v", err), reqCtx)
- }
-
- logger.Debug(fmt.Sprintf("成功创建邀请码: %s, 租户: %s, 角色: %s, 有效期: %d天",
- code, currentTenantID, req.RoleID, expiresDays))
-
- return util.CreateSuccessResultData(code, reqCtx)
- }
|