permission.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. package service
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/google/uuid"
  6. "github.com/pkg/errors"
  7. "go-micro.dev/v4/auth"
  8. "gorm.io/gorm"
  9. "sghgogs.com/micro/common/errorcode"
  10. req "sghgogs.com/micro/shopping-service/domain/model/request"
  11. pb "sghgogs.com/micro/shopping-service/proto"
  12. "sghgogs.com/micro/shopping-service/utils"
  13. "sghgogs.com/micro/shopping-service/utils/authutil"
  14. "time"
  15. )
  16. func (svc *Service) GetPermissionList(query *pb.GetPermissionListRequest) ([]*pb.Permission, int64, error) {
  17. list, i, err := svc.Repository.GetPermissionList(query)
  18. permissions := make([]*pb.Permission, 0)
  19. if err != nil {
  20. if errors.Is(err, gorm.ErrRecordNotFound) {
  21. return permissions, 0, nil // 记录不存在,角色不存在
  22. } else {
  23. return permissions, 0, err
  24. }
  25. }
  26. for _, item := range list {
  27. permissions = append(permissions, svc.getPermissionRes(item))
  28. }
  29. return permissions, i, nil
  30. }
  31. func (svc *Service) GetPermission(query *pb.GetPermissionRequest) (*pb.Permission, error) {
  32. permission, err := svc.Repository.GetPermission(query.PermissionId)
  33. if err != nil {
  34. return &pb.Permission{}, errorcode.New(svc.Namespace, err.Error(), 400)
  35. }
  36. return svc.getPermissionRes(permission), nil
  37. }
  38. func (svc *Service) TogglePermission(query *pb.TogglePermissionRequest) error {
  39. if err := svc.Repository.TogglePermission(query.PermissionId, map[string]interface{}{
  40. "status": query.Status,
  41. "updated_at": time.Now(),
  42. }); err != nil {
  43. return errorcode.New(svc.Namespace, err.Error(), 400)
  44. }
  45. roles, err := svc.Repository.AllRoles()
  46. if err == nil {
  47. items := svc.UpdateRulesItems(roles)
  48. authutil.JWTAuthService.SetRuleItems(items)
  49. }
  50. return nil
  51. }
  52. func (svc *Service) DeletePermission(query *pb.DeletePermissionRequest) error {
  53. if err := svc.Repository.DeletePermission(query.PermissionId); err != nil {
  54. return errorcode.New(svc.Namespace, err.Error(), 500)
  55. }
  56. roles, err := svc.Repository.AllRoles()
  57. if err == nil {
  58. items := svc.UpdateRulesItems(roles)
  59. authutil.JWTAuthService.SetRuleItems(items)
  60. }
  61. return nil
  62. }
  63. func (svc *Service) UpdateRulesItems(roles []*req.Role) []*auth.Rule {
  64. rules := make([]*auth.Rule, 0)
  65. for _, role := range roles {
  66. for _, permission := range role.Permissions {
  67. rules = append(rules, &auth.Rule{
  68. Resource: &auth.Resource{
  69. Name: permission.Name,
  70. Type: "user",
  71. Endpoint: permission.Endpoint,
  72. },
  73. ID: uuid.New().String(),
  74. Scope: role.Name,
  75. Priority: 1,
  76. })
  77. }
  78. }
  79. return rules
  80. }
  81. func (svc *Service) getPermissionRes(permission *req.Permission) *pb.Permission {
  82. var updatedAt int64
  83. if permission.UpdatedAt != nil {
  84. if permission.CreatedAt.Truncate(time.Second) == permission.UpdatedAt.Truncate(time.Second) {
  85. permission.UpdatedAt = nil
  86. } else {
  87. updatedAt = utils.ConvertTimeToInt64(*permission.UpdatedAt)
  88. }
  89. }
  90. p := pb.Permission{
  91. Id: permission.ID,
  92. Name: permission.Name,
  93. Description: permission.Description,
  94. Roles: svc.getBaseRoleRes(permission.Roles),
  95. CreatedAt: utils.ConvertTimeToInt64(permission.CreatedAt),
  96. CreatedBy: permission.CreatedBy,
  97. UpdatedAt: updatedAt,
  98. Status: permission.Status,
  99. IsReserved: permission.IsReserved,
  100. Endpoint: permission.Endpoint,
  101. }
  102. return &p
  103. }
  104. func (svc *Service) getBaseRoleRes(roles []req.Role) []*pb.Base {
  105. bases := make([]*pb.Base, 0)
  106. for _, item := range roles {
  107. bases = append(bases, &pb.Base{
  108. Key: item.Name,
  109. Value: fmt.Sprintf("%d", item.ID),
  110. })
  111. }
  112. return bases
  113. }
  114. func (svc *Service) getRolesToBase(roles []*req.Role) []*pb.Base {
  115. bases := make([]*pb.Base, 0)
  116. for _, item := range roles {
  117. bases = append(bases, &pb.Base{
  118. Key: item.Name,
  119. Value: fmt.Sprintf("%d", item.ID),
  120. })
  121. }
  122. return bases
  123. }
  124. func (svc *Service) CreatePermission(ctx context.Context, add *pb.CreatePermissionRequest) error {
  125. _, by, _, _ := utils.ParseMetadata(ctx)
  126. role := req.Permission{
  127. Name: add.Name,
  128. Description: add.Description,
  129. CreatedBy: by,
  130. CreatedAt: time.Now(),
  131. Status: pb.StatusEnum_ENABLED,
  132. IsReserved: false,
  133. UpdatedAt: nil,
  134. Endpoint: add.Endpoint,
  135. }
  136. if err := svc.Repository.CreatePermission(&role, add.Roles); err != nil {
  137. return errorcode.New(svc.Namespace, err.Error(), 500)
  138. }
  139. roles, err := svc.Repository.AllRoles()
  140. if err == nil {
  141. items := svc.UpdateRulesItems(roles)
  142. authutil.JWTAuthService.SetRuleItems(items)
  143. }
  144. return nil
  145. }
  146. func (svc *Service) CreateMultiplePermissions(ctx context.Context, data *pb.CreateMultiplePermissionsRequest) error {
  147. _, by, _, _ := utils.ParseMetadata(ctx)
  148. permissions := make([]*req.Permission, 0)
  149. for _, item := range data.Items {
  150. permissions = append(permissions, &req.Permission{
  151. Name: item.Name,
  152. Description: item.Description,
  153. CreatedBy: by,
  154. CreatedAt: time.Now(),
  155. Status: pb.StatusEnum_ENABLED,
  156. IsReserved: false,
  157. Endpoint: item.Endpoint,
  158. })
  159. }
  160. if err := svc.Repository.CreateMultiplePermissions(permissions, data.Roles); err != nil {
  161. return errorcode.New(svc.Namespace, err.Error(), 500)
  162. }
  163. roles, err := svc.Repository.AllRoles()
  164. if err == nil {
  165. items := svc.UpdateRulesItems(roles)
  166. authutil.JWTAuthService.SetRuleItems(items)
  167. }
  168. return nil
  169. }
  170. func (svc *Service) UpdatePermission(ctx context.Context, query *pb.UpdatePermissionRequest) error {
  171. _, by, _, _ := utils.ParseMetadata(ctx)
  172. if err := svc.Repository.UpdatePermission(query.PermissionId, map[string]interface{}{
  173. "description": query.Description,
  174. "endpoint": query.Endpoint,
  175. "updated_by": by,
  176. "updated_at": time.Now(),
  177. }, query.Roles); err != nil {
  178. return errorcode.New(svc.Namespace, err.Error(), 500)
  179. }
  180. roles, err := svc.Repository.AllRoles()
  181. if err == nil {
  182. items := svc.UpdateRulesItems(roles)
  183. authutil.JWTAuthService.SetRuleItems(items)
  184. }
  185. return nil
  186. }