Skip to content

Commit ee122c5

Browse files
committed
Fix non-global class middlewares
1 parent 148bc99 commit ee122c5

8 files changed

+36
-22
lines changed

examples/4-middlewares/app.module.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
11
import { Module } from "@nestjs/common";
22
import { ApolloDriver } from "@nestjs/apollo";
33
import { TypeGraphQLModule } from "../../src";
4-
import { LoggingMiddleware } from "./logging/middleware";
54

5+
import { AppContext } from "./context";
66
import RecipeModule from "./recipe/module";
77
import LoggingModule from "./logging/module";
8+
import { GlobalLoggingMiddleware } from "./logging/global-logging-middleware";
89

910
@Module({
1011
imports: [
1112
TypeGraphQLModule.forRoot({
1213
driver: ApolloDriver,
1314
emitSchemaFile: true,
1415
// register middlewares in settings
15-
globalMiddlewares: [LoggingMiddleware],
16+
globalMiddlewares: [GlobalLoggingMiddleware],
17+
// use fake context
18+
context: (): AppContext => ({ user: "Johny Debugger" }),
1619
}),
1720
RecipeModule,
1821
// import module with middleware provider

examples/4-middlewares/context.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export interface AppContext {
2+
user?: string;
3+
}

examples/4-middlewares/logging/middleware.ts renamed to examples/4-middlewares/logging/global-logging-middleware.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ import { MiddlewareInterface, NextFn, ResolverData } from "type-graphql";
33
import { LoggingService } from "./service";
44

55
@Injectable()
6-
export class LoggingMiddleware implements MiddlewareInterface {
6+
export class GlobalLoggingMiddleware implements MiddlewareInterface {
77
constructor(private readonly loggingService: LoggingService) {}
88

99
async use({ info }: ResolverData, next: NextFn) {
1010
this.loggingService.writeLog(
11-
`${info.parentType.name}.${info.fieldName} resolver executed`,
11+
`${info.parentType.name}.${info.fieldName} resolver triggered`,
1212
);
1313
return next();
1414
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { Injectable } from "@nestjs/common";
2+
import { MiddlewareInterface, NextFn, ResolverData } from "type-graphql";
3+
import { LoggingService } from "./service";
4+
import { AppContext } from "../context";
5+
6+
@Injectable()
7+
export class LocalLoggingMiddleware implements MiddlewareInterface<AppContext> {
8+
constructor(private readonly loggingService: LoggingService) {}
9+
10+
async use({ context, info }: ResolverData<AppContext>, next: NextFn) {
11+
this.loggingService.writeLog(
12+
`${context.user ?? "Somebody"} has accessed ${info.parentType.name}.${info.fieldName}`,
13+
);
14+
return next();
15+
}
16+
}
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
import { Module } from "@nestjs/common";
2-
import { LoggingMiddleware } from "./middleware";
2+
import { GlobalLoggingMiddleware } from "./global-logging-middleware";
33

44
import { LoggingService } from "./service";
5+
import { LocalLoggingMiddleware } from "./local-logging-middleware";
56

67
@Module({
78
providers: [
89
LoggingService,
910
// register middleware class as provider
10-
LoggingMiddleware,
11+
GlobalLoggingMiddleware,
12+
LocalLoggingMiddleware,
1113
],
1214
})
1315
export default class LoggingModule {}

examples/4-middlewares/recipe/resolver.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import { Injectable } from "@nestjs/common";
2-
import { Resolver, Query, Mutation, Arg } from "type-graphql";
2+
import { Resolver, Query, Mutation, Arg, UseMiddleware } from "type-graphql";
33

44
import RecipeService from "./service";
55
import Recipe from "./type";
6+
import { LocalLoggingMiddleware } from "../logging/local-logging-middleware";
67

78
@Injectable()
89
@Resolver()
@@ -14,6 +15,7 @@ export default class RecipeResolver {
1415
return this.recipeService.getRecipes();
1516
}
1617

18+
@UseMiddleware(LocalLoggingMiddleware)
1719
@Mutation(returns => Recipe)
1820
addRecipe(@Arg("input") recipe: Recipe) {
1921
this.recipeService.addRecipe(recipe);

src/prepare-options.service.ts

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import { ModulesContainer, ModuleRef, ContextIdFactory } from "@nestjs/core";
33
import { REQUEST_CONTEXT_ID } from "@nestjs/core/router/request/request-constants";
44
import { InstanceWrapper } from "@nestjs/core/injector/instance-wrapper";
55
import { ClassType, ContainerType, getMetadataStorage } from "type-graphql";
6-
import { type Middleware } from "type-graphql/build/typings/typings/middleware";
76

87
import { TypeGraphQLFeatureModuleOptions } from "./types";
98

@@ -14,17 +13,10 @@ export default class OptionsPreparatorService {
1413
private readonly modulesContainer: ModulesContainer,
1514
) {}
1615

17-
prepareOptions(
18-
featureModuleToken: string,
19-
globalMiddlewares: Middleware<any>[] = [],
20-
) {
16+
prepareOptions(featureModuleToken: string) {
2117
const globalResolvers = getMetadataStorage().resolverClasses.map(
2218
metadata => metadata.target,
2319
);
24-
const globalMiddlewareClasses = globalMiddlewares.filter(
25-
it => it.prototype,
26-
) as Function[];
27-
2820
const featureModuleOptionsArray: TypeGraphQLFeatureModuleOptions[] = [];
2921
const resolversClasses: ClassType[] = [];
3022
const providersMetadataMap = new Map<Function, InstanceWrapper<any>>();
@@ -40,12 +32,9 @@ export default class OptionsPreparatorService {
4032
);
4133
}
4234
if (globalResolvers.includes(provider.metatype)) {
43-
providersMetadataMap.set(provider.metatype, provider);
4435
resolversClasses.push(provider.metatype as ClassType);
4536
}
46-
if (globalMiddlewareClasses.includes(provider.metatype)) {
47-
providersMetadataMap.set(provider.metatype, provider);
48-
}
37+
providersMetadataMap.set(provider.metatype, provider);
4938
}
5039
}
5140

src/typegraphql-options.factory.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,10 @@ export default class TypeGraphQLOptionsFactory implements GqlOptionsFactory {
2727
) {}
2828

2929
async createGqlOptions(): Promise<GqlModuleOptions> {
30-
const { globalMiddlewares, federationVersion } = this.rootModuleOptions;
30+
const { federationVersion } = this.rootModuleOptions;
3131
const { resolversClasses, container, orphanedTypes, referenceResolvers } =
3232
this.optionsPreparatorService.prepareOptions(
3333
TYPEGRAPHQL_FEATURE_MODULE_OPTIONS,
34-
globalMiddlewares,
3534
);
3635

3736
const isFederatedModule =

0 commit comments

Comments
 (0)