Skip to content

Implementação do Endpoint de Feriados V2 por Estado e Município no BrasilAPI#558

Open
vitoriahilgert wants to merge 1 commit intoBrasilAPI:mainfrom
vitoriahilgert:main
Open

Implementação do Endpoint de Feriados V2 por Estado e Município no BrasilAPI#558
vitoriahilgert wants to merge 1 commit intoBrasilAPI:mainfrom
vitoriahilgert:main

Conversation

@vitoriahilgert
Copy link
Copy Markdown

Descrição da Feature

Nesta atualização do BrasilAPI, expandimos a funcionalidade do endpoint de feriados para incluir não apenas os feriados nacionais, mas também os específicos de cada estado e município brasileiro. Agora, o endpoint é capaz de fornecer informações precisas sobre feriados locais em qualquer ano solicitado.

Motivação

A motivação para esta atualização surgiu da necessidade de fornecer dados mais precisos e abrangentes sobre feriados no Brasil. Observamos que a versão anterior do endpoint de feriados era limitada, pois retornava apenas feriados nacionais, muitos dos quais não eram observados em todos os municípios. Além disso, a seleção de feriados de todo o Brasil resultava na exibição de feriados de uma capital aleatória, como São Paulo ou Rio de Janeiro, em vez de todos os feriados nacionais.

Detalhes Técnicos

  • Ampliação do Endpoint de Feriados: O novo endpoint agora retorna informações de feriados nacionais, estaduais e municipais, com a capacidade de filtrar por ano.
  • Precisão de Dados: Garantimos a precisão e a atualização dos dados, coletando informações de fontes oficiais e confiáveis.
  • Documentação Conforme Padrões do Repositório: Elaboramos a documentação detalhada do novo endpoint, seguindo as regras e diretrizes estabelecidas no BrasilAPI.
  • Testes Unitários: Realizamos testes unitários extensivos para assegurar a confiabilidade e a precisão dos dados retornados pelo novo endpoint.
  • Pull Request: O PR foi criado com detalhes completos da implementação, documentação e resultados dos testes.

Benefícios para Usuários e Desenvolvedores

Esta atualização beneficiará diretamente desenvolvedores, empresas e usuários que necessitam de informações precisas sobre feriados em diferentes regiões do Brasil. Desenvolvedores poderão integrar facilmente esses dados em aplicativos e sistemas, enquanto empresas poderão planejar melhor suas operações considerando feriados locais. Para os usuários, essa funcionalidade traz a conveniência de acessar informações sobre feriados em suas localidades de maneira rápida e confiável.

Solicitação de Integração

Solicitamos a revisão e aceitação desta implementação pela comunidade do BrasilAPI, acreditando que ela adiciona valor significativo ao projeto, ampliando sua utilidade e precisão para todos os usuários.

@vercel
Copy link
Copy Markdown

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 ✅ Ready (Inspect) Visit Preview 💬 Add feedback Nov 30, 2023 0:27am

@sonarqubecloud
Copy link
Copy Markdown

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 0 Code Smells

No Coverage information No Coverage information
No Duplication information No Duplication information

Copy link
Copy Markdown
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.

A proposta do PR é bastante interessante, deixei algumas observações, se puder ver se fazem sentido para você ;-)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Notei que houve uma mistura de variáveis com nomes em português e outras com nome em inglês.
Apesar de não ser um block, talvez fosse interessante manter uma padronização.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Gosto da sugestão de manter o código em ingles tbm! ^^

