guisilvagomes eae5e8cb92 Atualizar
2025-10-24 12:03:40 -03:00

113 lines
2.8 KiB
TypeScript

/**
* Serviço de Médicos (Frontend)
*/
import { apiClient } from "../api/client";
import type {
Doctor,
CreateDoctorInput,
UpdateDoctorInput,
DoctorFilters,
} from "./types";
class DoctorService {
/**
* Lista todos os médicos
*/
async list(filters?: DoctorFilters): Promise<Doctor[]> {
try {
const params = new URLSearchParams();
if (filters?.crm) {
params.append("crm", `eq.${filters.crm}`);
}
if (filters?.crm_uf) {
params.append("crm_uf", `eq.${filters.crm_uf}`);
}
if (filters?.specialty) {
params.append("specialty", `ilike.*${filters.specialty}*`);
}
if (filters?.active !== undefined) {
params.append("active", `eq.${filters.active}`);
}
if (filters?.full_name) {
params.append("full_name", `ilike.*${filters.full_name}*`);
}
const queryString = params.toString();
const url = queryString ? `/doctors?${queryString}` : "/doctors";
const response = await apiClient.get<Doctor[]>(url);
return response.data;
} catch (error: any) {
// Silenciar erro 401 (não autenticado) - é esperado em páginas públicas
if (error?.response?.status !== 401) {
console.error("Erro ao listar médicos:", error);
}
throw error;
}
}
/**
* Busca médico por ID
*/
async getById(id: string): Promise<Doctor> {
try {
const response = await apiClient.get<Doctor[]>(`/doctors?id=eq.${id}`);
if (response.data && response.data.length > 0) {
return response.data[0];
}
throw new Error("Médico não encontrado");
} catch (error) {
console.error("Erro ao buscar médico:", error);
throw error;
}
}
/**
* Cria novo médico
*/
async create(data: CreateDoctorInput): Promise<Doctor> {
try {
const response = await apiClient.post<Doctor>("/doctors", data);
return response.data;
} catch (error) {
console.error("Erro ao criar médico:", error);
throw error;
}
}
/**
* Atualiza médico existente
*/
async update(id: string, data: UpdateDoctorInput): Promise<Doctor> {
try {
const response = await apiClient.patch<Doctor[]>(
`/doctors?id=eq.${id}`,
data
);
if (response.data && response.data.length > 0) {
return response.data[0];
}
throw new Error("Médico não encontrado");
} catch (error) {
console.error("Erro ao atualizar médico:", error);
throw error;
}
}
/**
* Deleta médico
*/
async delete(id: string): Promise<void> {
try {
await apiClient.delete(`/doctors?id=eq.${id}`);
} catch (error) {
console.error("Erro ao deletar médico:", error);
throw error;
}
}
}
export const doctorService = new DoctorService();