Communitygithub.com

nestjs-patterns (Patrons d'architecture NestJS)

Patrons d'architecture NestJS pour modules, contrôleurs, fournisseurs, validation DTO, gardes, intercepteurs, configuration et backends TypeScript de qualité production. À utiliser lors de la construction ou de la révision d'un backend NestJS.

Qu'est-ce que nestjs-patterns (Patrons d'architecture NestJS) ?

Ce skill définit un ensemble de bonnes pratiques et de patrons d'architecture pour développer des backends NestJS robustes et maintenables. Il couvre les aspects fondamentaux de NestJS : la structure modulaire du projet, la configuration de la validation globale avec `class-validator`, la gestion de l'authentification via des gardes (guards) et des intercepteurs, la mise en place de filtres d'exception cohérents, la validation de l'environnement, et l'intégration de bases de données (Prisma/TypeORM). Il insiste sur la séparation des responsabilités : les contrôleurs doivent être légers, la logique métier placée dans des services injectables, et les DTOs dédiés à la validation des entrées. Le skill fournit des exemples de code concrets pour le bootstrap de l'application, la structuration des modules, la création de DTOs, l'implémentation de gardes personnalisées, et les tests unitaires. Il est conçu pour les développeurs utilisant NestJS avec TypeScript, quel que soit l'IDE ou l'outil d'agent (Claude Code, Cursor, Codex), et s'applique aussi bien à la création qu'à la révision de code existant.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/affaan-m/ECC/tree/main/skills/nestjs-patterns

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Patrons de développement NestJS

Patrons NestJS de qualité production pour des backends TypeScript modulaires.

Quand activer

  • Construction d'API ou de services NestJS
  • Structuration de modules, contrôleurs et fournisseurs
  • Ajout de validation DTO, gardes, intercepteurs ou filtres d'exception
  • Configuration de paramètres adaptés à l'environnement et d'intégrations de bases de données
  • Test de modules NestJS ou d'endpoints HTTP

Structure du projet

src/
├── app.module.ts
├── main.ts
├── common/
│   ├── filters/
│   ├── guards/
│   ├── interceptors/
│   └── pipes/
├── config/
│   ├── configuration.ts
│   └── validation.ts
├── modules/
│   ├── auth/
│   │   ├── auth.controller.ts
│   │   ├── auth.module.ts
│   │   ├── auth.service.ts
│   │   ├── dto/
│   │   ├── guards/
│   │   └── strategies/
│   └── users/
│       ├── dto/
│       ├── entities/
│       ├── users.controller.ts
│       ├── users.module.ts
│       └── users.service.ts
└── prisma/ ou database/
  • Conserver le code métier dans les modules fonctionnels.
  • Placer les filtres, décorateurs, gardes et intercepteurs transversaux dans common/.
  • Garder les DTOs proches du module qui les possède.

Bootstrap et validation globale

async function bootstrap() {
  const app = await NestFactory.create(AppModule, { bufferLogs: true });

  app.useGlobalPipes(
    new ValidationPipe({
      whitelist: true,
      forbidNonWhitelisted: true,
      transform: true,
      transformOptions: { enableImplicitConversion: true },
    }),
  );

  app.useGlobalInterceptors(new ClassSerializerInterceptor(app.get(Reflector)));
  app.useGlobalFilters(new HttpExceptionFilter());

  await app.listen(process.env.PORT ?? 3000);
}
bootstrap();
  • Toujours activer whitelist et forbidNonWhitelisted sur les API publiques.
  • Préférer un seul pipe de validation global plutôt que de répéter la configuration de validation par route.

Modules, contrôleurs et fournisseurs

@Module({
  controllers: [UsersController],
  providers: [UsersService],
  exports: [UsersService],
})
export class UsersModule {}

@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Get(':id')
  getById(@Param('id', ParseUUIDPipe) id: string) {
    return this.usersService.getById(id);
  }

  @Post()
  create(@Body() dto: CreateUserDto) {
    return this.usersService.create(dto);
  }
}

@Injectable()
export class UsersService {
  constructor(private readonly usersRepo: UsersRepository) {}

  async create(dto: CreateUserDto) {
    return this.usersRepo.create(dto);
  }
}
  • Les contrôleurs doivent rester légers : analyser l'entrée HTTP, appeler un fournisseur, retourner des DTOs de réponse.
  • Mettre la logique métier dans des services injectables, pas dans les contrôleurs.
  • Exporter uniquement les fournisseurs dont les autres modules ont réellement besoin.

