/** * Netlify Function: doctor-availability * * Proxy para operações de disponibilidade dos médicos * GET: Lista disponibilidades * POST: Criar disponibilidade * PATCH: Atualizar disponibilidade * DELETE: Deletar disponibilidade */ const SUPABASE_URL = "https://yuanqfswhberkoevtmfr.supabase.co"; const SUPABASE_API_KEY = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Inl1YW5xZnN3aGJlcmtvZXZ0bWZyIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTQ5NTQzNjksImV4cCI6MjA3MDUzMDM2OX0.g8Fm4XAvtX46zifBZnYVH4tVuQkqUH6Ia9CXQj4DztQ"; const SUPABASE_SERVICE_ROLE_KEY = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Inl1YW5xZnN3aGJlcmtvZXZ0bWZyIiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImlhdCI6MTc1NDk1NDM2OSwiZXhwIjoyMDcwNTMwMzY5fQ.Dez8PQkV8vWv7VkL_fZe-lY-Xs9P5VptNvRRnhkxoXw"; export default async (req: Request) => { // Permitir CORS if (req.method === "OPTIONS") { return new Response(null, { status: 204, headers: { "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Methods": "GET, POST, PATCH, DELETE, OPTIONS", "Access-Control-Allow-Headers": "Content-Type, Authorization", }, }); } try { const url = new URL(req.url); const authHeader = req.headers.get("Authorization"); // Extrair ID do path se existir const pathParts = url.pathname.split("/"); const availabilityId = pathParts[pathParts.length - 1]; // GET: Listar disponibilidades if (req.method === "GET") { const select = url.searchParams.get("select") || "*"; const doctor_id = url.searchParams.get("doctor_id"); const active = url.searchParams.get("active"); const queryParams = new URLSearchParams(); queryParams.append("select", select); if (doctor_id) queryParams.append("doctor_id", `eq.${doctor_id}`); if (active !== null) queryParams.append("active", `eq.${active}`); const supabaseUrl = `${SUPABASE_URL}/rest/v1/doctor_availability?${queryParams}`; const headers: HeadersInit = { apikey: SUPABASE_API_KEY, "Content-Type": "application/json", }; if (authHeader) { headers["Authorization"] = authHeader; } const response = await fetch(supabaseUrl, { method: "GET", headers, }); const data = await response.json(); return new Response(JSON.stringify(data), { status: response.status, headers: { "Content-Type": "application/json", "Access-Control-Allow-Origin": "*", }, }); } // POST: Criar disponibilidade if (req.method === "POST") { const body = await req.json(); const supabaseUrl = `${SUPABASE_URL}/rest/v1/doctor_availability`; // Usa SERVICE ROLE KEY para ignorar políticas RLS const headers: HeadersInit = { apikey: SUPABASE_SERVICE_ROLE_KEY, Authorization: `Bearer ${SUPABASE_SERVICE_ROLE_KEY}`, "Content-Type": "application/json", Prefer: "return=representation", }; const response = await fetch(supabaseUrl, { method: "POST", headers, body: JSON.stringify(body), }); const data = await response.json(); return new Response(JSON.stringify(data), { status: response.status, headers: { "Content-Type": "application/json", "Access-Control-Allow-Origin": "*", }, }); } // PATCH: Atualizar disponibilidade if (req.method === "PATCH") { if (!availabilityId || availabilityId === "doctor-availability") { return new Response( JSON.stringify({ error: "Availability ID is required" }), { status: 400, headers: { "Content-Type": "application/json", "Access-Control-Allow-Origin": "*", }, } ); } const body = await req.json(); const supabaseUrl = `${SUPABASE_URL}/rest/v1/doctor_availability?id=eq.${availabilityId}`; const headers: HeadersInit = { apikey: SUPABASE_API_KEY, "Content-Type": "application/json", Prefer: "return=representation", }; if (authHeader) { headers["Authorization"] = authHeader; } const response = await fetch(supabaseUrl, { method: "PATCH", headers, body: JSON.stringify(body), }); const data = await response.json(); const result = Array.isArray(data) && data.length > 0 ? data[0] : data; return new Response(JSON.stringify(result), { status: response.status, headers: { "Content-Type": "application/json", "Access-Control-Allow-Origin": "*", }, }); } // DELETE: Deletar disponibilidade if (req.method === "DELETE") { if (!availabilityId || availabilityId === "doctor-availability") { return new Response( JSON.stringify({ error: "Availability ID is required" }), { status: 400, headers: { "Content-Type": "application/json", "Access-Control-Allow-Origin": "*", }, } ); } const supabaseUrl = `${SUPABASE_URL}/rest/v1/doctor_availability?id=eq.${availabilityId}`; const headers: HeadersInit = { apikey: SUPABASE_API_KEY, "Content-Type": "application/json", }; if (authHeader) { headers["Authorization"] = authHeader; } const response = await fetch(supabaseUrl, { method: "DELETE", headers, }); return new Response(null, { status: response.status, headers: { "Access-Control-Allow-Origin": "*", }, }); } // Método não suportado return new Response(JSON.stringify({ error: "Method not allowed" }), { status: 405, headers: { "Content-Type": "application/json", "Access-Control-Allow-Origin": "*", }, }); } catch (error) { console.error("Error in doctor-availability function:", error); return new Response( JSON.stringify({ error: "Internal server error", details: error instanceof Error ? error.message : "Unknown error", }), { status: 500, headers: { "Content-Type": "application/json", "Access-Control-Allow-Origin": "*", }, } ); } };