Plan d'amélioration Backend (structure, modularité, performance)
Objectif : consolider la structure NestJS après la segmentation (API vs Worker), réduire les risques de cycles DI, accélérer le boot, et rendre l’architecture plus maintenable.
Ce plan est technique (backend). Pour les priorités produit, voir
docs/PRIORITES.md.
Principes
-
Deux runtimes, deux modules
- API runtime : HTTP + controllers + schedulers “API-only”.
- Worker runtime : BullMQ processors (pas de HTTP).
-
Tokens DI = impl “leaf”
- Un token
*_TOKENne doit jamais pointer vers une façade qui dépend d’un service injectant ce token. - Utiliser un adapter lookup si besoin (ex:
QuotesInvoicesLookupService).
- Un token
-
Runtime modules pour les dépendances optionnelles
QueueRuntimeModule,EventEmitterRuntimeModule, (à termeScheduleRuntimeModule).
-
Boot tests
- Chaque runtime doit avoir un smoke test (API boot / Worker boot) pour attraper les cycles DI dès le CI.
Checklist d’implémentation (PRs)
Voir docs/BACKEND_STRUCTURE_IMPLEMENTATION_CHECKLIST.md.
Phase 0 — Quick wins (1–2 jours)
0.1 Stabiliser WorkerModule minimal
- But : le worker charge uniquement ce qui est requis par les processors.
- Actions
- Auditer les imports “accidentels” tirés par les
*ProcessorModule(ex: un module qui ramène toute une feature). - Garder
EventEmitterRuntimeModule.register()dansWorkerModule(fournitEventEmitter2même quand désactivé).
- Auditer les imports “accidentels” tirés par les
- Critère de succès
RUN_MODE=workerboot sans erreur, et ne charge pas Search/Agent.
0.2 Nettoyer la config runtime (dev/prod)
- But : rendre le comportement “API enqueues / Worker processes” explicite.
- Actions
- Documenter les env vars runtime (
RUN_MODE,QUEUE_*,SCHEDULE_ENABLED,EVENT_EMITTER_ENABLED) dansdocs/BACKEND.mdetdocs/QUEUE_SYSTEM.md(fait). - Ajouter les clés manquantes dans
.env.example(placeholders uniquement).
- Documenter les env vars runtime (
- Critère de succès
- Stack dev + prod fonctionnent avec 2 services (
api,worker).
- Stack dev + prod fonctionnent avec 2 services (
Phase 1 — Refacto structure (3–5 jours)
1.1 Extraire ApiModule (root thin)
- But :
AppModuledevient un “wrapper” minimal, lisible, stable. - Actions
- Créer
ApiModule(controllers + modules métier HTTP). AppModuleimporteApiModuleet les modules runtime (event-emitter, schedule) au bon endroit.
- Créer
- Critère de succès
AppModulecontient uniquement du wiring, pas de logique de segmentation.
1.2 Séparer Queue “client” vs “worker”
- But : empêcher l’API de charger les processors, et clarifier l’usage.
- Actions
QueueClientModule: queues +QueueService(enqueue/status) sans processors.QueueWorkerModule:QueueClientModule+*ProcessorModule.- API importe
QueueClientModule, worker importeQueueWorkerModule.
- Critère de succès
QUEUE_WORKERS_ENABLED=falsesur l’API => aucun processor instancié.
Phase 2 — Durcissement anti-cycles + conventions (3–7 jours)
2.1 Standardiser “core module + adapter + token”
- But : prévenir les cycles DI à l’échelle du projet.
- Actions
- Pattern documenté + checklist PR : “token bound to leaf/adapter”.
- Appliquer progressivement aux modules à haut risque (emails, search, agent, calendar, quotes/invoices).
- Critère de succès
- Plus de “hang” sur
NestFactory.create()suite à une refacto de modules.
- Plus de “hang” sur
2.2 Runtime modules uniformes
- But : éviter les
if (process.env...)dispersés. - Actions
- Ajouter
ScheduleRuntimeModule(similaire àEventEmitterRuntimeModule). - Définir la règle :
forRoot()appelé une seule fois (dans le runtime module).
- Ajouter
- Critère de succès
- Aucune feature module n’appelle
ScheduleModule.forRoot().
- Aucune feature module n’appelle
Phase 3 — Tests & observabilité boot (2–4 jours)
3.1 Smoke tests “boot”
- But : détecter immédiatement cycles DI / providers bloquants.
- Actions
- Test API boot : créer app (sans listen) ou
createTestingModule(AppModule)et init. - Test Worker boot :
createApplicationContext(WorkerModule)etclose().
- Test API boot : créer app (sans listen) ou
- Critère de succès
- CI échoue si un cycle DI est introduit.
3.2 Mesure de boot
- But : suivre les gains.
- Actions
- Logger un timestamp “created” (déjà partiellement fait), + mesure par runtime.
- Optionnel: exposer un endpoint healthz API + log worker “ready”.
- Critère de succès
- Boot API/worker mesurés et comparables entre versions.
Nettoyage documentation (source de vérité)
- Règle
docs/PRIORITES.md= source de vérité “quoi faire”.- Ce document = “comment refactor” (plan technique).