import { NextRequest, NextResponse } from 'next/server'; /** * API Route proxy para Dolibarr * Protege la API key manteniéndola en el servidor */ export async function GET( request: NextRequest, { params }: { params: Promise<{ path: string[] }> } ) { try { // Await params en Next.js 16 const resolvedParams = await params; // Construir el endpoint desde los parámetros de ruta const endpoint = resolvedParams.path.join('/'); // Obtener API key y URL del servidor (sin NEXT_PUBLIC_) const apiUrl = process.env.DOLIBARR_API_URL || process.env.NEXT_PUBLIC_API_URL; const apiKey = process.env.DOLIBARR_API_KEY || process.env.NEXT_PUBLIC_DOLIBARR_API_KEY; if (!apiUrl || !apiKey) { console.error('Missing Dolibarr configuration'); return NextResponse.json( { error: 'Server configuration error' }, { status: 500 } ); } // Construir URL completa const url = `${apiUrl}/${endpoint}?DOLAPIKEY=${apiKey}`; // Realizar la petición a Dolibarr const response = await fetch(url, { method: 'GET', headers: { 'Accept': 'application/json', }, // Sin cache en servidor para evitar datos antiguos cache: 'no-store' }); if (!response.ok) { const errorText = await response.text(); console.error('Dolibarr API error:', response.status, errorText); return NextResponse.json( { error: 'Error al comunicarse con Dolibarr', details: errorText }, { status: response.status } ); } const data = await response.json(); return NextResponse.json(data); } catch (error) { console.error('Error in Dolibarr API route:', error); return NextResponse.json( { error: 'Internal server error' }, { status: 500 } ); } } /** * Método POST para crear recursos en Dolibarr */ export async function POST( request: NextRequest, { params }: { params: Promise<{ path: string[] }> } ) { try { // Await params en Next.js 16 const resolvedParams = await params; const endpoint = resolvedParams.path.join('/'); const body = await request.json(); const apiUrl = process.env.DOLIBARR_API_URL || process.env.NEXT_PUBLIC_API_URL; const apiKey = process.env.DOLIBARR_API_KEY || process.env.NEXT_PUBLIC_DOLIBARR_API_KEY; if (!apiUrl || !apiKey) { return NextResponse.json( { error: 'Server configuration error' }, { status: 500 } ); } const url = `${apiUrl}/${endpoint}?DOLAPIKEY=${apiKey}`; const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', }, body: JSON.stringify(body), }); const responseText = await response.text(); if (!response.ok) { console.error('Dolibarr API error:', response.status, responseText); // Intentar parsear como JSON para obtener detalles del error let errorDetails = responseText; try { const errorJson = JSON.parse(responseText); errorDetails = errorJson.error?.message || errorJson.error || responseText; } catch { // Mantener el texto original si no es JSON } return NextResponse.json( { error: errorDetails }, { status: response.status } ); } // Parsear respuesta exitosa let data; try { data = JSON.parse(responseText); } catch { data = responseText; } return NextResponse.json(data); } catch (error) { console.error('Error in Dolibarr API route:', error); return NextResponse.json( { error: 'Internal server error' }, { status: 500 } ); } } /** * Método PUT para actualizar recursos en Dolibarr */ export async function PUT( request: NextRequest, { params }: { params: Promise<{ path: string[] }> } ) { try { const resolvedParams = await params; const endpoint = resolvedParams.path.join('/'); const body = await request.json(); const apiUrl = process.env.DOLIBARR_API_URL || process.env.NEXT_PUBLIC_API_URL; const apiKey = process.env.DOLIBARR_API_KEY || process.env.NEXT_PUBLIC_DOLIBARR_API_KEY; if (!apiUrl || !apiKey) { return NextResponse.json( { error: 'Server configuration error' }, { status: 500 } ); } const url = `${apiUrl}/${endpoint}?DOLAPIKEY=${apiKey}`; const response = await fetch(url, { method: 'PUT', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', }, body: JSON.stringify(body), }); const responseText = await response.text(); if (!response.ok) { console.error('Dolibarr API error:', response.status, responseText); let errorDetails = responseText; try { const errorJson = JSON.parse(responseText); errorDetails = errorJson.error?.message || errorJson.error || responseText; } catch { // Mantener el texto original si no es JSON } return NextResponse.json( { error: errorDetails }, { status: response.status } ); } let data; try { data = JSON.parse(responseText); } catch { data = responseText; } return NextResponse.json(data); } catch (error) { console.error('Error in Dolibarr API route:', error); return NextResponse.json( { error: 'Internal server error' }, { status: 500 } ); } } /** * Método DELETE para eliminar recursos en Dolibarr */ export async function DELETE( request: NextRequest, { params }: { params: Promise<{ path: string[] }> } ) { try { const resolvedParams = await params; const endpoint = resolvedParams.path.join('/'); const apiUrl = process.env.DOLIBARR_API_URL || process.env.NEXT_PUBLIC_API_URL; const apiKey = process.env.DOLIBARR_API_KEY || process.env.NEXT_PUBLIC_DOLIBARR_API_KEY; if (!apiUrl || !apiKey) { return NextResponse.json( { error: 'Server configuration error' }, { status: 500 } ); } const url = `${apiUrl}/${endpoint}?DOLAPIKEY=${apiKey}`; const response = await fetch(url, { method: 'DELETE', headers: { 'Accept': 'application/json', }, }); if (!response.ok) { const responseText = await response.text(); console.error('Dolibarr API error:', response.status, responseText); let errorDetails = responseText; try { const errorJson = JSON.parse(responseText); errorDetails = errorJson.error?.message || errorJson.error || responseText; } catch { // Mantener el texto original si no es JSON } return NextResponse.json( { error: errorDetails }, { status: response.status } ); } // DELETE suele devolver vacío o el ID eliminado const responseText = await response.text(); let data; try { data = responseText ? JSON.parse(responseText) : { success: true }; } catch { data = { success: true }; } return NextResponse.json(data); } catch (error) { console.error('Error in Dolibarr API route:', error); return NextResponse.json( { error: 'Internal server error' }, { status: 500 } ); } }