Slide 1

Slide 1 text

#DevoxxFR Devoxx France 2021 Une API from scratch avec NestJS Sylvain Pontoreau @spontoreau Paul Souche @paulsouche 1

Slide 2

Slide 2 text

Présentation 2 Paul Souche @paulsouche Développeur @aircall Sylvain Pontoreau @spontoreau Chômeur @pole_emploi

Slide 3

Slide 3 text

#DevoxxFR Au programme 3 Introduction Auth CQRS TypeORM Swagger

Slide 4

Slide 4 text

#DevoxxFR 4 Introduction à NestJS

Slide 5

Slide 5 text

Main file import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory .create(AppModule); await app.listen(3000); } bootstrap(); 5

Slide 6

Slide 6 text

Premier module import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; @Module({ controllers: [AppController], providers: [AppService], }) export class AppModule {} 6

Slide 7

Slide 7 text

Un exemple de controller import { Controller, Get } from '@nestjs/common'; @Controller('/') export class AppController { @Get() hello(): string { return 'Hello Devoxx 2021'; } } 7

Slide 8

Slide 8 text

L'injection import { Controller, Get } from '@nestjs/common'; import { AppService } from './app.service'; @Controller('/') export class AppController { constructor( private readonly service: AppService ) {} @Get() findAll(): string { return this.service.sayHello(); } } 8

Slide 9

Slide 9 text

Un framework opiniated import { Module } from '@nestjs/common'; import { JwtModule } from '@nestjs/jwt'; import { PassportModule } from '@nestjs/passport'; @Module({ imports: [ JwtModule.register({ secretOrPrivateKey: process.ENV.JWT_SECRET, signOptions: { expiresIn: 3600, }, }), PassportModule.register({ defaultStrategy: 'jwt' }), ], }) export class AppModule {} 9

Slide 10

Slide 10 text

#DevoxxFR 10 Demo

Slide 11

Slide 11 text

#DevoxxFR 11 CQRS avec NestJS

Slide 12

Slide 12 text

#DevoxxFR Le pattern CQRS • CQS • Command : exécuter une tâche • Query : retourner une information • CQRS • Responsabilités ségrégées • Lecture != Écriture • Pure • https://www.eventstore.com/a-beginners-guide-to-cqrs 12

Slide 13

Slide 13 text

Première Query import { IQuery } from '@nestjs/cqrs'; export class SayHelloQuery implements IQuery { constructor( readonly name: string ) { } } 13

Slide 14

Slide 14 text

Handler import { QueryHandler, IQueryHandler } from '@nestjs/cqrs'; import { SayHelloQuery } from './sayHelloQuery'; @QueryHandler(SayHelloQuery) export class SayHelloQueryHandler implements IQueryHandler { execute({ name }: SayHelloQuery) { return `Hello ${ name }`; } } 14

Slide 15

Slide 15 text

Utilisation dans un contrôleur import { Controller, Get, Param } from '@nestjs/common'; import { QueryBus } from '@nestjs/cqrs'; import { SayHelloQuery } from './sayHello.query'; @Controller('/') export class AppController { constructor( private readonly queryBus: QueryBus ) { } @Get(':name') async sayHello(@Param() name: string) { return this.queryBus.execute( new SayHelloQuery(name) ); } } 15

Slide 16

Slide 16 text

Déclaration dans un module import { Module } from '@nestjs/common'; import { CqrsModule } from '@nestjs/cqrs'; import { SayHelloQueryHandler } from './sayHello.handler'; @Module({ imports: [CqrsModule], controllers: [AppController], providers: [SayHelloQueryHandler], }) export class AppModule {} 16

Slide 17

Slide 17 text

#DevoxxFR 17 Demo

Slide 18

Slide 18 text

#DevoxxFR Conclusion 18 https://github.com/paulsouche/devoxx-cfp-api

Slide 19

Slide 19 text

Ressources 1 9 NestJS ● Website : https://nestjs.com/ ● Doc: https://docs.nestjs.com/ ● TypeORM : https://docs.nestjs.com/recipes/sql-typeorm ● CQRS: https://docs.nestjs.com/recipes/cqrs ● Swagger: https://docs.nestjs.com/openapi/introduction Sample https://github.com/paulsouche/devoxx-cfp-api CQRS (guide) https://www.eventstore.com/a-beginners-guide-to-cqrs

Slide 20

Slide 20 text

#DevoxxFR 20 Des questions ?

Slide 21

Slide 21 text

#DevoxxFR 21 Merci