2025-10-21 13:02:56 -03:00

218 lines
6.0 KiB
TypeScript

/**
* 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";
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`;
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: "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": "*",
},
}
);
}
};