Skip to content

[NestJS] Modularisation de server #1889

Description

@StephaneTrebel

Modularisation de server vers server-nestjs

Référence auditée : origin/main à a3568efb (2026-09-14).

Ce registre mesure uniquement les 75 routes V1 encore enregistrées dans
apps/server. « Routé » signifie routé par
apps/nginx-strangler/conf.d/routing.conf versionné, pas observé en
production.

États

  • Legacy seul : aucune implémentation NestJS V1 équivalente.
  • Porté, non enregistré : contrôleur NestJS présent, module absent du
    chemin de chargement.
  • Enregistré, non routé : contrôleur chargé, fallback Nginx vers le legacy.
  • Routé vers NestJS : contrôleur chargé et règle Nginx V1 vers NestJS,
    sans blocage structurel connu.
  • Routé, conditionnel à confirmer : règle Nginx présente, module soumis à
    une variable USE_* non versionnée.
  • Bloqué par parité d'événements : route routée, mais un événement requis
    n'a pas de consommateur NestJS équivalent.

Registre V1

Module Méthode Route V1 État Preuve
admin-role GET /api/v1/admin/roles Porté, non enregistré Contrôleur présent ; AdminRoleModule absent de MainModule.imports.
admin-role POST /api/v1/admin/roles Porté, non enregistré Contrôleur présent ; AdminRoleModule absent de MainModule.imports.
admin-role PATCH /api/v1/admin/roles Porté, non enregistré Contrôleur présent ; AdminRoleModule absent de MainModule.imports.
admin-role GET /api/v1/admin/roles/member-counts Porté, non enregistré Contrôleur présent ; AdminRoleModule absent de MainModule.imports.
admin-role DELETE /api/v1/admin/roles/:roleId Porté, non enregistré Contrôleur présent ; AdminRoleModule absent de MainModule.imports.
admin-token GET /api/v1/admin/tokens Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
admin-token POST /api/v1/admin/tokens Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
admin-token DELETE /api/v1/admin/tokens/:tokenId Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
cluster GET /api/v1/clusters Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
cluster POST /api/v1/clusters Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
cluster GET /api/v1/clusters/:clusterId Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
cluster GET /api/v1/clusters/usage/:clusterId Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
cluster GET /api/v1/clusters/:clusterId/environments Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
cluster PUT /api/v1/clusters/:clusterId Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
cluster DELETE /api/v1/clusters/:clusterId Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
environment V1 POST /api/v1/environments Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
environment V1 GET /api/v1/environments Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
environment V1 PUT /api/v1/environments/:environmentId Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
environment V1 DELETE /api/v1/environments/:environmentId Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
log GET /api/v1/logs Enregistré, non routé Contrôleur chargé ; fallback location /api/ vers legacy.
project POST /api/v1/projects Routé vers NestJS Contrôleur chargé ; location ^~ /api/v1/projects.
project GET /api/v1/projects/:projectId Routé vers NestJS Contrôleur chargé ; location ^~ /api/v1/projects.
project GET /api/v1/projects Routé vers NestJS Contrôleur chargé ; location ^~ /api/v1/projects.
project PUT /api/v1/projects/:projectId Routé vers NestJS Contrôleur chargé ; location ^~ /api/v1/projects.
project DELETE /api/v1/projects/:projectId Routé vers NestJS Contrôleur chargé ; location ^~ /api/v1/projects.
project GET /api/v1/projects/data Routé vers NestJS Contrôleur chargé ; location ^~ /api/v1/projects.
project-bulk POST /api/v1/projects-bulk Routé vers NestJS Contrôleur chargé ; location /api/v1/projects-bulk.
project-hooks PUT /api/v1/projects/:projectId/hooks Routé vers NestJS Contrôleur chargé ; location ^~ /api/v1/projects.
project-secrets GET /api/v1/projects/:projectId/secrets Routé vers NestJS Contrôleur chargé ; location ^~ /api/v1/projects.
project-member GET /api/v1/projects/:projectId/members Bloqué par parité d'événements Contrôleur chargé et routé ; aucun @OnEvent('projectMember.*').
project-member POST /api/v1/projects/:projectId/members Bloqué par parité d'événements Contrôleur chargé et routé ; aucun @OnEvent('projectMember.*').
project-member PATCH /api/v1/projects/:projectId/members Bloqué par parité d'événements Contrôleur chargé et routé ; aucun @OnEvent('projectMember.*').
project-member DELETE /api/v1/projects/:projectId/members/:userId Bloqué par parité d'événements Contrôleur chargé et routé ; aucun @OnEvent('projectMember.*').
project-role GET /api/v1/projects/:projectId/roles Routé vers NestJS Contrôleur chargé ; location ^~ /api/v1/projects.
project-role POST /api/v1/projects/:projectId/roles Routé vers NestJS Contrôleur chargé ; location ^~ /api/v1/projects.
project-role PATCH /api/v1/projects/:projectId/roles Routé vers NestJS Contrôleur chargé ; location ^~ /api/v1/projects.
project-role GET /api/v1/projects/:projectId/roles/member-counts Routé vers NestJS Contrôleur chargé ; location ^~ /api/v1/projects.
project-role DELETE /api/v1/projects/:projectId/roles/:roleId Routé vers NestJS Contrôleur chargé ; location ^~ /api/v1/projects.
project-service GET /api/v1/projects/:projectId/services Routé vers NestJS Contrôleur chargé ; location ^~ /api/v1/projects.
project-service POST /api/v1/projects/:projectId/services Routé vers NestJS Contrôleur chargé ; location ^~ /api/v1/projects.
repository V1 POST /api/v1/repositories Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
repository V1 GET /api/v1/repositories Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
repository V1 POST /api/v1/repositories/:repositoryId/sync Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
repository V1 PUT /api/v1/repositories/:repositoryId Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
repository V1 DELETE /api/v1/repositories/:repositoryId Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
service-chain GET /api/v1/service-chains Routé, conditionnel à confirmer Routé par Nginx ; PluginModule exige USE_SERVICE_CHAIN=true.
service-chain GET /api/v1/service-chains/:serviceChainId Routé, conditionnel à confirmer Routé par Nginx ; PluginModule exige USE_SERVICE_CHAIN=true.
service-chain POST /api/v1/service-chains/:serviceChainId/retry Routé, conditionnel à confirmer Routé par Nginx ; PluginModule exige USE_SERVICE_CHAIN=true.
service-chain POST /api/v1/service-chains/validate/:validationId Routé, conditionnel à confirmer Routé par Nginx ; PluginModule exige USE_SERVICE_CHAIN=true.
service-chain GET /api/v1/service-chains/:serviceChainId/flows Routé, conditionnel à confirmer Routé par Nginx ; PluginModule exige USE_SERVICE_CHAIN=true.
service-monitor GET /api/v1/health-services Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
service-monitor GET /api/v1/complete-services Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
service-monitor GET /api/v1/refresh-services Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
stage GET /api/v1/stages Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
stage POST /api/v1/stages Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
stage GET /api/v1/stages/:stageId/environments Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
stage PUT /api/v1/stages/:stageId Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
stage DELETE /api/v1/stages/:stageId Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
version GET /api/v1/version Enregistré, non routé Contrôleur chargé ; fallback location /api/ vers legacy.
healthz GET /api/v1/healthz Enregistré, non routé Contrôleur chargé ; fallback location /api/ vers legacy.
system-config GET /api/v1/system/plugins Enregistré, non routé Contrôleur chargé ; fallback location /api/ vers legacy.
system-config POST /api/v1/system/plugins Enregistré, non routé Contrôleur chargé ; fallback location /api/ vers legacy.
system-settings GET /api/v1/system/settings Enregistré, non routé Contrôleur chargé ; fallback location /api/ vers legacy.
system-settings POST /api/v1/system/settings Enregistré, non routé Contrôleur chargé ; fallback location /api/ vers legacy.
user GET /api/v1/users/matching Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
user GET /api/v1/auth Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
user GET /api/v1/users Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
user PATCH /api/v1/users Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
user-token GET /api/v1/user/tokens Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
user-token POST /api/v1/user/tokens Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
user-token DELETE /api/v1/user/tokens/:tokenId Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
zone GET /api/v1/zones Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
zone POST /api/v1/zones Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
zone PUT /api/v1/zones/:zoneId Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.
zone DELETE /api/v1/zones/:zoneId Legacy seul Contrat et router V1 legacy ; aucun contrôleur NestJS V1.

