78 lines
2.3 KiB
TypeScript
78 lines
2.3 KiB
TypeScript
import { validateExternalAuth } from "../_shared/auth.ts";
|
|
|
|
const corsHeaders = {
|
|
"Access-Control-Allow-Origin": "*",
|
|
"Access-Control-Allow-Headers":
|
|
"authorization, x-client-info, apikey, content-type",
|
|
};
|
|
|
|
Deno.serve(async (req) => {
|
|
if (req.method === "OPTIONS")
|
|
return new Response("ok", { headers: corsHeaders });
|
|
|
|
try {
|
|
const { user, ownSupabase } = await validateExternalAuth(req);
|
|
const supabase = ownSupabase;
|
|
|
|
const { external_doctor_id, date } = await req.json();
|
|
if (!external_doctor_id || !date)
|
|
throw new Error("external_doctor_id and date required");
|
|
|
|
const dayOfWeek = new Date(date).getDay();
|
|
|
|
// 1. Buscar disponibilidade do médico
|
|
const { data: availability } = await supabase
|
|
.from("doctor_availability")
|
|
.select("*")
|
|
.eq("external_doctor_id", external_doctor_id)
|
|
.eq("day_of_week", dayOfWeek)
|
|
.eq("active", true);
|
|
|
|
// 2. Verificar exceções
|
|
const { data: exceptions } = await supabase
|
|
.from("availability_exceptions")
|
|
.select("*")
|
|
.eq("external_doctor_id", external_doctor_id)
|
|
.eq("exception_date", date);
|
|
|
|
if (exceptions && exceptions.length > 0) {
|
|
return new Response(
|
|
JSON.stringify({
|
|
success: true,
|
|
data: { slots: [], reason: "Exception date" },
|
|
}),
|
|
{ headers: { ...corsHeaders, "Content-Type": "application/json" } }
|
|
);
|
|
}
|
|
|
|
// 3. Gerar slots
|
|
const slots = [];
|
|
if (availability) {
|
|
for (const avail of availability) {
|
|
const start = parseInt(avail.start_time.split(":")[0]);
|
|
const end = parseInt(avail.end_time.split(":")[0]);
|
|
for (let hour = start; hour < end; hour++) {
|
|
slots.push({
|
|
time: `${hour.toString().padStart(2, "0")}:00`,
|
|
available: true,
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
const data = { slots, date, day_of_week: dayOfWeek };
|
|
|
|
return new Response(JSON.stringify({ success: true, data }), {
|
|
headers: { ...corsHeaders, "Content-Type": "application/json" },
|
|
});
|
|
} catch (error: any) {
|
|
return new Response(
|
|
JSON.stringify({ success: false, error: error.message }),
|
|
{
|
|
status: 400,
|
|
headers: { ...corsHeaders, "Content-Type": "application/json" },
|
|
}
|
|
);
|
|
}
|
|
});
|