/* quote-intake-log: server-side backup log for quote.seanmattsson.com submissions. * The quote form POSTs to FormSubmit (primary) and fire-and-forget POSTs here * (backup). If the FormSubmit email is ever delayed or dropped, the watcher * picks the submission up from KV instead. Nothing customer-facing. */ function cors() { return { "Access-Control-Allow-Origin": "https://quote.seanmattsson.com", "Access-Control-Allow-Methods": "POST, OPTIONS", "Access-Control-Allow-Headers": "Content-Type", }; } export default { async fetch(req, env) { const url = new URL(req.url); if (req.method === "OPTIONS") return new Response(null, { headers: cors() }); if (url.pathname === "/log" && req.method === "POST") { let data = {}; try { data = await req.json(); } catch (e) { try { data = JSON.parse(await req.text()); } catch (e2) { data = {}; } } const fields = data && typeof data === "object" ? data : {}; const email = String(fields.email || ""); const company = String(fields.company || ""); if (!email.includes("@") || !company.trim()) { return new Response(JSON.stringify({ ok: false, error: "bad fields" }), { status: 400, headers: Object.assign({ "Content-Type": "application/json" }, cors()) }); } const key = "intake_" + Date.now() + "_" + Math.random().toString(36).slice(2, 8); await env.INTAKE_KV.put(key, JSON.stringify({ ts: Date.now(), fields: fields })); return new Response(JSON.stringify({ ok: true }), { headers: Object.assign({ "Content-Type": "application/json" }, cors()) }); } return new Response("not found", { status: 404 }); }, };