package service import ( "context" "git.nobla.cn/golang/aeus-admin/internal/logic" "git.nobla.cn/golang/aeus-admin/models" "git.nobla.cn/golang/aeus-admin/pb" "git.nobla.cn/golang/aeus/pkg/cache" "gorm.io/gorm" ) type ( menuOptions struct { db *gorm.DB cache cache.Cache } MenuOption func(o *menuOptions) MenuService struct { opts *menuOptions logic *logic.Menu } ) func WithMenuCache(cache cache.Cache) MenuOption { return func(o *menuOptions) { o.cache = cache } } func WithMenuDB(db *gorm.DB) MenuOption { return func(o *menuOptions) { o.db = db } } func (s *MenuService) recursiveMenuValue(parent string, items []*models.Menu) []*pb.MenuValue { values := make([]*pb.MenuValue, 0, len(items)) for _, row := range items { if row.Parent == parent { item := &pb.MenuValue{ Id: row.Id, Parent: row.Parent, Name: row.Name, Label: row.Label, Children: make([]*pb.MenuValue, 0), } item.Children = append(item.Children, s.recursiveMenuValue(row.Name, items)...) values = append(values, item) } } return values } func (s *MenuService) recursiveMenuLevel(parent string, items []*models.Menu) []*pb.MenuLevelValue { values := make([]*pb.MenuLevelValue, 0, len(items)) for _, row := range items { if row.Parent == parent { item := &pb.MenuLevelValue{ Label: row.Label, Value: row.Name, Children: make([]*pb.MenuLevelValue, 0), } item.Children = append(item.Children, s.recursiveMenuLevel(row.Name, items)...) values = append(values, item) } } return values } func (s *MenuService) GetMenus(ctx context.Context, req *pb.GetMenuRequest) (res *pb.GetMenuResponse, err error) { var ( items []*models.Menu ) if items, err = s.logic.GetMenus(ctx); err != nil { return } res = &pb.GetMenuResponse{ Data: s.recursiveMenuValue("", items), } return } func (s *MenuService) GetMenuLevelLabels(ctx context.Context, req *pb.GetMenuLevelLabelsRequest) (res *pb.GetMenuLevelLabelsResponse, err error) { var ( items []*models.Menu ) if items, err = s.logic.GetMenus(ctx); err != nil { return } res = &pb.GetMenuLevelLabelsResponse{ Data: s.recursiveMenuLevel("", items), } return } func NewMenuService(cbs ...MenuOption) *MenuService { opts := &menuOptions{} for _, cb := range cbs { cb(opts) } return &MenuService{ opts: opts, logic: logic.NewMenuLogic(opts.db, opts.cache), } }