package pub import ( "context" "time" "perms-system-server/internal/consts" permModel "perms-system-server/internal/model/perm" "perms-system-server/internal/response" "perms-system-server/internal/svc" "perms-system-server/internal/types" "github.com/zeromicro/go-zero/core/logx" ) type SyncPermsLogic struct { logx.Logger ctx context.Context svcCtx *svc.ServiceContext } func NewSyncPermsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SyncPermsLogic { return &SyncPermsLogic{ Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } func (l *SyncPermsLogic) SyncPerms(req *types.SyncPermsReq) (resp *types.SyncPermsResp, err error) { product, err := l.svcCtx.SysProductModel.FindOneByAppKey(l.ctx, req.AppKey) if err != nil { return nil, response.ErrUnauthorized("无效的appKey") } if product.AppSecret != req.AppSecret { return nil, response.ErrUnauthorized("appSecret验证失败") } if product.Status != consts.StatusEnabled { return nil, response.ErrForbidden("产品已被禁用") } existingMap, err := l.svcCtx.SysPermModel.FindMapByProductCode(l.ctx, product.Code) if err != nil { return nil, err } now := time.Now().Unix() var added, updated int64 codes := make([]string, 0, len(req.Perms)) var toInsert []*permModel.SysPerm var toUpdate []*permModel.SysPerm for _, item := range req.Perms { codes = append(codes, item.Code) existing, ok := existingMap[item.Code] if !ok { toInsert = append(toInsert, &permModel.SysPerm{ ProductCode: product.Code, Name: item.Name, Code: item.Code, Remark: item.Remark, Status: consts.StatusEnabled, CreateTime: now, UpdateTime: now, }) added++ continue } if existing.Name != item.Name || existing.Remark != item.Remark || existing.Status != consts.StatusEnabled { existing.Name = item.Name existing.Remark = item.Remark existing.Status = consts.StatusEnabled existing.UpdateTime = now toUpdate = append(toUpdate, existing) updated++ } } if len(toInsert) > 0 { if err := l.svcCtx.SysPermModel.BatchInsert(l.ctx, toInsert); err != nil { return nil, err } } if len(toUpdate) > 0 { if err := l.svcCtx.SysPermModel.BatchUpdate(l.ctx, toUpdate); err != nil { return nil, err } } disabled, err := l.svcCtx.SysPermModel.DisableNotInCodes(l.ctx, product.Code, codes, now) if err != nil { return nil, err } if added > 0 || updated > 0 || disabled > 0 { l.svcCtx.UserDetailsLoader.CleanByProduct(l.ctx, product.Code) } return &types.SyncPermsResp{ Added: added, Updated: updated, Disabled: disabled, }, nil }