Voltar aos projetos

Estudo de caso

Leve

Uma agenda pessoal construída para não perder alterações quando a rede falha, uma requisição se repete ou duas sessões editam o mesmo dado.

Captura do projeto Leve

Problema

Aplicações de agenda podem ocultar falhas de sincronização e sobrescrever mudanças concorrentes. O Leve trata preservar o dado do usuário como a restrição principal e torna estados pendentes e conflitos visíveis.

Tecnologias

  • React 19
  • TypeScript
  • Express 5
  • Firebase Auth
  • Firestore
  • Zod
  • Playwright

Decisões de engenharia

Um caminho único de escrita

Toda mutação passa por POST /api/commands. A API concentra validação, autorização, idempotência por operationId e registro da operação.

Revisão esperada, sem last-write-wins

Cada comando informa a revisão esperada. Quando o servidor encontra outra versão, recusa a escrita e devolve o estado concorrente para a interface preservar o conflito.

Offline explícito e reversível

O modo offline é opt-in. Alterações sem conexão entram em uma outbox local e são sincronizadas na reconexão; a interface informa o que ainda está pendente.

Regras compartilhadas

Cliente e servidor importam os mesmos schemas Zod do pacote de domínio, reduzindo validações divergentes entre as duas camadas.

Trade-offs

Consistência por uma API menos convencional

O endpoint único simplifica garantias transversais, mas troca rotas REST por recurso por comandos discriminados no payload.

Continuidade exige dado local

A outbox preserva trabalho sem rede, mas o cache pode manter dados pessoais no aparelho. Por isso a ativação depende de uma escolha informada do usuário.

Arquitetura condicionada ao plano gratuito

O projeto documenta paginação na limpeza, leases no agendador e controle de leituras do Firestore como escolhas necessárias para operar sem recursos pagos.

Evidências no repositório

  • O repositório documenta testes unitários, integração com emuladores e E2E com Playwright para duas abas, reconexão da outbox, conflitos e acessibilidade.
  • A conta permite exportar dados em JSON versionado, excluir os dados e controlar o armazenamento offline por aparelho.
  • O README registra CI, runbooks e uma matriz que separa cobertura automatizada de verificações manuais.

O que eu mudaria

Eu transformaria em uma rotina de release registrada as verificações que o README ainda separa como manuais: push com o app fechado, leitor de tela externo e instalação em aparelho físico.

Fontes verificáveis

As afirmações desta página apontam para documentação e código públicos.