trello_fake/app/api/dolibarr/[...path]/route.ts

275 lines
7.2 KiB
TypeScript

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',
},
// Cache durante 60 segundos
next: { revalidate: 60 }
});
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 }
);
}
}