TS115 linhas4.167 bytes
apps/worker/src/routes/senador.ts
SHA-256
a013d1d88f427475fc22dd213c74ede513fb8be606fb6d81fb4fc0894c5d838d
Somente leiturafonte-acf635076da2
import { Hono } from 'hono'
import type { Env } from '../types'
import { getLatestRanking } from '../services/ranking'
import { getSenadorList } from '../services/legis'
import {
obterPerfil,
listarAutorias,
listarRelatorias,
listarVotacoes,
listarComissoes,
listarCargos,
listarDiscursos,
listarApartes,
listarDespesasDetalhadas,
} from '../services/detalhe'
const senador = new Hono<{ Bindings: Env }>()
const CACHE_LISTA = 'public, max-age=1800, stale-while-revalidate=300'
const CACHE_DETALHE_LONGO = 'public, max-age=43200, stale-while-revalidate=3600'
const CACHE_DETALHE_CURTO = 'public, max-age=21600, stale-while-revalidate=600'
function pageOpts(c: { req: { query: (k: string) => string | undefined } }) {
const pagina = Number(c.req.query('pagina') ?? '1')
const porPagina = Number(c.req.query('porPagina') ?? '50')
const ano = c.req.query('ano') ? Number(c.req.query('ano')) : undefined
return { pagina, porPagina, ano }
}
senador.get('/:codigo', async (c) => {
const codigo = c.req.param('codigo')
const [scores, lista] = await Promise.all([getLatestRanking(c.env), getSenadorList(c.env)])
const score = scores.find((s) => s.senadorCod === codigo)
const info = lista.find((s) => s.codigo === codigo)
if (!score && !info) return c.json({ error: 'Senador não encontrado' }, 404)
const posicao = score ? scores.indexOf(score) + 1 : null
return c.json(
{ ...score, ...info, posicao, totalSenadores: scores.length },
200,
{ 'Cache-Control': CACHE_LISTA },
)
})
senador.get('/:codigo/perfil', async (c) => {
const perfil = await obterPerfil(c.env, c.req.param('codigo'))
if (!perfil) return c.json({ error: 'Perfil não encontrado' }, 404)
return c.json(perfil, 200, { 'Cache-Control': CACHE_DETALHE_LONGO })
})
senador.get('/:codigo/autorias', async (c) => {
const result = await listarAutorias(c.env, c.req.param('codigo'), pageOpts(c))
return c.json(result, 200, { 'Cache-Control': CACHE_DETALHE_CURTO })
})
senador.get('/:codigo/relatorias', async (c) => {
const result = await listarRelatorias(c.env, c.req.param('codigo'), pageOpts(c))
return c.json(result, 200, { 'Cache-Control': CACHE_DETALHE_CURTO })
})
senador.get('/:codigo/votacoes', async (c) => {
const result = await listarVotacoes(c.env, c.req.param('codigo'), pageOpts(c))
return c.json(result, 200, { 'Cache-Control': CACHE_DETALHE_CURTO })
})
senador.get('/:codigo/comissoes', async (c) => {
const ativo = c.req.query('ativo')
const result = await listarComissoes(c.env, c.req.param('codigo'), {
...pageOpts(c),
ativo: ativo === 'false' ? false : ativo === 'true' ? true : undefined,
})
return c.json(result, 200, { 'Cache-Control': CACHE_DETALHE_LONGO })
})
senador.get('/:codigo/cargos', async (c) => {
const ativo = c.req.query('ativo')
const result = await listarCargos(c.env, c.req.param('codigo'), {
...pageOpts(c),
ativo: ativo === 'false' ? false : ativo === 'true' ? true : undefined,
})
return c.json(result, 200, { 'Cache-Control': CACHE_DETALHE_LONGO })
})
senador.get('/:codigo/discursos', async (c) => {
const result = await listarDiscursos(c.env, c.req.param('codigo'), pageOpts(c))
return c.json(result, 200, { 'Cache-Control': CACHE_DETALHE_CURTO })
})
senador.get('/:codigo/apartes', async (c) => {
const result = await listarApartes(c.env, c.req.param('codigo'), pageOpts(c))
return c.json(result, 200, { 'Cache-Control': CACHE_DETALHE_CURTO })
})
senador.get('/:codigo/despesas', async (c) => {
const codigo = c.req.param('codigo')
const opts = pageOpts(c)
const ano = opts.ano ?? new Date().getFullYear()
const tipo = c.req.query('tipo')
const fornecedor = c.req.query('fornecedor')
let result
try {
result = await listarDespesasDetalhadas(c.env, codigo, ano, {
pagina: opts.pagina,
porPagina: opts.porPagina,
tipo,
fornecedor,
})
} catch (err) {
console.error('[senador/despesas] upstream indisponível:', err)
return c.json({ error: 'Dados de despesas indisponíveis no momento' }, 503)
}
return c.json(result, 200, { 'Cache-Control': CACHE_DETALHE_CURTO })
})
export { senador }