Batalha dos Barris — Player de Ranking em TV

Aplicação Angular (PWA) que exibe em tempo real, em TV/monitor, os rankings de consumo de uma cervejaria, consumindo dados sincronizados diretamente do PDV do estabelecimento.

Capa do player de TV com o pódio de ranking 'Batalha dos Barris' em destaque e painel lateral com conteúdo promocional ao lado.

Problema

Uma cervejaria precisava exibir rankings de consumo em TV/monitor, alimentados pelo PDV do estabelecimento. O hardware era TV Box Android ligada 24/7; a rede caía; o PDV reiniciava diariamente. Sem intervenção manual, os dados tinham que permanecer quase em tempo real.

Solução e impacto

Monorepo com player Angular 17 PWA, API Flask/PostgreSQL (cache + OpenAPI) e agente Python que sincroniza vendas do MySQL do PDV via túnel SSH, com retomada de estado e sync incremental a cada ~15s. O resultado de engenharia é uma cadeia ponta a ponta estável o bastante para rodar sem babá no chão da operação.

Arquitetura e trade-offs

Separar player, API e agente isolou falhas: o front otimizado para hardware restrito não depende do MySQL legado; o agente absorve a complexidade do túnel SSH e do ciclo de vida do PDV. Cache na API reduz pressão no PostgreSQL sob polling do player. Trade-off: sync de ~15s não é streaming verdadeiro — é near-real-time pragmático, mais simples de operar do que websockets em TV Box.

Desafios técnicos

Resiliência a quedas de rede e reinícios do PDV, retomada correta do cursor de sync, e UX de ranking fluida em TV Box com Service Worker — além de deploy automatizado (GitHub Actions) e cobertura Cypress no player.

O que eu faria diferente

Eu formalizaria mais cedo healthchecks do agente e alertas quando o lag de sync passar de um limiar. O intervalo de ~15s e o modelo de retomada de estado continuam adequados; o que eu reforçaria é observabilidade operacional para o ambiente 24/7.

Stack

  • Angular 17
  • TypeScript
  • RxJS
  • Angular Service Worker
  • Flask
  • PostgreSQL
  • psycopg
  • Python
  • Docker
  • GitHub Actions
  • Cypress