Подготовка данных для доступов
Для формирования любых доступов нужны данные, получаемые из API.
Каждая policy указывает какие данные нужны для доступов
Каждая policy определяет метод подготовки данных, которые нужны для формирования запросов.
Пример
В BooksPolicy
для формирования доступа addingToShelf
требуются данные из UserRepository
и BillingRepository
.
При создании policy
необходимо указать как получить эти данные:
// @astral/permissions в реальном коде должен реэкспортироваться через shared
import { PolicyManagerStore, Policy } from '@astral/permissions';
export class BooksPolicyStore {
private readonly policy: PermissionsPolicy;
constructor(
policyManager: PolicyManagerStore,
private readonly billingRepo: BillingRepository,
private readonly userRepo: UserRepository,
) {
makeAutoObservable(this, {}, { autoBind: true });
this.policy = policyManager.createPolicy({
name: 'books',
// prepareData будет вызван одновременно с другими policy посредством policyManager
prepareData: async () => {
await Promise.all([
this.userRepo.getRolesQuery().async(),
this.userRepo.getPersonInfoQuery().async(),
this.billingRepo.getBillingInfoQuery().async(),
]);
},
});
}
/**
* Возможность добавить на полку книгу
*/
public get addingToShelf() {
return this.policy.createPermission((allow, deny) => {
if (this.userRepo.getRolesQuery().data?.isAdmin) {
return allow();
}
const billingInfo = this.billingRepo.getBillingInfoQuery()?.data;
if (!billingInfo?.paid) {
return deny(PermissionDenialReason.NoPayAccount);
}
if (
billingInfo.info.shelf.currentCount >=
billingInfo.info.shelf.allowedCount
) {
return deny(PermissionDenialReason.ExceedShelfCount);
}
allow();
});
}
}