Files
Charlie Egan fb8f6c4a4a website: Process feedback form on netlify (#8040)
This new function allows netlify to process the form's notification hook
itself and post to slack without zapier.

Signed-off-by: Charlie Egan <charlie_egan@apple.com>
2025-11-11 11:22:50 +00:00

92 lines
2.4 KiB
TypeScript

import { Context } from "netlify:edge";
const headers = { "Content-Type": "application/json" };
export default async (req: Request, context: Context) => {
if (req.method !== "POST") {
return new Response(JSON.stringify({ error: "Method not allowed" }), {
status: 405,
headers,
});
}
try {
const requestBody = await req.json();
const feedbackData = requestBody.data;
const formName = requestBody.form_name;
// Verify this is from the correct form
if (formName !== "page-feedback") {
return new Response(JSON.stringify({ error: "Invalid form" }), {
status: 400,
headers,
});
}
const slackUrl = Deno.env.get("SLACK_DOCUMENTATION_FEEDBACK_URL");
if (!slackUrl) {
console.error("SLACK_DOCUMENTATION_FEEDBACK_URL environment variable not set");
return new Response(JSON.stringify({ error: "Configuration error" }), {
status: 500,
headers,
});
}
const feedbackType = feedbackData["feedback-type"];
const comment = feedbackData.comment || "No comment provided";
const url = feedbackData.url;
const emoji = feedbackType === "positive" ? "👍" : "👎";
const slackMessage = {
text: `📨 New feedback received`,
attachments: [
{
fields: [
{
title: "Feedback Type",
value: feedbackType === "positive" ? "Positive" : "Negative",
short: true,
},
{
title: "Page URL",
value: url,
short: false,
},
{
title: "Comment",
value: comment,
short: false,
},
],
footer: "OPA Documentation Feedback",
ts: Math.floor(Date.now() / 1000),
},
],
};
const response = await fetch(slackUrl, {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(slackMessage),
});
if (!response.ok) {
throw new Error(`Slack webhook failed: ${response.status}`);
}
return new Response(JSON.stringify({ success: true }), {
status: 200,
headers,
});
} catch (error) {
console.error("Error processing feedback:", error);
return new Response(JSON.stringify({ error: "Internal server error" }), {
status: 500,
headers,
});
}
};