✨ Story 5.5: endpoint contact PHP
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
|
||||
## Status
|
||||
|
||||
Ready for Dev
|
||||
review
|
||||
|
||||
## Story
|
||||
|
||||
@@ -23,35 +23,35 @@ Ready for Dev
|
||||
|
||||
## Tasks / Subtasks
|
||||
|
||||
- [] **Task 1 : Créer l'endpoint api/contact.php** (AC: 7, 8)
|
||||
- [] Créer le fichier api/contact.php
|
||||
- [] Configurer les headers JSON (Content-Type, X-Content-Type-Options)
|
||||
- [] Gérer uniquement les requêtes POST (405 sinon)
|
||||
- [x] **Task 1 : Créer l'endpoint api/contact.php** (AC: 7, 8)
|
||||
- [x] Créer le fichier api/contact.php
|
||||
- [x] Configurer les headers JSON (Content-Type, X-Content-Type-Options)
|
||||
- [x] Gérer uniquement les requêtes POST (405 sinon)
|
||||
|
||||
- [] **Task 2 : Valider le token CSRF** (AC: 4)
|
||||
- [] Récupérer le token de la requête JSON
|
||||
- [] Utiliser verifyCsrfToken() existante
|
||||
- [] Exception si invalide
|
||||
- [x] **Task 2 : Valider le token CSRF** (AC: 4)
|
||||
- [x] Récupérer le token de la requête JSON
|
||||
- [x] Utiliser verifyCsrfToken() existante
|
||||
- [x] Exception si invalide
|
||||
|
||||
- [] **Task 3 : Vérifier reCAPTCHA** (AC: 2)
|
||||
- [] Créer verifyRecaptcha() dans functions.php
|
||||
- [] Appeler l'API Google siteverify
|
||||
- [] Rejeter si score < RECAPTCHA_THRESHOLD (0.5)
|
||||
- [x] **Task 3 : Vérifier reCAPTCHA** (AC: 2)
|
||||
- [x] Créer verifyRecaptcha() dans functions.php
|
||||
- [x] Appeler l'API Google siteverify
|
||||
- [x] Rejeter si score < RECAPTCHA_THRESHOLD (0.5)
|
||||
|
||||
- [] **Task 4 : Valider les données** (AC: 1, 3)
|
||||
- [] Créer validateContactData() dans functions.php
|
||||
- [] Valider required, format email, longueurs min/max
|
||||
- [] Nettoyer avec htmlspecialchars et trim
|
||||
- [] Exception avec messages détaillés
|
||||
- [x] **Task 4 : Valider les données** (AC: 1, 3)
|
||||
- [x] Créer validateContactData() dans functions.php
|
||||
- [x] Valider required, format email, longueurs min/max
|
||||
- [x] Nettoyer avec htmlspecialchars et trim
|
||||
- [x] Exception avec messages détaillés
|
||||
|
||||
- [] **Task 5 : Envoyer l'email** (AC: 5, 6)
|
||||
- [] Créer sendContactEmail() dans functions.php
|
||||
- [] Corps formaté avec tous les champs + IP + date
|
||||
- [] Headers avec Reply-To vers l'expéditeur
|
||||
- [x] **Task 5 : Envoyer l'email** (AC: 5, 6)
|
||||
- [x] Créer sendContactEmail() dans functions.php
|
||||
- [x] Corps formaté avec tous les champs + IP + date
|
||||
- [x] Headers avec Reply-To vers l'expéditeur
|
||||
|
||||
- [] **Task 6 : Retourner la réponse** (AC: 7, 8)
|
||||
- [] JSON {"success": true, "message": "..."} si OK
|
||||
- [] JSON {"success": false, "error": "..."} si erreur
|
||||
- [x] **Task 6 : Retourner la réponse** (AC: 7, 8)
|
||||
- [x] JSON {"success": true, "message": "..."} si OK
|
||||
- [x] JSON {"success": false, "error": "..."} si erreur
|
||||
|
||||
## Dev Notes
|
||||
|
||||
@@ -291,23 +291,29 @@ EMAIL;
|
||||
## Dev Agent Record
|
||||
|
||||
### Agent Model Used
|
||||
Claude Opus 4.5 (claude-opus-4-5-20251101)
|
||||
GPT-5 Codex
|
||||
|
||||
### Implementation Plan
|
||||
- Implémenter les tâches 1 à 6 dans l’ordre avec tests à chaque étape.
|
||||
- Ajouter endpoint API et fonctions de validation/envoi.
|
||||
|
||||
### File List
|
||||
| File | Action | Description |
|
||||
|------|--------|-------------|
|
||||
| `api/contact.php` | Created | Endpoint de traitement du formulaire |
|
||||
| `includes/functions.php` | Modified | Ajout verifyRecaptcha, validateContactData, sendContactEmail |
|
||||
| `includes/config.php` | Modified | Ajout RECAPTCHA_THRESHOLD |
|
||||
| `includes/config.php` | Modified | Ajout RECAPTCHA_THRESHOLD + CONTACT_EMAIL |
|
||||
| `.env` | Modified | Ajout CONTACT_EMAIL |
|
||||
| `tests/contact-api.test.php` | Added | Tests endpoint contact |
|
||||
| `tests/run.ps1` | Modified | Ajout du test contact-api |
|
||||
|
||||
### Completion Notes
|
||||
- Endpoint api/contact.php avec gestion JSON complète
|
||||
- verifyRecaptcha() : appel API Google avec dégradation gracieuse (0.3 si échec)
|
||||
- validateContactData() : validation complète (required, email, longueurs min/max, catégorie)
|
||||
- sendContactEmail() : email formaté avec tous les champs, Reply-To, IP, date
|
||||
- verifyRecaptcha() : appel API Google + seuil 0.5 + dégradation
|
||||
- validateContactData() : validation/normalisation complète
|
||||
- sendContactEmail() : email formaté avec Reply-To, IP, date
|
||||
- Sécurité : CSRF, reCAPTCHA, htmlspecialchars, filter_var
|
||||
- Réponses JSON standardisées {success, message/error}
|
||||
- Logging des erreurs via error_log()
|
||||
- Tests : `powershell -ExecutionPolicy Bypass -File tests/run.ps1`
|
||||
|
||||
### Debug Log References
|
||||
- Correction syntaxe heredoc (EMAIL: interprété comme label)
|
||||
@@ -318,3 +324,4 @@ Claude Opus 4.5 (claude-opus-4-5-20251101)
|
||||
|------|---------|-------------|--------|
|
||||
| 2026-01-22 | 0.1 | Création initiale | Sarah (PO) |
|
||||
| 2026-01-24 | 1.0 | Implémentation complète | James (Dev) |
|
||||
| 2026-02-04 | 1.1 | Endpoint contact + validation serveur | Amelia (Dev) |
|
||||
|
||||
Reference in New Issue
Block a user