docs(catalogue): contrat exact des FK a la suppression produit #27

Merged
Corentin merged 1 commit from fix/product-delete-fk-audit into dev 2026-06-16 14:21:28 +02:00
Owner

Finding LOW (audit 2026-06-16)

Le docblock de ProductRepository affirmait que la suppression dure est bloquee si le produit est reference (4 FK RESTRICT), en omettant que product_ingredient.product_id est ON DELETE CASCADE. Un produit avec une recette mais sans reference commande/menu se supprime donc (recette cascade-supprimee), contredisant le contrat. Latent aujourd'hui : product_ingredient est vide (domaine recettes/stock non construit).

Correctif (contrat, sans changement de comportement)

La cascade est voulue (la recette appartient au produit). On corrige donc le contrat, pas le comportement :

  • docblock ProductRepository : topologie FK reelle (RESTRICT bloquants -> 422 ; CASCADE product_ingredient).
  • commentaire au site de suppression (ProductController::destroy).

Differe (assume, documente)

Tracer dans audit_log le nombre de lignes product_ingredient cascade-supprimees : reporte a la phase stock/recettes (table vide aujourd'hui ; la trace sera concue avec la feature, avec le support de test adequat). TODO inscrit dans le docblock.

188 tests verts, PHPStan L6 propre. Pas de label auto-merge.

## Finding LOW (audit 2026-06-16) Le docblock de `ProductRepository` affirmait que la suppression dure est bloquee si le produit est reference (4 FK RESTRICT), en **omettant** que `product_ingredient.product_id` est `ON DELETE CASCADE`. Un produit avec une recette mais sans reference commande/menu se supprime donc (recette cascade-supprimee), contredisant le contrat. Latent aujourd'hui : `product_ingredient` est vide (domaine recettes/stock non construit). ## Correctif (contrat, sans changement de comportement) La cascade est **voulue** (la recette appartient au produit). On corrige donc le contrat, pas le comportement : - docblock `ProductRepository` : topologie FK reelle (RESTRICT bloquants -> 422 ; CASCADE `product_ingredient`). - commentaire au site de suppression (`ProductController::destroy`). ## Differe (assume, documente) Tracer dans `audit_log` le **nombre de lignes `product_ingredient` cascade-supprimees** : reporte a la phase stock/recettes (table vide aujourd'hui ; la trace sera concue avec la feature, avec le support de test adequat). TODO inscrit dans le docblock. 188 tests verts, PHPStan L6 propre. Pas de label auto-merge.
Corentin added 1 commit 2026-06-16 14:04:52 +02:00
docs(catalogue): contrat exact des FK a la suppression produit (CASCADE product_ingredient)
All checks were successful
CI / php-lint (pull_request) Successful in 23s
CI / php-lint (push) Successful in 20s
CI / static-tests (push) Successful in 38s
CI / auto-merge (pull_request) Successful in 6s
CI / secret-scan (pull_request) Successful in 12s
CI / static-tests (pull_request) Successful in 32s
CI / auto-merge (push) Has been skipped
CI / secret-scan (push) Successful in 9s
4e7a07bfe0
Le docblock de ProductRepository pretendait que la suppression dure est bloquee
si le produit est reference (4 FK RESTRICT listees), en omettant que
product_ingredient.product_id est ON DELETE CASCADE : un produit avec une recette
mais sans reference commande/menu se supprime (la recette est cascade-supprimee),
ce qui contredit le contrat affiche.

La cascade est le comportement VOULU (la recette appartient au produit). Correctif
de contrat, sans changement de comportement :
- docblock ProductRepository : topologie FK reelle (RESTRICT bloquants vs CASCADE
  product_ingredient), + TODO trace audit du nb de lignes recette (phase stock).
- commentaire au site de suppression dans ProductController.

Differe (assume) : tracer le compte de lignes product_ingredient cascade dans
audit_log. La table est vide (domaine recettes/stock non construit) ; la trace
sera concue avec cette feature. 188 tests verts, PHPStan L6 propre.
Corentin merged commit 8ce1dc21de into dev 2026-06-16 14:21:28 +02:00
Corentin deleted branch fix/product-delete-fk-audit 2026-06-16 14:21:29 +02:00
Sign in to join this conversation.
No reviewers
No labels
auto-merge
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: AcadeNice/corentin_wakdo#27
No description provided.