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

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?
