Skip to content
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

Open
wants to merge 2 commits into
base: main
Choose a base branch
from

Conversation

vitorialira92
Copy link

No description provided.

Copy link

vercel bot commented Nov 30, 2023

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Comments Updated (UTC)
brasilapi ❌ Failed (Inspect) Dec 1, 2023 1:45am

Copy link

sonarcloud bot commented Dec 1, 2023

Kudos, SonarCloud Quality Gate passed!    Quality Gate passed

Bug A 0 Bugs
Vulnerability A 0 Vulnerabilities
Security Hotspot A 0 Security Hotspots
Code Smell A 2 Code Smells

No Coverage information No Coverage information
0.0% 0.0% Duplication

import BadRequestError from '@/errors/BadRequestError';
import { getRemuneracoesPensionistas } from '@/services/dados-publicos-senado/servidores/index';

function isYearValid(year){

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?

Copy link
Collaborator

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) {

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!

Copy link
Collaborator

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);

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.

Copy link
Collaborator

@RodriAndreotti RodriAndreotti left a 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 ;-)

Comment on lines +10 to +13
const currentMonth = new Date().getMonth();
month = parseInt(month, 10);

return !isNaN(month) || month < currentMonth || month >= 1;
Copy link
Collaborator

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.' });
Copy link
Collaborator

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.' });
Copy link
Collaborator

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){
Copy link
Collaborator

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) {
Copy link
Collaborator

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

Comment on lines +8 to +23
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;
Copy link
Collaborator

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

Copy link
Collaborator

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": {
Copy link
Collaborator

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": {
Copy link
Collaborator

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",
Copy link
Collaborator

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

Copy link
Member

@LorhanSohaky LorhanSohaky left a 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;
Copy link
Member

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>

Comment on lines +9 to +14
function isMonthValid(month){
const currentMonth = new Date().getMonth();
month = parseInt(month, 10);

return !isNaN(month) || month < currentMonth || month >= 1;
}
Copy link
Member

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

Copy link
Member

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

Comment on lines +13 to +21

console.log(error.message);

if (error.response.status === 400) {
throw new BadRequestError({ message: 'Bad Request.' });
}

throw error;
}
Copy link
Member

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:

Suggested change
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',
});

Comment on lines +13 to +20

console.log(error.message);

if (error.response.status === 400) {
throw new BadRequestError({ message: 'Bad Request.' });
}

throw error;
Copy link
Member

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);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
return situacao == null || possibleValues.includes(situacao);
return situacao == null || possibleValues.includes(situacao.toUpperCase());

Comment on lines +35 to +43

console.log(error.message);

if (error.response.status === 400) {
throw new BadRequestError({ message: 'Bad Request.' });
}

throw error;
}
Copy link
Member

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);
Copy link
Member

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:

Suggested change
return axios.get(API_URL +'/servidores' + params);
return axios.get(API_URL +'/servidores', {
params: {
tipoVinculoEquals,
situacaoEquals,
lotacaoEquals,
cargoEquals,
}
});

https://masteringjs.io/tutorials/axios/get-query-params


export const getPensioners = async () => {
const endpoint = API_URL + '/pensionistas';
return axios.get(endpoint);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
return axios.get(endpoint);
const {data} = await axios.get(endpoint);
return data

Comment on lines +96 to +126
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,
Copy link
Member

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants