admin_role.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. package service
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/pkg/errors"
  6. "gorm.io/gorm"
  7. "sghgogs.com/sghblog/authorization-service/domain/model/base"
  8. req "sghgogs.com/sghblog/authorization-service/domain/model/request"
  9. pb "sghgogs.com/sghblog/authorization-service/proto"
  10. "sghgogs.com/sghblog/authorization-service/utils/authutil"
  11. "sghgogs.com/sghblog/common"
  12. "sghgogs.com/sghblog/common/errorcode"
  13. "time"
  14. )
  15. func (s *Service) GetAdminRole(roleId int64) (*pb.AdminRole, error) {
  16. var rsp *pb.AdminRole
  17. if exists, err := s.Repository.IsAdminRoleExists(roleId); err != nil {
  18. return rsp, errorcode.New("authorization service", err.Error(), 500)
  19. } else {
  20. if !exists {
  21. return rsp, errorcode.New("authorization service", common.ErrorMessage[common.InvalidRoleID], 400)
  22. }
  23. }
  24. if role, err := s.Repository.GetAdminRole(roleId); err != nil {
  25. return rsp, errorcode.New("authorization service", err.Error(), 500)
  26. } else {
  27. rsp = &pb.AdminRole{
  28. Id: role.ID,
  29. Name: role.Name,
  30. Description: role.Description,
  31. Users: base.UsersToProto(role.Users),
  32. Permissions: base.PermissionsToProto(role.Permissions),
  33. CreatedBy: role.CreatedBy,
  34. CreatedAt: ConvertTimeToInt64(role.CreatedAt),
  35. UpdatedAt: ConvertTimeToInt64(*role.UpdatedAt),
  36. Status: role.Status,
  37. IsReserved: role.IsReserved,
  38. }
  39. return rsp, nil
  40. }
  41. }
  42. func (s *Service) CreateAdminRole(ctx context.Context, role *pb.CreateAdminRoleRequest) error {
  43. _, createdBy, _, _ := ParseMetadata(ctx)
  44. adminRole := &req.AdminRole{
  45. Name: role.Name,
  46. Description: role.Description,
  47. CreatedBy: createdBy,
  48. CreatedAt: time.Now(),
  49. Status: pb.StatusEnum_ENABLED,
  50. IsReserved: false,
  51. UpdatedAt: nil,
  52. }
  53. if err := s.Repository.CreateAdminRole(adminRole, role.Users, role.Permissions); err != nil {
  54. return errorcode.New("authorization service", err.Error(), 500)
  55. }
  56. return nil
  57. }
  58. func (s *Service) ListAdminRoles(query *pb.ListAdminRolesRequest) ([]*pb.AdminRole, int64, error) {
  59. roles, count, err := s.Repository.ListAdminRoles(query)
  60. items := make([]*pb.AdminRole, 0)
  61. if err != nil {
  62. if errors.Is(err, gorm.ErrRecordNotFound) {
  63. return items, 0, nil
  64. }
  65. return items, 0, errorcode.New("authorization service", err.Error(), 500)
  66. }
  67. for _, role := range roles {
  68. var item *pb.AdminRole
  69. common.SwapTo(role, &item)
  70. item.UpdatedAt = ConvertTimeToInt64(*role.UpdatedAt)
  71. item.CreatedAt = ConvertTimeToInt64(role.CreatedAt)
  72. item.Users = base.UsersToProto(role.Users)
  73. item.Status = role.Status
  74. item.Permissions = base.PermissionsToProto(role.Permissions)
  75. items = append(items, item)
  76. }
  77. return items, count, nil
  78. }
  79. func (s *Service) UpdateAdminRole(role *pb.UpdateAdminRoleRequest) error {
  80. // 获取权限ID作为锁的键
  81. lockKey := fmt.Sprintf("update_admin_role_%d", role.RoleId)
  82. lock := authutil.JWTAuthService.Mu.NewMutex(lockKey)
  83. // 获取锁,保证原子性
  84. if err := lock.Lock(); err != nil {
  85. return err
  86. }
  87. defer lock.Unlock()
  88. if exists, err := s.Repository.IsAdminRoleExists(role.RoleId); err != nil {
  89. return errorcode.New("authorization service", err.Error(), 500)
  90. } else {
  91. if !exists {
  92. return errorcode.New("authorization service", common.ErrorMessage[common.InvalidRoleID], 400)
  93. }
  94. }
  95. if err := s.Repository.UpdateAdminRole(role); err != nil {
  96. return errorcode.New("authorization service", err.Error(), 500)
  97. }
  98. return nil
  99. }
  100. func (s *Service) RetrieveEnabledRoles() ([]*pb.AdminRole, error) {
  101. roles := make([]*pb.AdminRole, 0)
  102. enabledRoles, err := s.Repository.RetrieveEnabledRoles()
  103. if err != nil {
  104. if errors.Is(err, gorm.ErrRecordNotFound) {
  105. return roles, nil
  106. }
  107. return roles, errorcode.New("authorization service", err.Error(), 500)
  108. }
  109. for _, role := range enabledRoles {
  110. roles = append(roles, &pb.AdminRole{
  111. Id: role.ID,
  112. Name: role.Name,
  113. Description: role.Description,
  114. })
  115. }
  116. return roles, nil
  117. }
  118. func (s *Service) DeleteAdminRole(roleId int64) error {
  119. // 获取权限ID作为锁的键
  120. lockKey := fmt.Sprintf("delete_admin_role_%d", roleId)
  121. lock := authutil.JWTAuthService.Mu.NewMutex(lockKey)
  122. // 获取锁,保证原子性
  123. if err := lock.Lock(); err != nil {
  124. return err
  125. }
  126. defer lock.Unlock()
  127. // 1.查询角色是否存在
  128. if exists, err := s.Repository.IsAdminRoleExists(roleId); err != nil {
  129. return errorcode.New("authorization service", err.Error(), 500)
  130. } else {
  131. if !exists {
  132. return errorcode.New("authorization service", common.ErrorMessage[common.InvalidRoleID], 400)
  133. }
  134. }
  135. // 彻底删除角色
  136. if err := s.Repository.DeleteAdminRole(roleId); err != nil {
  137. return errorcode.New("authorization service", err.Error(), 500)
  138. }
  139. return nil
  140. }
  141. func (s *Service) ToggleAdminRole(role *pb.ToggleAdminRoleRequest) error {
  142. // 获取权限ID作为锁的键
  143. lockKey := fmt.Sprintf("toggle_admin_role_%d", role.RoleId)
  144. lock := authutil.JWTAuthService.Mu.NewMutex(lockKey)
  145. // 获取锁,保证原子性
  146. if err := lock.Lock(); err != nil {
  147. return err
  148. }
  149. defer lock.Unlock()
  150. // 1.查询角色是否存在
  151. if exists, err := s.Repository.IsAdminRoleExists(role.RoleId); err != nil {
  152. return errorcode.New("authorization service", err.Error(), 500)
  153. } else {
  154. if !exists {
  155. return errorcode.New("authorization service", common.ErrorMessage[common.InvalidRoleID], 400)
  156. }
  157. }
  158. if err := s.Repository.ToggleAdminRole(role); err != nil {
  159. return errorcode.New("authorization service", err.Error(), 500)
  160. }
  161. return nil
  162. }