Files
2025-11-29 21:18:53 -03:00

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

  1. Instale dependências do servidor:

    npm install
    
  2. No diretório client, instale o front-end:

    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:

    npm run start
    
  5. 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; 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)

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.