Repository navigation
fix(server-nestjs): consume projectMember events in gitlab module - #2721
Conversation
|
🤖 Hey ! A preview of the application is available at : https://console-pr-2721.dso.cpin-hp.numerique-interieur.fr Please be patient, deployment may take a few minutes. |
shikanime
left a comment
There was a problem hiding this comment.
Verdict : Commentaire
Le pont projectMember est propre : l'émission part après commit de la transaction (project-members.service.ts émet hors du $transaction), le handler relit l'état en base — donc idempotent au replay — et la suppression tolère un utilisateur GitLab ou un groupe absents sans faire échouer l'événement. Pas de finding.
3993a89 to
e88d29b
Compare
StephaneTrebel
left a comment
There was a problem hiding this comment.
Le pont projectMember couvre les deux événements et reste idempotent pour les suppressions rejouées. La branche est à 59 commits de main : rebase nécessaire, suivi d’une relance des contrôles, avant approbation.
e88d29b to
7097409
Compare
|
Relecture de la tête actuelle : les consommateurs projectMember.upsert/delete utilisent capturePluginResult et les cas d’absence GitLab sont couverts. La PR étant en brouillon, aucun verdict formel n’est publié. |
735349b to
613b8a9
Compare
shikanime
left a comment
There was a problem hiding this comment.
Revue conventions + structure : titre et commits conformes (adresse -open + co-authored-by Automata), brouillon cohérent avec la dépendance à #2579. Le consommateur upsert réutilise ensureProjectGroupMembers (pas de duplication) et la suppression ne crée rien, avec la divergence assumée et testée vis-à-vis du legacy. Un point important en inline : la résolution email → utilisateur GitLab passe par une recherche floue sans vérification d'égalité exacte, sur un chemin destructif. Note : le garde suspended est absent de tout server-nestjs à ce head (fonctionnalité revertée, cf. 097376a3) — cohérent avec les handlers project.* existants, à réintroduire le moment venu. Le retrait des assertions négatives de #2579 après fusion est bien tracé dans la description.
613b8a9 to
26c51a8
Compare
26c51a8 to
9f0fee3
Compare
|
Corrigé sur le head async getUserByEmail(email: string) {
- const users = await this.client.Users.all({ search: email, orderBy: 'username' })
- if (users.length === 0) return undefined
- return users[0] as UserSchema
+ // Fuzzy search matches username and display name too; only an exact
+ // email hit is safe on destructive paths (member removal).
+ const users = await this.client.Users.all({ search: email, orderBy: 'username' })
+ return users.find(user => user.email === email) as UserSchema | undefined
}
|
3b291cf to
0618b78
Compare
|
Branche rebasée sur
|
projectMember.upsert/delete were emitted with no @onevent consumer, so GitLab group member sync silently stopped on the /api/v1/projects routes already cut over to server-nestjs. Add a gitlab consumer that reconciles the project group members on upsert (parity with the legacy main step) and removes the group member on delete (parity with the legacy post step; absent user or group tolerated as OK). Refs #2590 Co-authored-by: Automata <automata@shikanime.studio> Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr> Change-Id: I258b7d5035b1d05946e851297ec3a1376a6a6964 Signed-off-by: Shikanime Deva <22115108+shikanime@users.noreply.github.com>
Co-authored-by: Automata <automata@shikanime.studio> Signed-off-by: Shikanime Deva <22115108+shikanime@users.noreply.github.com>
Co-authored-by: Automata <automata@shikanime.studio> Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr> Change-Id: I3a35122664f8d2616ce94fe6d073a80e6a6a6964
0618b78 to
44af7c5
Compare
|
StephaneTrebel
left a comment
There was a problem hiding this comment.
No findings. Les deux consommateurs couvrent les trois sites d’émission après transaction et remontent leurs résultats via capturePluginResult, conformément au choix documenté dans #2590 et à la divergence assumée pour un groupe absent. Les 150 tests existants et quatre sondes supplémentaires passent, dont deux reproduisent le défaut de recherche floue avec l’ancienne méthode ; lint ciblé et CI verts, SonarQube sans nouvelle issue et cinq fils déjà résolus.
Test Files 8 passed (8)
Tests 154 passed (154)

0 New Issues
0 Fixed Issues
0 Accepted Issues
Issues liées
Refs #2590
Quel est le comportement actuel ?
project-members.service.tsémetprojectMember.upsert/projectMember.deleteviaAppEventsService, mais aucun consommateur@OnEvent('projectMember.*')n'existe dans server-nestjs : les événements sont émis sans effet et la synchronisation des membres du groupe GitLab ne se fait plus sur les routes déjà basculées (/api/v1/projects).Quel est le nouveau comportement ?
Le module gitlab consomme les deux événements :
projectMember.upsert→ re-synchronisation complète des membres du groupe GitLab du projet (réutiliseensureProjectGroupMembers), en parité avec l'étapemaindu hook legacyupsertProjectMember;projectMember.delete→ suppression ciblée du membre du groupe (résolution email → utilisateur GitLab, puisremoveGroupMember) ; utilisateur absent de GitLab = OK, en parité avec l'étapepostdu hook legacydeleteProjectMember; groupe absent = OK sans création (voir la différence assumée ci-dessous).Différence assumée avec le legacy : le hook
deleteProjectMemberappelaitgitlabApi.removeGroupMember, qui passait pargetOrCreateProjectGroupet créait donc le groupe GitLab en effet de bord d'une suppression. Le consommateur NestJS ne crée plus le groupe : groupe absent ⇒OKsans création, une suppression ne doit pas avoir d'effet créateur. C'est cette divergence (et non une parité stricte) qui est couverte par le test « should tolerate a missing GitLab group ».Les trois sites d'émission restent inchangés. Les résultats passent par
capturePluginResult(échec → KO tracé dans le journal admin), comme les consommateursproject.*existants.Cette PR introduit-elle un breaking change ?
Non.
Autres informations