Type de ressource : Route Astro (Page SSR avec Preview)
Fichier source :src/pages/contact.astro
Statut : Actif
1. Vue dâensemble
Section titled â1. Vue dâensembleâ1.1. Description
Section titled â1.1. DescriptionâPage de contact avec formulaire de soumission. Supporte le mode preview pour visualiser les drafts. Le formulaire envoie les donnĂ©es vers lâendpoint /api/submit qui utilise le backend L3 (Cloudflare Workers).
1.2. Objectif
Section titled â1.2. Objectifâ- Fournir un formulaire de contact fonctionnel
- Tester lâintĂ©gration L1+L2+L3 (Sanity + Astro + Cloudflare Workers)
- Supporter le mode preview
- Afficher le message AMN (test dâintĂ©gration)
1.3. Caractéristiques
Section titled â1.3. CaractĂ©ristiquesâ| PropriĂ©tĂ© | Valeur |
|---|---|
| URL publique | /contact |
| Mode de rendu | SSR |
| Type | Page HTML |
| Méthode HTTP | GET |
| Authentification requise | Preview uniquement (cookie) |
| Cache | Non configuré |
2. Architecture et flux
Section titled â2. Architecture et fluxâ[RequĂȘte utilisateur] â âŒ[Cloudflare Pages / Edge] â âą Middleware (cookie sanity-preview) âŒ[Astro Route (contact.astro)] â âą DĂ©tection du mode preview (cookie) â âą RĂ©cupĂ©ration du message AMN via getAmn(isPreview) â âą Rendu du formulaire âŒ[RĂ©ponse HTML] â âŒ[Formulaire soumis] â âŒ[Endpoint /api/submit] â âą Validation Zod â âą Envoi vers form-handler Worker âŒ[Queue Cloudflare] â âŒ[Submission-processor Worker] â âą CrĂ©ation du document Sanity âŒ[Sanity CMS]2.2. Composants impliquĂ©s
Section titled â2.2. Composants impliquĂ©sâ| Composant | RĂŽle | Couche |
|---|---|---|
contact.astro |
Définition de la route | L2 (Astro) |
getAmn() |
Récupération du message AMN | L2 (Astro) |
/api/submit |
Endpoint de soumission | L2 (Astro) |
| Form-handler Worker | Validation et mise en queue | L3 (Cloudflare) |
| Submission-processor Worker | Création document Sanity | L3 (Cloudflare) |
3. Implémentation
Section titled â3. ImplĂ©mentationâ3.1. Code de la route
Section titled â3.1. Code de la routeâ---import { getAmn } from '../lib/sanity'
export const prerender = false
const isPreview = Astro.cookies.get('sanity-preview')?.value === 'true'const amn = await getAmn(isPreview)---
<html lang="fr"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width" /> <title>Contact - AMN</title> </head> <body> {isPreview && ( <div class="preview-banner"> â ïž <strong>Mode Preview ActivĂ©</strong> â Visualisation des brouillons Sanity non publiĂ©s (Drafts). <a href="/api/exit-preview" class="exit-link">Quitter la preview</a> </div> )}
<main> <h1>Contactez-nous</h1> <p class="subtitle">Formulaire de contact - Test d'intégration L1+L2+L3</p>
{amn && ( <div class="amn-message"> <p><strong>Message AMN:</strong> {amn.message}</p> </div> )}
<form id="contact-form" class="contact-form"> <div class="form-group"> <label for="name">Nom *</label> <input type="text" id="name" name="name" required minlength="2" maxlength="100" /> </div>
<div class="form-group"> <label for="email">Email *</label> <input type="email" id="email" name="email" required /> </div>
<div class="form-group"> <label for="message">Message *</label> <textarea id="message" name="message" required minlength="10" maxlength="2000" rows="5"></textarea> </div>
<button type="submit" id="submit-btn" class="submit-btn"> Envoyer </button> </form>
<div id="form-status" class="form-status"></div> </main>
<script is:inline> const form = document.getElementById('contact-form'); form.addEventListener('submit', async (e) => { e.preventDefault();
const formData = new FormData(form); const data = { name: String(formData.get('name') ?? ''), email: String(formData.get('email') ?? ''), message: String(formData.get('message') ?? ''), };
const response = await fetch('/api/submit', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data), });
const result = await response.json(); // ... gestion de la rĂ©ponse }); </script> </body></html>4. DonnĂ©es et requĂȘtes GROQ
Section titled â4. DonnĂ©es et requĂȘtes GROQâ4.1. RequĂȘte principale
Section titled â4.1. RequĂȘte principaleâ*[_type == "amn" && status == "active"][0]4.2. RequĂȘtes secondaires
Section titled â4.2. RequĂȘtes secondairesâAucune requĂȘte secondaire nâest utilisĂ©e.
4.3. Types TypeScript associés
Section titled â4.3. Types TypeScript associĂ©sâ// Type AMN (manuel, sanity-typegen non implĂ©mentĂ©)export type Amn = { _id: string; _type: 'amn'; message: string; status: 'active' | 'inactive';};5. ParamĂštres et validation
Section titled â5. ParamĂštres et validationâ5.1. ParamĂštres dâURL
Section titled â5.1. ParamĂštres dâURLâAucun paramĂštre dâURL nâest utilisĂ©.
5.2. Query strings
Section titled â5.2. Query stringsâAucune query string nâest utilisĂ©e.
5.3. Gestion des erreurs
Section titled â5.3. Gestion des erreursâ| Code HTTP | Condition | RĂ©ponse |
|---|---|---|
| 200 | SuccĂšs | Page HTML |
| 500 | Erreur Sanity (getAmn) | Page HTML avec message dâerreur |
6. Stratégie de cache
Section titled â6. StratĂ©gie de cacheâ6.1. En-tĂȘtes de cache
Section titled â6.1. En-tĂȘtes de cacheâ| Mode | Cache-Control |
CDN-Cache-Control |
Rationale |
|---|---|---|---|
| SSR Preview | Non configuré | Non configuré | à configurer (no-store recommandé) |
| SSR standard | Non configuré | Non configuré | Par défaut Cloudflare |
6.2. Implémentation dans la route
Section titled â6.2. ImplĂ©mentation dans la routeâNon implĂ©mentĂ© - pas de headers de cache explicites.
7. SEO et métadonnées
Section titled â7. SEO et mĂ©tadonnĂ©esâ7.1. Balises meta
Section titled â7.1. Balises metaâ| Balise | Source | Fallback |
|---|---|---|
<title> |
HardcodĂ© âContact - AMNâ | - |
<meta name="viewport"> |
Hardcodé | - |
7.2. Sitemap
Section titled â7.2. Sitemapâ- â Cette route est-elle incluse dans le sitemap ? Oui
- â FrĂ©quence de mise Ă jour : monthly
- â PrioritĂ© : 0.5
7.3. Indexation Pagefind
Section titled â7.3. Indexation Pagefindâ- â Cette route est-elle indexĂ©e par Pagefind ? Non (Pagefind non configurĂ©)
8. Composants UI utilisés
Section titled â8. Composants UI utilisĂ©sâAucun composant UI nâest utilisĂ© (page simple avec formulaire inline).
9. Sécurité
Section titled â9. SĂ©curitĂ©â9.1. AccĂšs et authentification
Section titled â9.1. AccĂšs et authentificationâ| Condition | Comportement |
|---|---|
| AccĂšs public | Page accessible sans authentification |
| Mode Preview | Cookie sanity-preview requis pour voir les drafts |
9.2. Validation des entrées
Section titled â9.2. Validation des entrĂ©esâ- â Validation HTML5 (required, minlength, maxlength, type=âemailâ)
- â Validation cĂŽtĂ© serveur via Zod (endpoint /api/submit)
9.3. En-tĂȘtes de sĂ©curitĂ©
Section titled â9.3. En-tĂȘtes de sĂ©curitĂ©âNon implĂ©mentĂ© dans cette route (Ă configurer via Middleware Cloudflare).
10. Débogage et troubleshooting
Section titled â10. DĂ©bogage et troubleshootingâ10.1. ProblĂšmes courants
Section titled â10.1. ProblĂšmes courantsâ| SymptĂŽme | Cause probable | Solution |
|---|---|---|
| Soumission échoue | Endpoint /api/submit inaccessible | Vérifier que le form-handler Worker est démarré |
| Erreur 500 | Token Sanity manquant | VĂ©rifier les variables dâenvironnement |
| Preview non fonctionnel | Cookie manquant | Vérifier le cookie sanity-preview |
10.2. Logs et monitoring
Section titled â10.2. Logs et monitoringâ# Logs de dĂ©veloppementnpm run dev
# Logs du form-handler Workerwrangler tail form-handler
# Logs du submission-processor Workerwrangler tail submission-processor10.3. Tests manuels
Section titled â10.3. Tests manuelsâ# Test de la route en localcurl -I http://localhost:4321/contact
# Test du mode previewcurl -I -b "sanity-preview=true" http://localhost:4321/contact
# Test du formulaire# Soumettre le formulaire via l'interface web11. Bonnes pratiques
Section titled â11. Bonnes pratiquesâ11.1. Architecture
Section titled â11.1. Architectureâ- â DĂ©tection automatique du mode preview via cookie
- â Validation cĂŽtĂ© client (HTML5)
- â Validation cĂŽtĂ© serveur (Zod)
- â Affichage conditionnel de la banniĂšre preview
11.2. Performance
Section titled â11.2. Performanceâ- â
Script inline (
is:inline) pour Ă©viter les charges supplĂ©mentaires - â Pas de JavaScript externe
11.3. Maintenance
Section titled â11.3. Maintenanceâ- â Tester le flux de soumission rĂ©guliĂšrement
- â VĂ©rifier lâintĂ©gration L1+L2+L3
12. Ăvolutions et roadmap
Section titled â12. Ăvolutions et roadmapâ12.1. AmĂ©liorations planifiĂ©es
Section titled â12.1. AmĂ©liorations planifiĂ©esâ- Configuration des headers de cache (no-store en preview)
- Ajout de structured data (JSON-LD)
- Amélioration du design du formulaire
- Ajout de CAPTCHA pour la protection anti-spam
12.2. Limitations connues
Section titled â12.2. Limitations connuesâ- â Pas de structured data (JSON-LD)
- â Headers de cache non configurĂ©s
- â Pas de protection anti-spam
- â Langue hardcodĂ©e en âfrâ
13. Ressources liées
Section titled â13. Ressources liĂ©esâ- Documentation Astro : Routing
- Fichiers concernés :
src/pages/contact.astrosrc/pages/api/submit.tssrc/lib/sanity.ts(getAmn)services/form-handler/src/index.tsservices/submission-processor/src/index.ts
14. Historique des modifications
Section titled â14. Historique des modificationsâ| Date | Version | Description | Auteur |
|---|---|---|---|
| 2026-09-15 | 1.0 | Création initiale | Devin |