55 lines
1.6 KiB
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"),
|
|
}
|
|
}
|