Annexes hors décompte V1

  • Remplacements V2 (9 routes) : les quatre routes environment et les cinq
    routes repository sous /api/v2/projects/:projectId/... sont chargées par
    NestJS et routées par location /api/v2/. Elles ne retirent pas les routes
    V1 /api/v1/environments et /api/v1/repositories.
  • NestJS-only (4 routes) : les routes deployment sous
    /api/v1/projects/:projectId/deployments sont chargées par NestJS et
    couvertes par leur règle Nginx dédiée.

Événements et plugins

  • Les plugins Vault, Keycloak, GitLab, Harbor, Nexus, ArgoCD et SonarQube ont
    des consommateurs project.upsert et project.delete ; leur chargement est
    conditionnel à USE_*, sauf Keycloak.
  • projectMember.upsert et projectMember.delete n'ont aucun consommateur.
  • adminRole.upsert et adminRole.delete n'ont aucun consommateur et ne
    passent pas par capturePluginResult.

Définition du fini

  • Les 75 routes V1 ont chacune une preuve de contrôleur,
    d'enregistrement, de routage et, si applicable, de parité d'événements.
  • Aucune route n'est marquée routée lorsque son module ou un consommateur
    d'événement requis est absent.
  • Les routes V2 et NestJS-only restent hors décompte V1.
  • Toute future bascule est accompagnée du test ciblé et de nginx -t.

Références

  • apps/server/src/resources/index.ts
  • apps/nginx-strangler/conf.d/routing.conf
  • apps/server-nestjs/documentation/Modularisation-de-console-server/MODULARISATION-STATUT.md
  • docs/superpowers/specs/2026-09-16-nestjs-modularisation-status-design.md

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

technical debtRésoud de la dette technique

Type

Projects

No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions