Add Google Meet event creation to payment webhook

When order is paid, automatically create Google Meet events for all consulting slots.
The meet_link is saved to consulting_slots table and included in notifications.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
dwindown
2025-12-23 16:41:22 +07:00
parent 7bf13b88d2
commit ce531c8d46

View File

@@ -335,9 +335,75 @@ serve(async (req) => {
console.log("[WEBHOOK] Consulting slots confirmed for order:", order.id); console.log("[WEBHOOK] Consulting slots confirmed for order:", order.id);
} }
// Create Google Meet events for each consulting slot
for (const slot of consultingSlots) {
try {
console.log("[WEBHOOK] Creating Google Meet event for slot:", slot.id);
const { data: settings } = await supabase
.from("platform_settings")
.select("integration_google_calendar_id")
.single();
if (!settings?.integration_google_calendar_id) {
console.log("[WEBHOOK] Google Calendar not configured, skipping Meet creation");
continue;
}
// Get product info for the topic
const { data: orderItems } = await supabase
.from("order_items")
.select("product_id, products(name)")
.eq("order_id", order.id)
.limit(1);
const topic = orderItems?.[0]?.products?.name || "Konsultasi 1-on-1";
const meetResponse = await fetch(
`${Deno.env.get("SUPABASE_URL")}/functions/v1/create-google-meet-event`,
{
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${Deno.env.get("SUPABASE_ANON_KEY")}`,
},
body: JSON.stringify({
slot_id: slot.id,
date: slot.date,
start_time: slot.start_time,
end_time: slot.end_time,
client_name: userName,
client_email: userEmail,
topic: topic,
}),
}
);
if (meetResponse.ok) {
const meetData = await meetResponse.json();
if (meetData.success) {
console.log("[WEBHOOK] Google Meet event created:", meetData.meet_link);
} else {
console.error("[WEBHOOK] Failed to create Meet event:", meetData.message);
}
} else {
console.error("[WEBHOOK] Meet creation API error:", meetResponse.status);
}
} catch (error) {
console.error("[WEBHOOK] Error creating Google Meet event:", error);
// Don't fail the webhook if Meet creation fails
}
}
// Refresh slots to get updated meet_link
const { data: updatedSlots } = await supabase
.from("consulting_slots")
.select("*")
.eq("order_id", order.id);
// Format consulting slot details for notification // Format consulting slot details for notification
const slots = consultingSlots as Array<{ date: string; start_time: string; end_time: string; meet_link?: string }>; const slots = (updatedSlots || consultingSlots) as Array<{ date: string; start_time: string; end_time: string; meet_link?: string }>;
const shortcodeData: Record<string, string> = { const shortcodeData: Record<string, string> = {
nama: userName, nama: userName,
email: userEmail, email: userEmail,