fix: adiciona teto de domínio a normalizeYearParam para ?year= do Panorama (closes #83) - #103
Merged
Merged
Conversation
…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
marked this pull request as ready for review
August 18, 2026 16:14
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
O que mudou
app/(app)/panorama/page.tsx: substitui o parsing inline de?year=(parseInt+ guard de piso> 2000, sem teto) por uma chamada anormalizeYearParam.lib/utils/date.ts: adicionanormalizeYearParam(raw), com o par piso/teto (> 2000/<= 9999) espelhando o quenormalizeYearMonthParamjá aplica viaz.string().date().__tests__/unit/date.test.ts: 5 casos novos paranormalizeYearParam— valor válido,undefined, não-numérico, piso ('2000'), e o caso que motivou a issue:'999999999'(estouraria o domíniodatedo 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 denormalizeYearMonthParamnem deyearMonthSchema— os dois operam sobreYYYY-MMe devolvemstring; o Panorama precisa denumbersem mês. Teto fixo em9999(não5874897, limite real dodatedo Postgres) porque é o mesmo teto quez.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 commitbfbd2cdjá pretendia.Como testei
Todas as etapas passaram (484 testes, incluindo os 5 novos).
npm run test:integrationnão foi executado — exige credenciais Neon e só roda em push paramain; 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-pushdeste checkout falhou por um problema de infraestrutura do container (~/.nvm/nvm.shinexistente — 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/getAnnualExpensesByGroupnem 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.tsapp/(app)/panorama/page.tsx__tests__/unit/date.test.tsGenerated by Claude Code