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

Closed
Corentin wants to merge 1 commit from fix/order-idempotency-key-length into dev
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 (pull_request) Failing after 23s
CI / php-lint (pull_request) Successful in 29s
CI / static-tests (pull_request) Successful in 2m48s
CI / js-tests (pull_request) Successful in 45s
CI / shell-tests (pull_request) Successful in 9s
CI / secret-scan (push) Failing after 23s
CI / php-lint (push) Successful in 28s
CI / static-tests (push) Successful in 3m3s
CI / js-tests (push) Successful in 44s
CI / shell-tests (push) Successful in 6s
973b561e21
Author
Owner

Remplacee par #186 : le test contenait un UUID d'exemple que l'analyse de secrets prend (a tort) pour une cle d'API. Le contenu est identique, avec une cle de test non aleatoire.

Remplacee par #186 : le test contenait un UUID d'exemple que l'analyse de secrets prend (a tort) pour une cle d'API. Le contenu est identique, avec une cle de test non aleatoire.
Corentin closed this pull request 2026-09-28 10:26:57 +02:00
Some checks failed
CI / secret-scan (pull_request) Failing after 23s
Required
Details
CI / php-lint (pull_request) Successful in 29s
Required
Details
CI / static-tests (pull_request) Successful in 2m48s
Required
Details
CI / js-tests (pull_request) Successful in 45s
Required
Details
CI / shell-tests (pull_request) Successful in 9s
CI / secret-scan (push) Failing after 23s
CI / php-lint (push) Successful in 28s
CI / static-tests (push) Successful in 3m3s
CI / js-tests (push) Successful in 44s
CI / shell-tests (push) Successful in 6s

Pull request closed

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!185
No description provided.