feat(aep): carte AEP — push Gitea 2026-04-28
This commit is contained in:
105
V2-cadrage/K-prompt-session-2-contribuer.md
Normal file
105
V2-cadrage/K-prompt-session-2-contribuer.md
Normal file
@@ -0,0 +1,105 @@
|
||||
# K — Prompt Sonnet 3 : Formulaire `/contribuer` + Redis rate limit
|
||||
|
||||
> **Lancer APRÈS validation checkpoint étape 2 (Sonnet 1).**
|
||||
> Peut tourner en **parallèle avec Sonnet 2** (étape 3 fiche) — pas de conflit attendu.
|
||||
|
||||
## Mission
|
||||
|
||||
Construire le formulaire de soumission de nouvelle organisation + setup Redis pour rate limiting.
|
||||
|
||||
## Contexte (lis AVANT)
|
||||
|
||||
**Racine projet** : `nav-carte/`
|
||||
|
||||
Specs (toutes dans `nav-carte/V2-cadrage/`) :
|
||||
1. Spec session : `H-prompt-session-2-front.md` (section "Étape 6")
|
||||
2. Wireframes formulaire : `E-spec-frontend.md` (page contribuer)
|
||||
3. Pipe collaboration : `F-spec-pipe-collaboration.md` (workflow modération + statut `pending`)
|
||||
4. Palette : `palette-nav-v2.md`
|
||||
5. VPS infra (Redis dispo ?) : `V2-cadrage/VPS-check.md`
|
||||
|
||||
Code base :
|
||||
- `nav-carte/pages/ajouter.vue` (formulaire V1 à reprendre / refondre)
|
||||
- `nav-carte/server/routes/` (proxy NocoDB)
|
||||
- Note Sonnet 1 dans JOURNAL-V2.md : conventions composants
|
||||
|
||||
## Livrables
|
||||
|
||||
- [ ] Page `/contribuer` (refonte de `ajouter.vue`) ou modal `SubmitModal.vue` (tu tranches selon UX cohérence)
|
||||
- [ ] Validation **Zod** côté client + serveur
|
||||
- [ ] Champs :
|
||||
- `nom` (required, min 3)
|
||||
- `url` (optional, regex URL)
|
||||
- `description_user` (required, 50-500 chars)
|
||||
- `echelle` (required, enum National/Régional/Local)
|
||||
- `fonctions` (required, 1-5 multi parmi 10)
|
||||
- `territoire` (required, enum Métropole + 5 DOM-TOM)
|
||||
- `localisation_ville` (optional, geocoding Nominatim côté serveur si fourni)
|
||||
- `submitted_by_email` (required, format email)
|
||||
- [ ] Submit :
|
||||
- POST `/api/submit` → NocoDB avec `moderation_status: "pending"`, `ai_processed: false`
|
||||
- Message confirmation : texte exact `E-spec-frontend.md` §9
|
||||
- Worker IA (cron 5 min) traitera plus tard — Session 3 (toi tu ne touches pas le worker)
|
||||
- [ ] **Rate limit Redis** : 3 submits / IP / jour
|
||||
- Setup Redis sur VPS (vérifier `VPS-check.md` — sinon `apt install redis-server` + config localhost only)
|
||||
- Connexion depuis Nuxt (`ioredis` ou `redis` npm)
|
||||
- En local dev : Redis en Docker ou fallback compteur en mémoire (TODO journal)
|
||||
- [ ] Endpoint `/api/comment` (Sonnet 2) : ajouter rate limit Redis 5 commentaires/IP/jour — coordonne avec Sonnet 2 via JOURNAL-V2.md
|
||||
|
||||
## Règles
|
||||
|
||||
- Accents français
|
||||
- Palette respectée
|
||||
- Mobile-first
|
||||
- Pas de Google Fonts
|
||||
- Pas de touche à : carte, sidebar, page fiche détail, worker IA, schéma NocoDB
|
||||
- Sécurité : pas de leak token NocoDB côté client (proxy Nuxt obligatoire)
|
||||
|
||||
## Délégation cascade autorisée
|
||||
|
||||
Sous-agents Task (Sonnet) pour : install Redis VPS via SSH, génération schéma Zod, recherche Nominatim API.
|
||||
|
||||
## Credentials VPS
|
||||
|
||||
- SSH alias : `vps-hetzner` (port 4422)
|
||||
- Détails : `_System` ou cf. mémoire (reference_vps_ssh_access)
|
||||
- App nav-carte : `/opt/nav-carte/`
|
||||
|
||||
## Critère de fin
|
||||
|
||||
- `npm run dev` charge `/contribuer`
|
||||
- Soumission valide → fiche en NocoDB avec status pending
|
||||
- Soumission invalide → erreurs Zod affichées
|
||||
- 4ᵉ submit même IP/jour → 429 rate limit
|
||||
- Redis tourne sur VPS (ou fallback documenté en local)
|
||||
- Mobile testé
|
||||
- Commits atomiques
|
||||
|
||||
## Doute / blocage
|
||||
|
||||
- Redis impossible à installer VPS → fallback fichier JSON simple (compteur IP/jour) + TODO journal
|
||||
- Nominatim rate-limited → skip geocoding, store ville texte brut
|
||||
- Spec ambiguë → tranche au plus simple, note JOURNAL-V2.md
|
||||
- Blocage dur → STOP + reporte
|
||||
|
||||
## Résumé attendu
|
||||
|
||||
```
|
||||
## S2 Étape 6 — [DONE / BLOCKED]
|
||||
|
||||
### Livrables
|
||||
- ✓ ... / ✗ ...
|
||||
|
||||
### Décisions
|
||||
- Redis : VPS / Docker local / fallback JSON ?
|
||||
- Page vs modal : ...
|
||||
|
||||
### À tester
|
||||
- /contribuer (submit valide + invalide + rate limit)
|
||||
|
||||
### Fichiers modifiés / Commits
|
||||
- ...
|
||||
|
||||
### Coordination Sonnet 2
|
||||
- Rate limit `/api/comment` : posé pour toi ou à toi de poser ?
|
||||
```
|
||||
Reference in New Issue
Block a user