Skip to content

fix: adiciona teto de domínio a normalizeYearParam para ?year= do Panorama (closes #83) - #103

Merged
Guiroos merged 3 commits into
mainfrom
claude/quirky-johnson-mv2480
Aug 19, 2026
Merged

fix: adiciona teto de domínio a normalizeYearParam para ?year= do Panorama (closes #83)#103
Guiroos merged 3 commits into
mainfrom
claude/quirky-johnson-mv2480

Conversation

@Guiroos

@Guiroos Guiroos commented Aug 18, 2026

Copy link
Copy Markdown
Owner

O que mudou

  • app/(app)/panorama/page.tsx: substitui o parsing inline de ?year= (parseInt + guard de piso > 2000, sem teto) por uma chamada a normalizeYearParam.
  • lib/utils/date.ts: adiciona normalizeYearParam(raw), com o par piso/teto (> 2000 / <= 9999) espelhando o que normalizeYearMonthParam já aplica via z.string().date().
  • __tests__/unit/date.test.ts: 5 casos novos para normalizeYearParam — valor válido, undefined, não-numérico, piso ('2000'), e o caso que motivou a issue: '999999999' (estouraria o domínio date do Postgres e derrubaria a rota em 500).

Por que dessa forma

Segue exatamente a proposta da issue #83: função nova e vizinha a normalizeYearMonthParam, não uma adaptação de normalizeYearMonthParam nem de yearMonthSchema — os dois operam sobre YYYY-MM e devolvem string; o Panorama precisa de number sem mês. Teto fixo em 9999 (não 5874897, limite real do date do Postgres) porque é o mesmo teto que z.string().date() já impõe no lado ?month=, que é o ponto da mudança: as duas fronteiras de "ano vindo de URL" ficam com a mesma regra, como o commit bfbd2cd já pretendia.

Como testei

npm ci
npm run lint && npm run format:check && npm run typecheck && npm test
npm run build

Todas as etapas passaram (484 testes, incluindo os 5 novos). npm run test:integration não foi executado — exige credenciais Neon e só roda em push para main; a mudança não toca camada de dados/queries, só o parsing do parâmetro na página.

Nota de ambiente: o hook pre-push deste checkout falhou por um problema de infraestrutura do container (~/.nvm/nvm.sh inexistente — o nvm deste ambiente vive em /opt/nvm), não por causa da mudança. Rodei os quatro comandos que o hook executaria manualmente, com sucesso, antes do push.

Risco e o que NÃO foi coberto

Risco baixo — o gatilho é URL editada à mão com ano de 8+ dígitos, não um fluxo que o usuário atinge clicando; o único comportamento visível muda de "tela de erro" para "cai no ano atual", que é estritamente uma melhoria. Não toquei getAnnualOverview/getAnnualExpensesByGroup nem adicionei validação na camada de query — a issue já verificou que o único site com essa lacuna é o Panorama.

Arquivos tocados

  • lib/utils/date.ts
  • app/(app)/panorama/page.tsx
  • __tests__/unit/date.test.ts

Generated by Claude Code

…orama (closes #83)

parseInt(?year=) não tinha teto — um ano de 8+ dígitos sobrevivia ao guard e
chegava a inArray(...) contra colunas date, derrubando a rota em 500. Extrai
normalizeYearParam para lib/utils/date.ts, espelhando o par piso/teto que
normalizeYearMonthParam já aplica via z.string().date().
@Guiroos
Guiroos merged commit 98384f2 into main Aug 19, 2026
5 checks passed
@Guiroos
Guiroos deleted the claude/quirky-johnson-mv2480 branch August 19, 2026 16:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants