Skip to content

Plan - Migration Formulaires vers Cloudflare D1 & Email Routing

Plan d’Exécution — Persistance D1 & Alertes Email Routing

Section titled “Plan d’Exécution — Persistance D1 & Alertes Email Routing”

  1. Remplacement de Sanity par Cloudflare D1 :
    • Les soumissions de formulaires (contact et newsletter) ne sont plus archivées dans Sanity CMS.
    • Création et initialisation d’une table SQL submissions dans Cloudflare D1.
    • Suppression de @sanity/client et des tokens/secrets Sanity du worker submission-processor.
  2. Notification d’alerte par email native (Contact) :
    • Pour chaque soumission de type contact, envoyer automatiquement un email de notification formaté (HTML et texte) à l’adresse de l’organisation (env.NOTIFICATION_EMAIL_TO) via le service natif Cloudflare Email Routing / Email Sending (env.EMAIL.send()).
  3. Maintien intégral de la logique Loops (Newsletter) :
    • Conserver la logique asynchrone d’enregistrement des abonnés newsletter vers Loops (Form Endpoint Double Opt-In et REST API fallback).
  4. Stricte conformité de sécurité :
    • Aucun secret ou ID en clair dans wrangler.json.
    • Bindings et variables gérés via .dev.vars (local), Cloudflare Secrets (remote) et GitHub Actions Secrets (CI/CD).

Phase 1 : Schéma SQL & Provisioning de la Base Cloudflare D1

Section titled “Phase 1 : Schéma SQL & Provisioning de la Base Cloudflare D1”
  • 1.1. Création du fichier schema.sql :
    CREATE TABLE IF NOT EXISTS submissions (
    id TEXT PRIMARY KEY,
    type TEXT NOT NULL,
    name TEXT,
    email TEXT NOT NULL,
    message TEXT,
    source TEXT,
    submitted_at TEXT NOT NULL
    );
  • 1.2. Provisioning des bases D1 sur Cloudflare :
    • Création de la base dev : npx wrangler d1 create amn-submissions-dev.
    • Application du schéma en local : npx wrangler d1 execute amn-submissions-dev --local --file=./schema.sql.
    • Application du schéma sur Cloudflare : npx wrangler d1 execute amn-submissions-dev --remote --file=./schema.sql.
  • 1.3. Configuration des bindings dans wrangler.json :
    • Déclarer le bloc d1_databases avec le binding DB.
    • Déclarer le bloc send_email avec le binding EMAIL.

Phase 2 : Refactorisation du Worker submission-processor

Section titled “Phase 2 : Refactorisation du Worker submission-processor”
  • 2.1. Nettoyage des dépendances Sanity :
    • Désinstaller @sanity/client (pnpm remove @sanity/client).
    • Installer les utilitaires d’emails légers (pnpm add mimetext pour la composition MIME).
  • 2.2. Mise à jour de l’interface Env (src/index.ts) :
    export interface Env {
    ENVIRONMENT: string;
    DB: D1Database;
    EMAIL?: SendEmail;
    NOTIFICATION_EMAIL_TO?: string;
    NOTIFICATION_EMAIL_FROM?: string;
    LOOPS_API_KEY?: string;
    LOOPS_FORM_ID?: string;
    LOOPS_MAILING_LIST_ID?: string;
    LOOPS_USER_GROUP?: string;
    LOOPS_DEFAULT_SOURCE?: string;
    }
  • 2.3. Mise à jour de fetch() (/health et /test-direct) :
    • Dans /health : remplacer les indicateurs Sanity par l’état du binding databaseConfigured: Boolean(env.DB) et emailConfigured: Boolean(env.EMAIL).
    • Dans /test-direct : remplacer la mutation sanityClient.create() par une insertion SQL préparée dans env.DB.
  • 2.4. Mise à jour du gestionnaire de Queue (queue()) :
    • Étape 1 (Persistance D1) : Exécuter INSERT INTO submissions pour chaque message du lot.
    • Étape 2 (Alerte Email) : Si submission.type === 'contact' et si env.EMAIL est disponible, construire le courriel MIME et l’expédier via env.EMAIL.send().
    • Étape 3 (Synchronisation Loops) : Si submission.type === 'newsletter', exécuter registerLoopsContact() (inchangé).

Phase 3 : Vérification et Alignement du Worker form-handler

Section titled “Phase 3 : Vérification et Alignement du Worker form-handler”
  • 3.1. Revue du schéma Zod et de l’interface Env :
    • Vérifier que form-handler reste strictement focalisé sur la validation et l’envoi dans SUBMISSIONS_QUEUE.
    • S’assurer qu’aucune dépendance Sanity résiduelle n’existe dans ce Worker.

Phase 4 : Mise à jour des Secrets & Workflows CI/CD

Section titled “Phase 4 : Mise à jour des Secrets & Workflows CI/CD”
  • 4.1. Configuration de .dev.vars :
    • Retirer SANITY_PROJECT_ID, SANITY_DATASET, SANITY_API_WRITE_TOKEN.
    • Ajouter NOTIFICATION_EMAIL_TO=andsinus.ai@gmail.com.
    • Ajouter NOTIFICATION_EMAIL_FROM=hello@amn-mail-dev.lasommedesrosees.com.
  • 4.2. Configuration des secrets Cloudflare & GitHub Actions :

Phase 5 : Recette & Validation de Bout en Bout

Section titled “Phase 5 : Recette & Validation de Bout en Bout”
  • 5.1. Test unitaire SQL D1 :
    • Vérifier l’insertion et la sélection dans la table submissions via wrangler d1 execute.
  • 5.2. Test d’une soumission Contact :
    • Soumettre un formulaire de contact depuis amn-blog ou via curl sur form-handler.
    • Vérifier la création de la ligne dans D1 (type: 'contact').
    • Vérifier la réception de l’email d’alerte dans la boîte de destination NOTIFICATION_EMAIL_TO (andsinus.ai@gmail.com).
  • 5.3. Test d’une soumission Newsletter :
    • Soumettre une inscription depuis le prefooter.
    • Vérifier la création de la ligne dans D1 (type: 'newsletter').
    • Vérifier le déclenchement de l’email Double Opt-In dans Loops.

3. Critères d’Acceptation (Definition of Done)

Section titled “3. Critères d’Acceptation (Definition of Done)”
  1. Le fichier schema.sql est présent à la racine de submission-processor et la table submissions est active dans D1.
  2. @sanity/client est complètement retiré de submission-processor.
  3. Toutes les soumissions (contact et newsletter) sont stockées dans D1.
  4. Tout contact soumis génère un email d’alerte à l’adresse de l’entreprise via Cloudflare Email Routing (andsinus.ai@gmail.com).
  5. Les newsletters continuent d’être synchronisées dans Loops sans régression.
  6. Aucun secret en clair dans wrangler.json et build TypeScript sans erreur (pnpm exec tsc --noEmit code 0).
Edit page

Last updated: