Iniciativa Cidadã Independente · Transparência Parlamentar
TS135 linhas4.608 bytes

apps/web/src/lib/api.ts

SHA-256

3175c5ce94a4a2aca0ea5fd16f846a6d130710894d98324b5ab34355892cfb19

Somente leiturafonte-acf635076da2
import type {
  RankingResponse,
  MetaResponse,
  IdsScore,
  CeapResponse,
  AfastadosResponse,
  FilterPreset,
  ListResultBase,
  AutoriaItem,
  RelatoriaItem,
  VotacaoItem,
  ComissaoItem,
  CargoItem,
  DiscursoItem,
  DespesasResponse,
  PerfilSenador,
} from './types'

const API_URL =
  process.env.NEXT_PUBLIC_API_URL ??
  'https://api.observasenado.org'

async function apiFetch<T>(path: string): Promise<T> {
  const res = await fetch(`${API_URL}${path}`, {
    cache: 'no-store',
  })
  if (!res.ok) {
    throw new Error(`API error ${res.status}: ${path}`)
  }
  return res.json() as Promise<T>
}

export async function getRanking(params?: {
  partido?: string
  uf?: string
  bloco?: string
  filter?: FilterPreset
  status?: string
  meses_min?: number
  ordenar?: string
}): Promise<RankingResponse> {
  const qs = new URLSearchParams()
  if (params?.partido) qs.set('partido', params.partido)
  if (params?.uf) qs.set('uf', params.uf)
  if (params?.bloco) qs.set('bloco', params.bloco)
  if (params?.filter && params.filter !== 'geral') qs.set('filter', params.filter)
  if (params?.status) qs.set('status', params.status)
  if (params?.meses_min) qs.set('meses_min', String(params.meses_min))
  if (params?.ordenar) qs.set('ordenar', params.ordenar)
  const query = qs.toString() ? `?${qs}` : ''
  return apiFetch<RankingResponse>(`/api/ranking${query}`)
}

export async function getAfastados(): Promise<AfastadosResponse> {
  return apiFetch<AfastadosResponse>('/api/ranking?filter=afastados')
}

export async function getRankingMeta(): Promise<MetaResponse> {
  return apiFetch<MetaResponse>('/api/ranking/meta')
}

export async function getSenador(codigo: string): Promise<IdsScore> {
  return apiFetch<IdsScore>(`/api/senador/${codigo}`)
}

export async function getCeap(
  codigo: string,
  ano?: number,
): Promise<CeapResponse> {
  const q = ano ? `?ano=${ano}` : ''
  return apiFetch<CeapResponse>(`/api/ceap/${codigo}${q}`)
}

interface PageOpts {
  pagina?: number
  porPagina?: number
  ano?: number
}

function pageQs(opts?: PageOpts): string {
  const qs = new URLSearchParams()
  if (opts?.pagina) qs.set('pagina', String(opts.pagina))
  if (opts?.porPagina) qs.set('porPagina', String(opts.porPagina))
  if (opts?.ano) qs.set('ano', String(opts.ano))
  return qs.toString() ? `?${qs}` : ''
}

export async function getPerfil(codigo: string): Promise<PerfilSenador> {
  return apiFetch<PerfilSenador>(`/api/senador/${codigo}/perfil`)
}

export async function getAutorias(codigo: string, opts?: PageOpts): Promise<ListResultBase<AutoriaItem>> {
  return apiFetch<ListResultBase<AutoriaItem>>(`/api/senador/${codigo}/autorias${pageQs(opts)}`)
}

export async function getRelatorias(codigo: string, opts?: PageOpts): Promise<ListResultBase<RelatoriaItem>> {
  return apiFetch<ListResultBase<RelatoriaItem>>(`/api/senador/${codigo}/relatorias${pageQs(opts)}`)
}

export async function getVotacoes(codigo: string, opts?: PageOpts): Promise<ListResultBase<VotacaoItem>> {
  return apiFetch<ListResultBase<VotacaoItem>>(`/api/senador/${codigo}/votacoes${pageQs(opts)}`)
}

export async function getComissoes(codigo: string, ativo?: boolean): Promise<ListResultBase<ComissaoItem>> {
  const q = ativo === undefined ? '' : `?ativo=${ativo}`
  return apiFetch<ListResultBase<ComissaoItem>>(`/api/senador/${codigo}/comissoes${q}`)
}

export async function getCargos(codigo: string, ativo?: boolean): Promise<ListResultBase<CargoItem>> {
  const q = ativo === undefined ? '' : `?ativo=${ativo}`
  return apiFetch<ListResultBase<CargoItem>>(`/api/senador/${codigo}/cargos${q}`)
}

export async function getDiscursos(codigo: string, opts?: PageOpts): Promise<ListResultBase<DiscursoItem>> {
  return apiFetch<ListResultBase<DiscursoItem>>(`/api/senador/${codigo}/discursos${pageQs(opts)}`)
}

export async function getApartes(codigo: string, opts?: PageOpts): Promise<ListResultBase<DiscursoItem>> {
  return apiFetch<ListResultBase<DiscursoItem>>(`/api/senador/${codigo}/apartes${pageQs(opts)}`)
}

export async function getDespesasDetalhadas(
  codigo: string,
  opts?: PageOpts & { tipo?: string; fornecedor?: string },
): Promise<DespesasResponse> {
  const qs = new URLSearchParams()
  if (opts?.pagina) qs.set('pagina', String(opts.pagina))
  if (opts?.porPagina) qs.set('porPagina', String(opts.porPagina))
  if (opts?.ano) qs.set('ano', String(opts.ano))
  if (opts?.tipo) qs.set('tipo', opts.tipo)
  if (opts?.fornecedor) qs.set('fornecedor', opts.fornecedor)
  const q = qs.toString() ? `?${qs}` : ''
  return apiFetch<DespesasResponse>(`/api/senador/${codigo}/despesas${q}`)
}