Skip to content

Commit

Permalink
lint: se arregla el problemas que tira el lint
Browse files Browse the repository at this point in the history
  • Loading branch information
ramirezsebas committed Feb 3, 2024
1 parent 6bc3582 commit 1e190ea
Show file tree
Hide file tree
Showing 6 changed files with 205 additions and 129 deletions.
4 changes: 2 additions & 2 deletions jest.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,15 @@ const config = {
// collectCoverageFrom: undefined,

// The directory where Jest should output its coverage files
coverageDirectory: "coverage",
coverageDirectory: 'coverage',

// An array of regexp pattern strings used to skip coverage collection
// coveragePathIgnorePatterns: [
// "/node_modules/"
// ],

// Indicates which provider should be used to instrument code for coverage
coverageProvider: "v8",
coverageProvider: 'v8',

// A list of reporter names that Jest uses when writing coverage reports
// coverageReporters: [
Expand Down
4 changes: 2 additions & 2 deletions src/constants.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const URL = "https://turuc.com.py/api/contribuyente";
const URL = 'https://turuc.com.py/api/contribuyente';
const MAX_LENGTH = 50;
const MIN_LENGTH = 3;
module.exports = { URL, MAX_LENGTH, MIN_LENGTH};
module.exports = { URL, MAX_LENGTH, MIN_LENGTH };
121 changes: 61 additions & 60 deletions src/contribuyentes.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
const { URL, MAX_LENGTH, MIN_LENGTH } = require("./constants");
const { ValidationError, ServerError } = require("./errors");
const { URL, MAX_LENGTH, MIN_LENGTH } = require('./constants');
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.
*
* @param {string} search - Término de búsqueda (entre 3 y 50 caracteres).
* @param {number} [offset=0] - Offset de paginación, por defecto es 0.
* @returns {Promise<Array>} - Una promesa que se resuelve con un array de contribuyentes si la búsqueda es exitosa.
* @return {Promise<Array>} - Una promesa que se resuelve con un array de contribuyentes si la búsqueda es exitosa.
*
* Cada contribuyente tiene el siguiente formato:
* {
Expand All @@ -26,6 +26,7 @@ const { ValidationError, ServerError } = require("./errors");
*
* @example
* try {
// eslint-disable-next-line max-len
* const contribuyentes = await getContribuyenteBySearch('término-de-búsqueda', 1);
* console.log(contribuyentes);
* } catch (error) {
Expand All @@ -37,38 +38,38 @@ async function getContribuyenteBySearch(search, offset = 0) {

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."
'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 = "";
let rule = '';

if (trimmedSearch.length < MIN_LENGTH) {
rule = "No se puede realizar una busqueda con un parametro menor a 3 caracteres.";
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.";
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
'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."
'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}`
`${URL}/search?search=${encodeURIComponent(trimmedSearch)}&page=${offset}`,
);

const contribuyentesJsonResponse = await response.json();
Expand All @@ -77,41 +78,41 @@ async function getContribuyenteBySearch(search, offset = 0) {
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."
'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."
'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."
'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."
'No se encontraron resultados.',
contribuyentesJsonResponse?.message || '',
404,
'NOT_FOUND',
'El servicio no encontro resultados para la busqueda realizada.',
);
}

Expand All @@ -125,7 +126,7 @@ async function getContribuyenteBySearch(search, offset = 0) {
* Obtiene información detallada sobre un contribuyente específico a través de su número de RUC o CI.
*
* @param {string} ruc - Número de RUC o CI del contribuyente (^\d{1,8}(?:-\d)?$).
* @returns {Promise<Object>} - Una promesa que se resuelve con un objeto representando la información del contribuyente.
* @return {Promise<Object>} - Una promesa que se resuelve con un objeto representando la información del contribuyente.
*
* El objeto tiene el siguiente formato:
* {
Expand All @@ -150,10 +151,10 @@ 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)) {
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"
'El parámetro ruc es inválido. Debe tener formato 12345 o 123456-1',
);
}

Expand All @@ -168,43 +169,43 @@ async function getContribuyenteByRucOrCI(ruc) {
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."
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."
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."
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."
serverErrorMessages || 'No se encontraron resultados.',
contribuyenteJsonResponse?.message || '',
404,
'NOT_FOUND',
'El servicio no encontro resultados para la busqueda realizada.',
);
}

Expand Down
91 changes: 83 additions & 8 deletions src/errors.js
Original file line number Diff line number Diff line change
@@ -1,42 +1,113 @@
/**
* Clase de error personalizada que representa un error de validación.
* @class ValidationError
* @extends Error
* @param {string} message - El mensaje de error que describe la falla de validación.
* @param {string} rule - La regla de validación específica que falló.
*/
class ValidationError extends Error {
constructor(message,rule) {
/**
* Crea una instancia de ValidationError.
* @param {string} message - El mensaje de error que describe la falla de validación.
* @param {string} rule - La regla de validación específica que falló.
* @constructor
*/
constructor(message, rule) {
super(message);
/**
* El nombre de la clase de error.
* @member {string}
*/
this.name = this.constructor.name;
/**
* La regla de validación específica que falló.
* @member {string}
*/
this.rule = rule;
Error.captureStackTrace(this, this.constructor);
}

/**
* Convierte el objeto de error a una representación JSON.
* @return {Object} - Representación JSON del error.
*/
toJSON() {
return {
name: this.name,
message: this.message,
stack: this.stack,
rule: this.rule,
};
}

/**
* Convierte el objeto de error a una cadena JSON.
* @return {string} - Representación en cadena JSON del error.
*/
toString() {
return JSON.stringify(this.toJSON());
}
}

/**
* Clase de error personalizada que representa un error en el lado del servidor.
* @class ServerError
* @extends Error
* @param {string} message - El mensaje de error que describe el error del lado del servidor.
* @param {string} serverMessage - El mensaje de error específico del servidor.
* @param {number} [statusCode=500] - El código de estado HTTP asociado con el error.
* @param {string} [errorCode] - Un código de error opcional para identificar el tipo de error.
* @param {string} [debugMessage] - Un mensaje de depuración opcional para el modo de desarrollo.
*/
class ServerError extends Error {
constructor(
message,
serverMessage,
statusCode = 500,
errorCode,
debugMessage
) {
/**
* Crea una instancia de ServerError.
* @param {string} message - El mensaje de error que describe el error del lado del servidor.
* @param {string} serverMessage - El mensaje de error específico del servidor.
* @param {number} [statusCode=500] - El código de estado HTTP asociado con el error.
* @param {string} [errorCode] - Un código de error opcional para identificar el tipo de error.
* @param {string} [debugMessage] - Un mensaje de depuración opcional para el modo de desarrollo.
* @constructor
*/
constructor(message, serverMessage, statusCode = 500, errorCode, debugMessage) {
super(message);
/**
* El nombre de la clase de error.
* @member {string}
*/
this.name = this.constructor.name;
/**
* El mensaje de error específico del servidor.
* @member {string}
*/
this.serverMessage = serverMessage;
/**
* El código de estado HTTP asociado con el error.
* @member {number}
*/
this.statusCode = statusCode;
/**
* Un código de error opcional para identificar el tipo de error.
* @member {string}
*/
this.errorCode = errorCode;
/**
* La marca de tiempo cuando ocurrió el error.
* @member {string}
*/
this.timestamp = new Date().toISOString();
/**
* Un mensaje de depuración opcional para el modo de desarrollo.
* @member {string}
*/
this.debugMessage = debugMessage;
Error.captureStackTrace(this, this.constructor);
}

/**
* Convierte el objeto de error a una representación JSON.
* @return {Object} - Representación JSON del error.
*/
toJSON() {
return {
name: this.name,
Expand All @@ -50,6 +121,10 @@ class ServerError extends Error {
};
}

/**
* Convierte el objeto de error a una cadena JSON.
* @return {string} - Representación en cadena JSON del error.
*/
toString() {
return JSON.stringify(this.toJSON());
}
Expand Down
10 changes: 5 additions & 5 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
const {
getContribuyenteBySearch,
getContribuyenteByRucOrCI,
} = require("./contribuyentes");
getContribuyenteBySearch,
getContribuyenteByRucOrCI,
} = require('./contribuyentes');

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

0 comments on commit 1e190ea

Please sign in to comment.