Skip to content

Commit

Permalink
fix: se manejo string vacio para la busqueda para evitar llamadas inn…
Browse files Browse the repository at this point in the history
…ecesarias

refactor: se usa nuevo manejo de error
  • Loading branch information
ramirezsebas committed Feb 3, 2024
1 parent e5a17f7 commit 6e94ff2
Showing 1 changed file with 151 additions and 113 deletions.
264 changes: 151 additions & 113 deletions src/contribuyentes.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
const { URL, MAX_LENGTH, MIN_LENGTH } = require("./constants");
const { CustomError } = require("./errors");
const { ValidationError, ServerError } = require("./errors");

/**
* Realiza una búsqueda de contribuyentes por un término específico y opcionalmente con un offset de paginación.
Expand Down Expand Up @@ -33,67 +33,92 @@ const { CustomError } = require("./errors");
* }
*/
async function getContribuyenteBySearch(search, offset = 0) {
if (
!search ||
search.trim() === "" ||
search.length < MIN_LENGTH ||
search.length > MAX_LENGTH
) {
throw new CustomError(
`El parámetro search es inválido. Debe tener entre ${MIN_LENGTH} y ${MAX_LENGTH} caracteres.`
);
}

if (offset < 0 || isNaN(offset)) {
throw new CustomError(
"El parámetro offset es inválido. Debe ser un número mayor o igual a 0."
);
}

try {
const response = await fetch(
`${URL}/search?search=${encodeURIComponent(search)}&page=${offset}`
);

const contribuyentesJsonResponse = await response.json();

if (response.status !== 200) {
if (response.status === 404) {
throw new CustomError(
"No se encontraron resultados.",
contribuyentesJsonResponse?.message || ""
);
}

if (response.status > 400 && response.status < 500) {
throw new CustomError(
`El parámetro search es inválido. Debe tener entre ${MIN_LENGTH} y ${MAX_LENGTH} caracteres.`,
contribuyentesJsonResponse?.message || ""
);
}

throw new CustomError(
"Ocurrió un error al consultar la API. Por favor, intente nuevamente o Contacta con los desarrolladores.",
contribuyentesJsonResponse?.message || ""
);
}

const contribuyentes = contribuyentesJsonResponse.data?.contribuyentes;

if (contribuyentes?.length === 0) {
throw new CustomError(
"No se encontraron resultados.",
contribuyentesJsonResponse?.message || ""
);
}

return contribuyentes;
} catch (error) {
throw new CustomError(
"Ocurrió un error al consultar la API. Por favor, intente nuevamente o Contacta con los desarrolladores.",
error?.message || error?.toString() || ""
);
}
const trimmedSearch = search?.trim();

if (!trimmedSearch) {
throw new ValidationError(
"El parámetro search es inválido. Debe tener entre 3 y 50 caracteres.",
"No se puede realizar una busqueda con un parametro vacio."
);
}

if (trimmedSearch.length < MIN_LENGTH || trimmedSearch.length > MAX_LENGTH) {
let rule = "";

if (trimmedSearch.length < MIN_LENGTH) {
rule = "No se puede realizar una busqueda con un parametro menor a 3 caracteres.";
}

if (trimmedSearch.length > MAX_LENGTH) {
rule = "No se puede realizar una busqueda con un parametro mayor a 50 caracteres.";
}

throw new ValidationError(
"El parámetro search es inválido. Debe tener entre 3 y 50 caracteres.",
rule
);
}

if (offset < 0 || isNaN(offset)) {
throw new ValidationError(
"El parámetro offset es inválido. Debe ser un número mayor o igual a 0.",
"El cliente envio un offset invalido. Debe ser un numero mayor o igual a 0."
);
}

try {
const response = await fetch(
`${URL}/search?search=${encodeURIComponent(trimmedSearch)}&page=${offset}`
);

const contribuyentesJsonResponse = await response.json();

if (response.status !== 200) {
if (response.status >= 400 && response.status < 500) {
if (response.status === 404) {
throw new ServerError(
"No se encontraron resultados.",
contribuyentesJsonResponse?.message || "",
404,
"NOT_FOUND",
"El servicio no encontro resultados para la busqueda realizada."
);
}

throw new ServerError(
"El parámetro search es inválido. Debe tener entre 3 y 50 caracteres.",
contribuyentesJsonResponse?.message || "",
response.status,
"BAD_REQUEST",
"El cliente envio un parametro invalido."
);
}

throw new ServerError(
"Ocurrió un error al consultar la API. Por favor, intente nuevamente o Contacta con los desarrolladores.",
contribuyentesJsonResponse?.message || "",
response.status,
"INTERNAL_SERVER_ERROR",
"El servicio no pudo procesar la solicitud."
);
}

const contribuyentes = contribuyentesJsonResponse.data?.contribuyentes;

if (contribuyentes?.length === 0) {
throw new ServerError(
"No se encontraron resultados.",
contribuyentesJsonResponse?.message || "",
404,
"NOT_FOUND",
"El servicio no encontro resultados para la busqueda realizada."
);
}

return contribuyentes;
} catch (error) {
throw error;
}
}

