Como Votou? é uma plataforma web desenvolvida para facilitar a fiscalização dos representantes políticos no Congresso Nacional.
A aplicação é dividida em duas partes:
- Front-end: desenvolvido em React com Chakra UI, hospedado na Vercel;
- Back-end (API): construído em Node.js, com Express, TypeScript e MongoDB, hospedado no Google Cloud Platform (GCP).
O sistema consome a API Dados Abertos da Câmara dos Deputados para reunir informações sobre proposições, votações e o voto de cada deputado, além de oferecer um glossário de termos legislativos — tornando o acompanhamento político mais acessível e promovendo a participação social no processo democrático.
-
Clone o repositório:
git clone https://github.com/rmftelier/comoVotou
-
Acesse a pasta do projeto:
cd comoVotou/backend -
Instale as dependências:
npm install
-
No arquivo
.env.examplena raiz do projeto, adicione a variável necessária e renomeie-o para.env:MONGO_URL=mongodb+srv://<username>:<password>@<cluster-url>/<dbname>?retryWrites=true&w=majority&appName=<appname> PORT=8080
-
Execute em modo desenvolvimento:
npm run dev
Tip
A API é hospedada no Google Cloud Platform. Para testar localmente, utilize ferramentas como ThunderClient/Postman e para enviar requisições aos endpoints.
-
Acesse a pasta do front-end:
cd ../frontend -
Instale as dependências:
npm install
-
Crie um arquivo
.envcom a URL da API:VITE_API_URL=https://<sua-api-no-gcp>.app
-
Inicie o projeto em modo desenvolvimento:
npm run dev
A API possui os seguintes endpoints:
GET /proposicoes
Retorna todas as proposições cadastradas.
- Método: GET
- Query Params (Opcionais):
pagina,itens - Resposta de Sucesso (200 OK):
{ "dados": [ { "id": 104402, "siglaTipo": "PRC", "numero": 4, "ano": 2003, "ementa": "Cria o Grupo Parlamentar do Turismo." }, { "id": 104404, "siglaTipo": "PL", "numero": 35, "ano": 2003, "ementa": "Adiciona parágrafo ao art. 6º da Lei nº 9.870, de 23 de novembro de 1999." } ], "links": [ { "rel": "self", "href": "https://dadosabertos.camara.leg.br/api/v2/proposicoes?pagina=1&itens=15" }, { "rel": "next", "href": "https://dadosabertos.camara.leg.br/api/v2/proposicoes?pagina=2&itens=15" }, { "rel": "first", "href": "https://dadosabertos.camara.leg.br/api/v2/proposicoes?pagina=1&itens=15" }, { "rel": "last", "href": "https://dadosabertos.camara.leg.br/api/v2/proposicoes?pagina=3110&itens=15" } ] }
GET /proposicoes/:id
Retorna uma proposição específica pelo seu id.
- Método: GET
- Parâmetros da Rota:
id:string - Resposta de Sucesso (200 OK):
{ "dados": { "id": 2500080, "siglaTipo": "PEC", "numero": 18, "ano": 2025, "ementa": "Altera os art. 21, art. 22, art. 23, art. 24 e art. 144 da Constituição, para dispor sobre competências da União, dos Estados, do Distrito Federal e dos Municípios relativas à segurança pública.", "dataApresentacao": "2025-04-24T08:51", "descricaoTipo": "Proposta de Emenda à Constituição", "statusProposicao": { "dataHora": "2025-10-16T15:09", "regime": "Especial (Art. 202 c/c 191, I, RICD)", "descricaoTramitacao": "Apresentação de Requerimento", "descricaoSituacao": "Aguardando Parecer", "despacho": "Apresentação do REQ n. 82/2025 (Requerimento de Audiência Pública), pelo Deputado Jorge Solla (PT/BA -Fdr PT-PCdoB-PV), que \"Requer seja convidado o Secretário Nacional de Justiça, Jean Keiji Uema, para apresentar e debater com os membros desta Comissão Especial os objetivos da PEC 18/2025\".", "ambito": "Regimental", "apreciacao": "Proposição Sujeita à Apreciação do Plenário" }, "ementaDetalhada": "", "texto": null, "justificativa": null } }
GET /proposicoes/:id/votacoes
Retorna as votações vinculadas à proposição cujo ID é passado como parâmetro.
- Método: GET
- Parâmetros da Rota:
id:string - Resposta de Sucesso (200 OK):
{ "dados": [ { "id": "2500080-166", "data": "2025-09-23", "descricao": "Aprovado o requerimento nº 48/2025,da Sra. Alice Portugal que requer a participação de representação nacional dos policiais rodoviários federais e dos policiais ferroviários federais no Seminário Regional de Salvador (BA) destinado a debater a PEC nº 18/2025.", "aprovacao": 1 }, { "id": "2500080-137", "data": "2025-09-16", "descricao": "Aprovado o requerimento nº 21/2025,do Sr. Alberto Fraga que apresenta nomes de entidades políticas nacionais para serem ouvidas em audiência pública: Conselho Nacional de Secretários de Segurança Pública (CONSESP); Frente Nacional de Prefeitas e Prefeitos (FNP); Confederação Nacional de Municípios (CNM); União Nacional dos Legisladores e Legislativos Estaduais (Unale); e União dos Vereadores do Brasil (UVB).", "aprovacao": 1 } ] }
GET /votacoes/:id/votos
Retorna as votações vinculadas à proposição cujo ID foi passado como parâmetro.
- Método: GET
- Parâmetros da Rota:
id:string - Resposta de Sucesso (200 OK):
{ "dados": [ { "tipoVoto": "Não", "dataRegistroVoto": "2025-07-09T12:55:24", "deputado_": { "id": 73486, "nome": "Pompeo de Mattos", "siglaPartido": "PDT", "siglaUf": "RS", "urlFoto": "https://www.camara.leg.br/internet/deputado/bandep/73486.jpg" } }, ] }
GET /glossario
Retorna todos os termos legislativos cadastrados no banco de dados.
- Método: GET
- Resposta de Sucesso (200 OK):
[ { "id": "68e6d1d67b3eaf3ce667a23c", "sigla": "PRC", "termo": "Projeto de Resolução da Câmara dos Deputados", "descricao": "Proposição destinada a elaboração de Resolução da Câmara dos Deputados.", "url": "https://www.congressonacional.leg.br/legislacao-e-publicacoes/glossario-legislativo/-/legislativo/termo/projeto_de_resolucao_da_camara_dos_deputados_prc" } ]
- Linguagem e ambiente: Node.js, TypeScript
- Framework: Express
- Banco de dados: MongoDB
- Integrações: Axios / Mongoose
- Front-end: React / Chakra UI
- Deploy: API no Google Cloud Platform (GCP) e Front-end na Vercel