https://github.com/anamartinsr/agendamento_consultas_api
API Rest com Node.js, Postgres, Prisma, Docker e Swagger. (Refatorando)
https://github.com/anamartinsr/agendamento_consultas_api
docker husky jwt nodejs postgresql rest-api swagger
Last synced: 3 months ago
JSON representation
API Rest com Node.js, Postgres, Prisma, Docker e Swagger. (Refatorando)
- Host: GitHub
- URL: https://github.com/anamartinsr/agendamento_consultas_api
- Owner: anamartinsr
- Created: 2024-10-31T13:58:54.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2025-10-28T20:18:04.000Z (8 months ago)
- Last Synced: 2025-10-28T22:24:07.453Z (8 months ago)
- Topics: docker, husky, jwt, nodejs, postgresql, rest-api, swagger
- Language: JavaScript
- Homepage:
- Size: 375 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Refatoração da API de Agendamento de Consultas
## Contexto
A API foi desenvolvida em um momento inicial de aprendizado, utilizando Prisma, MongoDB, JWT, Nodemailer, Swagger, entre outras ferramentas.
Com o crescimento do projeto e a necessidade de alinhar com boas práticas de mercado, foi identificada a necessidade de uma refatoração completa da arquitetura e stack, visando escalabilidade, segurança e manutenibilidade.
---
## Stack Atualizado
- Backend: Node.js + Express
- Banco de Dados: PostgreSQL + Prisma (ORM)
- Autenticação: JWT (access + refresh tokens com rotação)
- Criptografia: Argon2
- Validação: Zod
- Documentação: OpenAPI 3 + Swagger UI
- Logs: Pino
- Testes: Jest + Supertest
- CI/CD: GitHub Actions + Husky + Lint-staged + Commitlint
- Deploy: Docker + docker-compose (Nginx como proxy reverso em produção)
- Segurança: Helmet, CORS configurado, express-rate-limit, cookies HttpOnly/Secure
---
## Ambiente Docker
A API agora conta com um ambiente totalmente configurado para execução via Docker e Docker Compose, garantindo isolamento, portabilidade e fácil replicação em diferentes máquinas.
---
## Estrutura de Containers
- backend → Container da aplicação Node.js
- Constrói a imagem a partir do Dockerfile
- Instala dependências, copia o código e executa npm start
- Porta exposta: 3000
- postgres → Container do banco de dados PostgreSQL
- Baseado na imagem oficial postgres:16-alpine
- Configurado com variáveis de ambiente (DB_USER, DB_PASSWORD, DB_NAME)
- Armazena dados de forma persistente via volume Docker
- Redes
- O Compose cria duas redes:
- internal-network: comunicação segura entre containers
- external-network: usada para expor a aplicação externamente
- O banco de dados é acessível apenas internamente, evitando exposição pública.
- Comandos
Subir os containers em segundo plano
```
docker compose up -d
```
Visualizar status dos serviços
```
docker compose ps
```
Ver logs da aplicação
```
docker logs -f api_scheduling
```
Recriar após alterações
```
docker compose down
docker compose up -d --build
```
## Atualização de Modelagem
Durante a etapa de análise e modelagem, o esquema inicial foi **refatorado** após identificar inconsistências relacionadas ao armazenamento de documentos e à flexibilidade da agenda dos profissionais.
As principais mudanças foram:
- **Remoção do campo de documento de identificação (CPF/RG)**, pois o envio físico ocorre presencialmente.
- **Implementação de upload para documentos médicos**, como **exames, receitas e relatórios**.
- **Substituição do campo `password` por `passwordHash`**, garantindo **criptografia de senhas**.
- **Ajuste no controle de agenda**, permitindo:
- **dias fixos de atendimento** (agenda semanal padrão);
- **exceções de disponibilidade** (férias, ausência, bloqueio temporário).
- **Manutenção do escopo para uma única clínica/hospital**, mas com estrutura flexível para expansão futura.
---
## Regras de Negócio
### Usuário (Paciente)
- Realiza o cadastro e pode atualizar seu perfil com dados básicos e médicos.
- As senhas são **armazenadas de forma criptografada** (`passwordHash`).
- Pode **agendar consultas presenciais** apenas em horários disponíveis.
- Pode **enviar documentos médicos** (exames, receitas, relatórios) associados às consultas.
- Pode **cancelar consultas** enquanto estiverem nos status `PENDING` ou `ACCEPTED`.
- Visualiza:
- **Consultas futuras** (status diferente de `COMPLETED`)
- **Histórico de consultas concluídas**
---
### Profissional (Médico)
- Possui uma **agenda fixa semanal** definida no banco (`Availability`).
- Pode ter **exceções** de atendimento (`ScheduleException`), como:
- férias;
- afastamentos;
- bloqueios temporários.
- Recebe solicitações de agendamento com status inicial `PENDING`.
- Pode:
- **Aceitar** (`ACCEPTED`);
- **Recusar** (`REJECTED`);
- **Concluir** consultas (`COMPLETED`).
- Todas as ações são registradas em **histórico de agendamentos** (`AppointmentHistory`).
---
### Agendamento de Consultas
**Fluxo de criação:**
1. O paciente seleciona o profissional e o horário desejado.
2. O sistema valida:
- se o profissional existe e está ativo;
- se o horário pertence à sua disponibilidade semanal;
- se não há **exceções de ausência**;
- se não existe outro agendamento no mesmo horário.
3. Cria a consulta com status inicial `PENDING`.
4. O profissional recebe a solicitação e pode **aceitar** ou **rejeitar**.
**Atualizações:**
- Mudanças de status (aceite, cancelamento, conclusão) geram um novo registro em `AppointmentHistory`, com:
- autor da ação (usuário ou profissional),
- status anterior e novo status,
- data e hora da alteração.
---
### Documentos Médicos
- São armazenados em `MedicalDocument`, vinculados ao usuário e, opcionalmente, a uma consulta específica.
- Cada documento possui:
- título;
- tipo (`EXAM`, `PRESCRIPTION`, `REPORT`);
- URL do arquivo;
- data de upload.
- O backend armazena apenas o **link do arquivo**, não o binário, seguindo boas práticas de segurança e armazenamento em nuvem.
---
## Segurança e Boas Práticas
- **Senhas criptografadas**: nunca armazenadas em texto puro.
- **Controle de acesso baseado em papéis** (`ADMIN`, `USER`, `PROFESSIONAL`).
- **Histórico auditável**: toda mudança de status é registrada.
- **Uploads protegidos**: validação de formato e tamanho de arquivo.
- **Escalabilidade futura**: o modelo permite expansão para múltiplas clínicas sem grandes alterações estruturais.
---
## Estrutura de Entidades
| Entidade | Finalidade | Relações principais |
|-----------|-------------|--------------------|
| `User` | Todos os tipos de usuário (paciente, profissional, admin) | `Professional`, `Appointment`, `MedicalDocument` |
| `Professional` | Dados e agenda do médico | `User`, `Specialty`, `Availability`, `ScheduleException` |
| `Specialty` | Especialidades médicas | `Professional` |
| `Availability` | Agenda fixa semanal | `Professional` |
| `ScheduleException` | Períodos de ausência/férias | `Professional` |
| `Appointment` | Consulta agendada | `User`, `Professional`, `AppointmentHistory` |
| `AppointmentHistory` | Registro de ações e mudanças de status | `Appointment`, `User`, `Professional` |
| `MedicalDocument` | Exames, receitas e relatórios digitais | `User`, `Appointment` |
---