Skip to content

Commit fdb499b

Browse files
committed
fix(middlewares): support class-based middlewares
1 parent 49971f5 commit fdb499b

14 files changed

Lines changed: 188 additions & 8 deletions
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { Module } from "@nestjs/common";
2+
import { TypeGraphQLModule } from "../../src";
3+
import { LoggingMiddleware } from "./logging/middleware";
4+
5+
import RecipeModule from "./recipe/module";
6+
import LoggingModule from "./logging/module";
7+
8+
@Module({
9+
imports: [
10+
TypeGraphQLModule.forRoot({
11+
emitSchemaFile: true,
12+
validate: false,
13+
// register middlewares in settings
14+
globalMiddlewares: [LoggingMiddleware],
15+
}),
16+
RecipeModule,
17+
// import module with middleware provider
18+
LoggingModule,
19+
],
20+
})
21+
export default class AppModule {}

examples/5-middlewares/index.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import "reflect-metadata";
2+
import { NestFactory } from "@nestjs/core";
3+
import {
4+
NestFastifyApplication,
5+
FastifyAdapter,
6+
} from "@nestjs/platform-fastify";
7+
8+
import AppModule from "./app.module";
9+
10+
async function bootstrap() {
11+
const app = await NestFactory.create<NestFastifyApplication>(
12+
AppModule,
13+
new FastifyAdapter(),
14+
);
15+
16+
await app.listen(3000);
17+
}
18+
19+
bootstrap();
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { Injectable } from "@nestjs/common";
2+
import { MiddlewareInterface, NextFn, ResolverData } from "type-graphql";
3+
import { LoggingService } from "./service";
4+
5+
@Injectable()
6+
export class LoggingMiddleware implements MiddlewareInterface {
7+
constructor(private readonly loggingService: LoggingService) {}
8+
9+
async use({ info }: ResolverData, next: NextFn) {
10+
this.loggingService.writeLog(
11+
`${info.parentType.name}.${info.fieldName} resolver executed`,
12+
);
13+
return next();
14+
}
15+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { Module } from "@nestjs/common";
2+
import { LoggingMiddleware } from "./middleware";
3+
4+
import { LoggingService } from "./service";
5+
6+
@Module({
7+
providers: [
8+
LoggingService,
9+
// register middleware class as provider
10+
LoggingMiddleware,
11+
],
12+
})
13+
export default class LoggingModule {}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { Injectable } from "@nestjs/common";
2+
3+
@Injectable()
4+
export class LoggingService {
5+
writeLog(...args: any[]) {
6+
// replace with more sophisticated solution :)
7+
console.log(...args);
8+
}
9+
}

examples/5-middlewares/query.gql

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
query GetRecipes {
2+
recipes {
3+
title
4+
description
5+
}
6+
}
7+
8+
mutation AddRecipe {
9+
addRecipe(input: { title: "My Recipe", description: "My description" }) {
10+
title
11+
description
12+
}
13+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { Module } from "@nestjs/common";
2+
3+
import RecipeResolver from "./resolver";
4+
import RecipeService from "./service";
5+
6+
@Module({
7+
providers: [RecipeResolver, RecipeService],
8+
})
9+
export default class RecipeModule {}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { Injectable } from "@nestjs/common";
2+
import { Resolver, Query, Mutation, Arg } from "type-graphql";
3+
4+
import RecipeService from "./service";
5+
import Recipe from "./type";
6+
7+
@Injectable()
8+
@Resolver()
9+
export default class RecipeResolver {
10+
constructor(private readonly recipeService: RecipeService) {}
11+
12+
@Query(returns => [Recipe])
13+
recipes() {
14+
return this.recipeService.getRecipes();
15+
}
16+
17+
@Mutation(returns => Recipe)
18+
addRecipe(@Arg("input") recipe: Recipe) {
19+
this.recipeService.addRecipe(recipe);
20+
return recipe;
21+
}
22+
}
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+
3+
import Recipe from "./type";
4+
5+
@Injectable()
6+
export default class RecipeService {
7+
private readonly recipes: Recipe[] = [];
8+
9+
getRecipes() {
10+
return this.recipes;
11+
}
12+
13+
addRecipe(recipe: Recipe) {
14+
this.recipes.push(recipe);
15+
}
16+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { ObjectType, Field, InputType } from "type-graphql";
2+
3+
@ObjectType()
4+
@InputType("RecipeInput")
5+
export default class Recipe {
6+
@Field()
7+
title!: string;
8+
9+
@Field({ nullable: true })
10+
description?: string;
11+
}

0 commit comments

Comments
 (0)