DTOs et validation

export class CreateUserDto {
  @IsEmail()
  email!: string;

  @IsString()
  @Length(2, 80)
  name!: string;

  @IsOptional()
  @IsEnum(UserRole)
  role?: UserRole;
}
  • Valider chaque DTO de requête avec class-validator.
  • Utiliser des DTOs de réponse dédiés ou des sérialiseurs plutôt que de retourner directement les entités ORM.
  • Éviter de divulguer des champs internes tels que les hachages de mot de passe, les jetons ou les colonnes d'audit.

Authentification, gardes et contexte de requête

@UseGuards(JwtAuthGuard, RolesGuard)
@Roles('admin')
@Get('admin/report')
getAdminReport(@Req() req: AuthenticatedRequest) {
  return this.reportService.getForUser(req.user.id);
}
  • Garder les stratégies d'authentification et les gardes locaux aux modules sauf s'ils sont vraiment partagés.
  • Coder les règles d'accès grossières dans les gardes, puis effectuer l'autorisation spécifique aux ressources dans les services.
  • Préférer des types explicites pour les objets de requête authentifiés.

Filtres d'exception et forme des erreurs

@Catch()
export class HttpExceptionFilter implements ExceptionFilter {
  catch(exception: unknown, host: ArgumentsHost) {
    const response = host.switchToHttp().getResponse<Response>();
    const request = host.switchToHttp().getRequest<Request>();

    if (exception instanceof HttpException) {
      return response.status(exception.getStatus()).json({
        path: request.url,
        error: exception.getResponse(),
      });
    }

    return response.status(500).json({
      path: request.url,
      error: 'Erreur interne du serveur',
    });
  }
}
  • Garder une enveloppe d'erreur cohérente dans toute l'API.
  • Lever les exceptions du framework pour les erreurs client attendues ; journaliser et encapsuler les échecs inattendus de manière centralisée.

Configuration et validation de l'environnement

ConfigModule.forRoot({
  isGlobal: true,
  load: [configuration],
  validate: validateEnv,
});
  • Valider l'environnement au démarrage, pas paresseusement à la première requête.
  • Garder l'accès à la configuration derrière des helpers typés ou des services de configuration.
  • Séparer les préoccupations dev/staging/prod dans les fabriques de configuration plutôt que de bifurquer dans le code fonctionnel.

Persistance et transactions

  • Maintenir le code du dépôt/ORM derrière des fournisseurs qui parlent le langage du domaine.
  • Pour Prisma ou TypeORM, isoler les workflows transactionnels dans des services qui possèdent l'unité de travail.
  • Ne pas laisser les contrôleurs coordonner des écritures multi-étapes directement.

Tests

describe('UsersController', () => {
  let app: INestApplication;

  beforeAll(async () => {
    const moduleRef = await Test.createTestingModule({
      imports: [UsersModule],
    }).compile();

    app = moduleRef.createNestApplication();
    app.useGlobalPipes(new ValidationPipe({ whitelist: true, transform: true }));
    await app.init();
  });
});
  • Tester unitairement les fournisseurs en isolation avec des dépendances simulées.
  • Ajouter des tests au niveau des requêtes pour les gardes, les pipes de validation et les filtres d'exception.
  • Réutiliser les mêmes pipes/filtres globaux dans les tests que ceux utilisés en production.

Valeurs par défaut pour la production

  • Activer la journalisation structurée et les identifiants de corrélation de requête.
  • Arrêter l'application en cas d'environnement/config invalide plutôt que de démarrer partiellement.
  • Préférer l'initialisation asynchrone des fournisseurs pour les clients de base de données/cache avec des vérifications de santé explicites.
  • Garder les tâches d'arrière-plan et les consommateurs d'événements dans leurs propres modules, pas à l'intérieur des contrôleurs HTTP.
  • Rendre explicite la limitation de débit, l'authentification et la journalisation d'audit pour les endpoints publics.

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

accessibility

Design, implement, and audit inclusive digital products using WCAG 2.2 Level AA. Use when building or auditing UI that must meet WCAG 2.2 Level AA, or when reviewing a change for keyboard, contrast, or screen-reader support.

affaan-m/content-engine

Create platform-native content systems for X, LinkedIn, TikTok, YouTube, newsletters, and repurposed multi-platform campaigns. Use when the user wants social posts, threads, scripts, content calendars, or one source asset adapted cleanly across platforms.

affaan-m/ECC

