aeus-admin/internal/logic/menu.go

54 lines
1.5 KiB
Go

package logic
import (
"context"
"fmt"
"git.nobla.cn/golang/aeus-admin/models"
"git.nobla.cn/golang/aeus-admin/pkg/dbcache"
"git.nobla.cn/golang/aeus/pkg/cache"
"git.nobla.cn/golang/rest"
"git.nobla.cn/golang/rest/types"
"gorm.io/gorm"
)
type Menu struct {
db *gorm.DB
cache cache.Cache
sqlDependency *dbcache.SqlDependency
}
func (u *Menu) GetMenus(ctx context.Context, domainName string) (values []*models.Menu, err error) {
return dbcache.TryCache(ctx, fmt.Sprintf("menus:%s", domainName), func(tx *gorm.DB) ([]*models.Menu, error) {
var items []*models.Menu
if domainName == "" {
err = tx.Order("`position`,`id` ASC").Find(&items).Error
} else {
err = tx.Where("`domain`=?", domainName).Order("`position`,`id` ASC").Find(&items).Error
}
return items, err
},
dbcache.WithDB(u.db),
dbcache.WithCache(u.cache),
dbcache.WithDependency(u.sqlDependency),
)
}
func (u *Menu) GetLabels(ctx context.Context, domainName string) (values []*types.TypeValue[string], err error) {
return dbcache.TryCache(ctx, fmt.Sprintf("menu:labels:%s", domainName), func(tx *gorm.DB) ([]*types.TypeValue[string], error) {
return rest.ModelTypes[string](ctx, tx, &models.Menu{}, domainName, "label", "name")
},
dbcache.WithDB(u.db),
dbcache.WithCache(u.cache),
dbcache.WithDependency(u.sqlDependency),
)
}
func NewMenuLogic(db *gorm.DB, ch cache.Cache) *Menu {
return &Menu{
db: db,
cache: ch,
sqlDependency: dbcache.NewSqlDependency("SELECT MAX(`updated_at`) FROM `menus`"),
}
}