Skip to content

🐛 [BUG] server-nestjs: zone.upsert/zone.delete listeners have no emitter (AppEventsService missing emitZoneEvent) — cutover blocker #2575

Description

@shikanime

Contexte / Context

La migration apps/server → apps/server-nestjs mappe les syncs de plugins via des Ă©vĂ©nements :

  • apps/server (legacy) : fire hook.zone.upsert / hook.zone.delete directement dans business.ts sur les routes zone.
  • apps/server-nestjs : Ă©met via AppEventsService.emit*(...) → EventEmitter2 → consommateurs @OnEvent.

ProblĂšme / Problem

VaultService écoute sur @OnEvent('zone.upsert') et @OnEvent('zone.delete') (vault.service.ts:87, 101), mais :

  1. AppEventsService n'expose AUCUNE mĂ©thode d'Ă©mission pour zone.* — ni emitZoneEvent, ni de type ZoneEventName. La seule API publique est emitProjectEvent / emitProjectMemberEvent / emitRepositoryEvent (app-events.service.ts:72-109).
  2. Aucun service nestjs n'Ă©met zone.upsert / zone.delete — le grep emitProjectEvent|emitProjectMemberEvent|emitRepositoryEvent|eventEmitter.emit ne trouve aucune rĂ©fĂ©rence zone (hors logs).
  3. Le module zone n'existe pas encore dans server-nestjs — la route zone est toujours propriĂ©taire de apps/server (legacy).

Impact

Ce n'est pas un bug LIVE aujourd'hui (la route zone reste sur legacy, qui fire les hooks directement). C'est un rĂ©gression silencieuse au cutover : dĂšs que la route zone migrera vers server-nestjs sans brancher un emitZoneEvent, les listeners @OnEvent('zone.*') de Vault deviendront morts — le mount/policy/approle Vault des zones ne seront plus provisionnĂ©s/suprimĂ©s.

Cf. migration-parity-checklist : « if the migrated service emits eventEmitter.emitAsync('<entity>.<verb>', ...) but NO @OnEvent('<entity>.<verb>') handler exists anywhere » — ici c'est l'inverse (listener sans Ă©metteur), mĂȘme classe de rĂ©gression silencieuse.

Preuves / Evidence

  • Baseline unitaire : 578 passĂ© / 59 skipped (2026-08-25, Node 24).
  • Seed unitaire validĂ© : app-events.service.spec.ts ajoute une assertion de paritĂ© zone.* (listener sans Ă©metteur) — 12/12 vert.
  • vault.service.spec.ts : 4 specs nouveaux scellent la surface externe upsertZone/deleteZone (mount + policy + approle + tech-readonly) — 8/8 vert.
  • E2E vault.e2e-spec.ts : case zone ajoutĂ©e (gated E2E=1), Ă©met zone.upsert/zone.delete directement via EventEmitter2 pour couvrir le contrat externe Vault (runnable sur host connectĂ© / CI).

Definition du fini / Done

  • (cutover-blocker) Ajouter un module zone dans server-nestjs avec un Ă©metteur zone.upsert/zone.delete via AppEventsService — OU garder la route sur legacy jusqu'Ă  ce que l'Ă©metteur existe.
  • Le seed unitaire + e2e ci-dessus restentverts (ils valident le contrat).

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions