admin_user.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. package service
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/pkg/errors"
  6. "golang.org/x/crypto/bcrypt"
  7. "gorm.io/gorm"
  8. "sghgogs.com/sghblog/authorization-service/domain/model/base"
  9. req "sghgogs.com/sghblog/authorization-service/domain/model/request"
  10. pb "sghgogs.com/sghblog/authorization-service/proto"
  11. "sghgogs.com/sghblog/authorization-service/utils/authutil"
  12. "sghgogs.com/sghblog/common"
  13. "sghgogs.com/sghblog/common/errorcode"
  14. "time"
  15. )
  16. func (s *Service) GetAdminUser(userId int64) (*pb.AdminUser, error) {
  17. var rsp pb.AdminUser
  18. if exists, err := s.Repository.IsAdminUserExists(userId); err != nil {
  19. return &rsp, errorcode.New("authorization service", err.Error(), 500)
  20. } else {
  21. if !exists {
  22. return &rsp, errorcode.New("authorization service", common.ErrorMessage[common.AccountDoesNotExist], 400)
  23. }
  24. }
  25. user, err := s.Repository.GetAdminUser(userId)
  26. if err != nil {
  27. return &rsp, errorcode.New("authorization service", err.Error(), 500)
  28. }
  29. var objUser pb.AdminUser
  30. common.SwapTo(user, &objUser)
  31. objUser.CreatedAt = ConvertTimeToInt64(user.CreatedAt)
  32. objUser.UpdatedAt = ConvertTimeToInt64(*user.UpdatedAt)
  33. objUser.Teams = base.TeamsToProto(user)
  34. objUser.Roles = base.RolesToProto(user)
  35. objUser.Status = user.Status
  36. return &objUser, nil
  37. }
  38. func (s *Service) ListAdminUsers(query *pb.ListAdminUsersRequest) ([]*pb.AdminUser, int64, error) {
  39. adminUsers, totalCount, err := s.Repository.ListAdminUsers(query)
  40. if err != nil {
  41. if errors.Is(err, gorm.ErrRecordNotFound) {
  42. return make([]*pb.AdminUser, 0), 0, nil // 记录不存在,角色不存在
  43. } else {
  44. return make([]*pb.AdminUser, 0), 0, err
  45. }
  46. }
  47. users := make([]*pb.AdminUser, 0)
  48. for _, item := range adminUsers {
  49. var user *pb.AdminUser
  50. common.SwapTo(item, &user)
  51. user.CreatedAt = ConvertTimeToInt64(item.CreatedAt)
  52. user.UpdatedAt = ConvertTimeToInt64(*item.UpdatedAt)
  53. user.Roles = base.RolesToProto(item)
  54. user.Teams = base.TeamsToProto(item)
  55. users = append(users, user)
  56. }
  57. return users, totalCount, nil
  58. }
  59. func (s *Service) RetrieveEnabledUsers() ([]*pb.AdminUser, error) {
  60. users := make([]*pb.AdminUser, 0)
  61. enabledUsers, err := s.Repository.RetrieveEnabledUsers()
  62. if err != nil {
  63. if errors.Is(err, gorm.ErrRecordNotFound) {
  64. return users, nil
  65. }
  66. return users, errorcode.New("authorization service", err.Error(), 500)
  67. }
  68. for _, user := range enabledUsers {
  69. users = append(users, &pb.AdminUser{
  70. Id: user.ID,
  71. Username: user.Username,
  72. })
  73. }
  74. return users, nil
  75. }
  76. // hashPassword 使用 bcrypt 对密码进行哈希
  77. func hashPassword(password string) (string, error) {
  78. hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
  79. if err != nil {
  80. return "", err
  81. }
  82. return string(hash), nil
  83. }
  84. func (s *Service) CreateAdminUser(adminUser *pb.CreateAdminUserRequest) error {
  85. nowTime := time.Now()
  86. password, _ := hashPassword(adminUser.Password)
  87. user := req.AdminUser{
  88. Username: adminUser.Username,
  89. Password: password,
  90. PhoneNumber: adminUser.PhoneNumber,
  91. Email: adminUser.Email,
  92. Avatar: adminUser.Avatar,
  93. Status: pb.StatusEnum_ENABLED,
  94. IsReserved: false,
  95. CreatedAt: nowTime,
  96. UpdatedAt: nil,
  97. }
  98. if err := s.Repository.CreateAdminUser(&user, adminUser.Roles, adminUser.Teams); err != nil {
  99. return errorcode.New("authorization service", err.Error(), 400)
  100. }
  101. return nil
  102. }
  103. func (s *Service) UpdateAdminUser(adminUser *pb.UpdateAdminUserRequest) error {
  104. // 获取权限ID作为锁的键
  105. lockKey := fmt.Sprintf("update_admin_user_%d", adminUser.Id)
  106. lock := authutil.JWTAuthService.Mu.NewMutex(lockKey)
  107. // 获取锁,保证原子性
  108. if err := lock.Lock(); err != nil {
  109. return err
  110. }
  111. defer lock.Unlock()
  112. if exists, err := s.Repository.IsAdminUserExists(adminUser.Id); err != nil {
  113. return errorcode.New("authorization service", err.Error(), 500)
  114. } else {
  115. if !exists {
  116. return errorcode.New("authorization service", common.ErrorMessage[common.AccountDoesNotExist], 400)
  117. }
  118. }
  119. if err := s.Repository.UpdateAdminUser(adminUser); err != nil {
  120. return errorcode.New("authorization service", err.Error(), 500)
  121. }
  122. return nil
  123. }
  124. func (s *Service) DeleteAdminUser(ctx context.Context, userID int64) error {
  125. // 获取权限ID作为锁的键
  126. lockKey := fmt.Sprintf("delete_admin_user_%d", userID)
  127. lock := authutil.JWTAuthService.Mu.NewMutex(lockKey)
  128. // 获取锁,保证原子性
  129. if err := lock.Lock(); err != nil {
  130. return err
  131. }
  132. defer lock.Unlock()
  133. if exists, err := s.Repository.IsAdminUserExists(userID); err != nil {
  134. return errorcode.New("authorization service", err.Error(), 500)
  135. } else {
  136. if !exists {
  137. return errorcode.New("authorization service", common.ErrorMessage[common.AccountDoesNotExist], 400)
  138. }
  139. }
  140. if err := s.Repository.DeleteAdminUser(userID); err != nil {
  141. return errorcode.New("authorization service", err.Error(), 500)
  142. }
  143. return nil
  144. }
  145. func (s *Service) ToggleAdminUser(user *pb.ToggleAdminUserRequest) error {
  146. // 获取权限ID作为锁的键
  147. lockKey := fmt.Sprintf("toggle_admin_user_%d", user.UserId)
  148. lock := authutil.JWTAuthService.Mu.NewMutex(lockKey)
  149. // 获取锁,保证原子性
  150. if err := lock.Lock(); err != nil {
  151. return err
  152. }
  153. defer lock.Unlock()
  154. if exists, err := s.Repository.IsAdminUserExists(user.UserId); err != nil {
  155. return errorcode.New("authorization service", err.Error(), 500)
  156. } else {
  157. if !exists {
  158. return errorcode.New("authorization service", common.ErrorMessage[common.AccountDoesNotExist], 400)
  159. }
  160. }
  161. if err := s.Repository.ToggleAdminUser(user); err != nil {
  162. return errorcode.New("authorization service", err.Error(), 500)
  163. }
  164. return nil
  165. }