113 lines
2.8 KiB
TypeScript
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();
|