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.

Versão: 3.98.2 | Base Path: /api-gateway | Porta: 3001 (Docker) / 5001 (local)

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

Estrutura do Módulo
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

FrameworkFlask 2.x
DatabasePostgreSQL (mesmo do backend)
ORMSQLAlchemy
DocsFlasgger (Swagger 2.0)
AuthJWT + MOCK_API_KEY
ContainerDocker + 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

GET /api-gateway/netris/api/pacientes

Lista pacientes com suporte a filtros avançados (eq, like, ilike, gt, gte, lt, lte, ne).

Query Parameters

nomestringFiltro por nome (ex: ilike:maria)
cpfstringFiltro por CPF (ex: eq:12345678900)
telefone_celularstringFiltro por telefone (normalizado)
emailstringFiltro por email
listPatIdstringLista de PatIds separados por vírgula
limitintLimite de resultados (max: 100)
pageintPaginaçã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"
Normalização de Telefone: O sistema testa automaticamente variações com/sem o nono dígito (ex: 31912345678 e 3112345678).

Horário Controller

GET /api-gateway/netris/api/horarios

Busca slots disponíveis. Retorna array de arrays conforme especificação NetRIS: [[{horario1}, {horario2}]]

Query Parameters

dataBuscastringData inicial (DD/MM/YYYY) - obrigatório
dataFinalBuscastringData final (DD/MM/YYYY)
idConveniointID do convênio - obrigatório
idFilialintID da filial - obrigatório
idPacienteintID do paciente - obrigatório
idPlanoConveniointID do plano - obrigatório
listIdProcedimentostringIDs separados por vírgula (ex: 1,2,3)
idMedicointID do médico (opcional)
buscaInteligenteboolOtimizar resultados
limitintLimite 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

POST /api-gateway/netpacs/api/atendimentos

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

GET /api-gateway/netris/api/convenios

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
  }
]
GET /api-gateway/netris/api/plano-convenios

Lista planos de convênios, opcionalmente filtrados por idConvenio.

Query Parameters

idConveniointFiltrar por convênio específico

Modelos de Dados

Patient (mock_patients)

Estrutura completa compatível com NetAnimati/netRIS - 50+ campos.

CampoTipoDescrição
id_pacienteIntegerID único do paciente
pat_idStringPAT{id} - identificador externo
nomeStringNome completo
sexoStringM ou F
data_nascimentoBigIntTimestamp em millisegundos
cpfStringCPF (só números)
telefone_celularStringCelular/WhatsApp
emailStringE-mail
nome_socialStringNome social
pesoStringPeso em kg
alturaStringAltura em metros

Schedule (mock_schedules)

Formato EXATO da API NetRIS - 48 campos conforme especificação.

CampoTipoDescrição
idHorarioIntegernull = disponível, ID = ocupado
idEscalaIntegerID da escala médica
idMedicoIntegerID do médico
nomeMedicoStringNome do médico
idSalaIntegerID da sala
nomeSalaStringNome da sala
dataBigIntTimestamp em ms
dataStringStringDD/MM/YYYY
horaInicialStringStringHH:MM
duracaoProcedimentoIntegerMinutos
idProcedimentoIntegerID do procedimento
nomeProcedimentoStringNome do procedimento
tipoProcedimentoStringEXAME, CONSULTA, CIRURGIA
tipoAtendimentoStringEXAME_AMBULATORIAL, etc
diaSemanaString1 a 7
nomeDiaSemanaStringSegunda-Feira, etc

MockAppointment (mock_appointments)

Atendimento/agendamento confirmado.

CampoTipoDescrição
id_horarioStringReferência ao horário
id_pacienteIntegerFK → mock_patients
statusStringAGENDADO, CONFIRMADO, CANCELADO, CONCLUIDO
accession_numberStringNúmero de acesso único
protocoloStringProtocolo do agendamento
solicitante_crmStringCRM do médico solicitante
modalityStringMR, CT, US, etc

Convenio (mock_convenios)

Estrutura completa de convênio com 80+ campos.

CampoTipoDescrição
id_convenioIntegerID único
id_filialIntegerFilial associada (CRÍTICO)
nomeStringNome do convênio
razao_socialStringRazão social
cnpjStringCNPJ
convenio_particularBooleanÉ particular?
tipo_guiaStringINFORMADA, GERADA

Procedimento Controller

GET /api-gateway/netris/api/procedimentos

Lista procedimentos médicos com suporte a filtros avançados (eq, like, ilike, gt, gte, lt, lte, ne, in).

Query Parameters

distinctbooleanUsar DISTINCT (padrão: false)
limitintLimite (max: 100, padrão: 10)
pageintPaginação (padrão: 1)
projectionstringCampos (ex: id_procedimento,nome,tipo)
sortstringOrdenação (ex: asc:id_procedimento,desc:nome)
id_procedimentostringFiltro por ID (ex: eq:1)
nomestringFiltro por nome (ex: ilike:tomografia)
tipostringFiltro 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

GET /api-gateway/netris/api/filiais

Lista filiais com suporte a filtros SQL avançados (eq, like, ilike, gt, gte, lt, lte, ne, in).

Query Parameters

distinctbooleanUsar DISTINCT (padrão: false)
limitintLimite (max: 100, padrão: 10)
pageintPaginação (padrão: 1)
nomestringFiltro por nome (ex: ilike:centro)
cidadestringFiltro por cidade (ex: eq:São Paulo)
ufstringFiltro por estado (ex: eq:SP)
cnpjstringFiltro 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"
Fidelidade Total: Suporta 40+ campos de Filiais da API real (endereço, telefone, email, horários, etc).
GET /api-gateway/netris/api/filiais/{id}

Obtém detalhes de uma filial específica pelo ID.

Unidade Controller

GET /api-gateway/netris/api/unidades

Lista unidades de atendimento com suporte a filtros avançados.

Query Parameters

distinctbooleanUsar DISTINCT (padrão: false)
limitintLimite (max: 100, padrão: 10)
pageintPaginação (padrão: 1)
id_unidadestringFiltro por ID (ex: eq:5)
nomestringFiltro por nome (ex: ilike:tomografia)
aestringFiltro 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"
GET /api-gateway/netris/api/unidades/{id}

Obtém detalhes de uma unidade específica pelo ID.

Consulta Preço Controller

GET /api-gateway/netris/api/consultarPreco

Consulta o preço de um procedimento para determinado plano de convênio.

Query Parameters (Obrigatórios)

idPlanoConveniostringID do plano convênio (OBRIGATÓRIO)
idProcedimentostringID do procedimento (OBRIGATÓRIO)
dataStringstringData (DD/MM/YYYY) (OBRIGATÓRIO)

Query Parameters (Opcionais)

idFilialstringID da filial
idMedicostringID 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

Comandos Docker
# 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

Porta3001 (host) → 5001 (container)
RAM Limit800MB
CPU Limit1.25 cores
Health Check30s interval, 3 retries
Base ImagePython 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
Teste Interativo: O Swagger UI permite executar requests diretamente na interface, testando todos os endpoints da Mock API.