refactor: Fase 1 — padronização de handlers, classes de erro e import… · BrasilAPI/BrasilAPI@6bb98d6 · GitHub
Skip to content

Commit 6bb98d6

Browse files
lucianopfclaude
andauthored
refactor: Fase 1 — padronização de handlers, classes de erro e imports ESM (#794)
* refactor: use return response.status(N).json() in handlers Converte o padrão `response.status(N); response.json(data)` (separado, sem return) para `return response.status(N).json(data)` (encadeado, com return) em 15 handlers. Previne execução acidental após o envio da resposta e adota o padrão já usado pelo restante do projeto. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * refactor(banks): throw NotFoundError instead of direct response Substitui response.status(404).json() direto por throw new NotFoundError(), delegando a formatação da resposta ao middleware errorHandler. A resposta agora inclui o campo `name: 'NotFoundError'`, consistente com todos os outros endpoints de erro do projeto. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * refactor(feriados): throw BadRequestError instead of direct response Substitui response.status(400).json() direto por throw new BadRequestError(), delegando a formatação da resposta ao middleware errorHandler. Preserva type: 'validation_error' para manter compatibilidade com o contrato da API. Atualiza o teste para incluir name: 'BadRequestError', agora presente pois a resposta passa pelo errorHandler padrão. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * refactor: convert CommonJS require() to ESM import in services Converte require() para import ESM em 3 arquivos de serviço que misturavam sintaxe CommonJS com exports ESM: - services/cambio/moedas.js (axios) - services/cvm/corretoras.js (adm-zip, axios) - services/date.js (dayjs e plugins utc/timezone) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: add docs/superpowers/ to .gitignore Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(tests): corrige imports de fundos-v1 para ESM e vitest O arquivo usava `require('axios')` (CommonJS) e chamava `expect.extend()` sem importar `expect` do vitest. Com `globals: false` no vitest config, isso causava `ReferenceError: expect is not defined` e derrubava toda a suite. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(lint): corrige erros ESLint/Prettier que bloqueavam o next build - feriados/v1: remove params não utilizados após conversão para throw - cptec/previsao/semana: remove import InternalError não utilizado - ibge/municipios: ajusta formatação Prettier em ALLOWED_PROVIDERS e unknown - ibge/uf: reformata import para múltiplas linhas conforme Prettier Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: corrige IBGE UF e timeout do CEP no ambiente preview - ibge/uf/v1: desestruturação errada `{ ufData }` sobre resposta axios que possui `{ data }` — ufData era sempre undefined, causando 404 para qualquer UF válida. Produção mascarava o bug via CDN cache. - cep/cep.js: cep-promise usava timeout padrão de 30s por provider. Para CEPs inexistentes, Promise.any aguarda todos falharem (~30s), estourando o limite de 10s do Vercel. Reduzido para 5s. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent e22d750 commit 6bb98d6

27 files changed

Lines changed: 42 additions & 55 deletions

File tree

‎.gitignore‎

Lines changed: 1 addition & 1 deletion

‎pages/api/banks/v1/[code].js‎

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import app from '@/app';
2+
import NotFoundError from '@/errors/NotFoundError';
23
import { getBanksData } from '@/services/banco-central';
34

45
const action = async (request, response) => {
@@ -9,17 +10,13 @@ const action = async (request, response) => {
910
const bankData = allBanksData.find(({ code }) => code === bankCode);
1011

1112
if (!bankData) {
12-
response.status(404);
13-
response.json({
13+
throw new NotFoundError({
1414
message: 'Código bancário não encontrado',
1515
type: 'BANK_CODE_NOT_FOUND',
1616
});
17-
18-
return;
1917
}
2018

21-
response.status(200);
22-
response.json(bankData);
19+
return response.status(200).json(bankData);
2320
};
2421

2522
export default app().get(action);

‎pages/api/banks/v1/index.js‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ import { getBanksData } from '@/services/banco-central';
44
const action = async (request, response) => {
55
const allBanksData = await getBanksData();
66

7-
response.status(200);
8-
response.json(allBanksData);
7+
return response.status(200).json(allBanksData);
98
};
109

1110
export default app().get(action);

‎pages/api/cptec/v1/cidade/index.js‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@ async function getAllCities(request, response) {
77
try {
88
const allCitiesData = await getAllCitiesData();
99

10-
response.status(200);
11-
response.json(allCitiesData);
10+
return response.status(200).json(allCitiesData);
1211
} catch (err) {
1312
if (err instanceof BaseError) {
1413
throw err;

‎pages/api/cptec/v1/clima/aeroporto/[airport].js‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,7 @@ const action = async (request, response) => {
2727
});
2828
}
2929

30-
response.status(200);
31-
response.json(airportWeather);
30+
return response.status(200).json(airportWeather);
3231
} catch (err) {
3332
if (err instanceof BaseError) {
3433
throw err;

‎pages/api/cptec/v1/clima/previsao/semana/[lat]/[long].js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import app from '@/app';
22
import BadRequestError from '@/errors/BadRequestError';
33
import BaseError from '@/errors/BaseError';
4-
import InternalError from '@/errors/InternalError';
54
import NotFoundError from '@/errors/NotFoundError';
65
import { getPredictionWeatherByLocation } from '@/services/cptec';
76

‎pages/api/cptec/v1/ondas/[cityCode]/[days].js‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,7 @@ async function getSwellPredictions(request, response) {
5252
});
5353
}
5454

55-
response.status(200);
56-
response.json(swellPredictions);
55+
return response.status(200).json(swellPredictions);
5756
} catch (err) {
5857
if (err instanceof BaseError) {
5958
throw err;

‎pages/api/cptec/v1/ondas/[cityCode]/index.js‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,7 @@ const action = async (request, response) => {
2626
});
2727
}
2828

29-
response.status(200);
30-
response.json(weatherPredictions);
29+
return response.status(200).json(weatherPredictions);
3130
} catch (err) {
3231
if (err instanceof BaseError) {
3332
throw err;

‎pages/api/cvm/corretoras/v1/[cnpj].js‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ const action = async (request, response) => {
2424
});
2525
}
2626

27-
response.status(200).json(exchangeData);
27+
return response.status(200).json(exchangeData);
2828
} catch (err) {
2929
if (err instanceof BaseError) {
3030
throw err;

‎pages/api/cvm/corretoras/v1/index.js‎

Lines changed: 1 addition & 1 deletion

0 commit comments

Comments
 (0)