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éé)