syncPermsService.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package pub
  2. import (
  3. "context"
  4. "time"
  5. "perms-system-server/internal/consts"
  6. permModel "perms-system-server/internal/model/perm"
  7. "perms-system-server/internal/svc"
  8. "github.com/zeromicro/go-zero/core/stores/sqlx"
  9. "golang.org/x/crypto/bcrypt"
  10. )
  11. type SyncPermsResult struct {
  12. Added int64
  13. Updated int64
  14. Disabled int64
  15. }
  16. type SyncPermItem struct {
  17. Code string
  18. Name string
  19. Remark string
  20. }
  21. type SyncPermsError struct {
  22. Code int
  23. Message string
  24. }
  25. func (e *SyncPermsError) Error() string {
  26. return e.Message
  27. }
  28. func ExecuteSyncPerms(ctx context.Context, svcCtx *svc.ServiceContext, appKey, appSecret string, perms []SyncPermItem) (*SyncPermsResult, error) {
  29. product, err := svcCtx.SysProductModel.FindOneByAppKey(ctx, appKey)
  30. if err != nil {
  31. return nil, &SyncPermsError{Code: 401, Message: "无效的appKey"}
  32. }
  33. if err := bcrypt.CompareHashAndPassword([]byte(product.AppSecret), []byte(appSecret)); err != nil {
  34. return nil, &SyncPermsError{Code: 401, Message: "appSecret验证失败"}
  35. }
  36. if product.Status != consts.StatusEnabled {
  37. return nil, &SyncPermsError{Code: 403, Message: "产品已被禁用"}
  38. }
  39. if len(perms) == 0 {
  40. return nil, &SyncPermsError{Code: 400, Message: "权限列表不能为空,如需禁用所有权限请使用专用接口"}
  41. }
  42. existingMap, err := svcCtx.SysPermModel.FindMapByProductCode(ctx, product.Code)
  43. if err != nil {
  44. return nil, &SyncPermsError{Code: 500, Message: "查询权限数据失败"}
  45. }
  46. now := time.Now().Unix()
  47. var added, updated int64
  48. codes := make([]string, 0, len(perms))
  49. var toInsert []*permModel.SysPerm
  50. var toUpdate []*permModel.SysPerm
  51. seen := make(map[string]bool, len(perms))
  52. for _, item := range perms {
  53. if seen[item.Code] {
  54. continue
  55. }
  56. seen[item.Code] = true
  57. codes = append(codes, item.Code)
  58. existing, ok := existingMap[item.Code]
  59. if !ok {
  60. toInsert = append(toInsert, &permModel.SysPerm{
  61. ProductCode: product.Code,
  62. Name: item.Name,
  63. Code: item.Code,
  64. Remark: item.Remark,
  65. Status: consts.StatusEnabled,
  66. CreateTime: now,
  67. UpdateTime: now,
  68. })
  69. added++
  70. continue
  71. }
  72. if existing.Name != item.Name || existing.Remark != item.Remark || existing.Status != consts.StatusEnabled {
  73. existing.Name = item.Name
  74. existing.Remark = item.Remark
  75. existing.Status = consts.StatusEnabled
  76. existing.UpdateTime = now
  77. toUpdate = append(toUpdate, existing)
  78. updated++
  79. }
  80. }
  81. var disabled int64
  82. if err := svcCtx.SysPermModel.TransactCtx(ctx, func(txCtx context.Context, session sqlx.Session) error {
  83. if len(toInsert) > 0 {
  84. if err := svcCtx.SysPermModel.BatchInsertWithTx(txCtx, session, toInsert); err != nil {
  85. return err
  86. }
  87. }
  88. if len(toUpdate) > 0 {
  89. if err := svcCtx.SysPermModel.BatchUpdateWithTx(txCtx, session, toUpdate); err != nil {
  90. return err
  91. }
  92. }
  93. var err error
  94. disabled, err = svcCtx.SysPermModel.DisableNotInCodesWithTx(txCtx, session, product.Code, codes, now)
  95. return err
  96. }); err != nil {
  97. return nil, &SyncPermsError{Code: 500, Message: "同步权限事务失败"}
  98. }
  99. if added > 0 || updated > 0 || disabled > 0 {
  100. svcCtx.UserDetailsLoader.CleanByProduct(ctx, product.Code)
  101. }
  102. return &SyncPermsResult{
  103. Added: added,
  104. Updated: updated,
  105. Disabled: disabled,
  106. }, nil
  107. }