From e101a21a90515508e1898571c459a1250348f419 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A1bor=20Tam=C3=A1s?= Date: Mon, 27 Jan 2025 15:18:33 +0100 Subject: [PATCH 1/2] Added cors to newsletter fetch --- src/components/Newsletter/Newsletter.js | 1 + src/index.js | 81 +++++++++++++++++++++++++ wrangler.toml | 13 ++++ 3 files changed, 95 insertions(+) create mode 100644 src/index.js create mode 100644 wrangler.toml diff --git a/src/components/Newsletter/Newsletter.js b/src/components/Newsletter/Newsletter.js index ed2d28f2..545ffa1f 100644 --- a/src/components/Newsletter/Newsletter.js +++ b/src/components/Newsletter/Newsletter.js @@ -56,6 +56,7 @@ const Newsletter = () => { email, recaptchaToken: token, }), + mode: "cors", }); const data = await response.json(); diff --git a/src/index.js b/src/index.js new file mode 100644 index 00000000..ef4c8f58 --- /dev/null +++ b/src/index.js @@ -0,0 +1,81 @@ +export default { + async fetch(request, env) { + const corsHeaders = { + "Access-Control-Allow-Origin": "https://celestia.org", + "Access-Control-Allow-Methods": "POST, OPTIONS", + "Access-Control-Allow-Headers": "Content-Type, Accept", + "Content-Type": "application/json", + }; + + if (request.method === "OPTIONS") { + return new Response(null, { + status: 204, + headers: corsHeaders, + }); + } + + if (request.method !== "POST") { + return new Response("Method not allowed", { + status: 405, + headers: corsHeaders, + }); + } + + try { + const { email, recaptchaToken } = await request.json(); + + if (!email || !recaptchaToken) { + return new Response(JSON.stringify({ error: "Email and reCAPTCHA token required" }), { + status: 400, + headers: corsHeaders, + }); + } + + // Verify reCAPTCHA first + const recaptchaResponse = await fetch( + `https://www.google.com/recaptcha/api/siteverify?secret=${env.RECAPTCHA_SECRET_KEY}&response=${recaptchaToken}`, + { method: "POST" } + ); + + const recaptchaData = await recaptchaResponse.json(); + if (!recaptchaData.success) { + return new Response(JSON.stringify({ error: "Invalid reCAPTCHA" }), { + status: 400, + headers: corsHeaders, + }); + } + + // Make Mailchimp API call server-side + const response = await fetch(`https://${env.MAILCHIMP_SERVER_PREFIX}.api.mailchimp.com/3.0/lists/${env.MAILCHIMP_LIST_ID}/members`, { + method: "POST", + headers: { + Authorization: `Bearer ${env.MAILCHIMP_API_KEY}`, + "Content-Type": "application/json", + }, + body: JSON.stringify({ + email_address: email, + status: "subscribed", + }), + }); + + const data = await response.json(); + + if (response.status === 200 || response.status === 201) { + return new Response(JSON.stringify({ success: true }), { + headers: corsHeaders, + }); + } else if (data.title === "Member Exists") { + return new Response(JSON.stringify({ error: "Already subscribed" }), { + headers: corsHeaders, + }); + } + + throw new Error(data.detail || "Mailchimp error"); + } catch (error) { + return new Response(JSON.stringify({ error: error.message }), { + status: 500, + headers: corsHeaders, + }); + } + }, +}; diff --git a/wrangler.toml b/wrangler.toml new file mode 100644 index 00000000..88e91f13 --- /dev/null +++ b/wrangler.toml @@ -0,0 +1,13 @@ +name = "celestia-newsletter-worker" +main = "src/index.js" +compatibility_date = "2025-01-01" + +[vars] +ALLOWED_ORIGIN = "https://celestia.org" + +[[headers]] +for = "/*" +[headers.values] +Access-Control-Allow-Origin = "https://celestia.org" +Access-Control-Allow-Methods = "GET, POST, OPTIONS" +Access-Control-Allow-Headers = "Content-Type" \ No newline at end of file From 4ad012584da6aa99056e805423fcf1b984f2bb4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A1bor=20Tam=C3=A1s?= Date: Mon, 27 Jan 2025 15:19:49 +0100 Subject: [PATCH 2/2] Removed external worker files --- src/index.js | 81 --------------------------------------------------- wrangler.toml | 13 --------- 2 files changed, 94 deletions(-) delete mode 100644 src/index.js delete mode 100644 wrangler.toml diff --git a/src/index.js b/src/index.js deleted file mode 100644 index ef4c8f58..00000000 --- a/src/index.js +++ /dev/null @@ -1,81 +0,0 @@ -export default { - async fetch(request, env) { - const corsHeaders = { - "Access-Control-Allow-Origin": "https://celestia.org", - "Access-Control-Allow-Methods": "POST, OPTIONS", - "Access-Control-Allow-Headers": "Content-Type, Accept", - "Content-Type": "application/json", - }; - - if (request.method === "OPTIONS") { - return new Response(null, { - status: 204, - headers: corsHeaders, - }); - } - - if (request.method !== "POST") { - return new Response("Method not allowed", { - status: 405, - headers: corsHeaders, - }); - } - - try { - const { email, recaptchaToken } = await request.json(); - - if (!email || !recaptchaToken) { - return new Response(JSON.stringify({ error: "Email and reCAPTCHA token required" }), { - status: 400, - headers: corsHeaders, - }); - } - - // Verify reCAPTCHA first - const recaptchaResponse = await fetch( - `https://www.google.com/recaptcha/api/siteverify?secret=${env.RECAPTCHA_SECRET_KEY}&response=${recaptchaToken}`, - { method: "POST" } - ); - - const recaptchaData = await recaptchaResponse.json(); - if (!recaptchaData.success) { - return new Response(JSON.stringify({ error: "Invalid reCAPTCHA" }), { - status: 400, - headers: corsHeaders, - }); - } - - // Make Mailchimp API call server-side - const response = await fetch(`https://${env.MAILCHIMP_SERVER_PREFIX}.api.mailchimp.com/3.0/lists/${env.MAILCHIMP_LIST_ID}/members`, { - method: "POST", - headers: { - Authorization: `Bearer ${env.MAILCHIMP_API_KEY}`, - "Content-Type": "application/json", - }, - body: JSON.stringify({ - email_address: email, - status: "subscribed", - }), - }); - - const data = await response.json(); - - if (response.status === 200 || response.status === 201) { - return new Response(JSON.stringify({ success: true }), { - headers: corsHeaders, - }); - } else if (data.title === "Member Exists") { - return new Response(JSON.stringify({ error: "Already subscribed" }), { - headers: corsHeaders, - }); - } - - throw new Error(data.detail || "Mailchimp error"); - } catch (error) { - return new Response(JSON.stringify({ error: error.message }), { - status: 500, - headers: corsHeaders, - }); - } - }, -}; diff --git a/wrangler.toml b/wrangler.toml deleted file mode 100644 index 88e91f13..00000000 --- a/wrangler.toml +++ /dev/null @@ -1,13 +0,0 @@ -name = "celestia-newsletter-worker" -main = "src/index.js" -compatibility_date = "2025-01-01" - -[vars] -ALLOWED_ORIGIN = "https://celestia.org" - -[[headers]] -for = "/*" -[headers.values] -Access-Control-Allow-Origin = "https://celestia.org" -Access-Control-Allow-Methods = "GET, POST, OPTIONS" -Access-Control-Allow-Headers = "Content-Type" \ No newline at end of file