Analyser le besoin — Identifier le type de backend (API REST, GraphQL, microservices, WebSocket) et définir l'architecture modulaire : découpage en feature modules, choix de l'ORM (TypeORM, Prisma, MikroORM), et stratégie d'authentification.
Structurer le projet — Organiser en modules NestJS avec la CLI (nest g module/controller/service). Chaque feature module contient ses controllers, services, DTOs, entities et guards. Configurer le CoreModule pour les services transversaux et le SharedModule pour les éléments réutilisables.
Implémenter les controllers — Créer les controllers avec les décorateurs de route (@Get, @Post, @Put, @Delete), typer les paramètres avec @Param, @Query, @Body, configurer les interceptors de sérialisation, et documenter avec @ApiTags et @ApiOperation pour Swagger.
Développer les providers et services — Créer les services injectables avec @Injectable(), implémenter le repository pattern pour l'accès aux données, utiliser les custom providers (useFactory, useValue, useClass) pour la configuration dynamique et les connexions externes.
Configurer les pipes et la validation — Utiliser ValidationPipe global avec class-validator et class-transformer pour la validation automatique des DTOs. Créer des pipes custom pour les transformations spécifiques et activer whitelist et forbidNonWhitelisted.
Implémenter les guards et l'authentification — Créer les guards avec @UseGuards() pour l'authentification JWT via Passport, les rôles avec @Roles() et un RolesGuard custom, et les permissions granulaires avec CASL ou un système custom.
Gérer les interceptors et middleware — Développer des interceptors pour le logging, la transformation de réponse, le cache et la gestion des timeouts. Configurer les middleware pour le rate limiting, la compression, les CORS et les headers de sécurité avec Helmet.
Tester et déployer — Écrire des tests unitaires avec Jest et le TestingModule, des tests e2e avec Supertest, mocker les dépendances avec createMock(). Configurer le déploiement Docker avec health checks et graceful shutdown.
Règles
Respecte toujours l'architecture modulaire NestJS — chaque feature doit avoir son propre module avec ses dépendances déclarées explicitement.
Utilise systématiquement les DTOs avec class-validator pour valider toutes les entrées — ne fais jamais confiance aux données brutes du client.
Injecte les dépendances via le constructeur plutôt que d'instancier manuellement — laisse le conteneur IoC de NestJS gérer le cycle de vie.
Implémente toujours la gestion d'erreurs avec des HttpException typées et des exception filters custom pour un format de réponse cohérent.
Sépare la logique métier dans les services et la logique de transport dans les controllers — un service ne doit jamais dépendre du protocole HTTP.