Cours NestJS · Module 11: Swagger et OpenAPI

Personnalisation de Swagger UI - Décorer le Forum des Annales

3 min de lecture
Dans cette leçon9

Tout comme le Forum Romanum était décoré de colonnes, de statues et de fresques, notre Swagger UI peut être personnalisé visuellement et fonctionnellement. NestJS offre de nombreuses options pour personnaliser l'interface de la documentation.

Options de SwaggerModule.setup()

Le quatrième paramètre de la méthode setup() permet une configuration avancée :

1SwaggerModule.setup('api/docs', app, document, {
2  customSiteTitle: 'Chronicles of Imperium Romanum',
3  customCss: '.swagger-ui .topbar { background-color: #8B0000; }',
4  swaggerOptions: {
5    persistAuthorization: true,
6    docExpansion: 'none',
7    filter: true,
8    showRequestDuration: true,
9    tryItOutEnabled: true,
10  },
11});

customSiteTitle - Nom du panneau d'affichage

Change le titre de la page dans le navigateur :

1SwaggerModule.setup('api/docs', app, document, {
2  customSiteTitle: 'Imperium API - Documentation',
3});

customCss - Fresques sur les murs

Permet d'ajouter des styles CSS personnalisés à Swagger UI :

1SwaggerModule.setup('api/docs', app, document, {
2  customCss: `
3    .swagger-ui .topbar { background-color: #8B0000; }
4    .swagger-ui .topbar-wrapper img { content: url('/logo.png'); }
5    .swagger-ui .info .title { color: #8B0000; }
6    .swagger-ui .btn.execute { background-color: #8B0000; }
7  `,
8});

swaggerOptions - Règlement du Forum

Options contrôlant le comportement de Swagger UI :

OptionDescriptionPar défaut
persistAuthorizationConserver le token JWT après actualisationfalse
docExpansionExpansion des sections par défaut'list'
filterAfficher le champ de recherchefalse
showRequestDurationAfficher le temps de réponsefalse
tryItOutEnabledMode test activé par défautfalse
defaultModelsExpandDepthProfondeur d'expansion des modèles1
defaultModelExpandDepthProfondeur d'expansion des champs de modèle1
1SwaggerModule.setup('api/docs', app, document, {
2  swaggerOptions: {
3    persistAuthorization: true,
4    docExpansion: 'none',
5    filter: true,
6    showRequestDuration: true,
7  },
8});

addBearerAuth - Configuration de l'autorisation

Configuration complète de l'authentification JWT dans Swagger :

1const config = new DocumentBuilder()
2  .setTitle('Imperium API')
3  .addBearerAuth(
4    {
5      type: 'http',
6      scheme: 'bearer',
7      bearerFormat: 'JWT',
8      name: 'JWT',
9      description: 'Enter JWT token',
10      in: 'header',
11    },
12    'JWT-auth',
13  )
14  .build();

Après cette configuration, un bouton « Authorize » apparaîtra dans Swagger UI où l'utilisateur pourra saisir son token JWT.

operationIdFactory - Noms des opérations

Chaque opération dans OpenAPI a un operationId unique. Tu peux contrôler la manière dont ils sont générés :

1const document = SwaggerModule.createDocument(app, config, {
2  operationIdFactory: (controllerKey: string, methodKey: string) =>
3    methodKey,
4});

Par défaut, NestJS génère operationId au format ControllerName_methodName. Le réglage ci-dessus utilisera uniquement le nom de la méthode.

Options de createDocument

La méthode createDocument() accepte des options supplémentaires :

1const document = SwaggerModule.createDocument(app, config, {
2  // Inclure uniquement les modules sélectionnés
3  include: [LegionModule, ProvinceModule],
4
5  // Profondeur d'imbrication des schémas
6  deepScanRoutes: true,
7
8  // Générateur d'operationId personnalisé
9  operationIdFactory: (controllerKey, methodKey) => methodKey,
10
11  // Modèles supplémentaires à inclure
12  extraModels: [ErrorResponseDto, PaginatedResponseDto],
13});

Sécuriser la documentation

Dans un environnement de production, il est utile de sécuriser l'accès à Swagger UI :

1import * as basicAuth from 'express-basic-auth';
2
3// Avant SwaggerModule.setup()
4app.use(
5  '/api/docs',
6  basicAuth({
7    challenge: true,
8    users: { admin: 'imperiumSecret123' },
9  }),
10);
11
12SwaggerModule.setup('api/docs', app, document);

Exercice pratique

Configure les options avancées de Swagger UI pour le projet Imperium :

Code de cette leçon : src/main.ts
1// Personnalisation de Swagger UI
2import { NestFactory } from '@nestjs/core';
3import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
4
5async function bootstrap() {
6  // const app = await NestFactory.create(AppModule);
7
8  const config = new DocumentBuilder()
9    .setTitle('Imperium Romanum API')
10    .setDescription('Imperium API Chronicles')
11    .setVersion('1.0')
12    // TODO: Ajoute addBearerAuth avec la configuration complète :
13    // type: 'http', scheme: 'bearer', bearerFormat: 'JWT'
14    .build();
15
16  // const document = SwaggerModule.createDocument(app, config);
17
18  // TODO: Configure SwaggerModule.setup avec les options :
19  // customSiteTitle: 'Imperium API Chronicles'
20  // swaggerOptions:
21  //   persistAuthorization: true
22  //   docExpansion: 'none'
23  //   filter: true
24  //   showRequestDuration: true
25
26  // SwaggerModule.setup('api/docs', app, document, {
27  //   // TODO: Ajoute customSiteTitle
28  //   // TODO: Ajoute swaggerOptions
29  // });
30
31  console.log("Swagger UI: http://localhost:3000/api/docs");
32}
33
34bootstrap();
35
36console.log("=== Options de personnalisation ===");
37console.log("customSiteTitle - titre de la page");
38console.log("customCss - styles CSS personnalisés");
39console.log("swaggerOptions.persistAuthorization - conserve le token");
40console.log("swaggerOptions.docExpansion - expansion des sections");
41console.log("swaggerOptions.filter - champ de recherche");
42console.log("swaggerOptions.showRequestDuration - temps de réponse");
43

Tu as repéré une erreur dans cette leçon ?

Teste tes connaissances

Réponds aux questions de cette leçon. Choisis une réponse pour voir tout de suite si elle est correcte.

  1. 1. Que fait l'option persistAuthorization dans swaggerOptions ?

  2. 2. Que change l'option customSiteTitle dans la configuration de SwaggerModule.setup() ?

Voici 2 des 3 questions de cette leçon. Réponds aux autres dans le jeu.

Tâches pratiques dans le jeu

  • Éditeur de code

    Complète les options de SwaggerModule.setup avec customSiteTitle et swaggerOptions

  • Tri horizontal

    Ordonne les éléments de la configuration addBearerAuth dans le bon ordre :

  • Éditeur de code

    Ajoute la documentation Swagger complète (tags, operation, params, responses, auth) au contrôleur des gladiateurs