API REST do SIGPS (Sistema Inteligente de Gestão e Priorização na Saúde), desenvolvida em Python/Flask. Responsável por autenticação JWT, regras de negócio clínicas, persistência via SQLAlchemy e integração com o microserviço de Machine Learning para priorização da fila.
Deploy em container: DOCKER.md
- Visão geral
- Stack tecnológica
- Arquitetura do backend
- Modelo de domínio
- Módulos da API (telas/consumidores)
- Fluxogramas
- Como executar
- Estrutura do projeto
O backend expõe endpoints versionados em /api/v1/*, documentados no Swagger (/docs). Cada blueprint agrupa um domínio funcional consumido pelo frontend Angular.
flowchart LR
FE[SIGPS-Frontend] -->|REST + JWT| BE[SIGPS-Backend :5000]
BE --> DB[(MySQL / SQLite)]
BE -->|POST /predict| ML[SIGPS-ML :8000]
BE --> SMTP[E-mail SMTP]
| Tecnologia | Uso |
|---|---|
| Python 3.8+ | Linguagem base |
| Flask 3 | Framework web e blueprints |
| Flask-SQLAlchemy | ORM |
| Flask-JWT-Extended | Autenticação stateless |
| Flask-CORS | Política de origens |
| Flask-Limiter | Rate limiting |
| PyMySQL | Driver MySQL em produção |
| Werkzeug | Hash de senhas |
| Requests | Cliente HTTP para API de ML |
| Gunicorn | Servidor WSGI (produção) |
| python-dotenv | Variáveis de ambiente |
Padrão Application Factory com separação de rotas (controladores), modelos e utilitários.
flowchart TB
subgraph Entrada["Camada de entrada"]
RT[Blueprints / Rotas]
JWT[JWT + Rate Limit]
CORS[CORS]
end
subgraph Negocio["Camada de negócio"]
UTIL[utils: fila, e-mail, perfil, CNPJ...]
end
subgraph Persistencia["Persistência"]
MD[models.py]
DB[(SQLAlchemy)]
end
subgraph Externos["Serviços externos"]
ML[ML API FastAPI]
MAIL[SMTP]
end
RT --> JWT
RT --> UTIL
UTIL --> MD
MD --> DB
UTIL --> ML
UTIL --> MAIL
classDiagram
class FlaskApp {
+create_app()
+register_blueprints()
}
class AuthBlueprint {
+login()
+register()
+refresh()
}
class FilaBlueprint {
+check_in()
+listar()
+atualizar_status()
}
class FilaHelpers {
+calcular_prioridade_paciente()
+reordenar_fila()
}
class User
class Paciente
class FilaAtendimento
FlaskApp --> AuthBlueprint
FlaskApp --> FilaBlueprint
FilaBlueprint --> FilaHelpers
FilaHelpers --> Paciente
FilaBlueprint --> FilaAtendimento
AuthBlueprint --> User
Entidades principais em app/models.py:
erDiagram
users ||--o| pacientes : "1:1"
users ||--o| especialistas : "1:1"
users ||--o{ organizations : "owner"
organizations ||--o{ organization_users : "membros"
organizations ||--o{ patient_organizations : "pacientes vinculados"
pacientes ||--o{ fila_atendimento : "check-in"
organizations ||--o{ fila_atendimento : "contexto"
especialistas ||--o{ agendas : "disponibilidade"
agendas ||--o{ consultas : "slots"
pacientes ||--o{ exames : "anexos"
pacientes ||--o{ prontuarios : "histórico"
users ||--o{ chat_messages : "conversas"
users ||--o{ notifications : "alertas"
| Entidade | Tabela | Descrição |
|---|---|---|
User |
users |
Credenciais, perfil (RBAC), foto |
Paciente |
pacientes |
CPF, comorbidades, dados clínicos |
Especialista |
especialistas |
CRM/conselho, especialidade, verificação |
Organization |
organizations |
Clínica, consultório ou autônomo |
FilaAtendimento |
fila_atendimento |
Prioridade 1–3, status, organização |
Agenda / Consulta |
agendas, consultas |
Agendamentos |
Prontuario |
prontuarios |
Anotações e receitas |
Exame |
exames |
Upload binário no banco |
ChatMessage |
chat_messages |
Mensagens entre usuários |
Correspondência entre endpoints e telas do frontend:
| Blueprint | Prefixo | Telas que consomem |
|---|---|---|
auth |
/api/v1/auth |
Login, Cadastro, Esqueci/Redefinir senha |
pacientes |
/api/v1/patients |
Pacientes, Portal (ficha) |
organizations |
/api/v1/organizations |
Explorar clínicas, Minha clínica |
fila |
/api/v1/queue |
Fila de espera, Gestão IA |
agendas |
/api/v1/schedules |
Agendamentos (todos os perfis) |
exames |
/api/v1/exams |
Exames |
chat |
/api/v1/chat |
Chat |
perfil |
/api/v1/perfil |
Meu perfil, verificação |
specialists |
/api/v1/specialists |
Especialistas, Busca profissionais |
dashboards |
/api/v1/dashboards |
Dashboard |
relatorios |
/api/v1/relatorios |
Relatórios |
prontuarios |
/api/v1/medical-records |
Prontuário (atendimento) |
admin |
/api/v1/admin |
Configurações / administração |
notifications |
/api/v1/notifications |
Sininho do painel |
block-beta
columns 1
block:client:1
fe["Angular Service"]
end
block:http:1
req["HTTP + Authorization: Bearer JWT"]
end
block:route:1
bp["Blueprint → validação JWT/perfil"]
end
block:logic:1
util["Utils / regra de negócio"]
end
block:data:1
orm["SQLAlchemy → MySQL"]
end
sequenceDiagram
participant C as Cliente
participant A as auth.py
participant DB as Banco
C->>A: POST /login {email, senha}
A->>DB: Busca User
A->>A: check_password()
alt OK
A->>A: create_access_token()
A-->>C: 200 + JWT
else Falha
A-->>C: 401
end
flowchart TD
A[POST /queue/check-in] --> B[Carrega Paciente + Organization]
B --> C[fila_helpers.calcular_prioridade_paciente]
C --> D{ML API disponível?}
D -->|Sim| E[POST ML /predict]
E --> F[prioridade 1, 2 ou 3]
D -->|Não| G[Fallback por regras locais]
G --> F
F --> H[Insere FilaAtendimento]
H --> I[Reordena fila da organização]
I --> J[Resposta JSON ao frontend]
flowchart LR
A[POST /auth/register] --> B[Cria User perfil=Paciente]
B --> C[flush → user_id]
C --> D[Cria Paciente vinculado]
D --> E[commit transação]
E --> F[JWT + boas-vindas opcional]
flowchart TD
R[Requisição] --> J{@jwt_required?}
J -->|Token inválido| E401[401]
J -->|OK| P{Perfil permitido?}
P -->|Não| E403[403]
P -->|Sim| OK[Executa endpoint]
- Autenticação: registro, login, refresh, recuperação de senha,
/me - Pacientes: listagem, detalhes, completar perfil clínico, exclusão
- Organizações: CRUD, convites, membros, exploração pública
- Fila: check-in, listagem ordenada por prioridade, status, análise IA (
/ai-analysis) - Agendas e consultas: slots, agendamento, cancelamento, status
- Exames: upload, listagem, download, exclusão
- Chat: conversas, mensagens, leitura, limpeza
- Prontuários: CRUD por organização
- Admin: usuários, perfis, verificações pendentes
- Notificações: listagem e marcar como lidas
- Integração ML:
ML_API_URL→ priorização automática na fila
- Python 3.8+
- MySQL (produção) ou SQLite (desenvolvimento)
python -m venv .venv
# Windows
.venv\Scripts\activate
# Linux/Mac
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
# Edite SECRET_KEY, JWT_SECRET_KEY, DATABASE_URL ou DB_*
python run.py- API:
http://localhost:5000 - Health:
GET /health - Swagger:
http://localhost:5000/docs
| Variável | Descrição |
|---|---|
DATABASE_URL |
String SQLAlchemy (SQLite/MySQL) |
JWT_SECRET_KEY |
Chave de assinatura do token |
ML_API_URL |
Ex.: http://127.0.0.1:8000/predict |
CORS_ORIGINS |
Origens permitidas do frontend |
SMTP_* |
Envio de e-mails (recuperação de senha) |
docker compose up -d --build
# Produção
docker compose -f docker-compose.prod.yml up -d --buildapp/
├── __init__.py # Application Factory
├── config.py # Configurações por ambiente
├── extensions.py # db, jwt, cors, limiter
├── models.py # Entidades SQLAlchemy
├── routes/ # Blueprints (API v1)
│ ├── auth.py
│ ├── pacientes.py
│ ├── fila.py
│ ├── agendas.py
│ ├── organizations.py
│ └── ...
├── utils/ # Regras auxiliares (fila, e-mail...)
└── security/ # Rate limit
run.py # Ponto de entrada
requirements.txt
| Repositório | Função |
|---|---|
| SIGPS-Frontend | Interface Angular |
| SIGPS-Machine-Learning | API de inferência /predict |
Projeto desenvolvido como Trabalho de Conclusão de Curso (TCC) pela Faculdade Metropolitana de Manaus, pelos integrantes:
- Josias Azevedo da Silva
- Matheus Akabane Brazão
- Kaio Oliveira Pantoja
- Alan Nicolas Santos Maragua
- Olliver de Aquino Freitas
Professora orientadora: Luana Magalhães Leal
SIGPS — Trabalho de Conclusão de Curso · API REST · Gestão e priorização na saúde