feat: fill missing product pages and analytics proxy
This commit is contained in:
58
platform/web/app/api/analytics/[...path]/route.ts
Normal file
58
platform/web/app/api/analytics/[...path]/route.ts
Normal file
@@ -0,0 +1,58 @@
|
||||
import { NextResponse } from 'next/server';
|
||||
|
||||
const ANALYTICS_BACKEND = process.env.ANALYTICS_BACKEND_URL || 'http://127.0.0.1:8000';
|
||||
|
||||
export const dynamic = 'force-dynamic';
|
||||
|
||||
type RouteContext = {
|
||||
params: Promise<{ path: string[] }>;
|
||||
};
|
||||
|
||||
function buildBackendUrl(request: Request, path: string[]): string | null {
|
||||
if (!path.length || path.some((segment) => !segment || segment.includes('..'))) {
|
||||
return null;
|
||||
}
|
||||
const source = new URL(request.url);
|
||||
const target = new URL(`/analytics/${path.map(encodeURIComponent).join('/')}`, ANALYTICS_BACKEND);
|
||||
target.search = source.search;
|
||||
return target.toString();
|
||||
}
|
||||
|
||||
async function proxyAnalytics(request: Request, context: RouteContext, method: 'GET' | 'POST') {
|
||||
const { path } = await context.params;
|
||||
const backendUrl = buildBackendUrl(request, path);
|
||||
if (!backendUrl) {
|
||||
return NextResponse.json({ message: '分析 API 路徑不合法' }, { status: 400 });
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await fetch(backendUrl, {
|
||||
method,
|
||||
cache: 'no-store',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: method === 'POST' ? await request.text() : undefined,
|
||||
});
|
||||
|
||||
const contentType = response.headers.get('content-type') || '';
|
||||
if (contentType.includes('application/json')) {
|
||||
const data = await response.json();
|
||||
return NextResponse.json(data, { status: response.status });
|
||||
}
|
||||
|
||||
const text = await response.text();
|
||||
return NextResponse.json({ message: text || '分析服務暫時無法回應' }, { status: response.status });
|
||||
} catch (error) {
|
||||
const message = error instanceof Error ? error.message : '分析服務暫時無法連線';
|
||||
return NextResponse.json({ message }, { status: 502 });
|
||||
}
|
||||
}
|
||||
|
||||
export async function GET(request: Request, context: RouteContext) {
|
||||
return proxyAnalytics(request, context, 'GET');
|
||||
}
|
||||
|
||||
export async function POST(request: Request, context: RouteContext) {
|
||||
return proxyAnalytics(request, context, 'POST');
|
||||
}
|
||||
Reference in New Issue
Block a user