aeus-admin/internal/logic/role.go

55 lines
1.6 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/rest"
"git.nobla.cn/golang/rest/types"
"gorm.io/gorm"
)
type Role struct {
db *gorm.DB
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.WithDependency(u.sqlDependency),
)
return
}
func (u *Role) GetPermissions(ctx context.Context, role string) (values []*models.Permission, err error) {
values, err = dbcache.TryCache(ctx, fmt.Sprintf("role:permissions-items:%s", role), 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.WithDependency(u.permissionSqlDependency),
)
return
}
func NewRoleLogic(db *gorm.DB) *Role {
return &Role{
db: db,
sqlDependency: dbcache.NewSqlDependency("SELECT MAX(`updated_at`) FROM roles"),
permissionSqlDependency: dbcache.NewSqlDependency("SELECT MAX(`updated_at`) FROM permissions"),
}
}