Comment on lines +9 to +55
if (uf != "") {
let urlUF = 'https://servicodados.ibge.gov.br/api/v1/localidades/estados';
const responseUF = await fetch(urlUF);
const htmlUF = await responseUF.text();
const objetoUF = JSON.parse(htmlUF);

var achou = false;

objetoUF.forEach((item) => {
if (item["sigla"] == uf.toUpperCase()) {
achou = true;
}
});

if (!achou) {
throw new NotFoundError({
name: 'NotFoundError',
message: `Sigla não corresponde a nenhum estado existente.`,
type: 'uf_range_error',
});
}

if (city != "") {
const urlCity = `https://servicodados.ibge.gov.br/api/v1/localidades/estados/${uf.replaceAll(" ", "_")}/municipios`;
const responseCity = await fetch(urlCity);
const htmlCity = await responseCity.text();

const objetoCity = JSON.parse(htmlCity);

achou = false;

objetoCity.forEach((item) => {
if (item["nome"].toUpperCase() == city.toUpperCase()) {
achou = true;
}
});

if (!achou) {
throw new NotFoundError({
name: 'NotFoundError',
message: `Cidade não existente ou não correspondete ao estado informado.`,
type: 'feriados_error',
});
}

}
}
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Será que não faria sentido ter essa camada de consulta a dados em um serviço externo?

Hoje já temos um service para dados do ibge (services/ibge/gov.js), talvez fosse interessante reaproveitar o que puder dele e somente criar novas funções dentro do mesmo arquivo, visando o princípio da responsabilidade única.

Comment thread tests/feriados-v2.test.js
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Pelo que vi do serviço usado parece que a url é sempre montada com o nome da cidade sem acentuação, seria interessante testar esse cenário tentando enviar uma cidade com o acento no nome, o que acha?


if (uf != "") {
let urlUF = 'https://servicodados.ibge.gov.br/api/v1/localidades/estados';
const responseUF = await fetch(urlUF);
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

a lista de siglas de estados é algo que muda muito pouco, talvez não justifique pegar do ibge dinamicamente sempre, poderia estar estática no código, ou num lugar também estático que faça parte da build, para economizar um http get, (caro, sujeito a erros de rede, etc)

});
}

const url = `https://www.feriados.com.br/feriados-${city.replaceAll(" ", "_")}-${uf.replaceAll(" ", "_")}.php?ano=${year}`;
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

seria interessante marcar com um comentário tipo // TODO: ou FIXME: um pedido de trocar a fonte dos feriados por algo que fosse mais canonico/reconhecido, talvez Wikipedia

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Apesar da intenção incrível do PR talvez isso seja necessário pra uma primeira versão especialmente pelo ponto que a consulta dos dados é via interpretação de HTML que pode subtamente mudar

Comment on lines +8 to +13
if(!('estado' in request.query)) {
request.query.estado = '';
}
if(!('cidade' in request.query)) {
request.query.cidade = '';
}
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Será que isso é realmente necessário dado que caso não haja na query esses parametros eles serão falsy? 😬

Se a gnt só ignora isso e passa pro getHolidays lá a gnt só precisa validar se o valor contido no caminho existe e é truthy ^^

@lucianopf
Copy link
Copy Markdown
Member

Olá @vitoriahilgert, obrigado pela contribuição! A ideia de feriados por estado e município é muito útil, mas o PR tem problemas arquiteturais que impedem o merge.

Bloqueador principal: web scraping de feriados.com.br

const url = `https://www.feriados.com.br/feriados-${city}-${uf}.php?ano=${year}`;
const response = await fetch(url);
const html = await response.text();
const dom = new JSDOM(html); // parseia HTML com jsdom

A BrasilAPI não pode depender de web scraping:

  • Se o site mudar o HTML, o endpoint quebra imediatamente
  • Não é uma fonte oficial ou pública de dados
  • jsdom é uma dependência pesada não incluída no projeto

Para feriados estaduais, as opções são:

  1. Dados hardcoded (como PR feat: add statewide holidays #552 faz) — simples e sem dependências externas, adequado para feriados fixos
  2. APIs públicas oficiais — o IBGE e o governo federal não oferecem API de feriados municipais, então dados estáticos são a abordagem comum

Outros problemas:

  • Mistura require() (CommonJS) com import (ESM) no mesmo arquivo: const { JSDOM } = require('jsdom')
  • Usa fetch() nativo em vez de axios (padrão do projeto)
  • Usa var em vez de const/let
  • Usa != em vez de !== (comparação não estrita)
  • Testes usam CommonJS (const axios = require('axios')) e não importam Vitest

Recomendo examinar o PR #552 que implementa feriados estaduais com dados estáticos — é a abordagem correta para este tipo de dado.

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.

5 participants