diff --git a/cloudflare-worker/hubspot-proxy.js b/cloudflare-worker/hubspot-proxy.js index d40eb48..77d93f1 100644 --- a/cloudflare-worker/hubspot-proxy.js +++ b/cloudflare-worker/hubspot-proxy.js @@ -238,6 +238,39 @@ export default { } } + // ── action: sendWelcomeBack ───────────────────────────── + // Envoie un email "Vous êtes déjà inscrit" au client qui tente + // une ré-inscription. Idempotent côté HubSpot (= aucune création + // ni update de contact). Anti-bot via Turnstile + sanity check + // que l'email existe vraiment dans HubSpot avant d'envoyer. + if (action === 'sendWelcomeBack') { + if (!body.email) return jsonResponse({ error: 'email requis' }, 400); + + const turnstileOk = await verifyTurnstile(env, body.turnstile_token, request); + if (!turnstileOk) { + return jsonResponse({ ok: false, error: 'Turnstile validation failed' }, 403); + } + + try { + // Vérification : le contact existe bien (= prevent spam vers + // emails inconnus en passant un faux turnstile) + const search = await searchContactByEmail(token, body.email); + const existing = (search.results || [])[0]; + if (!existing) { + return jsonResponse({ ok: false, error: 'Contact not found' }, 404); + } + + await sendWelcomeBackViaResend(env, { + firstname : body.firstname || existing.properties?.firstname || '', + email : body.email, + reference_client : existing.properties?.reference_client || '', + }); + return jsonResponse({ ok: true }); + } catch (err) { + return jsonResponse({ ok: false, error: err.message }, 500); + } + } + // ── action: listSubscriptions (debug : trouver les IDs) ── if (action === 'listSubscriptions') { // Endpoint legacy email/public/v1 nécessite scope content au lieu de @@ -530,6 +563,79 @@ async function sendWelcomeViaResend(env, contact) { }); } +// Email "Ravis de vous revoir" pour les clients déjà inscrits qui retentent +// le formulaire de contact. Rappelle le numéro de référence existant et +// précise que le contact n'est pas re-créé (= anti-doublon HubSpot). +// Idempotent côté HubSpot (= zéro write). Footer 2026 cohérent avec les +// autres emails Resend. +async function sendWelcomeBackViaResend(env, contact) { + const siteUrl = env.SITE_URL || 'https://mva-globalfret.com'; + const logoUrl = `${siteUrl}/PNG%20MVA%20GLOBAL%20FRET.png`; + const firstname = escapeHtml(contact.firstname || ''); + const ref = escapeHtml(contact.reference_client || ''); + const refBlock = ref + ? `
|
+ |
+
+ MVA GLOBAL FRET
+ Fret Aérien Paris — Antananarivo
+ |
+
Bonjour ${firstname || 'cher client'},
++ Votre adresse email est déjà enregistrée chez MVA Global Fret. + Pas besoin de vous ré-inscrire — votre compte est actif. +
+ ${refBlock} ++ Utilisez ce numéro pour étiqueter vos colis et les rendre traçables tout au long du transport Paris → Antananarivo. +
++ Pour toute question, n'hésitez pas à nous contacter : +
+
+ À très bientôt pour votre prochain envoi,
+ L'équipe MVA Global Fret
+