aeus-admin/service/menu.go

108 lines
2.4 KiB
Go

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),
}
}