Multi-platform content distribution across X, LinkedIn, Threads, and Bluesky. Adapts content per platform using content-engine patterns. Never posts identical content cross-platform. Use when the user wants to distribute content across social platforms.

affaan-m/fal-ai-media

Unified media generation via fal.ai MCP — image, video, and audio. Covers text-to-image (Nano Banana), text/image-to-video (Seedance, Kling, Veo 3), text-to-speech (CSM-1B), and video-to-audio (ThinkSound). Use when the user wants to generate images, videos, or audio with AI.

affaan-m/manim-video

日本語翻訳:このファイルは manim-video 用の日本語翻訳が必要です

affaan-m/remotion-video-creation

Remotion のベストプラクティス - React で動画を作成する。3D、アニメーション、音声、字幕、チャート、トランジションなどをカバーするドメイン固有の29のルール。

affaan-m/video-editing

AI-assisted video editing workflows for cutting, structuring, and augmenting real footage. Covers the full pipeline from raw capture through FFmpeg, Remotion, ElevenLabs, fal.ai, and final polish in Descript or CapCut. Use when the user wants to edit video, cut footage, create vlogs, or build video content.

agent-architecture-audit

Full-stack diagnostic for agent and LLM applications. Audits the 12-layer agent stack for wrapper regression, memory pollution, tool discipline failures, hidden repair loops, and rendering corruption. Produces severity-ranked findings with code-first fixes. Essential for developers building agent applications, autonomous loops, or any LLM-powered feature. Use when an agent or LLM feature misbehaves and the failing layer is unknown, or before shipping an agent stack.

agent-eval

Head-to-head comparison of coding agents (Claude Code, Aider, Codex, etc.) on custom tasks with pass rate, cost, time, and consistency metrics. Use when choosing between coding agents, or when a change to an agent setup needs measured pass rate, cost, and time rather than an impression.

agent-harness-construction

Design and optimize AI agent action spaces, tool definitions, and observation formatting for higher completion rates. Use when defining or revising an agent

agentic-engineering

Operate as an agentic engineer using eval-first execution, decomposition, and cost-aware model routing. Use when planning or executing engineering work that agents will carry out end to end.

agentic-os

Build persistent multi-agent operating systems on Claude Code. Covers kernel architecture, specialist agents, slash commands, file-based memory, scheduled automation, and state management without external databases. Use when building a persistent multi-agent system on Claude Code with its own memory, commands, and scheduling.

agent-introspection-debugging

Structured self-debugging workflow for AI agent failures using capture, diagnosis, contained recovery, and introspection reports. Use when an agent run fails and you need a reproducible diagnosis instead of a retry.

agent-payment-x402

Add x402 payment execution to AI agents with per-task budgets, spending controls, and non-custodial wallets. Supports Base through agentwallet-sdk and X Layer through OKX Payments / OKX Agent Payments Protocol. Use when an agent must pay for something itself and needs per-task budgets, spending controls, and a non-custodial wallet.

agent-self-evaluation

Use after completing any non-trivial task. The agent self-rates its output on 5 axes — accuracy, completeness, clarity, actionability, conciseness — with concrete evidence per criterion. Produces a structured 1-5 scorecard with specific improvement suggestions.

agent-sort

Build an evidence-backed ECC install plan for a specific repo by sorting skills, commands, rules, hooks, and extras into DAILY vs LIBRARY buckets using parallel repo-aware review passes. Use when ECC should be trimmed to what a project actually needs instead of loading the full bundle.

ai-first-engineering

Engineering operating model for teams where AI agents generate a large share of implementation output. Use when setting team process, review gates, or ownership rules for a codebase largely written by agents.

ai-regression-testing

Regression testing strategies for AI-assisted development. Sandbox-mode API testing without database dependencies, automated bug-check workflows, and patterns to catch AI blind spots where the same model writes and reviews code. Use when adding regression coverage to AI-assisted code, or when the same model both wrote and reviewed a change.

android-clean-architecture

Clean Architecture patterns for Android and Kotlin Multiplatform projects — module structure, dependency rules, UseCases, Repositories, and data layer patterns. Use when structuring modules, layers, or data flow in an Android or KMP project.

angular-developer

Generates Angular code and provides architectural guidance. Trigger when creating projects, components, or services, or for best practices on reactivity (signals, linkedSignal, resource), forms, dependency injection, routing, SSR, accessibility (ARIA), animations, styling (component styles, Tailwind CSS), testing, or CLI tooling.

Skills associés