perms.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package auth
  2. import (
  3. "context"
  4. "perms-system-server/internal/consts"
  5. "perms-system-server/internal/model/productmember"
  6. "perms-system-server/internal/svc"
  7. )
  8. func GetUserPerms(ctx context.Context, svcCtx *svc.ServiceContext, userId int64, deptId int64, productCode string, isSuperAdmin bool) ([]string, string, error) {
  9. if isSuperAdmin {
  10. perms, err := svcCtx.SysPermModel.FindAllCodesByProductCode(ctx, productCode)
  11. if err != nil {
  12. return nil, "", err
  13. }
  14. return perms, consts.MemberTypeSuperAdmin, nil
  15. }
  16. member, err := svcCtx.SysProductMemberModel.FindOneByProductCodeUserId(ctx, productCode, userId)
  17. if err != nil {
  18. if err == productmember.ErrNotFound {
  19. return nil, "", nil
  20. }
  21. return nil, "", err
  22. }
  23. if member.MemberType == consts.MemberTypeDeveloper || member.MemberType == consts.MemberTypeAdmin {
  24. perms, err := svcCtx.SysPermModel.FindAllCodesByProductCode(ctx, productCode)
  25. if err != nil {
  26. return nil, member.MemberType, err
  27. }
  28. return perms, member.MemberType, nil
  29. }
  30. if deptId > 0 {
  31. deptInfo, err := svcCtx.SysDeptModel.FindOne(ctx, deptId)
  32. if err == nil && deptInfo.DeptType == consts.DeptTypeDev {
  33. perms, err := svcCtx.SysPermModel.FindAllCodesByProductCode(ctx, productCode)
  34. if err != nil {
  35. return nil, member.MemberType, err
  36. }
  37. return perms, member.MemberType, nil
  38. }
  39. }
  40. roleIds, err := svcCtx.SysUserRoleModel.FindRoleIdsByUserId(ctx, userId)
  41. if err != nil {
  42. return nil, member.MemberType, err
  43. }
  44. productRoleIds := make([]int64, 0)
  45. if len(roleIds) > 0 {
  46. roles, err := svcCtx.SysRoleModel.FindByIds(ctx, roleIds)
  47. if err != nil {
  48. return nil, member.MemberType, err
  49. }
  50. for _, r := range roles {
  51. if r.ProductCode == productCode && r.Status == consts.StatusEnabled {
  52. productRoleIds = append(productRoleIds, r.Id)
  53. }
  54. }
  55. }
  56. rolePermIds, err := svcCtx.SysRolePermModel.FindPermIdsByRoleIds(ctx, productRoleIds)
  57. if err != nil {
  58. return nil, member.MemberType, err
  59. }
  60. allowPermIds, err := svcCtx.SysUserPermModel.FindPermIdsByUserIdAndEffect(ctx, userId, consts.PermEffectAllow)
  61. if err != nil {
  62. return nil, member.MemberType, err
  63. }
  64. denyPermIds, err := svcCtx.SysUserPermModel.FindPermIdsByUserIdAndEffect(ctx, userId, consts.PermEffectDeny)
  65. if err != nil {
  66. return nil, member.MemberType, err
  67. }
  68. denySet := make(map[int64]bool)
  69. for _, id := range denyPermIds {
  70. denySet[id] = true
  71. }
  72. permIdSet := make(map[int64]bool)
  73. for _, id := range rolePermIds {
  74. if !denySet[id] {
  75. permIdSet[id] = true
  76. }
  77. }
  78. for _, id := range allowPermIds {
  79. if !denySet[id] {
  80. permIdSet[id] = true
  81. }
  82. }
  83. finalIds := make([]int64, 0, len(permIdSet))
  84. for id := range permIdSet {
  85. finalIds = append(finalIds, id)
  86. }
  87. permsResult, err := svcCtx.SysPermModel.FindByIds(ctx, finalIds)
  88. if err != nil {
  89. return nil, member.MemberType, err
  90. }
  91. codes := make([]string, 0, len(permsResult))
  92. for _, p := range permsResult {
  93. if p.Status == consts.StatusEnabled {
  94. codes = append(codes, p.Code)
  95. }
  96. }
  97. return codes, member.MemberType, nil
  98. }