| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- package auth
- import (
- "context"
- "perms-system-server/internal/consts"
- "perms-system-server/internal/model/productmember"
- "perms-system-server/internal/svc"
- )
- func GetUserPerms(ctx context.Context, svcCtx *svc.ServiceContext, userId int64, deptId int64, productCode string, isSuperAdmin bool) ([]string, string, error) {
- if isSuperAdmin {
- perms, err := svcCtx.SysPermModel.FindAllCodesByProductCode(ctx, productCode)
- if err != nil {
- return nil, "", err
- }
- return perms, consts.MemberTypeSuperAdmin, nil
- }
- member, err := svcCtx.SysProductMemberModel.FindOneByProductCodeUserId(ctx, productCode, userId)
- if err != nil {
- if err == productmember.ErrNotFound {
- return nil, "", nil
- }
- return nil, "", err
- }
- if member.MemberType == consts.MemberTypeDeveloper || member.MemberType == consts.MemberTypeAdmin {
- perms, err := svcCtx.SysPermModel.FindAllCodesByProductCode(ctx, productCode)
- if err != nil {
- return nil, member.MemberType, err
- }
- return perms, member.MemberType, nil
- }
- if deptId > 0 {
- deptInfo, err := svcCtx.SysDeptModel.FindOne(ctx, deptId)
- if err == nil && deptInfo.DeptType == consts.DeptTypeDev {
- perms, err := svcCtx.SysPermModel.FindAllCodesByProductCode(ctx, productCode)
- if err != nil {
- return nil, member.MemberType, err
- }
- return perms, member.MemberType, nil
- }
- }
- roleIds, err := svcCtx.SysUserRoleModel.FindRoleIdsByUserId(ctx, userId)
- if err != nil {
- return nil, member.MemberType, err
- }
- productRoleIds := make([]int64, 0)
- if len(roleIds) > 0 {
- roles, err := svcCtx.SysRoleModel.FindByIds(ctx, roleIds)
- if err != nil {
- return nil, member.MemberType, err
- }
- for _, r := range roles {
- if r.ProductCode == productCode && r.Status == consts.StatusEnabled {
- productRoleIds = append(productRoleIds, r.Id)
- }
- }
- }
- rolePermIds, err := svcCtx.SysRolePermModel.FindPermIdsByRoleIds(ctx, productRoleIds)
- if err != nil {
- return nil, member.MemberType, err
- }
- allowPermIds, err := svcCtx.SysUserPermModel.FindPermIdsByUserIdAndEffect(ctx, userId, consts.PermEffectAllow)
- if err != nil {
- return nil, member.MemberType, err
- }
- denyPermIds, err := svcCtx.SysUserPermModel.FindPermIdsByUserIdAndEffect(ctx, userId, consts.PermEffectDeny)
- if err != nil {
- return nil, member.MemberType, err
- }
- denySet := make(map[int64]bool)
- for _, id := range denyPermIds {
- denySet[id] = true
- }
- permIdSet := make(map[int64]bool)
- for _, id := range rolePermIds {
- if !denySet[id] {
- permIdSet[id] = true
- }
- }
- for _, id := range allowPermIds {
- if !denySet[id] {
- permIdSet[id] = true
- }
- }
- finalIds := make([]int64, 0, len(permIdSet))
- for id := range permIdSet {
- finalIds = append(finalIds, id)
- }
- permsResult, err := svcCtx.SysPermModel.FindByIds(ctx, finalIds)
- if err != nil {
- return nil, member.MemberType, err
- }
- codes := make([]string, 0, len(permsResult))
- for _, p := range permsResult {
- if p.Status == consts.StatusEnabled {
- codes = append(codes, p.Code)
- }
- }
- return codes, member.MemberType, nil
- }
|