Aller au contenu

ADR 001 : Choix de NestJS comme framework backend

Date : 2025-01-13 Status : ✅ Accepté Décideurs : Équipe technique ProbatioVault Tags : architecture, framework, backend


Contexte

Le projet ProbatioVault nécessite un backend robuste, scalable et maintenable pour gérer : - Authentification Zero-Knowledge (SRP-6a) - Chiffrement de bout en bout (AES-256-GCM) - Stockage sécurisé (S3, Glacier) - Journalisation probatoire immuable - Ancrage blockchain (Merkle Trees)

Nous devons choisir un framework backend adapté à ces exigences.


Décision

Nous avons choisi NestJS comme framework principal pour le backend ProbatioVault.


Options considérées

Option 1 : Express.js (vanilla)

Avantages : - ✅ Léger et minimaliste - ✅ Grande flexibilité - ✅ Écosystème mature

Inconvénients : - ❌ Pas d'architecture imposée (risque de code spaghetti) - ❌ Pas de DI native - ❌ Configuration manuelle fastidieuse - ❌ Difficile à tester proprement

Option 2 : Fastify

Avantages : - ✅ Très performant (2x plus rapide qu'Express) - ✅ Validation de schéma intégrée (JSON Schema) - ✅ TypeScript friendly

Inconvénients : - ❌ Écosystème moins mature que NestJS - ❌ Pas d'architecture opinionnée - ❌ Moins de modules pré-intégrés

Option 3 : NestJS ✅ (Choix retenu)

Avantages : - ✅ Architecture modulaire inspirée d'Angular - ✅ Dependency Injection native - ✅ TypeScript first-class citizen - ✅ Écosystème riche (@nestjs/typeorm, @nestjs/jwt, @nestjs/bull...) - ✅ Testing framework intégré (Jest) - ✅ Swagger/OpenAPI natif - ✅ Support WebSockets, microservices, GraphQL - ✅ Scalable et maintenable sur le long terme - ✅ Documentation excellente - ✅ Communauté active

Inconvénients : - ⚠️ Courbe d'apprentissage pour les débutants - ⚠️ Plus verbeux qu'Express - ⚠️ Légèrement moins performant que Fastify (mais acceptable)

Option 4 : Koa.js

Avantages : - ✅ Moderne (async/await natif) - ✅ Léger - ✅ Créé par l'équipe d'Express

Inconvénients : - ❌ Écosystème moins riche - ❌ Pas d'architecture opinionnée - ❌ Moins adapté aux projets complexes


Justification du choix

NestJS a été choisi pour les raisons suivantes :

1. Architecture modulaire

Le projet ProbatioVault est complexe (auth, crypto, documents, audit, blockchain...). NestJS impose une architecture claire avec des modules découplés, facilitant la maintenance et l'évolution.

2. Dependency Injection

La DI native permet une testabilité maximale (mocking facile) et une séparation des responsabilités claire.

3. TypeScript strict

NestJS est conçu pour TypeScript dès le départ. Crucial pour un projet de sécurité comme ProbatioVault (typage strict, détection d'erreurs à la compilation).

4. Écosystème riche

  • @nestjs/typeorm : ORM PostgreSQL prêt à l'emploi
  • @nestjs/jwt : Authentification JWT intégrée
  • @nestjs/bull : Queues asynchrones (BullMQ)
  • @nestjs/swagger : Documentation API automatique
  • @nestjs/config : Gestion de configuration validée

5. Testing

Framework de tests intégré (Jest) avec support complet pour les tests unitaires, d'intégration et E2E.

6. Sécurité

  • Guards natifs pour la protection des routes
  • Pipes pour la validation des données (class-validator)
  • Interceptors pour le logging centralisé
  • Filters pour la gestion d'erreurs globale

7. Scalabilité

Architecture permettant de passer facilement à des microservices si nécessaire (avec @nestjs/microservices).


Conséquences

Positives

  • ✅ Code structuré et maintenable
  • ✅ Testabilité maximale
  • ✅ Productivité accrue (modules pré-intégrés)
  • ✅ Onboarding facilité (conventions claires)
  • ✅ Documentation automatique (Swagger)
  • ✅ Écosystème mature

Négatives

  • ⚠️ Courbe d'apprentissage initiale
  • ⚠️ Plus verbeux qu'Express (mais justifié pour la clarté)
  • ⚠️ Performance légèrement inférieure à Fastify (négligeable pour notre use case)

Risques

  • ⚠️ Dépendance à l'écosystème NestJS : Mitigé par la popularité croissante du framework
  • ⚠️ Breaking changes : NestJS suit semver, mise à jour progressive possible

Alternatives futures

Si les performances deviennent un goulot d'étranglement critique (peu probable) : - Migration vers Fastify comme adaptateur sous-jacent (NestJS supporte Fastify) - Optimisation spécifique des endpoints critiques


Références


Historique

  • 2025-01-13 : Décision initiale (ADR créé)