services.ts•4.99 kB
import { Pagination, Pedido, Producto, Size } from "../interfaces/models.js";
// Variables de entorno para autenticación
export const API_EMAIL = process.env.API_EMAIL || '';
export const API_PASSWORD = process.env.API_PASSWORD || '';
export const API_BASE_URL = process.env.API_BASE_URL || '';
/**
* Autentica con la API y obtiene el token JWT
*/
export const authenticate = async(): Promise<string | null> => {
let authToken = '';
try {
console.log("🔐 Iniciando autenticación...");
const response = await fetch(`${API_BASE_URL}/user/login`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
email: API_EMAIL,
password: API_PASSWORD
})
});
if (response.ok) {
// Extraer token de las cookies
const cookies = response.headers.get('set-cookie');
if (cookies) {
const tokenMatch = cookies.match(/access_token=([^;]+)/);
if (tokenMatch) {
authToken = tokenMatch[1];
console.log("✅ Autenticación exitosa");
return authToken;
}
}
// Si no hay cookies, intentar obtener del body
try {
const data = await response.json();
if (data.token) {
authToken = data.token;
console.log("✅ Autenticación exitosa");
return authToken;
}
} catch (e) {
// Ignorar errores de parsing JSON
}
console.error("❌ Token no encontrado en la respuesta");
return null;
} else {
console.error(`❌ Error en autenticación: ${response.status}`);
return null;
}
} catch (error) {
console.error(`❌ Error durante autenticación: ${error}`);
return null;
}
}
/**
* Obtiene todos los productos activos
*/
export const fetchGetProductos = async(authToken: string): Promise<Producto[]> => {
try {
console.log("🛍️ Obteniendo productos...");
const response = await fetch(`${API_BASE_URL}/api/products?estatus=ACTIVO`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Cookie': `access_token=${authToken}`
}
});
if (response.ok) {
const productos = await response.json();
console.log(`✅ Obtenidos ${productos.length || 0} productos`);
return productos || [];
} else {
console.error(`❌ Error obteniendo productos: ${response.status}`);
return [];
}
} catch (error) {
console.error(`❌ Error obteniendo productos: ${error}`);
return [];
}
}
/**
* Obtiene todos los tamaños disponibles
*/
export const fetchGetSizes =async(authToken: string): Promise<Size[]> => {
try {
console.log("📏 Obteniendo tamaños...");
const response = await fetch(`${API_BASE_URL}/api/sizes`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Cookie': `access_token=${authToken}`
}
});
if (response.ok) {
const sizes = await response.json();
console.log(`✅ Obtenidos ${sizes.length || 0} tamaños`);
return sizes || [];
} else {
console.error(`❌ Error obteniendo tamaños: ${response.status}`);
return [];
}
} catch (error) {
console.error(`❌ Error obteniendo tamaños: ${error}`);
return [];
}
}
/**
* Obtiene todos los tamaños disponibles
*/
export const fetchGetPedidos =async(authToken: string,
statusFilter:string,dateInit:string | null, dateEnd:String | null, pagination:Pagination
): Promise<Pedido[]> => {
try {
console.log("📏 Obteniendo pedidos...");
const response = await fetch(`${API_BASE_URL}/api/pedidos?`+
`estatus=${statusFilter}&pageSize=${pagination.pageSize}`+
(dateInit?`&fechaInicio=${dateInit}`:'')+
(dateEnd?`&fechaFin=${dateEnd}`:''), {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Cookie': `access_token=${authToken}`
}
});
if (response.ok) {
const pedidos = await response.json();
console.log(`✅ Obtenidos ${pedidos.length || 0} pedidos`);
return pedidos || [];
} else {
console.error(`❌ Error obteniendo pedidos: ${response.status}`);
return [];
}
} catch (error) {
console.error(`❌ Error obteniendo pedidos: ${error}`);
return [];
}
}