Pular para o conteúdo

Histórico de exames laboratoriais, API e web

SmartHealth

API e aplicação web que transformam o PDF do laboratório em histórico por métrica, com a faixa de referência escolhida pelo sexo e pela idade do titular, meta de composição corporal e um recorte compartilhável por link com senha.

Papel
API e revisão do frontend, projeto acadêmico em dupla
Período
Março a novembro de 2023
Situação
Código aberto, concluído em 2023
Painel do paciente: um cartão por marcador de exame, com faixa de referência e série histórica, ao lado do cálculo de IMC e das medidas de antropometria.

O que o sistema faz

  • Leitura do PDF do laboratório, com extração dos valores de cada métrica do catálogo.
  • Histórico por marcador, com a faixa de referência escolhida pelo sexo e pela idade do titular.
  • Meta de composição corporal, com antropometria por dobra cutânea e cálculo de densidade, gordura, massa magra e taxa metabólica basal no servidor.
  • Compartilhamento de um recorte com o médico, por link com senha ou QR code, sem cadastro de quem recebe.
  • Catálogo clínico de vinte e cinco métricas e cinquenta e quatro faixas de referência, carregado por migration.

Arquitetura

  • API em NestJS com REST documentado em Swagger, ValidationPipe global e onze módulos de domínio, mais dois submódulos aninhados por RouterModule.
  • Dependência por contrato: cada módulo declara uma interface de operações e registra a implementação por token de injeção, de modo que o controller depende do token e não da classe.
  • Os módulos de domínio não devolvem entidade: cada um tem um assembler que monta o DTO, e é lá que a senha some do usuário.
  • TypeORM sobre PostgreSQL, com uma migration que carrega o catálogo clínico: vinte e cinco métricas com unidade e cinquenta e quatro faixas de referência chaveadas por sexo e intervalo de idade.
  • Autenticação por JWT em middleware global com lista de exceções, mais um segundo middleware que compara o sujeito do token com o identificador da URL antes de deixar passar.
  • Leitura do PDF com pdfjs-dist: a camada de texto de cada página vira uma string normalizada, e cada métrica do catálogo é procurada por expressão regular.
  • A classificação do resultado acontece na gravação, não na leitura: o item é comparado com a faixa do titular e o veredito fica guardado junto da faixa usada.
  • Compartilhamento por cópia pontual em três tabelas próprias, aberta por um identificador aleatório e uma senha com hash bcrypt, em duas rotas públicas.
  • Web em Next.js com pages router, sem rotas de API próprias, consumindo a API por axios, com a série de cada marcador em Chart.js.
  • Fluxo de dupla com aprovação obrigatória em pull request nas duas branches de produção, push forçado bloqueado e política de origem de branch aplicada por workflow.

Detalhes de implementação

  • GraphQL com Apollo existiu de março a setembro de 2023, ao lado do REST. O módulo e os quatro resolvers foram removidos quando nenhum consumidor passou a usá-los.
  • A extração do PDF tolera espaço entre as letras da palavra RESULTADO, porque a camada de texto do laboratório nem sempre vem contígua.
  • Quem recebe o compartilhamento cai numa página que primeiro verifica se o link existe e só depois pede a senha. Link inválido nunca revela se houve compartilhamento.

Tecnologias

NestJS
Framework da API, com módulos, middleware e injeção por token.
TypeScript
Linguagem da API.
TypeORM
Mapeamento das entidades e a migration do catálogo clínico.
PostgreSQL
Banco do exame, da métrica, da meta e das cópias compartilhadas.
Swagger
Documentação da API, servida pela própria aplicação.
JWT
Autenticação em middleware global, com lista de exceções.
bcrypt
Hash da senha do usuário e da senha do compartilhamento.
pdf.js
Leitura da camada de texto do PDF de exame.
Next.js e React
Aplicação web, em pages router, consumindo a API.
Chart.js
Série histórica de cada marcador.
Jest
Testes da API, cobrindo os assemblers e o extrator de PDF.
Docker
Ambiente local com PostgreSQL ao lado da API.
GitHub Actions
Build em cada pull request e a política de origem de branch.
  • Tela de acompanhamento, com a evolução de cada marcador ao longo do tempo.
  • Envio de exames, entrada do módulo que lê o PDF e extrai os valores.
  • Compartilhamento, onde o paciente escolhe quais resultados libera para o médico.
  • Diagrama do caminho do exame: o PDF é lido, a faixa de referência do titular entra na gravação, e o recorte compartilhado sai por link com senha.

Quer conversar sobre arquitetura, decisão técnica e entrega em produção?

Retrato de Thiago Sanches

Dados de contato

Disponível para trabalho remoto em times internacionais

Nome
Thiago Sanches
Localização
Brasil · UTC−3 · trabalho remoto
Idiomas
Português nativo · inglês com fluência profissional
Baixar currículo

Experiência

  • 5 anos

    em sistemas corporativos

  • 70%

    menos tempo por relatório novo

  • 50%

    menos latência em GraphQL

  • Workers

    processos assíncronos com filas em Redis