Type de ressource : Route Astro (Endpoint API)
Fichier source :src/pages/api/submit.ts
Statut : Actif
1. Vue dâensemble
Section titled â1. Vue dâensembleâ1.1. Description
Section titled â1.1. DescriptionâEndpoint API pour la soumission du formulaire de contact. Valide les donnĂ©es, envoie vers le form-handler Worker (local ou production via Cloudflare binding), et retourne le rĂ©sultat. Partie intĂ©grante du flux L1+L2+L3.
1.2. Objectif
Section titled â1.2. Objectifâ- Recevoir les soumissions du formulaire de contact
- Valider les données
- Envoyer vers le backend L3 (Cloudflare Workers)
- Retourner le résultat au frontend
1.3. Caractéristiques
Section titled â1.3. CaractĂ©ristiquesâ| PropriĂ©tĂ© | Valeur |
|---|---|
| URL publique | /api/submit |
| Mode de rendu | SSR |
| Type | Endpoint API (JSON) |
| Méthode HTTP | POST |
| Authentification requise | Non |
| Cache | No-store |
2. Architecture et flux
Section titled â2. Architecture et fluxâ[Formulaire soumis] â âą POST /api/submit âŒ[Endpoint /api/submit] â âą DĂ©tection de l'environnement (local vs production) âŒ[Local] â âą Fetch vers http://localhost:8789/test-direct âŒ[Form-handler Worker (local)] â âą Validation Zod â âą CrĂ©ation directe dans Sanity âŒ[Sanity CMS]
[Production] â âą Utilisation du service binding FORM_HANDLER âŒ[Form-handler Worker (Cloudflare)] â âą Validation Zod â âą Mise en queue dans submissions-queue âŒ[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 |
|---|---|---|
api/submit.ts |
DĂ©finition de lâendpoint | L2 (Astro) |
| Form-handler Worker | Validation et mise en queue | L3 (Cloudflare) |
| Submission-processor Worker | Création document Sanity | L3 (Cloudflare) |
| Queue Cloudflare | Queue asynchrone | L3 (Cloudflare) |
| Sanity CMS | Stockage des soumissions | L1 (Sanity) |
3. Implémentation
Section titled â3. ImplĂ©mentationâ3.1. Code de lâendpoint
Section titled â3.1. Code de lâendpointâimport type { APIRoute } from 'astro';import { env } from 'cloudflare:workers';export const prerender = false;
export const POST: APIRoute = async (context) => { const { request } = context;
try { const data = await request.json();
const url = new URL(request.url); const isLocal = url.hostname === 'localhost' || url.hostname === '127.0.0.1' || url.port === '4321';
let response: Response;
if (isLocal) { // En local, on continue d'appeler le port local en HTTP classique response = await fetch('http://localhost:8789/test-direct', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data), }); } else { // En production : Utilisation de l'import natif validé par Astro v6 const formHandler = (env as any).FORM_HANDLER;
if (!formHandler) { const keys = Object.keys(env || {}); throw new Error(`Le Service Binding 'FORM_HANDLER' est introuvable. ĂlĂ©ments dispo dans env: [${keys.join(', ')}]`); }
// Appel sécurisé via le binding avec l'URL interne response = await formHandler.fetch('http://internal/api/submit', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data), }); }
const responseText = await response.text();
try { const result = JSON.parse(responseText); return new Response(JSON.stringify(result), { status: response.status, headers: { 'Content-Type': 'application/json' }, }); } catch { return new Response(JSON.stringify({ success: false, error: 'Invalid JSON response from downstream worker', details: responseText }), { status: response.status, headers: { 'Content-Type': 'application/json' }, }); }
} catch (error: any) { console.error('Erreur réelle détectée lors de la soumission :', error.stack || error.message || error);
return new Response(JSON.stringify({ success: false, error: 'Failed to process submission', debugMessage: error.message, debugStack: error.stack }), { status: 500, headers: { 'Content-Type': 'application/json' }, }); }};4. DonnĂ©es et requĂȘtes GROQ
Section titled â4. DonnĂ©es et requĂȘtes GROQâAucune requĂȘte GROQ nâest utilisĂ©e dans cet endpoint (la logique est dĂ©lĂ©guĂ©e aux Workers).
5. ParamĂštres et validation
Section titled â5. ParamĂštres et validationâ5.1. Body JSON
Section titled â5.1. Body JSONâ| Champ | Type | Obligatoire | Validation |
|---|---|---|---|
name |
string |
â | Min 2, Max 100 (validĂ© par Worker) |
email |
string |
â | Format email (validĂ© par Worker) |
message |
string |
â | Min 10, Max 2000 (validĂ© par Worker) |
5.2. Gestion des erreurs
Section titled â5.2. Gestion des erreursâ| Code HTTP | Condition | RĂ©ponse |
|---|---|---|
| 200 | SuccĂšs | JSON avec success: true |
| 400 | Validation échouée | JSON avec error: validation |
| 500 | Erreur serveur | JSON avec error + debug info |
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 |
Rationale |
|---|---|---|
| API (POST) | Non configuré | à configurer (no-store recommandé) |
6.2. ImplĂ©mentation dans lâendpoint
Section titled â6.2. ImplĂ©mentation dans lâendpointâNon implĂ©mentĂ© - pas de headers de cache explicites.
7. SEO et métadonnées
Section titled â7. SEO et mĂ©tadonnĂ©esâNon applicable (endpoint API).
8. Composants UI utilisés
Section titled â8. Composants UI utilisĂ©sâAucun composant UI nâest utilisĂ© (endpoint API).
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 | Endpoint accessible sans authentification |
9.2. Validation des entrées
Section titled â9.2. Validation des entrĂ©esâ- â Validation cĂŽtĂ© serveur via Zod (Worker)
- â Validation cĂŽtĂ© client (HTML5)
9.3. En-tĂȘtes de sĂ©curitĂ©
Section titled â9.3. En-tĂȘtes de sĂ©curitĂ©âNon implĂ©mentĂ© dans cet endpoint (Ă 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 |
|---|---|---|
| Service binding introuvable | FORM_HANDLER non configuré | Vérifier apps/web/wrangler.toml |
| Erreur 500 | Worker inaccessible | Vérifier que le form-handler Worker est démarré |
| JSON invalide | Worker retourne une réponse non-JSON | Vérifier les logs du Worker |
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 l'endpoint en localcurl -X POST http://localhost:4321/api/submit \ -H "Content-Type: application/json" \ -d '{"name":"Test","email":"test@example.com","message":"Test message"}'11. Bonnes pratiques
Section titled â11. Bonnes pratiquesâ11.1. Architecture
Section titled â11.1. Architectureâ- â DĂ©tection automatique de lâenvironnement (local vs production)
- â Utilisation des Cloudflare bindings en production
- â Fallback vers HTTP local en dĂ©veloppement
- â Logging des erreurs avec stack trace
11.2. Performance
Section titled â11.2. Performanceâ- â Asynchrone (pas de blocage)
- â Queue pour le traitement en arriĂšre-plan
11.3. Maintenance
Section titled â11.3. Maintenanceâ- â VĂ©rifier la configuration des bindings Cloudflare
- â Surveiller les logs des Workers
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)
- Ajout de rate limiting
- Ajout de CAPTCHA
12.2. Limitations connues
Section titled â12.2. Limitations connuesâ- â Headers de cache non configurĂ©s
- â Pas de rate limiting
- â Pas de CAPTCHA
- â ïž Utilisation de
as anypour le binding FORM_HANDLER
13. Ressources liées
Section titled â13. Ressources liĂ©esâ- Documentation Astro : Endpoints
- Documentation Cloudflare : Service Bindings
- Fichiers concernés :
src/pages/api/submit.tsservices/form-handler/src/index.tsservices/submission-processor/src/index.tsapps/web/wrangler.toml
14. Historique des modifications
Section titled â14. Historique des modificationsâ| Date | Version | Description | Auteur |
|---|---|---|---|
| 2026-09-15 | 1.0 | Création initiale | Devin |