riseup-squad21/services/0detalhes.txt
2025-10-20 21:49:35 -03:00

184 lines
7.8 KiB
Plaintext

======================================================================
DOCUMENTAÇÃO DA CAMADA DE SERVIÇO (SERVICES)
======================================================================
Este documento descreve a arquitetura e o funcionamento da camada de serviço,
responsável por toda a comunicação com o backend (Supabase API).
----------------------------------------------------------------------
ARQUITETURA GERAL
----------------------------------------------------------------------
A camada de serviço é composta por 12 arquivos, organizados por módulos
de funcionalidade da API. A arquitetura é centralizada em um arquivo
principal `api.ts` que configura o Axios, enquanto os outros arquivos
consomem essa configuração para realizar as chamadas específicas.
----------------------------------------------------------------------
1. ARQUIVO PRINCIPAL: api.ts
----------------------------------------------------------------------
- **Propósito:** Este é o coração da camada de serviço. Ele cria e exporta
uma instância centralizada do Axios pré-configurada para interagir com
a API do Supabase.
- **Configurações Principais:**
- **baseURL:** Aponta para `https://yuanqfswhberkoevtmfr.supabase.co`.
- **apikey:** A chave pública (anon key) do Supabase é adicionada como
um cabeçalho padrão em TODAS as requisições.
- **Interceptor de Requisição (Request Interceptor):**
- Antes de qualquer requisição ser enviada, o interceptor busca por um
cookie chamado `supabase-token`.
- Se o token for encontrado, ele é adicionado ao cabeçalho `Authorization`
como um `Bearer Token`.
- Isso automatiza o processo de autenticação para todas as rotas protegidas,
evitando a necessidade de adicionar o token manualmente em cada chamada.
- **Importante:** Este arquivo NÃO contém nenhuma função de endpoint (como
login ou listagem de médicos). Sua única responsabilidade é a configuração
do cliente HTTP.
----------------------------------------------------------------------
2. MÓDULOS DE SERVIÇO
----------------------------------------------------------------------
Cada arquivo a seguir representa um módulo da API e exporta um objeto
com funções assíncronas para interagir com os endpoints.
---
### 2.1. autenticacaoApi.ts
- **Propósito:** Gerencia todas as operações de autenticação.
- **Observação:** Este módulo utiliza `fetch` diretamente em vez da instância
`api` do Axios. Isso é necessário porque as funções de login são as que
OBTÊM o token, que o interceptor do Axios precisa para funcionar. Ele também
gerencia a gravação e remoção do `supabase-token` nos cookies do navegador.
- **Funções Exportadas:**
- `loginWithEmailAndPassword(email, password)`: Envia credenciais para `POST /auth/v1/token?grant_type=password`, recebe o token de acesso e o armazena nos cookies.
- `logout()`: Envia uma requisição para `POST /auth/v1/logout` para invalidar a sessão no Supabase e remove o token dos cookies.
- `sendMagicLink(email, redirectTo)`: Envia um email para `POST /auth/v1/otp` para login sem senha.
- `renewToken(refreshToken)`: Usa um refresh token para obter um novo token de acesso via `POST /auth/v1/token?grant_type=refresh_token`.
---
### 2.2. atribuicoesApi.ts
- **Propósito:** Gerencia as atribuições de pacientes a profissionais.
- **Tabela Alvo:** `patient_assignments`
- **Funções Exportadas:**
- `list()`: Busca a lista de todas as atribuições (`GET /rest/v1/patient_assignments`).
- `create(data)`: Cria uma nova atribuição (`POST /rest/v1/patient_assignments`).
---
### 2.3. avatarsApi.ts
- **Propósito:** Gerencia o upload e a remoção de avatares no Supabase Storage.
- **Observação:** As URLs e o método de envio (multipart/form-data) são
específicos para o serviço de Storage do Supabase.
- **Funções Exportadas:**
- `upload(userId, file)`: Envia um arquivo de imagem para `POST /storage/v1/object/avatars/{userId}/avatar`.
- `remove(userId)`: Deleta o avatar de um usuário (`DELETE /storage/v1/object/avatars/{userId}/avatar`).
- `getPublicUrl(userId, ext)`: Monta e retorna a URL pública para acessar a imagem do avatar, não faz uma chamada de API.
---
### 2.4. medicosApi.ts
- **Propósito:** Gerencia o CRUD (Create, Read, Update, Delete) completo para o recurso de médicos.
- **Tabela Alvo:** `doctors`
- **Funções Exportadas:**
- `list()`: `GET /rest/v1/doctors`
- `getById(id)`: `GET /rest/v1/doctors?id=eq.{id}`
- `create(data)`: `POST /rest/v1/doctors`
- `update(id, data)`: `PATCH /rest/v1/doctors?id=eq.{id}`
- `delete(id)`: `DELETE /rest/v1/doctors?id=eq.{id}`
---
### 2.5. pacientesApi.ts
- **Propósito:** Gerencia o CRUD completo para o recurso de pacientes.
- **Tabela Alvo:** `patients`
- **Funções Exportadas:** CRUD padrão (`list`, `getById`, `create`, `update`, `delete`).
---
### 2.6. perfisApi.ts
- **Propósito:** Gerencia a listagem e atualização de perfis de usuários.
- **Tabela Alvo:** `profiles`
- **Funções Exportadas:**
- `list()`: `GET /rest/v1/profiles`
- `update(userId, data)`: `PATCH /rest/v1/profiles?id=eq.{userId}`
---
### 2.7. relatoriosApi.ts
- **Propósito:** Gerencia o CRUD completo para o recurso de relatórios.
- **Tabela Alvo:** `reports`
- **Funções Exportadas:** CRUD padrão (`list`, `getById`, `create`, `update`, `delete`).
---
### 2.8. usuariosApi.ts
- **Propósito:** Agrupa endpoints relacionados a usuários que não são CRUD direto da tabela `profiles`.
- **Funções Exportadas:**
- `listRoles()`: Busca as funções (roles) dos usuários (`GET /rest/v1/user_roles`).
- `createUser(data)`: Chama uma Supabase Function para criar um novo usuário (`POST /functions/v1/create-user`).
- `getCurrentUser()`: Obtém os dados do usuário atualmente autenticado (`GET /auth/v1/user`).
- `getFullData(userId)`: Chama uma Supabase Function para obter dados consolidados de um usuário (`GET /functions/v1/user-info`).
---
### 2.9. smsApi.ts
- **Propósito:** Responsável pelo envio de mensagens SMS.
- **Funções Exportadas:**
- `send(data)`: Chama a Supabase Function para enviar um SMS (`POST /functions/v1/send-sms`).
---
### 2.10. agendamentosApi.ts
- **Propósito:** Gerencia o CRUD de agendamentos e a busca por horários.
- **Tabela Alvo:** `appointments`
- **Funções Exportadas:**
- CRUD padrão (`list`, `getById`, `create`, `update`, `delete`).
- `searchAvailableSlots(data)`: Chama a Supabase Function para buscar horários disponíveis (`POST /functions/v1/get-available-slots`).
---
### 2.11. disponibilidadeApi.ts
- **Propósito:** Gerencia o CRUD completo para a disponibilidade dos médicos.
- **Tabela Alvo:** `doctor_availability`
- **Funções Exportadas:** CRUD padrão (`list`, `getById`, `create`, `update`, `delete`).
---
### 2.12. excecoesApi.ts
- **Propósito:** Gerencia as exceções (bloqueios/liberações) na agenda dos médicos.
- **Tabela Alvo:** `doctor_exceptions`
- **Funções Exportadas:**
- `list()`: `GET /rest/v1/doctor_exceptions`
- `create(data)`: `POST /rest/v1/doctor_exceptions`
- `delete(id)`: `DELETE /rest/v1/doctor_exceptions?id=eq.{id}`
----------------------------------------------------------------------
COMO UTILIZAR
----------------------------------------------------------------------
Para usar qualquer uma dessas funções em um componente ou página do Next.js,
basta importar o módulo desejado e chamar a função. O tratamento de erros
(com `try/catch`) e o gerenciamento de estado (loading, data, error) devem
ser feitos no local onde a função é chamada.
**Exemplo:**
```typescript
import { medicosApi } from './services/medicosApi';
async function fetchDoctors() {
try {
const doctors = await medicosApi.list();
console.log(doctors);
} catch (error) {
console.error("Erro ao buscar médicos:", error);
}
}