a · Les DTO
- Project: Werewolf
- About 30 minutes
- 3 exercises
This content is not available in your language yet.
En partie 3, POST /api/villages acceptait @Body() village: Village — mais rien ne garantissait que le corps envoyé ressemblait vraiment à un Village. Un DTO (Data Transfer Object) décrit la forme des données attendues à l’entrée d’une route.
export class CreerVillageDto { nombreDeJoueurs: number; rolesEnJeu: string[];}import { Body, Controller, Post } from '@nestjs/common';import { CreerVillageDto } from './dto/creer-village.dto.js';
@Controller('api/villages')export class VillagesController { @Post() creer(@Body() dto: CreerVillageDto) { // dto.nombreDeJoueurs et dto.rolesEnJeu sont typés }}C’est déjà mieux qu’un any implicite : ton éditeur connaît dto.nombreDeJoueurs, et une faute de frappe sur son nom est détectée à la compilation. Mais ce n’est qu’une promesse TypeScript — au moment où tsc a fini son travail, elle disparaît. Rien n’empêche encore un client d’envoyer { "nombreDeJoueurs": "beaucoup" }, une chaîne au lieu d’un nombre : à l’exécution, personne ne vérifie. La section b comble ce trou.
Exercises 4.1 to 4.3
Project: marketplaceCrée CreerProduitDto, avec nom: string, prix: number et categorie: string. Utilise-le dans @Body() sur POST /api/produits.
Ajoute un champ variantes: string[] à CreerProduitDto (les tailles ou coloris disponibles pour ce produit). Vérifie avec curl qu’un produit créé avec "variantes": ["S", "M", "L"] les renvoie bien telles quelles.
Envoie un POST /api/produits avec un prix négatif, et un autre sans le champ nom du tout. Observe : les deux sont acceptés, avec un statut 201. Garde ces deux requêtes sous le coude, tu les rejoueras en section b.
To check your work: npm run test:partie-4 (exercises repository)