PD-13 — Initialiser projet NestJS avec structure modulaire¶
📚 Navigation User Story
| Document | | | ---------- | -- | | 📋 **Spécification** | *(ce document)* | | 🛠️ [Plan d'implémentation](PD-13-plan.md) | | | ✅ [Critères d'acceptation](PD-13-acceptability.md) | | | 📝 [Retour d'expérience](PD-13-rex.md) | | [← Retour à backend-core](../PD-186-epic.md) · [↑ Index User Story](index.md)Métadonnées¶
- Epic : PD-186 — BACKEND-CORE
- Type : Foundation / Infrastructure Task
- Priorité : Critique (bloquante)
- Story Points : 8
1. Contexte¶
Le backend ProbatioVault constitue le cœur applicatif du système :
- authentification Zero-Knowledge (SRP-6a),
- orchestration cryptographique,
- gestion documentaire WORM,
- journalisation probatoire,
- ancrage blockchain.
Une architecture NestJS modulaire, stricte et industrialisée est indispensable pour garantir :
- la maintenabilité long terme,
- la sécurité by design,
- la scalabilité technique et organisationnelle,
- la conformité aux standards ProbatioVault.
Cette User Story pose la fondation technique de tout le backend. Aucune autre PD backend ne peut démarrer sans celle-ci.
2. Objectifs¶
- Initialiser un projet NestJS 10+ avec TypeScript en mode strict.
- Mettre en place une architecture modulaire cible (auth, crypto, documents, audit, storage, jobs…).
- Configurer les outils de qualité : ESLint, Prettier, Jest, SonarQube.
- Déployer une CI/CD GitLab complète (lint → tests → build → qualité).
- Fournir une base sécurisée, testable et observable.
3. Portée¶
Inclus¶
- Création du projet NestJS via CLI
- Configuration TypeScript stricte
- Mise en place ESLint / Prettier / SonarQube
- Configuration Jest (unit / integration / e2e)
- Dockerfile multistage + docker-compose dev
- Pipeline GitLab CI/CD
- Structure modulaire complète
- Documentation initiale (README, CONTRIBUTING, ADR)
Hors périmètre¶
- Implémentation métier détaillée (PD suivantes)
- Schémas DB et RLS (PD-14+)
- Logique SRP-6a complète
4. Architecture cible¶
probatio-vault-backend/
├── src/
│ ├── main.ts
│ ├── app.module.ts
│ ├── config/
│ ├── common/
│ ├── modules/
│ │ ├── auth/
│ │ ├── crypto/
│ │ ├── documents/
│ │ ├── audit/
│ │ ├── storage/
│ │ └── jobs/
│ └── database/
├── test/
│ ├── unit/
│ ├── integration/
│ └── e2e/
├── Dockerfile
├── docker-compose.yml
├── .gitlab-ci.yml
├── tsconfig.json
├── .eslintrc.js
├── .prettierrc
├── sonar-project.properties
├── README.md
├── CONTRIBUTING.md
└── docs/adr/
5. Spécifications techniques¶
5.1 Stack technique¶
- Node.js : 20.x LTS
- Framework : NestJS 10.x
- Langage : TypeScript 5.x (strict)
- DB : PostgreSQL (via TypeORM ultérieurement)
- Queue : Redis + BullMQ
- Tests : Jest
- Qualité : ESLint, Prettier, SonarQube
5.2 TypeScript¶
- Mode strict activé
- Aucun
anyimplicite - Paths aliases configurés (
@/,@modules/*, etc.)
5.3 Qualité & sécurité¶
- ESLint avec règles sécurité (
eslint-plugin-security) - Prettier intégré
- SonarQube avec Quality Gate strict
5.4 CI/CD GitLab¶
- Stages :
lint→test→build→quality - Analyse SonarQube obligatoire
- Build Docker multistage
5.5 Conteneurisation¶
- Dockerfile multistage
- Image finale non-root
- Healthcheck
/health
5bis. Diagrammes Mermaid¶
5bis.1 Pipeline CI/CD — Diagramme de séquence¶
Flux multi-service du pipeline GitLab (cf. §5.4, §7 CI/CD).
sequenceDiagram
participant Dev as Développeur
participant GL as GitLab Runner
participant ES as ESLint / Prettier
participant Jest as Jest
participant Nest as NestJS Build
participant Sonar as SonarQube
participant Docker as Docker Registry
Dev->>GL: git push
activate GL
rect rgb(240, 248, 255)
Note over GL,ES: Stage 1 — lint
GL->>ES: eslint --max-warnings 0
ES-->>GL: 0 erreur critique (§7 Infrastructure)
GL->>ES: prettier --check
ES-->>GL: Conforme (§5.3)
end
rect rgb(240, 255, 240)
Note over GL,Jest: Stage 2 — test
GL->>Jest: jest --coverage
Jest-->>GL: Couverture >= 85% (§7 Qualité)
end
rect rgb(255, 248, 240)
Note over GL,Nest: Stage 3 — build
GL->>Nest: nest build (TypeScript strict)
Nest-->>GL: 0 warning TS (§5.2, §11 DoD)
GL->>Docker: docker build --multistage
Docker-->>GL: Image non-root + healthcheck (§5.5)
end
rect rgb(248, 240, 255)
Note over GL,Sonar: Stage 4 — quality
GL->>Sonar: sonar-scanner
Sonar-->>GL: Quality Gate PASS (§5.3)
end
GL-->>Dev: Pipeline verte (§11 DoD)
deactivate GL 5bis.2 Bootstrap applicatif — Diagramme de séquence¶
Séquence de démarrage NestJS et résolution des modules (cf. §4 Architecture cible, §6 Modules).
sequenceDiagram
participant Main as main.ts
participant App as AppModule
participant Cfg as ConfigModule
participant Common as CommonModule
participant Mod as Modules métier
participant Health as HealthController
Main->>App: NestFactory.create(AppModule)
activate App
App->>Cfg: import ConfigModule.forRoot()
Cfg-->>App: Variables validées (Joi)
App->>Common: import CommonModule
Note right of Common: Guards, Filters,<br/>Interceptors, Pipes (§6 common)
App->>Mod: import AuthModule, CryptoModule,<br/>DocumentsModule, AuditModule,<br/>StorageModule, JobsModule
Note right of Mod: Chaque module :<br/>module + service + test (§6)
App->>Health: register /health, /health/db, /health/ready
App-->>Main: Application prête
Main->>Main: app.listen(PORT)
deactivate App 5bis.3 Health check — Diagramme d'états¶
États du endpoint /health (cf. §5.5 Healthcheck, §7 Infrastructure).
stateDiagram-v2
[*] --> Starting : NestFactory.create()
Starting --> Healthy : Bootstrap OK<br/>(tous modules chargés)
Starting --> Unhealthy : Erreur chargement module
Healthy --> Degraded : /health/db FAIL<br/>(PostgreSQL indisponible)
Healthy --> Unhealthy : Erreur critique<br/>(module auth/crypto DOWN)
Degraded --> Healthy : /health/db OK<br/>(PostgreSQL rétabli)
Degraded --> Unhealthy : Cascade d'erreurs
Unhealthy --> Starting : Redémarrage conteneur<br/>(Docker restart policy)
state Healthy {
[*] --> Ready
Ready : /health → 200
Ready : /health/db → 200
Ready : /health/ready → 200
}
state Degraded {
[*] --> PartialReady
PartialReady : /health → 200
PartialReady : /health/db → 503
PartialReady : /health/ready → 200
}
state Unhealthy {
[*] --> NotReady
NotReady : /health → 503
NotReady : /health/ready → 503
} 6. Modules à créer (structure minimale)¶
- auth : authentification (SRP-6a, JWT)
- crypto : hash, chiffrement, HKDF
- documents : CRUD documents
- audit : journalisation probatoire
- storage : S3 / Glacier
- jobs : workers BullMQ
- config : configuration centralisée validée
- common : guards, interceptors, filters
Chaque module doit contenir a minima :
- un module NestJS,
- un service,
- un test unitaire initial.
7. Critères d'acceptation¶
Infrastructure¶
- Projet NestJS initialisé (CLI officiel)
- Compilation TypeScript sans warning
- ESLint : 0 erreur critique
- Prettier conforme
Architecture¶
- Tous les modules créés
- Imports cohérents et découplés
- DI NestJS utilisée partout
Qualité & tests¶
- Jest configuré
- ≥ 1 test par module
- Couverture ≥ 85 %
CI/CD¶
- Pipeline GitLab fonctionnel
- SonarQube exécuté avec Quality Gate
- Build Docker OK
Documentation¶
- README complet
- CONTRIBUTING.md présent
- ADR initialisé
8. Dépendances¶
Bloquantes¶
- Aucune
Dépendantes¶
- PD-14 : Configuration PostgreSQL
- PD-15 : Schéma users
- PD-16 : Schéma documents
- Toutes les PD backend suivantes
9. Risques & mitigations¶
| Risque | Mitigation |
|---|---|
| Dette technique initiale | Strict TS + lint + Sonar |
| Failles sécurité | ESLint security + revues |
| Pipeline instable | CI dès le départ |
| Architecture figée | Modules découplés |
10. Livrables¶
- Dépôt backend initialisé
- Structure modulaire complète
- CI/CD opérationnelle
- Dockerfile + docker-compose
- Documentation initiale
11. Definition of Done¶
- Projet NestJS opérationnel
- 0 warning TS / ESLint
- Pipeline verte
- Image Docker build & run OK
- Documentation validée
- Code review approuvée (2 reviewers)