Checklist d’implémentation — refacto structure backend
Objectif : découper le travail en PRs petites, sûres, et testables, en priorité sur la structure NestJS (API vs Worker), la queue, et la prévention des cycles DI.
Référence plan :
docs/BACKEND_STRUCTURE_IMPROVEMENT_PLAN.md.
PR 0 — Préparation / garde-fous (smoke tests boot)
- But : empêcher toute régression “NestFactory.create() pend”.
- Changements
- Ajouter un boot-check exécuté sur code compilé (fiable pour Nest) :
- API :
createApplicationContext(AppModule)puisclose() - Worker :
createApplicationContext(WorkerModule)puisclose()
- API :
- Ajouter un boot-check exécuté sur code compilé (fiable pour Nest) :
- Fichiers
backend/src/scripts/boot-check.ts
- Critère d’acceptation
- CI échoue si cycle DI / provider manquant.
PR 1 — Queue : séparer enqueue vs process (QueueClientModule / QueueWorkerModule)
- But : clarifier “API enqueues / Worker processes” au niveau module, pas juste via env vars.
- Changements
- Créer
QueueCoreModule: BullMQ connection + registerQueue +QueueService(enqueue/status). - Créer
QueueClientModule(API) :QueueCoreModule+ progress via WebSocket. - Créer
QueueWorkerModule(Worker) :QueueCoreModule+ processors base + progress no-op. QueueRuntimeModulechoisit quel module importer selonQUEUE_ENABLEDetQUEUE_WORKERS_ENABLED.
- Créer
- Fichiers (suggestion)
backend/src/queue/queue-core.module.tsbackend/src/queue/queue-client.module.tsbackend/src/queue/queue-worker.module.tsbackend/src/queue/queue-runtime.module.ts
- Critère d’acceptation
- API démarre avec
QUEUE_ENABLED=trueetQUEUE_WORKERS_ENABLED=falsesans instancier de processors. - Worker démarre avec
QUEUE_WORKERS_ENABLED=trueet exécute les processors.
- API démarre avec
PR 2 — AppModule “thin” : extraire ApiModule
- But : rendre la racine lisible et réduire le risque de régressions lors de refacto.
- Changements
- Créer
ApiModule(imports + controllers HTTP). AppModulegarde uniquement :- runtime modules (
EventEmitterRuntimeModule,ScheduleRuntimeModulesi créé) - infra global (
ConfigModule,LoggerModule,DbModule,CacheModule,TimeoutModule, etc.) ApiModule
- runtime modules (
- Créer
- Fichiers (suggestion)
backend/src/api.module.ts(nouveau)backend/src/app.module.ts(simplifié)
- Critère d’acceptation
app.module.tsne contient plus de logique de “segmentation debug” typeBOOTSTRAP_GROUPS.
PR 3 — WorkerModule : minimiser encore (enlever WebSocket si possible)
- But : réduire boot time + mémoire du worker.
- Changements
- Vérifier si les processors ont réellement besoin de
WebSocketModule. - Si besoin “progress events”, passer par un provider dédié plus léger (ex: “QueueProgressEmitter”) ou rendre l’émetteur optionnel.
- Éviter d’importer des modules “full” quand un “core” suffit.
- Vérifier si les processors ont réellement besoin de
- Critère d’acceptation
- Worker charge un ensemble stable de modules (pas Search/Agent).
- Les jobs progress continuent de fonctionner (ou sont explicitement documentés si désactivés côté worker).
PR 4 — Runtime modules uniformes (ScheduleRuntimeModule)
- But : enlever les
if (process.env...)dispersés. - Changements
- Créer
ScheduleRuntimeModule.register()qui:- si
SCHEDULE_ENABLED=false=> n’importe rien - sinon =>
ScheduleModule.forRoot()(appel unique)
- si
- Remplacer la logique dans
AppModule.
- Créer
- Fichiers
backend/src/common/schedule-runtime.module.ts(nouveau)backend/src/app.module.ts(mise à jour)
- Critère d’acceptation
- plus aucun
ScheduleModule.forRoot()ailleurs.
- plus aucun
PR 5 — Convention DI : tokens “leaf/lookup only” + lints/guide
- But : prévenir les cycles DI à l’échelle du codebase.
- Changements
- Ajouter une section “règle DI tokens” dans
docs/BACKEND.md(déjà partiellement fait). - (Optionnel) Ajouter un mini “checklist PR” dans
docs/ROADMAP.md. - Auditer les tokens existants (quick scan) : tout token
*_TOKENdoit pointer vers un leaf ou un lookup.
- Ajouter une section “règle DI tokens” dans
- Critère d’acceptation
- Les tokens ne pointent pas vers des orchestrateurs qui ré-injectent le token via leurs dépendances.
PR 6 — Config prod/dev : expliciter le worker partout (env + docs)
- But : cohérence dev/prod et onboarding.
- Changements
.env.example: documenterRUN_MODE,QUEUE_*,SCHEDULE_ENABLED,EVENT_EMITTER_ENABLED(placeholders).- Vérifier que
infra/docker-compose.prod.ymlinclut le serviceworker(fait) et que la doc le mentionne.
- Critère d’acceptation
- Déploiement prod : jobs BullMQ sont réellement consommés.
Notes de découpage
- Chaque PR doit rester petite (idéalement < 400 lignes net), avec un critère de succès testable.
- Si une PR touche “wiring” + logique métier, la découper : d’abord wiring, ensuite changements comportementaux.