100 lines
4.2 KiB
Markdown
100 lines
4.2 KiB
Markdown
# OdontoFlow Scheduler
|
|
|
|
Dashboard de agendamento para clínicas odontológicas com front-end em React e back-end Node/PostgreSQL prontos para rodar em Docker.
|
|
|
|
## Estrutura
|
|
- `client/`: app React (Vite) reproduzindo a experiência solicitada com agenda, filtros e modais.
|
|
- `server/`: API Express conectada a um banco PostgreSQL com CRUD completo de pacientes, agendamentos e prontuários.
|
|
- `docker-compose.yml`: sobe o app, o banco PostgreSQL e o Adminer para gerenciamento visual.
|
|
|
|
## Comandos de desenvolvimento
|
|
1. Instale dependências do servidor:
|
|
```bash
|
|
npm install
|
|
```
|
|
2. No diretório `client`, instale o front-end:
|
|
```bash
|
|
cd client && npm install
|
|
```
|
|
3. Garanta que exista um PostgreSQL disponível (por exemplo `docker compose up postgres -d`). Configure a URL em `DATABASE_URL` ou use `postgresql://agenda:agenda@localhost:5432/agenda`.
|
|
|
|
4. Em uma janela, rode o servidor:
|
|
```bash
|
|
npm run start
|
|
```
|
|
5. Em outra, inicie o front-end em modo dev:
|
|
```bash
|
|
cd client && npm run dev
|
|
```
|
|
O front-end irá consumir a API em `http://localhost:4000/api` automaticamente.
|
|
|
|
## Construindo e executando via Docker
|
|
```bash
|
|
docker compose up --build
|
|
```
|
|
A aplicação ficará disponível em `http://localhost:4000`. O PostgreSQL roda no serviço `postgres` (persistido em `postgres_data`) e o Adminer para inspeção está em `http://localhost:8080` (use `agenda` / `agenda` / banco `agenda`).
|
|
|
|
## Notas
|
|
- Os seeds criam três médicos e alguns agendamentos iniciais na primeira execução do banco.
|
|
- O servidor serve os assets estáticos de `client/dist`; rode `npm run build` dentro de `client` antes de subir a imagem ou deixe o Docker cuidar disso.
|
|
- Utilize as rotas REST em `/api/appointments`, `/api/patients`, `/api/records` e `/api/doctors` para integrar outros sistemas.
|
|
|
|
## Integração via N8N
|
|
Há um endpoint único pensado para automações low-code. Ele concentra todas as ações necessárias para criar, consultar, alterar ou remover agendamentos e cadastrar pacientes usando o N8N (ou qualquer outro orquestrador).
|
|
|
|
### Endpoint
|
|
- **URL:** `POST /api/integrations/n8n`
|
|
- **Corpo:** JSON com as chaves:
|
|
- `action`: string informando qual operação executar (ver tabela abaixo).
|
|
- `data`: objeto com os campos necessários para a ação escolhida.
|
|
|
|
### Ações suportadas
|
|
| Ação (`action`) | Dados mínimos em `data` | O que faz |
|
|
|-----------------|-------------------------|-----------|
|
|
| `create_appointment` | `patient`, `doctorId`, `date`, `time` (opcionais: `phone`, `type`, `status`, `notes`) | Cria um agendamento e retorna o registro completo |
|
|
| `list_appointments` | (opcional) `date`, `doctorId`, `status`, `patient` | Lista agendamentos aplicando filtros |
|
|
| `get_appointment` | `id` | Busca um agendamento específico com dados do médico |
|
|
| `update_appointment` | `id` + campos a atualizar (`patient`, `doctorId`, `date`, `time`, etc.) | Atualiza todas as informações do agendamento |
|
|
| `reschedule_appointment` | `id`, `date`, `time` (opcional `doctorId`) | Atualiza apenas data/horário e, opcionalmente, o médico |
|
|
| `delete_appointment` | `id` | Remove o agendamento informado |
|
|
| `create_patient` | `name`, `phone` (opcionais: `email`, `cpf`, `cep`, `address`, `birthdate`) | Cadastra um novo paciente |
|
|
|
|
Caso `action` seja inválido, o servidor responde com HTTP 400 e mensagem listando as opções válidas.
|
|
|
|
### Exemplo de uso (cURL ou HTTP Request node no N8N)
|
|
```bash
|
|
curl -X POST http://localhost:4000/api/integrations/n8n \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"action": "create_appointment",
|
|
"data": {
|
|
"patient": "João Silva",
|
|
"phone": "+55 11 9999-9999",
|
|
"doctorId": "dr-ana",
|
|
"date": "2024-10-01",
|
|
"time": "09:00",
|
|
"type": "Avaliação",
|
|
"status": "pending"
|
|
}
|
|
}'
|
|
```
|
|
Resposta típica:
|
|
```json
|
|
{
|
|
"result": {
|
|
"id": 123,
|
|
"patient": "João Silva",
|
|
"phone": "+55 11 9999-9999",
|
|
"doctor_id": "dr-ana",
|
|
"date": "2024-10-01",
|
|
"time": "09:00",
|
|
"type": "Avaliação",
|
|
"status": "pending",
|
|
"notes": "",
|
|
"createdAt": "2024-09-10T12:34:56.000Z",
|
|
"doctorId": "dr-ana"
|
|
}
|
|
}
|
|
```
|
|
No N8N, basta configurar um nó HTTP Request em `POST`, apontando para a URL acima e enviando o JSON conforme a ação desejada.
|