cambios en el crear producto y en el refresh token

This commit is contained in:
2025-08-14 15:38:10 -04:00
parent 854b31f594
commit 6a28e141a9
19 changed files with 278 additions and 400 deletions

View File

@@ -1,19 +1,18 @@
'use server';
import { env } from '@/lib/env'; // Importamos la configuración de entorno validada
import { env } from '@/lib/env';
import axios from 'axios';
import { z } from 'zod';
// Crear instancia de Axios con la URL base validada
const fetchApi = axios.create({
baseURL: env.API_URL, // Aquí usamos env.API_URL en vez de process.env.BACKEND_URL
// No establecer Content-Type aquí. Axios lo manejará automáticamente con FormData.
baseURL: env.API_URL,
});
// Interceptor para incluir el token automáticamente en las peticiones
// ESTE INTERCEPTOR ESTÁ BIEN PARA EL RESTO DE LAS PETICIONES AUTENTICADAS
fetchApi.interceptors.request.use(async (config: any) => {
try {
// Importación dinámica para evitar la referencia circular
const { auth } = await import('@/lib/auth');
const { auth } = await import('@/lib/auth'); // Importación dinámica
const session = await auth();
const token = session?.access_token;
@@ -22,44 +21,35 @@ fetchApi.interceptors.request.use(async (config: any) => {
}
// **Importante:** Si el body es FormData, elimina el Content-Type para que Axios lo configure automáticamente.
// Esto es necesario porque 'multipart/form-data' requiere un 'boundary' que Axios añade.
if (config.data instanceof FormData) {
delete config.headers['Content-Type'];
} else {
// Para otros tipos de datos, asegura que el Content-Type sea 'application/json'
config.headers['Content-Type'] = 'application/json';
}
return config;
} catch (error) {
console.error('Error getting auth token:', error);
console.error('Error al obtener el token de autenticación para el interceptor:', error);
// IMPORTANTE: Si ocurre un error aquí, es mejor rechazar la promesa
// para que la solicitud no se envíe sin autorización.
return Promise.reject(error);
}
return config;
});
/**
* Función para hacer peticiones con validación de respuesta
* @param schema - Esquema de Zod para validar la respuesta
* @param url - Endpoint a consultar
* @param method - Método HTTP (GET, POST, PUT, PATCH, DELETE)
* @param data - Datos a enviar (puede ser un objeto JSON o FormData para archivos)
* @returns [error, data] -> Devuelve el error como objeto estructurado si hay fallo, o los datos validados
*/
// safeFetchApi sigue siendo útil para el resto de las llamadas que requieren autenticación
export const safeFetchApi = async <T extends z.ZodSchema<any>>(
schema: T,
url: string,
method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' = 'GET',
data?: any, // Renombrado a 'data' para mayor claridad y consistencia con Axios
data?: any,
): Promise<
[{ type: string; message: string; details?: any } | null, z.infer<T> | null]
> => {
try {
console.log(url,method,data);
const response = await fetchApi({
method,
url,
data, // Axios usa 'data' para el body de POST/PUT/PATCH
data,
});
const parsed = schema.safeParse(response.data);