108 lines
2.4 KiB
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),
|
|
}
|
|
}
|