Skip to content

feat(server-nestjs): consume adminRole events in keycloak and gitlab modules - #2749

Merged
shikanime merged 3 commits into
mainfrom
pr/admin-role-event-bridge
Oct 8, 2026
Merged

shikanime merged 3 commits into
mainfrom
pr/admin-role-event-bridge

Conversation

@shikanime

@shikanime shikanime commented Sep 18, 2026 •

Copy link
Copy Markdown
Member

Issues liées

Blocks the cut-over of #2738, #2495, #2496, #2740.

Quel est le comportement actuel ?

admin-role.service.ts already emits these events on main, but no @OnEvent consumer exists — at cutover the Keycloak/GitLab group sync would be silently lost. Also unblocks #2738 (user migration emits adminRole.upsert per impacted role).

Quel est le nouveau comportement ?

Bridge emitAsync('adminRole.upsert' | 'adminRole.delete') to actual consumers in server-nestjs:

  • keycloak: reconcile the impacted role's Keycloak group membership (reuses ensureAdminRoleGroup)
  • gitlab: upsert members with admin/auditor flags from the role's oidc group (mirrors legacy upsertAdminRole/deleteAdminRole plugin functions)

Shared payload type AdminRoleEventPayload in app-events.service.ts.

Signed-off-by: Shikanime Deva 22115108+shikanime@users.noreply.github.com

@shikanime
shikanime requested a review from a team as a code owner September 18, 2026 09:42
@shikanime
shikanime added this pull request to stack #2750 September 18, 2026 09:44
@shikanime
shikanime removed this pull request from stack #2750 September 18, 2026 09:44
@shikanime
shikanime added this pull request to stack #2751 September 18, 2026 09:46
@github-actions github-actions Bot added the built label Sep 18, 2026
@shikanime
shikanime marked this pull request as draft September 18, 2026 09:55
@shikanime shikanime added this to the 9.27.0 milestone Sep 24, 2026
@shikanime shikanime added the preview Deploy preview app with Argo-cd label Sep 24, 2026
@github-actions

Copy link
Copy Markdown
Contributor

🤖 Hey !

A preview of the application is available at : https://console-pr-2749.dso.cpin-hp.numerique-interieur.fr

Please be patient, deployment may take a few minutes.

@shikanime shikanime removed the preview Deploy preview app with Argo-cd label Sep 28, 2026
shikanime added a commit that referenced this pull request Sep 28, 2026
server-nestjs already excludes OIDC-backed role ids from member counts,
while the frozen legacy handler computes NaN for them, fails the response
contract and turns GET /api/v1/admin/roles/member-counts into a 500.

