Repository navigation
Conversation
StephaneTrebel
left a comment
There was a problem hiding this comment.
Le nettoyage externe est désormais exécuté sur le projet intact et un résultat KO renvoie 422 sans lancer la transaction d’archivage. Le contrat, le test de non-écriture et les contrôles CI sont cohérents avec le ledger #2813.
shikanime
left a comment
There was a problem hiding this comment.
Réordonnancement correct et bien motivé : émettre project.delete sur le projet intact avant toute écriture rend la suppression rejouable (statut failed, ligne ni renommée ni verrouillée), et les specs accompagnent le changement sans perte de couverture — nouveau cas KO inclus, contrat 422 ajouté. Deux nits ci-dessous : le spec de succès ne verrouille pas l'ordre émission-avant-écriture (l'invariant central de la PR) et le return silencieux en cas d'archivage concurrent mérite une trace.
À noter aussi, hors diff : le commentaire de updateProjectStatus dans app-events.service.ts (« A successful project.delete leaves the archived status set when the project was archived ») est devenu obsolète avec le nouvel ordre — au moment de l'émission, la ligne n'est plus jamais archived.
|
🤖 Hey ! A preview of the application is available at : https://console-pr-2816.dso.cpin-hp.numerique-interieur.fr Please be patient, deployment may take a few minutes. |
d36099d to
c979cfe
Compare
|
Stress-test sur la preview (delete -> F5, deux
Unitaires : 28/28 sur Related: #2813 |
StephaneTrebel
left a comment
There was a problem hiding this comment.
Verdict : changements demandés. L’échec de nettoyage laisse désormais le projet rejouable, les deux défauts du stress-test concurrent ont des correctifs ciblés, et la CI est verte. Il reste toutefois une course entre ce nettoyage externe et les mutations du projet : une modification peut encore réconcilier des ressources après leur suppression ; en outre, la branche est à 7 commits derrière main et doit être rebasée avant validation.
20d5e83 to
d6ae40c
Compare
d6ae40c to
50a6b3d
Compare
L'archivage committait le renommage _archived et le verrouillage avant d'émettre project.delete. Un échec d'un listener laissait donc le projet verrouillé dans un état sans voie de récupération. L'émission passe avant la transaction : les listeners nettoyent les ressources sous le slug intact et voient encore les dépôts et environnements, un KO lève une 422 et laisse la ligne inchangée (statut failed, projet rejouable par un nouveau DELETE). Le renommage et le verrouillage ne sont posés qu'après un nettoyage externe réussi. Related: #2813 Co-authored-by: Automata <automata@shikanime.studio> Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr> Change-Id: Ic331cffbf0034681ad123ff26fe1159e6a6a6964 Signed-off-by: Shikanime Deva <22115108+shikanime@users.noreply.github.com>
…t archive Un DELETE rejoue pendant une suppression en cours fait repondre Keycloak 500 unknown_error au lieu de 404 : le 500 est desormais tolere quand le groupe n'existe plus au re-fetch, et le statut failed pose par un KO obsolete ne peut plus ecraser un projet deja archive. Related: #2813 Co-authored-by: Automata <automata@shikanime.studio> Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr> Signed-off-by: Shikanime Deva <22115108+shikanime@users.noreply.github.com>
Un update concurrent pendant le nettoyage externe reconsiliait des ressources derriere la suppression : l'archivage compare maintenant updatedAt au snapshot pre-emit et repond 409 sans ecrire, la requete reste rejouable. Trace du 204 silencieux sur ligne deja archivee et assertion d'ordre emission-avant-ecriture dans le spec. Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr> Signed-off-by: Shikanime Deva <22115108+shikanime@users.noreply.github.com>
Poser `locked` avant l'emission de `project.delete` fence toutes les routes de mutation (`@RequireProjectLocked(false)` + re-check in-transaction dans `update`) : aucune reconciliation externe ne peut plus passer derriere le nettoyage, y compris apres un echec (422) ou un conflit (409) - le verrou est conserve pour la reprise. Corrige la revue bloquante de #2816 (course nettoyage externe vs mutations), met a jour les docstrings obsoletes sur l'ordre emission/archivage et rebase sur main. Co-authored-by: Automata <automata@shikanime.studio> Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>
50a6b3d to
0094e10
Compare
|
Vingt-hole fermee : Nouveau head : |
StephaneTrebel
left a comment
There was a problem hiding this comment.
🔴 L’archivage échoue systématiquement car le contrôle updatedAt inclut la mise à jour du verrou (@updatedAt). Voir le commentaire inline pour le détail et une piste de correction ; merci de corriger avant validation.
Le controle de conflit comparait le projet recharge a un snapshot anterieur a l'ecriture du verrou ; l'annotation @updatedat de Prisma avance ce champ sur cette ecriture, donc chaque suppression repondait 409. La comparaison se fait desormais sur la ligne renvoyee par la pose du verrou, et le spec de succes verrouille ce comportement (le mock du verrou bump updatedAt) : la comparaison a l'ancienne echoue le spec. Corrige la revue bloquante de #2816. Co-authored-by: Automata <automata@shikanime.studio> Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr> Change-Id: I2d6b0f7bbcc3061a5c980bb3a197c83a6a6a6964
|

0 New Issues
0 Fixed Issues
0 Accepted Issues
Pourquoi
Un projet dont la suppression externe échouait restait définitivement verrouillé en
<slug>_<horodatage>_archived: l'archivage commettait le renommage et le verrouillage avant d'émettreproject.delete, et toutes les voies de récupération (update, rejeu de hooks, second DELETE) sont fermées par des gardes pour cet état. La seule issue était un UPDATE manuel en base.Quoi
Inversion de l'ordre dans
ProjectService.archive: l'événementproject.deleteest émis avant toute écriture, le renommage et le verrouillage ne sont posés qu'après un nettoyage externe réussi.422 Echec des services à la suppression du projet, statutfailed, ligne inchangée — un nouveauDELETErejoue le nettoyage (les listeners sont idempotents, modèle ensure-not-exists).422ajouté aux réponses dearchiveProject.Références
Related: #2813
#2813