Files
anil-matcha--open-generativ…/app/api/v1/creative-agent/[[...path]]/route.js
T
2026-07-13 13:02:44 +08:00

123 lines
4.3 KiB
JavaScript

import { NextResponse } from 'next/server';
const MUAPI_BASE = 'https://api.muapi.ai';
function getApiKey(request) {
const authHeader = request.headers.get('Authorization');
if (authHeader && authHeader.startsWith('Bearer ')) {
return authHeader.substring(7);
}
const headerKey = request.headers.get('x-api-key');
if (headerKey) return headerKey;
// Cookie-based auth removed for security: no HttpOnly flag exposes key to XSS (CWE-522)
return null;
}
function cleanHeaders(request) {
const headers = new Headers(request.headers);
headers.delete('host');
headers.delete('connection');
headers.delete('cookie');
headers.delete('Authorization');
headers.delete('x-api-key');
return headers;
}
export async function GET(request, { params }) {
const slug = await params;
const pathSegments = slug.path || [];
const path = pathSegments.join('/');
const { search } = new URL(request.url);
const targetUrl = `${MUAPI_BASE}/api/v1/creative-agent/${path}${search}`;
const headers = cleanHeaders(request);
const apiKey = getApiKey(request);
// NOTE: credential logging removed for security (CWE-200)
if (apiKey) headers.set('x-api-key', apiKey);
try {
const response = await fetch(targetUrl, { headers, method: 'GET' });
const data = await response.json();
return NextResponse.json(data, { status: response.status });
} catch (error) {
console.error(`[creative-agent proxy GET ERROR] ${targetUrl}:`, error.message);
return NextResponse.json({ error: error.message }, { status: 500 });
}
}
export async function POST(request, { params }) {
const slug = await params;
const pathSegments = slug.path || [];
const path = pathSegments.join('/');
const { search } = new URL(request.url);
const targetUrl = `${MUAPI_BASE}/api/v1/creative-agent/${path}${search}`;
const headers = cleanHeaders(request);
const apiKey = getApiKey(request);
// NOTE: credential logging removed for security (CWE-200)
if (apiKey) headers.set('x-api-key', apiKey);
try {
const body = await request.arrayBuffer();
const response = await fetch(targetUrl, { method: 'POST', headers, body });
const data = await response.json();
return NextResponse.json(data, { status: response.status });
} catch (error) {
console.error(`[creative-agent proxy POST ERROR] ${targetUrl}:`, error.message);
return NextResponse.json({ error: error.message }, { status: 500 });
}
}
export async function PATCH(request, { params }) {
const slug = await params;
const pathSegments = slug.path || [];
const path = pathSegments.join('/');
const { search } = new URL(request.url);
const targetUrl = `${MUAPI_BASE}/api/v1/creative-agent/${path}${search}`;
const headers = cleanHeaders(request);
const apiKey = getApiKey(request);
// NOTE: credential logging removed for security (CWE-200)
if (apiKey) headers.set('x-api-key', apiKey);
try {
const body = await request.arrayBuffer();
const response = await fetch(targetUrl, { method: 'PATCH', headers, body });
const data = await response.json();
return NextResponse.json(data, { status: response.status });
} catch (error) {
console.error(`[creative-agent proxy PATCH ERROR] ${targetUrl}:`, error.message);
return NextResponse.json({ error: error.message }, { status: 500 });
}
}
export async function DELETE(request, { params }) {
const slug = await params;
const pathSegments = slug.path || [];
const path = pathSegments.join('/');
const { search } = new URL(request.url);
const targetUrl = `${MUAPI_BASE}/api/v1/creative-agent/${path}${search}`;
const headers = cleanHeaders(request);
const apiKey = getApiKey(request);
// NOTE: credential logging removed for security (CWE-200)
if (apiKey) headers.set('x-api-key', apiKey);
try {
const response = await fetch(targetUrl, { method: 'DELETE', headers });
const data = await response.json();
return NextResponse.json(data, { status: response.status });
} catch (error) {
console.error(`[creative-agent proxy DELETE ERROR] ${targetUrl}:`, error.message);
return NextResponse.json({ error: error.message }, { status: 500 });
}
}