teqo-backup/src/lib/schemas/sectionPotentialQuery.ts
Francisco Solla 62b674cfba feat(potencial): cálculo puro, loader e rotas públicas da seção
sectionPotential.ts parseia/valida o shard (ordem fail-closed), busca por
seção e computa o cenário aprovado — válidos = nominais, X₁ = comparecimento
− Lula − Flávio (todos os terceiros; o bulk tem 13 candidaturas) e X₂ =
aptos − Lula − Flávio — com formatadores pt-BR e o nome do PNG. O loader
server-only lê os shards por fs com cache por processo; as rotas públicas
/api/potencial/{municipios,secao} aplicam same-origin, rate-limit e zod
strict, com 404 honesto e cache de um dia. O story 1080×1920 é desenhado
por um renderer puro com contexto estrutural. 'potencial' entra nos slugs
reservados e o módulo novo no pin do top-level de utilities.
2026-10-07 19:47:19 -03:00

21 lines
817 B
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { z } from 'zod'
import { POTENTIAL_UFS } from '@/lib/sectionPotential'
/**
* S46 — wire contract of the public `/api/potencial` reads. Strict objects:
* an extra query key is malformed, never silently ignored. The section numbers
* follow the title's shapes (zona 2–4 dígitos, seção até 4) and are normalized
* by the callers; the município is the TSE code the combobox picked.
*/
export const potentialMunicipiosQuerySchema = z.strictObject({
uf: z.enum(POTENTIAL_UFS),
})
export const potentialSectionQuerySchema = z.strictObject({
uf: z.enum(POTENTIAL_UFS),
/** Código TSE do município (`CD_MUNICIPIO`) — não é slug de URL. */
codigo: z.coerce.number().int().positive(),
zona: z.coerce.number().int().min(1).max(9999),
secao: z.coerce.number().int().min(1).max(9999),
})