Introdução
API Mock Idêntica à Homologação
O Net Mock API Gateway replica fielmente a estrutura e comportamento da API de homologação NetAnimati/NetRIS, permitindo testes completos sem depender de ambiente externo.
Características
- Fidelidade Total: Mesmos endpoints, payloads e respostas da API real
- 50+ Campos NetRIS: Schedule com estrutura completa de 48 campos
- Swagger UI: Documentação interativa integrada
- PostgreSQL: Persistência real de dados mock
- Docker Ready: Container isolado com health check
- Autenticação JWT: Suporte a Bearer token ou MOCK_API_KEY
Propósito
Por que um Mock Gateway?
| Cenário | API de Homologação | Mock Gateway |
|---|---|---|
| Disponibilidade | Depende de servidor externo | 24/7 Local |
| Velocidade | Latência de rede (~200ms) | <10ms localhost |
| Dados de Teste | Limitado/Compartilhado | Controle total |
| Reset de Estado | Impossível | Rebuild instantâneo |
| Testes Unitários | Flaky (rede) | 100% confiável |
| CI/CD | Precisa de VPN/credenciais | Auto-suficiente |
Casos de Uso
- ✅ Desenvolvimento local sem internet
- ✅ Testes de integração automatizados
- ✅ Validação de fluxos de agendamento
- ✅ Simulação de cenários edge-case
- ✅ Treinamento de novos desenvolvedores
- ✅ Debugging sem afetar produção
Arquitetura
net_mock_api_gateway/
├── api_gateway.py # App Flask principal + Swagger
├── Dockerfile # Container config
├── requirements.txt # Dependências isoladas
├── blueprints/
│ └── netpacs_mock/
│ ├── routes.py # Blueprint principal
│ ├── auth_controller.py # JWT auth
│ ├── auth_middleware.py # Middleware de autenticação
│ ├── paciente_controller.py
│ ├── horario_controller.py
│ ├── atendimento_controller.py
│ ├── convenio_controller.py
│ ├── medico_controller.py
│ └── healthcare_controller.py
├── models/
│ ├── db.py # SQLAlchemy config
│ └── mock_models.py # Patient, Schedule, Appointment, Convenio
├── migrations/
│ └── recreate_mock_tables.py # Rebuild database
└── util/
├── config.py
└── logger.py
Stack Tecnológico
| Framework | Flask 2.x |
| Database | PostgreSQL (mesmo do backend) |
| ORM | SQLAlchemy |
| Docs | Flasgger (Swagger 2.0) |
| Auth | JWT + MOCK_API_KEY |
| Container | Docker + Gunicorn |
Controllers
Auth Controller
Geração de tokens JWT para autenticação na API.
POST /security/api/access-token/{auth}
Paciente Controller
CRUD completo de pacientes com filtros avançados.
GET /netris/api/pacientes
POST /netris/api/pacientes
GET /netris/api/pacientes/{id}
PUT /netris/api/pacientes/{id}
Horário Controller
Busca de slots disponíveis no formato NetRIS.
GET /netris/api/horarios
POST /netris/api/horarios
Atendimento Controller
Gestão de consultas/exames agendados.
GET /netris/api/atendimentos
POST /netpacs/api/atendimentos
GET /netris/api/atendimentos/{id}
PATCH /netris/api/atendimentos/{id}
Convênio Controller
Listagem de convênios e planos disponíveis.
GET /netris/api/convenios
GET /netris/api/convenios/{id}
GET /netris/api/plano-convenios
Procedimento Controller
Listagem de procedimentos médicos com filtros avançados.
GET /netris/api/procedimentos
GET /netris/api/procedimentos/{id}
Filiais Controller
Gestão de filiais da rede com suporte a filtros SQL avançados.
GET /netris/api/filiais
GET /netris/api/filiais/{id}
Unidade Controller
Gestão de unidades de atendimento.
GET /netris/api/unidades
GET /netris/api/unidades/{id}
Consulta Preço Controller
Consulta de preços de procedimentos por plano de convênio.
GET /netris/api/consultarPreco
Paciente Controller
Lista pacientes com suporte a filtros avançados (eq, like, ilike, gt, gte, lt, lte, ne).
Query Parameters
nome | string | Filtro por nome (ex: ilike:maria) |
cpf | string | Filtro por CPF (ex: eq:12345678900) |
telefone_celular | string | Filtro por telefone (normalizado) |
email | string | Filtro por email |
listPatId | string | Lista de PatIds separados por vírgula |
limit | int | Limite de resultados (max: 100) |
page | int | Paginação |
Exemplo de Request
# Buscar por telefone (com normalização automática)
curl -X GET "http://localhost:3001/api-gateway/netris/api/pacientes?telefone_celular=ilike:31999999999&limit=10" \
-H "Authorization: Bearer eyJhbUdSQVRJT05fbdqQHV2vk"
Horário Controller
Busca slots disponíveis. Retorna array de arrays conforme especificação NetRIS: [[{horario1}, {horario2}]]
Query Parameters
dataBusca | string | Data inicial (DD/MM/YYYY) - obrigatório |
dataFinalBusca | string | Data final (DD/MM/YYYY) |
idConvenio | int | ID do convênio - obrigatório |
idFilial | int | ID da filial - obrigatório |
idPaciente | int | ID do paciente - obrigatório |
idPlanoConvenio | int | ID do plano - obrigatório |
listIdProcedimento | string | IDs separados por vírgula (ex: 1,2,3) |
idMedico | int | ID do médico (opcional) |
buscaInteligente | bool | Otimizar resultados |
limit | int | Limite de resultados |
Exemplo de Response (Formato NetRIS)
[[
{
"idHorario": null,
"idEscala": 10274,
"idMedico": 13155,
"nomeMedico": "CLINICA SAO JOSE",
"medicoProvisorio": null,
"idSala": 3,
"nomeSala": "RAIO-X/ MAMOGRAFIA",
"data": 1764298800000,
"dataString": "28/11/2025",
"horaInicial": 46800000,
"horaInicialString": "10:00",
"horaFinal": 47400000,
"indisponivel": null,
"agrupador": 1,
"idProcedimento": 58,
"nomeProcedimento": "RX SEIOS PARANASAIS",
"tipoProcedimento": "EXAME",
"duracaoProcedimento": 10,
"listIdHorario": [null, null],
"cor": "#000000",
"duracao": 10,
"idAparelho": 2,
"idFilial": 1,
"diaSemana": "5",
"nomeDiaSemana": "Sexta-Feira",
"restrito": false,
"idUnidade": 5,
"idModalidade": 1,
"tipoAtendimento": "EXAME_AMBULATORIAL",
"procedimentoRecorrente": false
}
]]
Atendimento Controller
Salva um novo atendimento (consulta/exame) com estrutura completa da API Real.
Request Body
{
"accessionNo": "5902030",
"paciente": {
"altura": "1.80",
"birthDateString": "1998-05-20",
"celular": "048999997711",
"cpf": "000.000.000-00",
"email": "paciente@email.com",
"id": 0,
"name": "Maria Fernandes",
"nomeMae": "Maria",
"nomeSocial": "Maria da Cruz",
"patId": "3484",
"patObs": "Paciente teste",
"peso": "70",
"rg": "99999",
"sex": "F"
},
"protocolo": "1313213221",
"solicitanteCrm": "12345",
"solicitanteEstadoCrm": "SC",
"solicitanteWorklist": "José da Silva",
"modality": "MR",
"titulo": "Ressonância MR",
"studyDateTimeString": "2020-12-25 10:15:35",
"indicacaoClinica": "jejum de 8h",
"convenio": "UNIMED",
"idModalidade": 5,
"idProcedimento": 4,
"idUnidade": 11
}
Convênio Controller
Lista todos os convênios disponíveis. Cada convênio inclui id_filial obrigatório para SearchSlots.
Response
[
{
"id_convenio": 4,
"id_filial": 2,
"nome": "UNIMED",
"razao_social": "UNIMED",
"cnpj": "86.318.275/0001-93",
"convenio_particular": false,
"tipo_guia": "INFORMADA",
"permite_repetir_numero_guia": true
}
]
Lista planos de convênios, opcionalmente filtrados por idConvenio.
Query Parameters
idConvenio | int | Filtrar por convênio específico |
Modelos de Dados
Patient (mock_patients)
Estrutura completa compatível com NetAnimati/netRIS - 50+ campos.
| Campo | Tipo | Descrição |
|---|---|---|
id_paciente | Integer | ID único do paciente |
pat_id | String | PAT{id} - identificador externo |
nome | String | Nome completo |
sexo | String | M ou F |
data_nascimento | BigInt | Timestamp em millisegundos |
cpf | String | CPF (só números) |
telefone_celular | String | Celular/WhatsApp |
email | String | |
nome_social | String | Nome social |
peso | String | Peso em kg |
altura | String | Altura em metros |
Schedule (mock_schedules)
Formato EXATO da API NetRIS - 48 campos conforme especificação.
| Campo | Tipo | Descrição |
|---|---|---|
idHorario | Integer | null = disponível, ID = ocupado |
idEscala | Integer | ID da escala médica |
idMedico | Integer | ID do médico |
nomeMedico | String | Nome do médico |
idSala | Integer | ID da sala |
nomeSala | String | Nome da sala |
data | BigInt | Timestamp em ms |
dataString | String | DD/MM/YYYY |
horaInicialString | String | HH:MM |
duracaoProcedimento | Integer | Minutos |
idProcedimento | Integer | ID do procedimento |
nomeProcedimento | String | Nome do procedimento |
tipoProcedimento | String | EXAME, CONSULTA, CIRURGIA |
tipoAtendimento | String | EXAME_AMBULATORIAL, etc |
diaSemana | String | 1 a 7 |
nomeDiaSemana | String | Segunda-Feira, etc |
MockAppointment (mock_appointments)
Atendimento/agendamento confirmado.
| Campo | Tipo | Descrição |
|---|---|---|
id_horario | String | Referência ao horário |
id_paciente | Integer | FK → mock_patients |
status | String | AGENDADO, CONFIRMADO, CANCELADO, CONCLUIDO |
accession_number | String | Número de acesso único |
protocolo | String | Protocolo do agendamento |
solicitante_crm | String | CRM do médico solicitante |
modality | String | MR, CT, US, etc |
Convenio (mock_convenios)
Estrutura completa de convênio com 80+ campos.
| Campo | Tipo | Descrição |
|---|---|---|
id_convenio | Integer | ID único |
id_filial | Integer | Filial associada (CRÍTICO) |
nome | String | Nome do convênio |
razao_social | String | Razão social |
cnpj | String | CNPJ |
convenio_particular | Boolean | É particular? |
tipo_guia | String | INFORMADA, GERADA |
Procedimento Controller
Lista procedimentos médicos com suporte a filtros avançados (eq, like, ilike, gt, gte, lt, lte, ne, in).
Query Parameters
distinct | boolean | Usar DISTINCT (padrão: false) |
limit | int | Limite (max: 100, padrão: 10) |
page | int | Paginação (padrão: 1) |
projection | string | Campos (ex: id_procedimento,nome,tipo) |
sort | string | Ordenação (ex: asc:id_procedimento,desc:nome) |
id_procedimento | string | Filtro por ID (ex: eq:1) |
nome | string | Filtro por nome (ex: ilike:tomografia) |
tipo | string | Filtro por tipo (ex: eq:EXAME) |
Exemplo de Request
curl -X GET "http://localhost:3001/api-gateway/netris/api/procedimentos?tipo=eq:EXAME&limit=20&sort=asc:nome" \
-H "Authorization: Bearer eyJhbUdSQVRJT05fbdqQHV2vk"
Filiais Controller
Lista filiais com suporte a filtros SQL avançados (eq, like, ilike, gt, gte, lt, lte, ne, in).
Query Parameters
distinct | boolean | Usar DISTINCT (padrão: false) |
limit | int | Limite (max: 100, padrão: 10) |
page | int | Paginação (padrão: 1) |
nome | string | Filtro por nome (ex: ilike:centro) |
cidade | string | Filtro por cidade (ex: eq:São Paulo) |
uf | string | Filtro por estado (ex: eq:SP) |
cnpj | string | Filtro por CNPJ (ex: eq:12345678000100) |
Exemplo de Request
curl -X GET "http://localhost:3001/api-gateway/netris/api/filiais?cidade=eq:São Paulo&uf=eq:SP&limit=10" \
-H "Authorization: Bearer eyJhbUdSQVRJT05fbdqQHV2vk"
Obtém detalhes de uma filial específica pelo ID.
Unidade Controller
Lista unidades de atendimento com suporte a filtros avançados.
Query Parameters
distinct | boolean | Usar DISTINCT (padrão: false) |
limit | int | Limite (max: 100, padrão: 10) |
page | int | Paginação (padrão: 1) |
id_unidade | string | Filtro por ID (ex: eq:5) |
nome | string | Filtro por nome (ex: ilike:tomografia) |
ae | string | Filtro por tipo atendimento |
Exemplo de Request
curl -X GET "http://localhost:3001/api-gateway/netris/api/unidades?nome=ilike:radiologia&limit=10" \
-H "Authorization: Bearer eyJhbUdSQVRJT05fbdqQHV2vk"
Obtém detalhes de uma unidade específica pelo ID.
Consulta Preço Controller
Consulta o preço de um procedimento para determinado plano de convênio.
Query Parameters (Obrigatórios)
idPlanoConvenio | string | ID do plano convênio (OBRIGATÓRIO) |
idProcedimento | string | ID do procedimento (OBRIGATÓRIO) |
dataString | string | Data (DD/MM/YYYY) (OBRIGATÓRIO) |
Query Parameters (Opcionais)
idFilial | string | ID da filial |
idMedico | string | ID do médico |
Exemplo de Request
# Consultar preço básico
curl -X GET "http://localhost:3001/api-gateway/netris/api/consultarPreco?idPlanoConvenio=1&idProcedimento=1&dataString=20/11/2025" \
-H "Authorization: Bearer eyJhbUdSQVRJT05fbdqQHV2vk"
# Consultar preço com filial e médico
curl -X GET "http://localhost:3001/api-gateway/netris/api/consultarPreco?idPlanoConvenio=2&idProcedimento=2&dataString=20/11/2025&idFilial=1&idMedico=1" \
-H "Authorization: Bearer eyJhbUdSQVRJT05fbdqQHV2vk"
Response Esperada
{
"idPlanoConvenio": "1",
"idProcedimento": "1",
"data": "20/11/2025",
"preco": 180.50,
"currency": "BRL",
"descricao": "Procedimento 1",
"valido": true
}
Docker
Configuração do Container
O Mock Gateway roda como serviço Docker independente com resources limits e health check.
Build & Run
# Build individual
docker build -f net_mock_api_gateway/Dockerfile -t net_mock_api_gateway:latest .
# Build via docker-compose
docker-compose build net_mock_api_gateway
# Iniciar serviço
docker-compose up -d net_mock_api_gateway
# Ver logs
docker-compose logs -f net_mock_api_gateway
# Testar health check
curl http://localhost:3001/api-gateway/health
Configurações do Container
| Porta | 3001 (host) → 5001 (container) |
| RAM Limit | 800MB |
| CPU Limit | 1.25 cores |
| Health Check | 30s interval, 3 retries |
| Base Image | Python 3.11-slim |
Autenticação
O Mock Gateway suporta duas formas de autenticação:
Opção A: MOCK_API_KEY (Recomendado para Dev)
# Use o valor de ANIMATI_PACS_MOCK_API_KEY do .env
curl -X GET "http://localhost:3001/api-gateway/netris/api/convenios" \
-H "Authorization: Bearer eyJhbUdSQVRJT05fbdqQHV2vk"
Opção B: Gerar JWT
# 1. Gerar token (válido por 100 dias)
curl -X POST "http://localhost:3001/api-gateway/security/api/access-token/minha-chave-inicial-12345"
# Response:
# {
# "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
# "expiresIn": 8640000,
# "tokenType": "Bearer"
# }
# 2. Usar o token
curl -X GET "http://localhost:3001/api-gateway/netris/api/convenios" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
Rotas Públicas (sem auth)
/api-gateway/security/api/access-token/api-gateway/health/api-gateway/v2/api-docs/api-gateway/swagger-ui.html
Swagger UI
Documentação Interativa
Acesse a documentação Swagger completa da Mock API:
- Swagger UI:
http://localhost:3001/api-gateway/swagger-ui.html - API Spec (JSON):
http://localhost:3001/api-gateway/apispec.json - Swagger v2 Docs:
http://localhost:3001/api-gateway/v2/api-docs