# 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.