From 90808551f003fe3e8e1cd227b433594b5e6f087a Mon Sep 17 00:00:00 2001 From: Jules Neny Date: Wed, 29 Apr 2026 00:34:57 +0200 Subject: [PATCH] docs(p4): recap P4 form proposer-pratique Co-Authored-By: Claude Sonnet 4.6 --- aep-communaute-build/P4-RECAP.md | 76 ++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 aep-communaute-build/P4-RECAP.md diff --git a/aep-communaute-build/P4-RECAP.md b/aep-communaute-build/P4-RECAP.md new file mode 100644 index 0000000..84efdb8 --- /dev/null +++ b/aep-communaute-build/P4-RECAP.md @@ -0,0 +1,76 @@ +# P4 — Form contribution "Proposer une pratique" — Récap + +**Date :** 2026-04-28 +**Branche :** feat/aep-pratiques-regeneratives +**Commits :** 3 atomiques (83d4bd1, d10586c, f25a7d3) + +--- + +## Fichiers créés / modifiés + +| Fichier | Statut | Description | +|---------|--------|-------------| +| `pages/proposer-pratique.vue` | créé (833 lignes) | Formulaire complet clone adapté de contribuer.vue | +| `server/api/submit-pratique.post.ts` | créé (117 lignes) | Endpoint POST avec Zod + rate limit + append pending | +| `public/data/pratiques-pending.json` | créé (`[]`) | File de modération V1, nettoyée après tests | +| `components/PratiqueSidebar.vue` | modifié | CTA "+ Proposer une pratique" en bas de sidebar | + +--- + +## Formulaire — champs implémentés + +- **Nom** (obligatoire, 3-150c) +- **URL** (optionnel) +- **Description** (obligatoire, 50-500c + compteur live) +- **Critères régénératifs** (checkboxes 8 critères, min 3 / max 8, désactivation au-delà) +- **Type d'entité** (radio pill : 9 options depuis TYPES_ENTITE) +- **Pays** (dropdown groupé Europe 16 codes / DOM-TOM 11 codes / Autre texte libre conditionnel) +- **Ville** (optionnel) +- **Tags** (optionnel, input virgule-séparé → chips preview, max 6 × 30c) +- **Email** (optionnel) + +--- + +## Endpoint serveur + +- Validation Zod miroir du client (schéma identique) +- Rate limit JSON : 3 soumissions / IP hashée SHA-256 / jour (action `submit-pratique`) +- Lecture / écriture `public/data/pratiques-pending.json` (init `[]` si absent) +- Entrée : champs validés + `id: timestamp` + `submitted_at: ISO` + `moderation_status: 'pending'` +- Retour : `{ ok: true, trackingId: timestamp }` +- Commentaire modération V2 en haut du fichier + +--- + +## Résultats tests + +| Test | Résultat | +|------|----------| +| GET /proposer-pratique | 200 | +| POST valide | 200 + entrée pending.json | +| POST invalide (nom 2c, desc trop courte, criteres < 3) | 422 + fieldErrors structurés | +| Rate limit : 3ème soumission depuis même IP | 429 | +| pending.json après nettoyage | `[]` vide | + +Note : la 3ème soumission (pas la 4ème) a déclenché le 429 car le test valide +précédent comptait comme 1ère soumission — comportement correct, limite = 3/jour. + +--- + +## Navigation + +- CTA "Proposer une pratique" dans `PratiqueSidebar.vue` (section bas sidebar, style `sidebar-cta-link`) +- Bouton retour dans `proposer-pratique.vue` → `/pratiques-regeneratives` +- Bouton Annuler dans le formulaire → `/pratiques-regeneratives` + +--- + +## Notes implémentation + +- `types/pratique.ts` non modifié — `CRITERES`, `TYPES_ENTITE`, `TYPES_ENTITE_LABELS`, `EUROPE_CODES`, `OUTREMER_CODES`, `PAYS_LABELS` importés tels quels +- Style réutilise 100% les classes CSS et variables CSS var(--nav-*) existantes +- Accentuation dans pending.json depuis curl Windows = artefact d'encodage terminal uniquement — depuis navigateur, l'encodage UTF-8 est correct + +--- + +## Prêt pour P5