Skip to content

Commit 6a4e659

Browse files
committed
Migrate policy Granter
1 parent 0df83fa commit 6a4e659

File tree

2 files changed

+21
-33
lines changed

2 files changed

+21
-33
lines changed
Lines changed: 10 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import { type DiscoveryService } from '@golevelup/nestjs-discovery';
2-
import { SetMetadata } from '@nestjs/common';
1+
import { createMetadataDecorator } from '@seedcompany/nest';
32
import { type EnhancedResource, type Many, type ResourceShape } from '~/common';
43
import { type ResourceGranter } from './resource-granter';
54

@@ -27,25 +26,12 @@ import { type ResourceGranter } from './resource-granter';
2726
* }
2827
* }
2928
*/
30-
export const Granter = (
31-
resources: GranterMetadata['resources'],
32-
factory?: GranterMetadata['factory'],
33-
): ClassDecorator =>
34-
SetMetadata<any, GranterMetadata>(GRANTER_FACTORY_METADATA_KEY, {
35-
resources,
36-
factory,
37-
});
38-
39-
export const discover = (discovery: DiscoveryService) =>
40-
discovery.providersWithMetaAtKey<GranterMetadata>(
41-
GRANTER_FACTORY_METADATA_KEY,
42-
);
43-
44-
const GRANTER_FACTORY_METADATA_KEY = Symbol('GranterFactory');
45-
46-
interface GranterMetadata {
47-
resources: Many<ResourceShape<any>>;
48-
factory?: <TResourceStatic extends ResourceShape<any>>(
49-
resource: EnhancedResource<TResourceStatic>,
50-
) => ResourceGranter<TResourceStatic>;
51-
}
29+
export const Granter = createMetadataDecorator({
30+
setter: (
31+
resources: Many<ResourceShape<any>>,
32+
factory?: <TResourceStatic extends ResourceShape<any>>(
33+
resource: EnhancedResource<TResourceStatic>,
34+
) => ResourceGranter<TResourceStatic>,
35+
) => ({ resources, factory }),
36+
types: ['class'],
37+
});

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

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import { DiscoveryService } from '@golevelup/nestjs-discovery';
2-
import { Injectable } from '@nestjs/common';
1+
import { Injectable, type Type } from '@nestjs/common';
32
import { many, mapEntries } from '@seedcompany/common';
43
import { mapValues } from 'lodash';
5-
import { EnhancedResource } from '~/common';
4+
import { EnhancedResource, type ResourceShape } from '~/common';
5+
import { MetadataDiscovery } from '~/core/discovery';
66
import { ResourcesHost } from '~/core/resources';
7-
import { discover } from './builder/granter.decorator';
7+
import { Granter } from './builder/granter.decorator';
88
import {
99
DefaultResourceGranter,
1010
ResourceGranter,
@@ -14,21 +14,23 @@ import { type ResourcesGranter } from './granters';
1414
@Injectable()
1515
export class GrantersFactory {
1616
constructor(
17-
private readonly discovery: DiscoveryService,
17+
private readonly discovery: MetadataDiscovery,
1818
private readonly resourcesHost: ResourcesHost,
1919
) {}
2020

2121
async makeGranters() {
22-
const discoveredGranters = await discover(this.discovery);
22+
const discoveredGranters = this.discovery
23+
.discover(Granter)
24+
.classes<ResourceGranter<ResourceShape<any>>>();
2325

2426
const custom = Object.assign(
2527
{},
2628
...discoveredGranters.map(
27-
({ meta: { resources, factory }, discoveredClass }) =>
29+
({ meta: { resources, factory }, instance }) =>
2830
mapEntries(many(resources), (raw) => {
2931
const res = EnhancedResource.of(raw);
30-
const granter =
31-
factory?.(res) ?? new discoveredClass.dependencyType(res);
32+
const GranterImpl = instance.constructor as Type<ResourcesGranter>;
33+
const granter = factory?.(res) ?? new GranterImpl(res);
3234
if (!(granter instanceof ResourceGranter)) {
3335
throw new Error(
3436
`Granter for ${res.name} must extend ResourceGranter class`,

0 commit comments

Comments
 (0)