127 lines
4.2 KiB
TypeScript
127 lines
4.2 KiB
TypeScript
import { serve } from "https://deno.land/std@0.190.0/http/server.ts";
|
|
import { createClient } from "https://esm.sh/@supabase/supabase-js@2";
|
|
|
|
const corsHeaders = {
|
|
"Access-Control-Allow-Origin": "*",
|
|
"Access-Control-Allow-Headers": "authorization, x-client-info, apikey, content-type",
|
|
};
|
|
|
|
interface CreateMeetRequest {
|
|
slot_id: string;
|
|
date: string;
|
|
start_time: string;
|
|
end_time: string;
|
|
client_name: string;
|
|
client_email: string;
|
|
topic: string;
|
|
notes?: string;
|
|
}
|
|
|
|
serve(async (req: Request): Promise<Response> => {
|
|
if (req.method === "OPTIONS") {
|
|
return new Response(null, { headers: corsHeaders });
|
|
}
|
|
|
|
try {
|
|
const supabaseUrl = Deno.env.get("SUPABASE_URL")!;
|
|
const supabaseServiceKey = Deno.env.get("SUPABASE_SERVICE_ROLE_KEY")!;
|
|
const supabase = createClient(supabaseUrl, supabaseServiceKey);
|
|
|
|
const body: CreateMeetRequest = await req.json();
|
|
console.log("Creating meet link for slot:", body.slot_id);
|
|
|
|
// Get platform settings for Google Calendar ID
|
|
const { data: settings } = await supabase
|
|
.from("platform_settings")
|
|
.select("integration_google_calendar_id, brand_name")
|
|
.single();
|
|
|
|
const calendarId = settings?.integration_google_calendar_id;
|
|
const brandName = settings?.brand_name || "LearnHub";
|
|
|
|
if (!calendarId) {
|
|
return new Response(
|
|
JSON.stringify({
|
|
success: false,
|
|
message: "Google Calendar ID belum dikonfigurasi di Pengaturan > Integrasi"
|
|
}),
|
|
{ status: 400, headers: { ...corsHeaders, "Content-Type": "application/json" } }
|
|
);
|
|
}
|
|
|
|
// For now, this is a placeholder that returns a message
|
|
// In production, you would integrate with Google Calendar API via OAuth or service account
|
|
// Or call an n8n webhook to handle the calendar creation
|
|
|
|
const { data: integrationSettings } = await supabase
|
|
.from("platform_settings")
|
|
.select("integration_n8n_base_url")
|
|
.single();
|
|
|
|
if (integrationSettings?.integration_n8n_base_url) {
|
|
// Call n8n webhook if configured
|
|
const n8nUrl = `${integrationSettings.integration_n8n_base_url}/webhook/create-meet`;
|
|
|
|
try {
|
|
const n8nResponse = await fetch(n8nUrl, {
|
|
method: "POST",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: JSON.stringify({
|
|
slot_id: body.slot_id,
|
|
date: body.date,
|
|
start_time: body.start_time,
|
|
end_time: body.end_time,
|
|
client_name: body.client_name,
|
|
client_email: body.client_email,
|
|
topic: body.topic,
|
|
notes: body.notes,
|
|
calendar_id: calendarId,
|
|
brand_name: brandName,
|
|
}),
|
|
});
|
|
|
|
if (n8nResponse.ok) {
|
|
const result = await n8nResponse.json();
|
|
|
|
if (result.meet_link) {
|
|
// Update the slot with the meet link
|
|
await supabase
|
|
.from("consulting_slots")
|
|
.update({ meet_link: result.meet_link })
|
|
.eq("id", body.slot_id);
|
|
|
|
return new Response(
|
|
JSON.stringify({ success: true, meet_link: result.meet_link }),
|
|
{ headers: { ...corsHeaders, "Content-Type": "application/json" } }
|
|
);
|
|
}
|
|
}
|
|
} catch (n8nError) {
|
|
console.error("n8n webhook error:", n8nError);
|
|
}
|
|
}
|
|
|
|
// Fallback: Return instructions for manual setup
|
|
return new Response(
|
|
JSON.stringify({
|
|
success: false,
|
|
message: "Integrasi otomatis belum tersedia. Silakan buat link Meet secara manual atau konfigurasi n8n webhook di Pengaturan > Integrasi.",
|
|
manual_instructions: {
|
|
calendar_id: calendarId,
|
|
event_title: `Konsultasi: ${body.topic} - ${body.client_name}`,
|
|
event_date: body.date,
|
|
event_time: `${body.start_time} - ${body.end_time}`,
|
|
}
|
|
}),
|
|
{ status: 200, headers: { ...corsHeaders, "Content-Type": "application/json" } }
|
|
);
|
|
|
|
} catch (error: any) {
|
|
console.error("Error creating meet link:", error);
|
|
return new Response(
|
|
JSON.stringify({ success: false, message: error.message }),
|
|
{ status: 500, headers: { ...corsHeaders, "Content-Type": "application/json" } }
|
|
);
|
|
}
|
|
});
|