184 lines
7.8 KiB
Plaintext
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);
|
|
}
|
|
} |