Nav apraksta
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

create_invitation.go 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package user
  2. import (
  3. "context"
  4. "fmt"
  5. "git.x2erp.com/qdy/go-base/ctx"
  6. "git.x2erp.com/qdy/go-base/logger"
  7. "git.x2erp.com/qdy/go-base/model/request/configreq"
  8. "git.x2erp.com/qdy/go-base/model/response"
  9. "git.x2erp.com/qdy/go-base/util"
  10. "git.x2erp.com/qdy/go-db/factory/database"
  11. "git.x2erp.com/qdy/go-svc-configure/internal/service/dao"
  12. )
  13. // CreateInvitationCode 创建邀请码(仅限租户管理员)
  14. func CreateInvitationCode(req *configreq.CreateInvitationCodeRequest, ctx context.Context, dbFactory *database.DBFactory, reqCtx *ctx.RequestContext) *response.QueryResult[string] {
  15. logger.Debug("CreateInvitationCode-开始创建邀请码")
  16. // 参数验证
  17. if req.RoleID == "" {
  18. logger.ErrorC(reqCtx, "角色ID不能为空")
  19. return util.CreateErrorResult[string]("角色ID不能为空", reqCtx)
  20. }
  21. // 获取当前用户信息
  22. currentUserID := reqCtx.UserID
  23. currentTenantID := reqCtx.TenantID
  24. if currentUserID == "" || currentTenantID == "" {
  25. logger.ErrorC(reqCtx, "用户身份信息不完整")
  26. return util.CreateErrorResult[string]("用户身份信息不完整", reqCtx)
  27. }
  28. db := dbFactory.GetDB()
  29. // 验证当前用户是否存在
  30. userExists, err := dao.CheckUserExists(ctx, db, currentUserID, currentTenantID)
  31. if err != nil {
  32. logger.ErrorC(reqCtx, fmt.Sprintf("检查用户存在性失败: %v", err))
  33. return util.CreateErrorResult[string](fmt.Sprintf("检查用户存在性失败: %v", err), reqCtx)
  34. }
  35. if !userExists {
  36. logger.ErrorC(reqCtx, "当前用户不存在")
  37. return util.CreateErrorResult[string]("当前用户不存在", reqCtx)
  38. }
  39. // 检查用户是否具有admin角色(或其他权限)
  40. userRoles, err := dao.GetUserRoles(ctx, db, currentUserID, currentTenantID)
  41. if err != nil {
  42. logger.ErrorC(reqCtx, fmt.Sprintf("获取用户角色失败: %v", err))
  43. return util.CreateErrorResult[string](fmt.Sprintf("获取用户角色失败: %v", err), reqCtx)
  44. }
  45. // 检查是否有admin角色
  46. hasAdminRole := false
  47. for _, role := range userRoles {
  48. if role == "admin" {
  49. hasAdminRole = true
  50. break
  51. }
  52. }
  53. if !hasAdminRole {
  54. logger.ErrorC(reqCtx, "权限不足,需要admin角色")
  55. return util.CreateErrorResult[string]("权限不足,需要admin角色", reqCtx)
  56. }
  57. // 检查角色是否存在
  58. _, err = dao.GetRoleByRoleID(ctx, db, req.RoleID)
  59. if err != nil {
  60. logger.ErrorC(reqCtx, fmt.Sprintf("角色 '%s' 不存在", req.RoleID))
  61. return util.CreateErrorResult[string](fmt.Sprintf("角色 '%s' 不存在", req.RoleID), reqCtx)
  62. }
  63. // 获取数据库连接并开始事务
  64. tx, err := db.BeginTxx(ctx, nil)
  65. if err != nil {
  66. logger.ErrorC(reqCtx, fmt.Sprintf("开始事务失败: %v", err))
  67. return util.CreateErrorResult[string](fmt.Sprintf("开始事务失败: %v", err), reqCtx)
  68. }
  69. defer func() {
  70. if p := recover(); p != nil {
  71. tx.Rollback()
  72. panic(p)
  73. }
  74. }()
  75. // 创建邀请码
  76. creator := currentUserID
  77. expiresDays := req.ExpiresDays
  78. if expiresDays <= 0 {
  79. expiresDays = 7 // 默认7天
  80. }
  81. code, err := dao.CreateInvitationCode(ctx, tx, currentTenantID, req.RoleID, creator, expiresDays)
  82. if err != nil {
  83. tx.Rollback()
  84. logger.ErrorC(reqCtx, fmt.Sprintf("创建邀请码失败: %v", err))
  85. return util.CreateErrorResult[string](fmt.Sprintf("创建邀请码失败: %v", err), reqCtx)
  86. }
  87. // 提交事务
  88. if err := tx.Commit(); err != nil {
  89. logger.ErrorC(reqCtx, fmt.Sprintf("提交事务失败: %v", err))
  90. return util.CreateErrorResult[string](fmt.Sprintf("提交事务失败: %v", err), reqCtx)
  91. }
  92. logger.Debug(fmt.Sprintf("成功创建邀请码: %s, 租户: %s, 角色: %s, 有效期: %d天",
  93. code, currentTenantID, req.RoleID, expiresDays))
  94. return util.CreateSuccessResultData(code, reqCtx)
  95. }