Skip to content

Commit 2d15059

Browse files
committed
Migrate policy Policy
1 parent 6a4e659 commit 2d15059

File tree

2 files changed

+17
-29
lines changed

2 files changed

+17
-29
lines changed
Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { SetMetadata } from '@nestjs/common';
1+
import { createMetadataDecorator } from '@seedcompany/nest';
22
import type { ValueOf } from 'type-fest';
33
import { type Many, type Role } from '~/common';
44
import type { ResourcesGranter } from '../granters';
@@ -7,18 +7,13 @@ type ResourceGranterFn = (
77
resourcesGranter: ResourcesGranter,
88
) => Many<Many<ValueOf<ResourcesGranter>>>;
99

10-
export const POLICY_METADATA_KEY = Symbol('Policy');
11-
12-
export const Policy = (
13-
role: Many<Role> | 'all',
14-
privilegesForResources: ResourceGranterFn,
15-
): ClassDecorator =>
16-
SetMetadata<any, PolicyMetadata>(POLICY_METADATA_KEY, {
10+
export const Policy = createMetadataDecorator({
11+
setter: (
12+
role: Many<Role> | 'all',
13+
privilegesForResources: ResourceGranterFn,
14+
) => ({
1715
role,
1816
def: privilegesForResources,
19-
});
20-
21-
export interface PolicyMetadata {
22-
role: Many<Role> | 'all';
23-
def: ResourceGranterFn;
24-
}
17+
}),
18+
types: ['class'],
19+
});

src/components/authorization/policy/policy.factory.ts

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
1-
import {
2-
type DiscoveredClassWithMeta,
3-
DiscoveryService,
4-
} from '@golevelup/nestjs-discovery';
51
import { Injectable, type OnModuleInit } from '@nestjs/common';
62
import { entries, mapEntries, mapValues, setOf } from '@seedcompany/common';
73
import { pick, startCase } from 'lodash';
84
import { type DeepWritable, type Writable } from 'ts-essentials';
95
import { type EnhancedResource, many, type Role } from '~/common';
6+
import { type DiscoveredClass, MetadataDiscovery } from '~/core/discovery';
107
import { ResourcesHost } from '~/core/resources';
118
import { Power } from '../dto';
129
import { ChildListAction, ChildSingleAction } from './actions';
@@ -15,10 +12,7 @@ import {
1512
type Permission,
1613
type Permissions,
1714
} from './builder/perm-granter';
18-
import {
19-
POLICY_METADATA_KEY,
20-
type PolicyMetadata,
21-
} from './builder/policy.decorator';
15+
import { Policy as PolicyMetadata } from './builder/policy.decorator';
2216
import { all, any, Condition } from './conditions';
2317
import { type ResourcesGranter } from './granters';
2418
import { GrantersFactory } from './granters.factory';
@@ -53,7 +47,7 @@ export class PolicyFactory implements OnModuleInit {
5347

5448
constructor(
5549
private readonly grantersFactory: GrantersFactory,
56-
private readonly discovery: DiscoveryService,
50+
private readonly discovery: MetadataDiscovery,
5751
private readonly resourcesHost: ResourcesHost,
5852
) {}
5953

@@ -72,10 +66,9 @@ export class PolicyFactory implements OnModuleInit {
7266
}
7367

7468
async onModuleInit() {
75-
const discoveredPolicies =
76-
await this.discovery.providersWithMetaAtKey<PolicyMetadata>(
77-
POLICY_METADATA_KEY,
78-
);
69+
const discoveredPolicies = this.discovery
70+
.discover(PolicyMetadata)
71+
.classes();
7972

8073
const resGranter = await this.grantersFactory.makeGranters();
8174

@@ -99,9 +92,9 @@ export class PolicyFactory implements OnModuleInit {
9992

10093
private buildPlainPolicy(
10194
resGranter: ResourcesGranter,
102-
{ meta, discoveredClass }: DiscoveredClassWithMeta<PolicyMetadata>,
95+
{ meta, instance }: DiscoveredClass<(typeof PolicyMetadata)['$value']>,
10396
): PlainPolicy {
104-
const name = startCase(discoveredClass.name.replace(/Policy$/, ''));
97+
const name = startCase(instance.constructor.name.replace(/Policy$/, ''));
10598

10699
const roles = meta.role === 'all' ? undefined : setOf(many(meta.role));
107100

0 commit comments

Comments
 (0)