package logic import ( "admin/internal/dao" "admin/internal/model" "admin/validator" "context" "strconv" "strings" "admin/admin" "admin/internal/svc" "github.com/zeromicro/go-zero/core/logx" "pkg.local/modelbase" "pkg.local/utils" ) type RoleItemsLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger BaseLogic } func NewRoleItemsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *RoleItemsLogic { return &RoleItemsLogic{ ctx: ctx, svcCtx: svcCtx, Logger: logx.WithContext(ctx), } } func (l *RoleItemsLogic) RoleItems(in *admin.RoleItemsRequest) (*admin.Response, error) { var v validator.RoleItemsValidator if fail := l.checkParams(in, &v); fail != nil { return fail, nil } modelObj := model.RoleModel{}.Init() w := modelbase.Params{ Page: int(in.Page), Size: int(in.Size), Order: "id asc", Eq: map[string]string{"service_id": strconv.FormatInt(in.ServiceId, 10)}, } w.Like = make(map[string]string) if in.Status > utils.NumberZero { w.Eq["status"] = strconv.Itoa(int(in.Status)) } if len(in.Name) > utils.NumberZero { w.Like["name LIKE ? "] = "%%" + in.Name + "%%" } var data []dao.Role err := modelObj.Items(w, &data) if err != nil { l.Logger.Error(err) return nil, err } var items []dao.RoleItems rulesInfos := l.getRulesInfo(data) for i := utils.NumberZero; i < len(data); i++ { var rules []string for _, rule := range strings.Split(data[i].Rules, utils.DecollatorComma) { if _, ok := rulesInfos[rule]; ok { rules = append(rules, rulesInfos[rule]) } } items = append(items, dao.RoleItems{ Role: data[i], RuleItems: rules, }) } return l.ok(items), nil } func (l *RoleItemsLogic) getRulesInfo(data []dao.Role) map[string]string { var ids []string for i := utils.NumberZero; i < len(data); i++ { ids = append(ids, strings.Split(data[i].Rules, utils.DecollatorComma)...) } w := modelbase.Params{ In: map[string][]string{"id in ?": ids}, Other: map[string]string{"type != ?": strconv.Itoa(dao.TypeDir)}, } var items []dao.AuthorityNames retData := make(map[string]string) err := model.AuthorityModel{}.Init().Items(w, &items) if err != nil { return retData } for i := utils.NumberZero; i < len(items); i++ { retData[strconv.Itoa(int(items[i].Id))] = items[i].Name } return retData }