Skip to content

Commit da8c23a

Browse files
fix(): address minor issues, fix subscriptions support (mercurius)
1 parent 6a84892 commit da8c23a

File tree

10 files changed

+68
-26
lines changed

10 files changed

+68
-26
lines changed

packages/apollo/lib/drivers/apollo-base.driver.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
import { GraphQLError, GraphQLFormattedError } from 'graphql';
1616
import * as omit from 'lodash.omit';
1717
import { ApolloDriverConfig } from '../interfaces';
18+
import { createAsyncIterator } from '../utils/async-iterator.util';
1819

1920
const apolloPredefinedExceptions: Partial<
2021
Record<HttpStatus, typeof ApolloError | typeof UserInputError>
@@ -97,6 +98,23 @@ export abstract class ApolloBaseDriver<
9798
return options;
9899
}
99100

101+
public subscriptionWithFilter(
102+
instanceRef: unknown,
103+
filterFn: (
104+
payload: any,
105+
variables: any,
106+
context: any,
107+
) => boolean | Promise<boolean>,
108+
createSubscribeContext: Function,
109+
) {
110+
return <TPayload, TVariables, TContext, TInfo>(
111+
...args: [TPayload, TVariables, TContext, TInfo]
112+
): any =>
113+
createAsyncIterator(createSubscribeContext()(...args), (payload: any) =>
114+
filterFn.call(instanceRef, payload, ...args.slice(1)),
115+
);
116+
}
117+
100118
protected async registerExpress(
101119
apolloOptions: T,
102120
{ preStartHook }: { preStartHook?: () => void } = {},

packages/graphql/lib/drivers/abstract-graphql.driver.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,18 @@ export abstract class AbstractGraphQLDriver<
3636
return clonedOptions;
3737
}
3838

39+
public subscriptionWithFilter(
40+
instanceRef: unknown,
41+
filterFn: (
42+
payload: any,
43+
variables: any,
44+
context: any,
45+
) => boolean | Promise<boolean>,
46+
createSubscribeContext: Function,
47+
) {
48+
return createSubscribeContext();
49+
}
50+
3951
protected getNormalizedPath(options: TOptions): string {
4052
const prefix = this.applicationConfig.getGlobalPrefix();
4153
const useGlobalPrefix = prefix && options.useGlobalPrefix;

packages/graphql/lib/graphql.module.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
} from '@nestjs/common/interfaces';
88
import { HttpAdapterHost } from '@nestjs/core';
99
import { MetadataScanner } from '@nestjs/core/metadata-scanner';
10-
import { AbstractGraphQLDriver } from '.';
10+
import { AbstractGraphQLDriver } from './drivers/abstract-graphql.driver';
1111
import { GraphQLFederationFactory } from './federation/graphql-federation.factory';
1212
import { GraphQLAstExplorer } from './graphql-ast.explorer';
1313
import { GraphQLSchemaBuilder } from './graphql-schema.builder';

packages/graphql/lib/schema-builder/storages/type-metadata.storage.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ export class TypeMetadataStorageHost {
202202
}
203203

204204
addMethodParamMetadata(metadata: MethodArgsMetadata) {
205-
this.params.push(metadata);
205+
this.params.unshift(metadata);
206206
}
207207

208208
compile(orphanedTypes: (Function | object)[] = []) {

packages/graphql/lib/services/resolvers-explorer.service.ts

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { isUndefined } from '@nestjs/common/utils/shared.utils';
33
import {
44
createContextId,
55
MetadataScanner,
6+
ModuleRef,
67
ModulesContainer,
78
REQUEST,
89
} from '@nestjs/core';
@@ -18,7 +19,8 @@ import { Module } from '@nestjs/core/injector/module';
1819
import { REQUEST_CONTEXT_ID } from '@nestjs/core/router/request/request-constants';
1920
import { GraphQLResolveInfo } from 'graphql';
2021
import { head, identity } from 'lodash';
21-
import { GqlModuleOptions, SubscriptionOptions } from '..';
22+
import { SubscriptionOptions } from '../decorators/subscription.decorator';
23+
import { AbstractGraphQLDriver } from '../drivers/abstract-graphql.driver';
2224
import { GqlParamtype } from '../enums/gql-paramtype.enum';
2325
import { Resolver } from '../enums/resolver.enum';
2426
import { GqlParamsFactory } from '../factories/params.factory';
@@ -30,8 +32,8 @@ import {
3032
SUBSCRIPTION_OPTIONS_METADATA,
3133
SUBSCRIPTION_TYPE,
3234
} from '../graphql.constants';
35+
import { GqlModuleOptions } from '../interfaces';
3336
import { ResolverMetadata } from '../interfaces/resolver-metadata.interface';
34-
import { createAsyncIterator } from '../utils/async-iterator.util';
3537
import { decorateFieldResolverWithMiddleware } from '../utils/decorate-field-resolver.util';
3638
import { extractMetadata } from '../utils/extract-metadata.util';
3739
import { BaseExplorerService } from './base-explorer.service';
@@ -49,6 +51,7 @@ export class ResolversExplorerService extends BaseExplorerService {
4951
private readonly externalContextCreator: ExternalContextCreator,
5052
@Inject(GRAPHQL_MODULE_OPTIONS)
5153
private readonly gqlOptions: GqlModuleOptions,
54+
private readonly moduleRef: ModuleRef,
5255
) {
5356
super();
5457
}
@@ -58,13 +61,15 @@ export class ResolversExplorerService extends BaseExplorerService {
5861
this.modulesContainer,
5962
this.gqlOptions.include || [],
6063
);
64+
const gqlAdapter = this.moduleRef.get(AbstractGraphQLDriver);
6165
const resolvers = this.flatMap(modules, (instance, moduleRef) =>
62-
this.filterResolvers(instance, moduleRef),
66+
this.filterResolvers(gqlAdapter, instance, moduleRef),
6367
);
6468
return this.groupMetadata(resolvers);
6569
}
6670

