Skip to content

Commit 4f45747

Browse files
committed
Migrate HandleIdLookup
1 parent 3ffe823 commit 4f45747

File tree

1 file changed

+20
-27
lines changed

1 file changed

+20
-27
lines changed

src/core/resources/resource-resolver.service.ts

Lines changed: 20 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import { DiscoveryService } from '@golevelup/nestjs-discovery';
2-
import { Injectable, SetMetadata } from '@nestjs/common';
1+
import { Injectable } from '@nestjs/common';
32
import { GraphQLSchemaHost } from '@nestjs/graphql';
4-
import { asNonEmptyArray } from '@seedcompany/common';
3+
import { asNonEmptyArray, setOf } from '@seedcompany/common';
4+
import { createMetadataDecorator } from '@seedcompany/nest';
55
import { GraphQLObjectType } from 'graphql';
66
import type { ValueOf } from 'type-fest';
77
import {
@@ -11,16 +11,12 @@ import {
1111
type ObjectView,
1212
ServerException,
1313
} from '~/common';
14+
import { MetadataDiscovery } from '~/core/discovery';
1415
import { type BaseNode } from '../database/results';
1516
import { ILogger, Logger } from '../logger';
1617
import { type ResourceMap } from './map';
1718
import { ResourcesHost } from './resources.host';
1819

19-
const RESOLVE_BY_ID = 'RESOLVE_BY_ID';
20-
interface Shape {
21-
type: ReadonlyArray<keyof ResourceMap>;
22-
}
23-
2420
type SomeResource = ValueOf<ResourceMap>;
2521

2622
/**
@@ -33,10 +29,12 @@ type SomeResource = ValueOf<ResourceMap>;
3329
*
3430
* {@link ResourceResolver} can be used to invoke this function.
3531
*/
36-
export const HandleIdLookup = (type: Many<SomeResource>) =>
37-
SetMetadata<string, Shape>(RESOLVE_BY_ID, {
38-
type: many(type).map((cls) => cls.name as keyof ResourceMap),
39-
});
32+
export const HandleIdLookup = createMetadataDecorator({
33+
setter: (type: Many<SomeResource>) => ({
34+
types: setOf(many(type).map((cls) => cls.name as keyof ResourceMap)),
35+
}),
36+
types: ['method'],
37+
});
4038

4139
/**
4240
* Allows looking up GraphQL objects from DB Nodes.
@@ -55,7 +53,7 @@ export class ResourceResolver {
5553
private readonly typeCache = new Map<string, keyof ResourceMap | Error>();
5654

5755
constructor(
58-
private readonly discover: DiscoveryService,
56+
private readonly discovery: MetadataDiscovery,
5957
private readonly resourcesHost: ResourcesHost,
6058
private readonly schemaHost: GraphQLSchemaHost,
6159
@Logger('resource-resolver') private readonly logger: ILogger,
@@ -94,28 +92,23 @@ export class ResourceResolver {
9492
view?: ObjectView,
9593
): Promise<SomeResource['prototype'] & { __typename: string }> {
9694
const type = this.resolveType(possibleTypes);
97-
const discovered = await this.discover.providerMethodsWithMetaAtKey<Shape>(
98-
RESOLVE_BY_ID,
99-
);
95+
const discovered = this.discovery
96+
.discover(HandleIdLookup)
97+
.methods<
98+
(id: ID, view?: ObjectView) => Promise<SomeResource['prototype']>
99+
>();
100100
const filtered = asNonEmptyArray(
101-
discovered.filter((f) => f.meta.type.includes(type)),
101+
discovered.filter((f) => f.meta.types.has(type)),
102102
);
103103
if (!filtered) {
104104
throw new ServerException(`Could find resolver for type: ${type}`);
105105
}
106106
if (filtered.length > 1) {
107107
this.logger.warning(`Found more than one resolver for ${type}`);
108108
}
109-
const method = filtered[0].discoveredMethod;
110-
const result = await method.handler.call(
111-
method.parentClass.instance,
112-
id,
113-
view,
114-
);
115-
return {
116-
__typename: type,
117-
...result,
118-
};
109+
const { method } = filtered[0];
110+
const result = await method(id, view);
111+
return Object.assign({ __typename: type }, result);
119112
}
120113

121114
resolveTypeByBaseNode(node: BaseNode) {

0 commit comments

Comments
 (0)