96 lines
2.8 KiB
TypeScript
96 lines
2.8 KiB
TypeScript
import { serve } from "https://deno.land/std@0.190.0/http/server.ts";
|
|
|
|
const corsHeaders = {
|
|
"Access-Control-Allow-Origin": "*",
|
|
"Access-Control-Allow-Headers":
|
|
"authorization, x-client-info, apikey, content-type",
|
|
};
|
|
|
|
interface ContactRequest {
|
|
name: string;
|
|
email: string;
|
|
company: string;
|
|
message: string;
|
|
}
|
|
|
|
const handler = async (req: Request): Promise<Response> => {
|
|
if (req.method === "OPTIONS") {
|
|
return new Response(null, { headers: corsHeaders });
|
|
}
|
|
|
|
try {
|
|
const { name, email, company, message }: ContactRequest = await req.json();
|
|
|
|
// Validate required fields
|
|
if (!name || !email || !message) {
|
|
throw new Error("Missing required fields");
|
|
}
|
|
|
|
// Validate email format
|
|
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
if (!emailRegex.test(email)) {
|
|
throw new Error("Invalid email format");
|
|
}
|
|
|
|
// Validate field lengths
|
|
if (name.length > 100 || email.length > 255 || (company && company.length > 100) || message.length > 2000) {
|
|
throw new Error("Field length exceeded");
|
|
}
|
|
|
|
const RESEND_API_KEY = Deno.env.get("RESEND_API_KEY");
|
|
const recipientEmail = Deno.env.get("CONTACT_EMAIL") || "kontakt@example.com";
|
|
|
|
if (!RESEND_API_KEY) {
|
|
throw new Error("RESEND_API_KEY not configured");
|
|
}
|
|
|
|
const res = await fetch("https://api.resend.com/emails", {
|
|
method: "POST",
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
Authorization: `Bearer ${RESEND_API_KEY}`,
|
|
},
|
|
body: JSON.stringify({
|
|
from: "Lennart Svensson Konditorivaror <noreply@lennartsvensson.se>",
|
|
to: [recipientEmail],
|
|
reply_to: email,
|
|
subject: `Kontaktförfrågan från ${name}`,
|
|
html: `
|
|
<h2>Ny kontaktförfrågan</h2>
|
|
<p><strong>Namn:</strong> ${name}</p>
|
|
<p><strong>E-post:</strong> ${email}</p>
|
|
${company ? `<p><strong>Företag:</strong> ${company}</p>` : ""}
|
|
<hr />
|
|
<p><strong>Meddelande:</strong></p>
|
|
<p>${message.replace(/\n/g, "<br />")}</p>
|
|
`,
|
|
}),
|
|
});
|
|
|
|
if (!res.ok) {
|
|
const error = await res.text();
|
|
console.error("Resend API error:", error);
|
|
throw new Error("Failed to send email");
|
|
}
|
|
|
|
const data = await res.json();
|
|
console.log("Contact email sent successfully:", data);
|
|
|
|
return new Response(JSON.stringify({ success: true }), {
|
|
status: 200,
|
|
headers: { "Content-Type": "application/json", ...corsHeaders },
|
|
});
|
|
} catch (error: any) {
|
|
console.error("Error in send-contact-email function:", error);
|
|
return new Response(
|
|
JSON.stringify({ error: error.message }),
|
|
{
|
|
status: 500,
|
|
headers: { "Content-Type": "application/json", ...corsHeaders },
|
|
}
|
|
);
|
|
}
|
|
};
|
|
|
|
serve(handler);
|