4.2 KiB
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
-
Instale dependências do servidor:
npm install -
No diretório
client, instale o front-end:cd client && npm install -
Garanta que exista um PostgreSQL disponível (por exemplo
docker compose up postgres -d). Configure a URL emDATABASE_URLou usepostgresql://agenda:agenda@localhost:5432/agenda. -
Em uma janela, rode o servidor:
npm run start -
Em outra, inicie o front-end em modo dev:
cd client && npm run dev
O front-end irá consumir a API em http://localhost:4000/api automaticamente.
Construindo e executando via Docker
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; rodenpm run builddentro declientantes de subir a imagem ou deixe o Docker cuidar disso. - Utilize as rotas REST em
/api/appointments,/api/patients,/api/recordse/api/doctorspara 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)
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:
{
"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.