Initial commit
This commit is contained in:
99
README.md
Normal file
99
README.md
Normal 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.
|
||||
Reference in New Issue
Block a user