Plan - Intégration Newsletter Loops, Cloudflare Services et Sanity
Plan d’Exécution — Logique Newsletter Loops & Architecture L1/L2/L3
Section titled “Plan d’Exécution — Logique Newsletter Loops & Architecture L1/L2/L3”- Date : 2026-10-26
- Statut : Complété et validé de bout en bout
- Références :
- Dépôts cibles :
amn-blog(Couche L2 - Présentation Astro & Endpoint/api/submit)amn-services(Couche L3 - Workersform-handleretsubmission-processor)amn-studio(Couche L1 - SchémasprefooterSettingsetsubmission)~/.gemini/config/mcp_config.json(Configuration MCP Loops)
1. Objectif Global
Section titled “1. Objectif Global”Mettre en place la logique complète du formulaire d’abonnement à la newsletter situé dans le prefooter de amn-blog, en respectant scrupuleusement l’architecture découplée AMN :
- Sanity (L1 - Contenus) : Administration éditoriale des textes, boutons et messages d’états, ainsi qu’archivage d’audit des soumissions.
- Astro (L2 - Présentation) : Interface utilisateur fluide, accessible, optimisée pour le mobile et le desktop, sans rechargement de page.
- Cloudflare (L3 - Services) : Pipeline asynchrone non-bloquant garantissant une réponse en < 50ms et une résilience maximale grâce à Cloudflare Queues.
- Loops.so (Plateforme Emailing) : Enregistrement de l’abonné dans l’audience de l’équipe “AmCloud” avec pilotage outillé via le serveur MCP.
2. Découpage par Phases
Section titled “2. Découpage par Phases”Phase 1 : Configuration du Serveur MCP Loops & Clés d’Environnement
Section titled “Phase 1 : Configuration du Serveur MCP Loops & Clés d’Environnement”- 1.1. Mise à jour de
mcp_config.json: Remplacer l’URL distante OAuth (https://mcp.loops.so) par le serveur stdioloops-mcp-serverafin d’injecter la clé API validée796e3ae3c6da58a59e14787256ce0507. - 1.2. Test de diagnostic MCP :
Vérifier la détection des outils (
loops_create_contact,loops_find_contact, etc.) et la connectivité avec l’équipe “AmCloud”. - 1.3. Configuration des secrets Cloudflare :
Ajouter
LOOPS_API_KEYdans la configuration locale (.dev.vars) et les secrets Cloudflare (wrangler secret put LOOPS_API_KEY --env dev) deamn-services/submission-processor.
Phase 2 : Évolution des Schémas Sanity (amn-studio)
Section titled “Phase 2 : Évolution des Schémas Sanity (amn-studio)”- 2.1. Mise à jour de
prefooterSettings.ts:- Ajouter
newsletterSuccessMessage(texte affiché en cas de succès). - Ajouter
newsletterErrorMessage(texte affiché en cas d’erreur).
- Ajouter
- 2.2. Mise à jour de
submission.ts:- Ajouter le champ
formType('contact' | 'newsletter'). - Assouplir la validation pour que
nameetmessagene soient pas obligatoires siformType === 'newsletter'.
- Ajouter le champ
- 2.3. Validation Studio :
Vérifier l’affichage et l’édition dans Sanity Studio en local (
tsc --noEmitvalidé).
Phase 3 : Logique Backend & Workers Cloudflare (amn-services)
Section titled “Phase 3 : Logique Backend & Workers Cloudflare (amn-services)”- 3.1. Évolution du Worker
form-handler(Producer) :- Remplacer
SubmissionSchemapar une union discriminée Zod acceptant les soumissions de typecontactet de typenewsletter({ type: "newsletter", email: string, source?: string }). - Conserver le dispatch asynchrone dans
SUBMISSIONS_QUEUE. - Déployé sur Cloudflare :
amn-form-handler-dev.
- Remplacer
- 3.2. Évolution du Worker
submission-processor(Consumer) :- Détecter le type
newsletterdans le lot de messages. - Implémenter l’appel REST vers Loops :
POST https://app.loops.so/api/v1/contacts/createavec l’en-têteAuthorization: Bearer ${env.LOOPS_API_KEY}. - Créer le document d’audit correspondant dans Sanity (
_type: 'submission',formType: 'newsletter'). - Gérer l’idempotence (si le contact existe déjà dans Loops, HTTP 409 traité comme succès).
- Déployé sur Cloudflare :
amn-submission-processor-dev.
- Détecter le type
- 3.3. Mise à jour de l’endpoint local
/test-direct:- Permettre à l’endpoint de test local de simuler l’envoi vers Loops et Sanity pour faciliter le développement.
Phase 4 : Interface Utilisateur & Intégration Astro (amn-blog)
Section titled “Phase 4 : Interface Utilisateur & Intégration Astro (amn-blog)”- 4.1. Amélioration de
PreFooter.astro:- Récupérer les messages de succès et d’erreur depuis Sanity (
Astro.props). - Intégrer un feedback accessible : spinner/indicateur de chargement sur le bouton lors de la soumission (
disabled, aria-busy). - Afficher le message de confirmation avec animation fluide et réinitialisation du champ email.
- Assurer un nettoyage Stega rigoureux sur tous les attributs de formulaire.
- Récupérer les messages de succès et d’erreur depuis Sanity (
- 4.2. Validation du relais
/api/submit.ts:- Vérifier la compatibilité du relaiement en local et en production via le fallback résilient vers le worker distant.
Phase 5 : Recette, Tests Bout en Bout & Démonstration
Section titled “Phase 5 : Recette, Tests Bout en Bout & Démonstration”- 5.1. Test unitaire/local : Soumission d’une adresse de test via le formulaire du prefooter en environnement local.
- 5.2. Vérification dans Loops :
Vérification de la présence du contact créé avec le statut
subscribed: trueet le groupeNewsletter. - 5.3. Vérification dans Sanity Studio :
Vérification du document d’audit créé dans la collection
submission. - 5.4. Test des cas limites :
- Email invalide (format rejeté par HTML5 et Zod).
- Double soumission rapide (anti-rebond côté client).
- Contact déjà existant dans Loops (idempotence HTTP 409).
3. Critères d’Acceptation (Definition of Done)
Section titled “3. Critères d’Acceptation (Definition of Done)”- La documentation technique (ADR, DAT et Plan) est consultable et intégrée dans
amn-docs. - Le serveur MCP Loops est configuré et opérationnel avec la clé API fournie.
- Le formulaire de la newsletter soumet les données sans rechargement de page et affiche un retour visuel clair et accessible.
- Tout contact soumis est instantanément transmis via la Queue Cloudflare sans bloquer l’interface (< 50ms perçus).
- L’abonné est créé dans Loops et une trace d’audit est enregistrée dans Sanity.
- Aucune régression sur le formulaire de contact existant (
contact.astro).