aeus-admin/internal/logic/role.go

66 lines
1.8 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 Role struct {
db *gorm.DB
cache cache.Cache
sqlDependency *dbcache.SqlDependency
permissionSqlDependency *dbcache.SqlDependency
}
func (u *Role) GetLabels(ctx context.Context) (values []*types.TypeValue[string], err error) {
values, err = dbcache.TryCache(ctx, fmt.Sprintf("role:labels"), func(tx *gorm.DB) ([]*types.TypeValue[string], error) {
return rest.ModelTypes[string](ctx, tx, &models.Role{}, "", "label", "name")
},
dbcache.WithDB(u.db),
dbcache.WithCache(u.cache),
dbcache.WithDependency(u.sqlDependency),
)
return
}
func (u *Role) GetPermissions(ctx context.Context, role string) (values []*models.Permission, err error) {
cacheKey := "role:permissions:"
if role == "" {
cacheKey += "all"
} else {
cacheKey += role
}
values, err = dbcache.TryCache(ctx, cacheKey, func(tx *gorm.DB) ([]*models.Permission, error) {
var items []*models.Permission
if role == "" {
err = tx.Find(&items).Error
} else {
err = tx.
Where("`permission` IN (SELECT `permission` FROM role_permissions WHERE `role` = ?)", role).
Find(&items).Error
}
return items, err
},
dbcache.WithDB(u.db),
dbcache.WithCache(u.cache),
dbcache.WithDependency(u.permissionSqlDependency),
)
return
}
func NewRoleLogic(db *gorm.DB, ch cache.Cache) *Role {
return &Role{
db: db,
cache: ch,
sqlDependency: dbcache.NewSqlDependency("SELECT MAX(`updated_at`) FROM `roles`"),
permissionSqlDependency: dbcache.NewSqlDependency("SELECT MAX(`updated_at`) FROM `permissions`"),
}
}