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).

Activity

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

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