/**
Expand Down Expand Up @@ -125,58 +150,71 @@ async function getContribuyenteBySearch(search, offset = 0) {
* }
*/
async function getContribuyenteByRucOrCI(ruc) {
const regex = new RegExp("^\\d{1,8}(?:-\\d+)?$");
if (!ruc || ruc.trim() === "" || !regex.test(ruc)) {
throw new CustomError(
"El parámetro ruc es inválido. Debe tener formato 123456-1 o 123456"
);
}

try {
const response = await fetch(`${URL}/${ruc}`);

const contribuyenteJsonResponse = await response.json();

if (response.status !== 200) {
if (response.status === 404) {
throw new CustomError(
"No se encontraron resultados.",
contribuyenteJsonResponse?.message || ""
);
}

if (response.status > 400 && response.status < 500) {
throw new CustomError(
"El parámetro ruc es inválido. Debe tener formato 12345 o 123456-1",
contribuyenteJsonResponse?.message || ""
);
}

throw new CustomError(
"Ocurrió un error al consultar la API. Por favor, intente nuevamente o Contacta con los desarrolladores.",
contribuyenteJsonResponse?.message || ""
);
}

const contribuyente = contribuyenteJsonResponse.data;

if (!contribuyente) {
throw new CustomError(
"No se encontraron resultados.",
contribuyenteJsonResponse?.message || ""
);
}

return contribuyente;
} catch (error) {
throw new CustomError(
"Ocurrió un error al consultar la API. Por favor, intente nuevamente o Contacta con los desarrolladores.",
error?.message || error?.toString() || ""
);
}
const regex = new RegExp("^\\d{1,8}(?:-\\d+)?$");
if (!ruc || ruc.trim() === "" || !regex.test(ruc)) {
throw new ValidationError(
"El parámetro ruc es inválido. Debe tener formato 12345 o 123456-1"
);
}

try {
const response = await fetch(`${URL}/${ruc}`);

const contribuyenteJsonResponse = await response.json();

if (response.status !== 200) {
const serverErrorMessages = contribuyenteJsonResponse?.message;

if (response.status >= 400 && response.status < 500) {
if (response.status === 404) {
throw new ServerError(
serverErrorMessages || "No se encontraron resultados.",
contribuyenteJsonResponse?.message || "",
404,
"NOT_FOUND",
"El servicio no encontro resultados para la busqueda realizada."
);
}

throw new ServerError(
serverErrorMessages ||
"El parámetro ruc es inválido. Debe tener formato 12345 o 123456-1",
serverErrorMessages || "",
response.status,
"BAD_REQUEST",
"El cliente envio un parametro invalido."
);
}

throw new ServerError(
serverErrorMessages ||
"Ocurrió un error al consultar la API. Por favor, intente nuevamente o Contacta con los desarrolladores.",
serverErrorMessages || "",
response.status,
"INTERNAL_SERVER_ERROR",
"El servicio no pudo procesar la solicitud."
);
}

const contribuyente = contribuyenteJsonResponse.data;

if (!contribuyente) {
throw new ServerError(
serverErrorMessages || "No se encontraron resultados.",
contribuyenteJsonResponse?.message || "",
404,
"NOT_FOUND",
"El servicio no encontro resultados para la busqueda realizada."
);
}

return contribuyente;
} catch (error) {
throw error;
}
}

module.exports = {
getContribuyenteBySearch,
getContribuyenteByRucOrCI,
getContribuyenteBySearch,
getContribuyenteByRucOrCI,
};

0 comments on commit 6e94ff2

Please sign in to comment.