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`"), } }