fix: une clé d'idempotence de plus de 36 caractères est refusée en 422 au lieu d'un 500 #186

Merged
Corentin merged 1 commit from fix/order-idempotency-key-max into dev 2026-09-28 11:25:07 +02:00
Owner

Pourquoi

En capturant les vraies reponses de chaque route pour la page Sante, une commande de la borne a repondu 500 : sa idempotency_key faisait 39 caracteres, la colonne customer_order.idempotency_key est un VARCHAR(36) (migration 0001), et rien ne controlait la longueur avant l'insertion. Une entree invalide doit rendre un 422 lisible, pas une erreur serveur.

Ce qui change

  • OrderRepository : la cle est nettoyee et controlee a un seul endroit (idempotencyKey()), avant la recherche de commande existante et avant toute ecriture. Au-dela de 36 caracteres : INVALID_IDEMPOTENCY_KEY. La creation au comptoir et au drive passe par le meme controle.
  • OrderController : message « Clé d'idempotence invalide (36 caractères au plus). », statut 422 (regle par defaut des erreurs de validation).
  • docs/api/conventions.md : le code est documente a cote d'ORDER_CANCELLED.

La borne n'est pas touchee : elle envoie un UUID (crypto.randomUUID), 36 caracteres.

Verification

  • 3 tests ecrits avant la correction : 37 caracteres refuses sans ecriture, 36 acceptes, reponse 422 et message du controleur. Rouges (2 echecs) puis verts.
  • Suite PHP complete avec la base de test : 2360 tests, 7807 assertions, 0 echec. PHPStan niveau 6 propre.
  • gitleaks sur un clone : aucune fuite.
## Pourquoi En capturant les vraies reponses de chaque route pour la page Sante, une commande de la borne a repondu **500** : sa `idempotency_key` faisait 39 caracteres, la colonne `customer_order.idempotency_key` est un `VARCHAR(36)` (migration 0001), et rien ne controlait la longueur avant l'insertion. Une entree invalide doit rendre un 422 lisible, pas une erreur serveur. ## Ce qui change - `OrderRepository` : la cle est nettoyee et controlee a un seul endroit (`idempotencyKey()`), avant la recherche de commande existante et avant toute ecriture. Au-dela de 36 caracteres : `INVALID_IDEMPOTENCY_KEY`. La creation au comptoir et au drive passe par le meme controle. - `OrderController` : message « Clé d'idempotence invalide (36 caractères au plus). », statut 422 (regle par defaut des erreurs de validation). - `docs/api/conventions.md` : le code est documente a cote d'`ORDER_CANCELLED`. La borne n'est pas touchee : elle envoie un UUID (`crypto.randomUUID`), 36 caracteres. ## Verification - 3 tests ecrits avant la correction : 37 caracteres refuses sans ecriture, 36 acceptes, reponse 422 et message du controleur. Rouges (2 echecs) puis verts. - Suite PHP complete avec la base de test : 2360 tests, 7807 assertions, 0 echec. PHPStan niveau 6 propre. - gitleaks sur un clone : aucune fuite.
fix: une clé d'idempotence de plus de 36 caractères est refusée en 422 au lieu de faire échouer la commande en 500
Some checks failed
CI / secret-scan (push) Failing after 24s
CI / php-lint (push) Successful in 29s
CI / static-tests (push) Successful in 2m54s
CI / js-tests (push) Successful in 41s
CI / shell-tests (push) Successful in 9s
CI / secret-scan (pull_request) Successful in 24s
CI / php-lint (pull_request) Successful in 32s
CI / static-tests (pull_request) Successful in 3m5s
CI / shell-tests (pull_request) Successful in 8s
CI / js-tests (pull_request) Successful in 53s
e7b3e1d80b
Corentin deleted branch fix/order-idempotency-key-max 2026-09-28 11:25:08 +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!186
No description provided.