6771
filterResolvers(
72+
gqlAdapter: AbstractGraphQLDriver,
6873
wrapper: InstanceWrapper,
6974
moduleRef: Module,
7075
): ResolverMetadata[] {
@@ -118,6 +123,7 @@ export class ResolversExplorerService extends BaseExplorerService {
118123
instance[resolver.methodName],
119124
);
120125
return this.createSubscriptionMetadata(
126+
gqlAdapter,
121127
createContext,
122128
subscriptionOptions,
123129
resolver,
@@ -238,6 +244,7 @@ export class ResolversExplorerService extends BaseExplorerService {
238244
}
239245

240246
createSubscriptionMetadata(
247+
gqlAdapter: AbstractGraphQLDriver,
241248
createSubscribeContext: Function,
242249
subscriptionOptions: SubscriptionOptions,
243250
resolverMetadata: ResolverMetadata,
@@ -255,16 +262,11 @@ export class ResolversExplorerService extends BaseExplorerService {
255262
...resolverMetadata,
256263
callback: {
257264
...baseCallbackMetadata,
258-
subscribe: <TPayload, TVariables, TContext, TInfo>(
259-
...args: [TPayload, TVariables, TContext, TInfo]
260-
) =>
261-
createAsyncIterator(createSubscribeContext()(...args), (payload) =>
262-
(subscriptionOptions.filter as Function).call(
263-
instanceRef,
264-
payload,
265-
...args.slice(1),
266-
),
267-
),
265+
subscribe: gqlAdapter.subscriptionWithFilter(
266+
instanceRef,
267+
subscriptionOptions.filter,
268+
createSubscribeContext,
269+
),
268270
},
269271
};
270272
}

packages/graphql/lib/utils/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
export * from './async-iterator.util';
21
export * from './extend.util';
32
export * from './extract-metadata.util';
43
export * from './generate-token.util';

packages/mercurius/lib/drivers/mercurius.driver.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,21 @@ export class MercuriusDriver extends AbstractGraphQLDriver<MercuriusDriverConfig
5151
return options;
5252
}
5353

54+
public subscriptionWithFilter(
55+
instanceRef: unknown,
56+
filterFn: (
57+
payload: any,
58+
variables: any,
59+
context: any,
60+
) => boolean | Promise<boolean>,
61+
createSubscribeContext: Function,
62+
) {
63+
return mercurius.withFilter(
64+
createSubscribeContext(),
65+
(...args: unknown[]) => filterFn.call(instanceRef, ...args),
66+
) as any;
67+
}
68+
5469
private wrapContextResolver(
5570
targetOptions: MercuriusDriverConfig,
5671
originalOptions: MercuriusDriverConfig = { ...targetOptions },

packages/mercurius/tests/graphql-federation/gateway/config/config.service.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,12 @@ import { Injectable } from '@nestjs/common';
22
import {
33
MercuriusDriverConfig,
44
MercuriusDriverConfigFactory,
5-
MercuriusGatewayDriver,
65
} from '../../../../lib';
76

87
@Injectable()
98
export class ConfigService implements MercuriusDriverConfigFactory {
109
public createGqlOptions(): Partial<MercuriusDriverConfig> {
1110
return {
12-
driver: MercuriusGatewayDriver,
1311
gateway: {
1412
services: [
1513
{ name: 'users', url: 'http://localhost:3011/graphql' },

packages/mercurius/tests/subscriptions/app/notification.resolver.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,12 @@ export class NotificationResolver {
1717

1818
@UseGuards(AuthGuard)
1919
@Subscription(() => Notification, {
20-
// filter(payload, variables, context) {
21-
// // console.log('in filter', { payload, variables, context });
22-
// // return (
23-
// // context.user === payload.newNotification.recipient &&
24-
// // payload.newNotification.id === variables.id
25-
// // );
26-
// return true;
27-
// },
20+
filter(payload, variables, context) {
21+
return (
22+
context.user === payload.newNotification.recipient &&
23+
payload.newNotification.id === variables.id
24+
);
25+
},
2826
})
2927
newNotification(
3028
@Args('id', {

0 commit comments

Comments
 (0)