-
Notifications
You must be signed in to change notification settings - Fork 567
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: dados abertos senado - servidores #546
base: main
Are you sure you want to change the base?
Conversation
The latest updates on your projects. Learn more about Vercel for Git ↗︎
|
Kudos, SonarCloud Quality Gate passed! 0 Bugs No Coverage information |
import BadRequestError from '@/errors/BadRequestError'; | ||
import { getRemuneracoesPensionistas } from '@/services/dados-publicos-senado/servidores/index'; | ||
|
||
function isYearValid(year){ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Essas funções podem ser úteis para mais alguém, acho que vale a pena colocar em uma pasta/arquivo de "utils". O que acham?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Eu utilizaria a services e criaria um subdir validators para colocar elas.
Porém acredito que elas estão repetidas no código, o primeiro arquivo do commit já é um service de validação para estas informações.
import BadRequestError from '@/errors/BadRequestError'; | ||
import { getPensioners } from '@/services/dados-publicos-senado/servidores/index'; | ||
|
||
async function getAllPensioners(request, response) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Aqui tem um nome em inglês, mas em outros lugares está em português. Acho que vale seguir o padrão do repositório!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Bem observado, apesar de não termos um padrão com o martelo batido ainda, temos um modelo em desenvolvimento que pode ser um guia: https://github.com/BrasilAPI/BrasilAPI/blob/6509fa5e96ed4544b193d6a56a5cfc1b48c29bf5/GOOD_PRACTICES.md
const result = await getServidoresAtivos(); | ||
|
||
response.status(200); | ||
return response.json(result); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Uma coisa que percebi foi que vocês recebem os dados da API do senado e mandam direto para quem está chamando, se vocês observarem em outras partes do repositório eles fazem um mapeamento dos campos da resposta da API para campos próprios - isso daria algumas vantagens a implementação de vocês, fazendo com que o padrão (e os campos) da resposta pudesse ser controlado pela própria BrasilAPI, dando mais visibilidade no código dos campos respondidos, e permitindo contornar eventuais comportamentos estranhos ou quebras de contrato da API que vocês usaram.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No geral o PR ficou muito bom, quero agradecer a contribuição e parabenizar pelo código, pois é uma integração grande e sei que deu bastante trabalho para criar.
Se me permitirem eu gostaria de sugerir algumas alterações:
1- Nomes: Notei que tanto no código quanto nos arquivos há uma mistura de nomenclaturas em inglês e português (por ex.: getAllInativos
), é sempre recomendável manter uma padronização.
Apesar de não termos uma recomendação oficial ainda para as nomenclaturas temos um documento que estamos trabalhando para caminhar a isso, e acredito que seja uma boa tentar dar uma analisada e ver se faz sentido adequar:
https://github.com/BrasilAPI/BrasilAPI/blob/6509fa5e96ed4544b193d6a56a5cfc1b48c29bf5/GOOD_PRACTICES.md
2- Verificar repetição de código: Se um código é usado em mais de um lugar sem alteração talvez seja interessante extraí-lo para um arquivo externo.
3- Indentação do código: apesar de não ser block é sempre uma boa prática manter o código bem indentado, notei que alguns arquivos aqui a indentação poderia receber alguma atenção, apesar de não estarem ruins.
Novamente obrigado pela contribuição e seria muito legal para a gente se quiserem contribuir com outras implementações ;-)
const currentMonth = new Date().getMonth(); | ||
month = parseInt(month, 10); | ||
|
||
return !isNaN(month) || month < currentMonth || month >= 1; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Acredito que tenha dois problemas de lógica nesta validação:
1- se alguém informar o mês 12 de 2015 será retornado o mês como inválido, pois é verificado se o mês é menor que o atual.
2- Acho que é interessante validar também se o mês está dentro do range de um ano (1 - 12), caso contrário teremos um erro quando corrigir o ponto 1
console.log(error.message); | ||
|
||
if (error.response.status === 400) { | ||
throw new BadRequestError({ message: 'Bad Request.' }); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Se houve um bad request, não seria mais interessante informar ao client qual o motivo desse bad request?
console.log(error.message); | ||
|
||
if (error.response.status === 400) { | ||
throw new BadRequestError({ message: 'Bad Request.' }); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Idem ao anterior
import BadRequestError from '@/errors/BadRequestError'; | ||
import { getRemuneracoesPensionistas } from '@/services/dados-publicos-senado/servidores/index'; | ||
|
||
function isYearValid(year){ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Eu utilizaria a services e criaria um subdir validators para colocar elas.
Porém acredito que elas estão repetidas no código, o primeiro arquivo do commit já é um service de validação para estas informações.
import BadRequestError from '@/errors/BadRequestError'; | ||
import { getPensioners } from '@/services/dados-publicos-senado/servidores/index'; | ||
|
||
async function getAllPensioners(request, response) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Bem observado, apesar de não termos um padrão com o martelo batido ainda, temos um modelo em desenvolvimento que pode ser um guia: https://github.com/BrasilAPI/BrasilAPI/blob/6509fa5e96ed4544b193d6a56a5cfc1b48c29bf5/GOOD_PRACTICES.md
var params = ""; | ||
|
||
if(tipoVinculoEquals != null) | ||
params = `tipoVinculoEquals=${tipoVinculoEquals}`; | ||
|
||
if(situacaoEquals != null) | ||
params += (params == "") ? `tipoVinculoEquals=${situacaoEquals}` : `&tipoVinculoEquals=${situacaoEquals}`; | ||
|
||
if(lotacaoEquals != null) | ||
params += (params == "") ? `tipoVinculoEquals=${lotacaoEquals}` : `&tipoVinculoEquals=${lotacaoEquals}`; | ||
|
||
if(cargoEquals != null) | ||
params += (params == "") ? `tipoVinculoEquals=${lotacaoEquals}` : `&tipoVinculoEquals=${lotacaoEquals}` | ||
|
||
if(params != "") | ||
params = "?" + params; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Será que aqui não seria interessante o uso de URLSearchParams
?
Acredito que o código se tornaria um pouco mais legível
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Senti falta de testes para validar a algumas rotas aqui, por exemplo remunerações, horas extras etc.
Idealmente, para cada rota seria interessante termos ao menos um teste (melhor se for mais de um) para garantir que alguma alteração futura não a quebre.
"application/json": { | ||
"schema": { | ||
"type": "array", | ||
"content": { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Apesar de não ser um block, poderia ficar um pouco mais fácil para leitura se os schemas fossem declarados separadamente e só referenciados nos responses.
Isso, inclusive, facilita o reuso de um schema que por ventura seja usado por duas ou mais rotas.
Um exemplo: https://github.com/BrasilAPI/BrasilAPI/blob/main/pages/docs/doc/cptec.json
} | ||
} | ||
}, | ||
"400": { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Aqui nos possíveis erros recomendo o uso dos schemas que já temos:
https://github.com/BrasilAPI/BrasilAPI/blob/main/pages/docs/doc/error.json
} | ||
}, | ||
"400": { | ||
"description": "Error", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Mesmo caso dos erros anteriores
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Muito obrigado pela contribuição! Além de tudo que comentei, peço que adicione testes para todas as rotas, pois só assim detectaremos caso alguma delas comece a dar problema
const currentYear = new Date().getFullYear(); | ||
const yearN = parseInt(year, 10); | ||
|
||
return !isNaN(yearN) && year <= currentYear && yearN >= 2012; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sugiro colocar o 2012
em uma constante para não ficar o número mágico no meio do código e se possível uma explicação do motivo para ser 2012. Por exemplo
const SENADO_MIN_DATE = 2012 // data mínima dos dados disponibilizados pela API do senado <link doc oficial>
function isMonthValid(month){ | ||
const currentMonth = new Date().getMonth(); | ||
month = parseInt(month, 10); | ||
|
||
return !isNaN(month) || month < currentMonth || month >= 1; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Se entendi corretamente, essa função não funciona bem para datas passadas. Por exemplo, se hoje fosse 01/2023 e eu estivesse tentando acessar dados de 11/2022 daria como inválida
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Essas funções deveriam estar em outra pasta, pois tudo que está em pages/api
é transformado em rotas de APIs
|
||
console.log(error.message); | ||
|
||
if (error.response.status === 400) { | ||
throw new BadRequestError({ message: 'Bad Request.' }); | ||
} | ||
|
||
throw error; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sugiro trocar todos os catch para algo mais ou menos assim:
console.log(error.message); | |
if (error.response.status === 400) { | |
throw new BadRequestError({ message: 'Bad Request.' }); | |
} | |
throw error; | |
} | |
if (err instanceof BaseError) { | |
throw err; | |
} | |
throw new InternalError({ | |
message: 'Erro ao buscar informações dos servidores ativos', | |
}); |
|
||
console.log(error.message); | ||
|
||
if (error.response.status === 400) { | ||
throw new BadRequestError({ message: 'Bad Request.' }); | ||
} | ||
|
||
throw error; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
mesmo sobre o catch
function checkSituacao(situacao){ | ||
const possibleValues = ['APOSENTADO', 'INATIVO', 'ATIVO', 'DESLIGADO']; | ||
|
||
return situacao == null || possibleValues.includes(situacao); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
return situacao == null || possibleValues.includes(situacao); | |
return situacao == null || possibleValues.includes(situacao.toUpperCase()); |
|
||
console.log(error.message); | ||
|
||
if (error.response.status === 400) { | ||
throw new BadRequestError({ message: 'Bad Request.' }); | ||
} | ||
|
||
throw error; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
mesmo sobre o catch
if(params != "") | ||
params = "?" + params; | ||
|
||
return axios.get(API_URL +'/servidores' + params); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sugiro fazer algo mais ou menos assim:
return axios.get(API_URL +'/servidores' + params); | |
return axios.get(API_URL +'/servidores', { | |
params: { | |
tipoVinculoEquals, | |
situacaoEquals, | |
lotacaoEquals, | |
cargoEquals, | |
} | |
}); |
|
||
export const getPensioners = async () => { | ||
const endpoint = API_URL + '/pensionistas'; | ||
return axios.get(endpoint); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
return axios.get(endpoint); | |
const {data} = await axios.get(endpoint); | |
return data |
expect(response.data).toMatchObject({ | ||
sequencial: 3502872, | ||
nome: "EVERTOM ALMEIDA DA SILVA", | ||
vinculo: "EXERCICIO_PROVISORIO", | ||
situacao: "DESLIGADO", | ||
cargo: null, | ||
padrao: null, | ||
especialidade: null, | ||
funcao: null, | ||
lotacao:{ | ||
sigla: "SEPCOM", | ||
nome: "Serviço de Cadastro Parlam. e Pessoal Comissionado" | ||
}, | ||
categoria:{ | ||
codigo: "EXERCÍCIO PROVISÓRIO", | ||
nome: "EXERCÍCIO PROVISÓRIO" | ||
}, | ||
cedido:{ | ||
tipo_cessao: "para SF", | ||
orgao_origem: "Instituto Federal de Educação, Ciência e Tecnologia de MT", | ||
orgao_destino: null | ||
}, | ||
ano_admissao: 2020 | ||
}, | ||
{ | ||
sequencial: 3502775, | ||
nome: "EVERTOM ALMEIDA DA SILVA", | ||
vinculo: "EXERCICIO_PROVISORIO", | ||
situacao: "DESLIGADO", | ||
cargo: null, | ||
padrao: null, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sugiro deixar o teste mais genérico, validando apenas os tipos da resposta. Já tivemos problemas no passada validando o valor da resposta
No description provided.