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) }