106 lines
3.7 KiB
Markdown
106 lines
3.7 KiB
Markdown
# 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 ?
|
|
```
|