The route flip depends on the adminRole event bridge (#2749) landing
first.

Refs #2781

Co-authored-by: Automata <automata@shikanime.studio>
Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>
Change-Id: I7d36cd930692f7b476d37909077bb7166a6a6964
shikanime added a commit that referenced this pull request Sep 28, 2026
server-nestjs already excludes OIDC-backed role ids from member counts,
while the frozen legacy handler computes NaN for them, fails the response
contract and turns GET /api/v1/admin/roles/member-counts into a 500.

The route flip depends on the adminRole event bridge (#2749) landing
first.

Refs #2781

Co-authored-by: Automata <automata@shikanime.studio>
Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>
Change-Id: I7d36cd930692f7b476d37909077bb7166a6a6964
@shikanime shikanime added the enhancement New feature or request label Sep 29, 2026
@shikanime shikanime self-assigned this Sep 29, 2026
@shikanime
shikanime removed this pull request from stack #2751 September 29, 2026 13:28

@shikanime shikanime left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verdict : Changements demandés

Le pont GitLab est fidèle au legacy et bien testé, mais le pont Keycloak pour adminRole.delete relit la base à l'intérieur de la transaction émettrice et ne révoque donc jamais les membres — bloquant, il faut traiter le payload de delete ou émettre après commit — et le module se base sur un main pré-#2792 dont il duplique le split d'auditor paths. Bel effort otherwise : trois suites de tests dont la chaîne event→consommateurs, exactement le garde-fou qui manquait pour débloquer #2738.

Comment thread apps/server-nestjs/src/modules/keycloak/keycloak.service.ts
Comment thread apps/server-nestjs/src/modules/gitlab/gitlab.service.ts Outdated
Comment thread apps/server-nestjs/src/modules/keycloak/keycloak.service.ts
Comment thread apps/server-nestjs/src/modules/gitlab/gitlab.service.ts Outdated
Comment thread apps/server-nestjs/src/modules/gitlab/gitlab.service.ts Outdated
Comment thread apps/server-nestjs/src/modules/events/app-events.module.spec.ts
@shikanime
shikanime force-pushed the pr/admin-role-event-bridge branch 3 times, most recently from 5a1f4a9 to 0e5b588 Compare October 1, 2026 15:12
shikanime added a commit that referenced this pull request Oct 1, 2026
server-nestjs already excludes OIDC-backed role ids from member counts,
while the frozen legacy handler computes NaN for them, fails the response
contract and turns GET /api/v1/admin/roles/member-counts into a 500.

The route flip depends on the adminRole event bridge (#2749) landing
first.

Refs #2781

Co-authored-by: Automata <automata@shikanime.studio>
Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>
Change-Id: I7d36cd930692f7b476d37909077bb7166a6a6964

@StephaneTrebel StephaneTrebel left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Les consommateurs adminRole.* présents dans le diff relient bien les deux ponts demandés et le payload de suppression est maintenant consommé sans relecture du rôle supprimé. La branche reste toutefois à 3 commits de main et deux fils de revue pertinents restent ouverts : rebaser, intégrer #2792 puis réconcilier les fils et les contrôles avant nouvelle revue.

shikanime added a commit that referenced this pull request Oct 2, 2026
server-nestjs already excludes OIDC-backed role ids from member counts,
while the frozen legacy handler computes NaN for them, fails the response
contract and turns GET /api/v1/admin/roles/member-counts into a 500.

The route flip depends on the adminRole event bridge (#2749) landing
first.

Refs #2781

Co-authored-by: Automata <automata@shikanime.studio>
Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>
Change-Id: I7d36cd930692f7b476d37909077bb7166a6a6964
@iliesmrf iliesmrf modified the milestones: 9.27.0, 9.28.0 Oct 2, 2026

@shikanime shikanime left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment s'articule la revue

L'implémentation suit bien les patterns existants : la réconciliation Keycloak repasse par ensureAdminRoleGroup (idempotent, avec relecture en base) et la révocation interroge le groupe via getGroupByPath sans le créer, avec tolérance 404. Le pont GitLab reflète fidèlement les fonctions plugin legacy, mais le chemin delete s'appuie sur upsertUser qui crée les comptes GitLab absents — invariant déjà corrigé sur la PR #2807. Par ailleurs, la comparaison du chemin admin en égalité stricte diverge du reste du même fichier qui passe par parseGroupPaths, ce qui casse silencieusement les configurations multi-chemins. Le reste (payload partagé AdminRoleEventPayload, specs ajoutées plutôt que supprimées, imports minimaux, pas de cast as) est conforme ; le flag draft est cohérent avec le statut du chantier.

Comment thread apps/server-nestjs/src/modules/gitlab/gitlab.service.ts
Comment thread apps/server-nestjs/src/modules/gitlab/gitlab.service.ts Outdated
@StephaneTrebel
StephaneTrebel marked this pull request as ready for review October 8, 2026 09:05
@StephaneTrebel StephaneTrebel modified the milestones: 9.28.0, 9.27.0 Oct 8, 2026

@StephaneTrebel StephaneTrebel left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verdict : changements demandés. Le rebase et la révocation Keycloak depuis le payload ont bien corrigé les points précédents, et les specs de chaîne sont utiles. Deux régressions restent toutefois dans le pont GitLab : une suppression peut provisionner un utilisateur GitLab absent, et une configuration admin multi-chemins n'est pas reconnue ; détails inline ci-dessous.

@shikanime
shikanime force-pushed the pr/admin-role-event-bridge branch from e081d11 to c808c97 Compare October 8, 2026 09:21
@shikanime

Copy link
Copy Markdown
Member Author

Traitement de la revue (c808c97)

  • packages/ts-config/tsconfig.base.json : l'artefact n'existe plus à la tête de branche (fil marqué obsolète, résolu).
  • Pont GitLab delete : getUserByEmail avant révocation ; compte absent → membre ignoré (provisioning OIDC), pas de compte fantôme — calibré sur feat(zone): port keycloak and gitlab zone bridges to server-nestjs #2807. Nouvelle spé : should skip absent GitLab accounts instead of provisioning them.
  • Config admin multi-chemins : parseGroupPaths + includes sur getAdminGroupPath(), aligné sur l'usage projet (l. 292). Nouvelle spé : should recognize every configured admin group path.

Gates locaux : vitest gitlab.service.spec (30/30), nest build, eslint — verts.

@StephaneTrebel StephaneTrebel left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verdict : changements demandés. Les deux constats fonctionnels précédents sont corrigés : les chemins admin multiples passent par parseGroupPaths, et une révocation n’essaie plus de provisionner les comptes GitLab absents ; les tests et les checks du head sont verts. La branche reste toutefois à 4 commits derrière main : rebase et relance des checks requis avant validation. Ledger #2723 : specs et parité sont couvertes par le diff ; le choix de conception n’est pas encore documenté dans l’issue comme le demande son premier critère.

@shikanime
shikanime force-pushed the pr/admin-role-event-bridge branch from c808c97 to f34ad1f Compare October 8, 2026 09:36
@shikanime
shikanime force-pushed the pr/admin-role-event-bridge branch 3 times, most recently from 433d9be to d89b285 Compare October 8, 2026 09:57
@shikanime
shikanime enabled auto-merge October 8, 2026 09:57
shikanime and others added 3 commits October 8, 2026 11:58
…modules

Design: bridge adminRole.upsert/delete events emitted by admin-role.service and user migration to keycloak (group membership reconcile via ensureAdminRoleGroup, delete revokes from payload members) and gitlab (admin/auditor flags from the role oidc group, mirrors legacy upsertAdminRole/deleteAdminRole plugin functions). Shared payload type AdminRoleEventPayload in app-events.service.ts. Rebased onto current main; drops the stray packages/ts-config artifact flagged in review.

Refs #2723

Co-authored-by: Automata <automata@shikanime.studio>
Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>
Change-Id: I5e020c8ea72c6ba782e73c62e29e9aad6a6a6964
…Lab accounts on revoke

Co-authored-by: Automata <automata@shikanime.studio>
Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>
Change-Id: I6b5e959fc804f5ea7d4cd9e06bfebabc6a6a6964
Co-authored-by: Automata <automata@shikanime.studio>
Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>
Change-Id: I3ac3c5df9f778e623f92e8383eb4ec906a6a6964
@cloud-pi-native-sonarqube

Copy link
Copy Markdown

@StephaneTrebel StephaneTrebel left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verdict : approuvée. Les correctifs GitLab sont conformes à la décision documentée dans #2723 : les chemins multiples sont pris en charge et la console reste autoritaire sur le provisioning OIDC lors d’une révocation. Le pont couvre les événements upsert/delete dans Keycloak et GitLab, avec des specs de chaîne/service ; la branche est à jour sur main et tous les checks, dont Sonar, sont verts.

@shikanime
shikanime disabled auto-merge October 8, 2026 10:04
@shikanime
shikanime added this pull request to the merge queue Oct 8, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Oct 8, 2026
@shikanime
shikanime added this pull request to the merge queue Oct 8, 2026
Merged via the queue into main with commit 2ea9860 Oct 8, 2026
34 checks passed
@shikanime
shikanime deleted the pr/admin-role-event-bridge branch October 8, 2026 10:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

built enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants