contifico
Version:
Un módulo en desarrollo para interactuar con la API de Contífico, diseñado para facilitar la integración y el manejo de los endpoints disponibles. Actualmente, el módulo proporciona métodos para la gestión de productos, permitiendo consultar productos por
96 lines (85 loc) • 2.87 kB
JavaScript
import axios from 'axios'
// Constantes para configuración
const CONFIG = {
BASE_URL: 'https://api.contifico.com/sistema/api/v1',
TIMEOUT: 1000000, // Timeout de 1000 segundos
HEADERS: {
'Content-Type': 'application/json',
Accept: 'application/json'
}
}
// Mensajes de estado en un objeto congelado para prevenir modificaciones
const STATUS_MESSAGES = Object.freeze({
200: 'Ejecución Correcta: Devuelto al ejecutar correctamente una consulta',
201: 'Objeto Creado: Devuelto al crear un objeto nuevo',
400: 'Solicitud Incorrecta: El requerimiento es incorrecto',
401: 'No Autorizado: No se ha proporcionado las credenciales o son incorrectas',
403: 'Acceso Denegado: No se tiene permiso para entrar al recurso',
404: 'No Encontrado: El objeto que se trata de consultar no existe',
500: 'Error Interno: Error interno del sistema'
})
// Clase para manejar errores personalizados
class ApiError extends Error {
constructor (status, message) {
super(message)
this.status = status
this.name = 'ApiError'
}
}
// Crear instancia de axios con configuración
const createApi = ({ apiKey }) => {
const api = axios.create({
baseURL: CONFIG.BASE_URL,
timeout: CONFIG.TIMEOUT,
headers: {
...CONFIG.HEADERS,
Authorization: apiKey
}
})
// Función para manejar errores
const handleError = (error) => {
if (error.response) {
const status = error.response.status
const message = `⛔ ${STATUS_MESSAGES[status] || 'Error desconocido'}`
throw new ApiError(status, message)
}
throw new ApiError(0, 'Error de red o problema al conectar con el servidor')
}
// Función para manejar respuestas exitosas
const handleSuccess = (response) => {
const message = STATUS_MESSAGES[response.status]
if (process.env.NODE_ENV === 'development') {
console.log(`✅ ${message}`)
}
return response
}
// Interceptores
api.interceptors.request.use(
(config) => {
// Validar token antes de hacer la petición
if (!config.headers.Authorization) {
throw new ApiError(401, STATUS_MESSAGES[401])
}
return config
},
(error) => Promise.reject(error)
)
api.interceptors.response.use(handleSuccess, handleError)
// Función de reintento automático
api.retry = async (request, maxRetries = 3) => {
for (let i = 0; i < maxRetries; i++) {
try {
return await request()
} catch (error) {
if (i === maxRetries - 1) throw error
if (error.status === 429) { // Too Many Requests
await new Promise(resolve => setTimeout(resolve, 1000 * (i + 1))) // Espera exponencial
continue
}
throw error
}
}
}
return api
}
export default createApi