package useCases import ( "RenewCMS/internal/domain/role" "RenewCMS/internal/domain/user" "errors" ) type CheckPermissionUseCase struct { roles role.Repository } func NewCheckPermissionUseCase(roles role.Repository) *CheckPermissionUseCase { return &CheckPermissionUseCase{roles: roles} } func (c *CheckPermissionUseCase) Grants(account user.User) (role.GrantSet, error) { resolved, err := resolveRole(c.roles, account) if errors.Is(err, role.ErrRoleNotFound) { return role.GrantSet{}, nil } if err != nil { return role.GrantSet{}, err } return resolved.GrantSet(), nil } func (c *CheckPermissionUseCase) Require(account user.User, key string) (role.GrantSet, error) { return c.RequireFor(account, key, "") } func (c *CheckPermissionUseCase) RequireFor(account user.User, key string, typeKey string) (role.GrantSet, error) { grants, err := c.Grants(account) if err != nil { return role.GrantSet{}, err } if !grants.HoldsFor(key, typeKey) { return role.GrantSet{}, role.MissingPermissionError{Key: key} } return grants, nil } func (c *CheckPermissionUseCase) RequireAll(account user.User, key string) (role.GrantSet, error) { grants, err := c.Grants(account) if err != nil { return role.GrantSet{}, err } if !grants.HoldsAll(key) { return role.GrantSet{}, role.MissingPermissionError{Key: key} } return grants, nil }