179 lines
4.2 KiB
TypeScript
179 lines
4.2 KiB
TypeScript
/**
|
|
* Helper para acessar o SUPABASE EXTERNO (fonte da verdade)
|
|
* URL: https://yuanqfswhberkoevtmfr.supabase.co
|
|
*
|
|
* USAR PARA:
|
|
* - appointments (CRUD)
|
|
* - doctors (leitura)
|
|
* - patients (leitura)
|
|
* - reports (leitura/escrita)
|
|
*/
|
|
|
|
/// <reference lib="deno.ns" />
|
|
|
|
const EXTERNAL_SUPABASE_URL = "https://yuanqfswhberkoevtmfr.supabase.co";
|
|
const EXTERNAL_SUPABASE_ANON_KEY =
|
|
Deno.env.get("EXTERNAL_SUPABASE_ANON_KEY") ||
|
|
Deno.env.get("EXTERNAL_SUPABASE_KEY") ||
|
|
"";
|
|
|
|
export async function externalRest(
|
|
path: string,
|
|
method: "GET" | "POST" | "PATCH" | "DELETE" = "GET",
|
|
body?: Record<string, unknown>,
|
|
authToken?: string
|
|
): Promise<Record<string, unknown> | Record<string, unknown>[]> {
|
|
const url = `${EXTERNAL_SUPABASE_URL}/rest/v1/${path}`;
|
|
|
|
const headers: Record<string, string> = {
|
|
apikey: EXTERNAL_SUPABASE_ANON_KEY,
|
|
"Content-Type": "application/json",
|
|
};
|
|
|
|
if (authToken) {
|
|
headers["Authorization"] = authToken;
|
|
}
|
|
|
|
const options: RequestInit = {
|
|
method,
|
|
headers,
|
|
};
|
|
|
|
if (body && (method === "POST" || method === "PATCH")) {
|
|
options.body = JSON.stringify(body);
|
|
}
|
|
|
|
const response = await fetch(url, options);
|
|
|
|
if (!response.ok) {
|
|
const error = await response.text();
|
|
throw new Error(`External Supabase error: ${error}`);
|
|
}
|
|
|
|
return await response.json();
|
|
}
|
|
|
|
/**
|
|
* Buscar appointments do Supabase externo
|
|
*/
|
|
export async function getExternalAppointments(
|
|
filters?: {
|
|
doctor_id?: string;
|
|
patient_id?: string;
|
|
date?: string;
|
|
status?: string;
|
|
},
|
|
authToken?: string
|
|
) {
|
|
let path = "appointments?select=*";
|
|
|
|
if (filters?.doctor_id) path += `&doctor_id=eq.${filters.doctor_id}`;
|
|
if (filters?.patient_id) path += `&patient_id=eq.${filters.patient_id}`;
|
|
if (filters?.date)
|
|
path += `&scheduled_at=gte.${filters.date}T00:00:00&scheduled_at=lte.${filters.date}T23:59:59`;
|
|
if (filters?.status) path += `&status=eq.${filters.status}`;
|
|
|
|
return await externalRest(path, "GET", undefined, authToken);
|
|
}
|
|
|
|
/**
|
|
* Criar appointment no Supabase externo
|
|
*/
|
|
export async function createExternalAppointment(
|
|
data: {
|
|
doctor_id: string;
|
|
patient_id: string;
|
|
scheduled_at: string; // ISO 8601 timestamp
|
|
duration_minutes?: number;
|
|
appointment_type?: string;
|
|
status?: string;
|
|
chief_complaint?: string;
|
|
patient_notes?: string;
|
|
created_by: string;
|
|
},
|
|
authToken?: string
|
|
) {
|
|
return await externalRest("appointments", "POST", data, authToken);
|
|
}
|
|
|
|
/**
|
|
* Atualizar appointment no Supabase externo
|
|
*/
|
|
export async function updateExternalAppointment(
|
|
id: string,
|
|
data: Partial<{
|
|
scheduled_at: string;
|
|
duration_minutes: number;
|
|
appointment_type: string;
|
|
status: string;
|
|
notes: string;
|
|
chief_complaint: string;
|
|
}>,
|
|
authToken?: string
|
|
) {
|
|
return await externalRest(
|
|
`appointments?id=eq.${id}`,
|
|
"PATCH",
|
|
data,
|
|
authToken
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Buscar doctors do Supabase externo
|
|
*/
|
|
export async function getExternalDoctors(
|
|
filters?: {
|
|
specialty?: string;
|
|
active?: boolean;
|
|
},
|
|
authToken?: string
|
|
) {
|
|
let path = "doctors?select=*";
|
|
|
|
if (filters?.specialty) path += `&specialty=eq.${filters.specialty}`;
|
|
if (filters?.active !== undefined) path += `&active=eq.${filters.active}`;
|
|
|
|
return await externalRest(path, "GET", undefined, authToken);
|
|
}
|
|
|
|
/**
|
|
* Buscar patients do Supabase externo
|
|
*/
|
|
export async function getExternalPatients(
|
|
filters?: {
|
|
id?: string;
|
|
cpf?: string;
|
|
},
|
|
authToken?: string
|
|
) {
|
|
let path = "patients?select=*";
|
|
|
|
if (filters?.id) path += `&id=eq.${filters.id}`;
|
|
if (filters?.cpf) path += `&cpf=eq.${filters.cpf}`;
|
|
|
|
return await externalRest(path, "GET", undefined, authToken);
|
|
}
|
|
|
|
/**
|
|
* Buscar reports do Supabase externo
|
|
*/
|
|
export async function getExternalReports(
|
|
filters?: {
|
|
patient_id?: string;
|
|
doctor_id?: string;
|
|
date_from?: string;
|
|
date_to?: string;
|
|
},
|
|
authToken?: string
|
|
) {
|
|
let path = "reports?select=*";
|
|
|
|
if (filters?.patient_id) path += `&patient_id=eq.${filters.patient_id}`;
|
|
if (filters?.doctor_id) path += `&doctor_id=eq.${filters.doctor_id}`;
|
|
if (filters?.date_from) path += `&created_at=gte.${filters.date_from}`;
|
|
if (filters?.date_to) path += `&created_at=lte.${filters.date_to}`;
|
|
|
|
return await externalRest(path, "GET", undefined, authToken);
|
|
}
|