Initial commit

This commit is contained in:
Tiago
2025-11-29 21:18:53 -03:00
commit 86d13bee5d
14 changed files with 4216 additions and 0 deletions

99
README.md Normal file
View File

@@ -0,0 +1,99 @@
# 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.