openrag/frontend/src/app/api/[...path]/route.ts
2025-08-01 10:12:39 -04:00

92 lines
No EOL
2.5 KiB
TypeScript

import { NextRequest, NextResponse } from 'next/server';
export async function GET(
request: NextRequest,
{ params }: { params: Promise<{ path: string[] }> }
) {
return proxyRequest(request, await params);
}
export async function POST(
request: NextRequest,
{ params }: { params: Promise<{ path: string[] }> }
) {
return proxyRequest(request, await params);
}
export async function PUT(
request: NextRequest,
{ params }: { params: Promise<{ path: string[] }> }
) {
return proxyRequest(request, await params);
}
export async function DELETE(
request: NextRequest,
{ params }: { params: Promise<{ path: string[] }> }
) {
return proxyRequest(request, await params);
}
export async function PATCH(
request: NextRequest,
{ params }: { params: Promise<{ path: string[] }> }
) {
return proxyRequest(request, await params);
}
async function proxyRequest(
request: NextRequest,
params: { path: string[] }
) {
const backendHost = process.env.GENDB_BACKEND_HOST || 'localhost';
const path = params.path.join('/');
const searchParams = request.nextUrl.searchParams.toString();
const backendUrl = `http://${backendHost}:8000/${path}${searchParams ? `?${searchParams}` : ''}`;
try {
const body = request.method !== 'GET' && request.method !== 'HEAD'
? await request.text()
: undefined;
const headers = new Headers();
// Copy relevant headers from the original request
for (const [key, value] of request.headers.entries()) {
if (!key.toLowerCase().startsWith('host') &&
!key.toLowerCase().startsWith('x-forwarded') &&
!key.toLowerCase().startsWith('x-real-ip')) {
headers.set(key, value);
}
}
const response = await fetch(backendUrl, {
method: request.method,
headers,
body,
});
const responseBody = await response.text();
const responseHeaders = new Headers();
// Copy response headers
for (const [key, value] of response.headers.entries()) {
if (!key.toLowerCase().startsWith('transfer-encoding') &&
!key.toLowerCase().startsWith('connection')) {
responseHeaders.set(key, value);
}
}
return new NextResponse(responseBody, {
status: response.status,
statusText: response.statusText,
headers: responseHeaders,
});
} catch (error) {
console.error('Proxy error:', error);
return NextResponse.json(
{ error: 'Failed to proxy request' },
{ status: 500 }
);
}
}