feat(admin-web): add missing proxy routes for ai-diagnostics + feedback pages

- ai-diagnostics: GET/POST /api/ai-diagnostics/* → platform-service /api/ai-diagnostics/*
- feedback: GET/POST/DELETE /api/feedback/* → platform-service /api/feedback/*
- feedback base: GET/POST /api/feedback → platform-service /api/feedback

These pages existed with sidebar items but had no proxy routes, causing 404s.
This commit is contained in:
saravanakumardb1 2026-03-21 21:17:04 -07:00
parent c54a3fe277
commit 880338b79c
3 changed files with 126 additions and 0 deletions

View File

@ -0,0 +1,42 @@
/**
* AI Diagnostics API proxy forwards requests to platform-service.
*
* GET/POST /api/ai-diagnostics/* platform-service /api/ai-diagnostics/*
*/
import { NextRequest, NextResponse } from 'next/server';
import { getCurrentUserFromRequest } from '@/lib/auth-server';
import { logError } from '@/lib/logger';
const PLATFORM_URL = process.env.PLATFORM_SERVICE_URL || 'http://localhost:4003';
async function proxy(req: NextRequest, { params }: { params: Promise<{ path: string[] }> }) {
try {
const caller = await getCurrentUserFromRequest(req);
if (!caller) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
const { path } = await params;
const targetPath = `/api/ai-diagnostics/${path.join('/')}`;
const qs = new URL(req.url).search;
const headers: Record<string, string> = {
'Content-Type': 'application/json',
'x-request-id': req.headers.get('x-request-id') || crypto.randomUUID(),
'x-user-id': caller.id,
'x-product-id': req.headers.get('x-product-id') || process.env.PRODUCT_ID || 'lysnrai',
};
const fetchOptions: RequestInit = { method: req.method, headers };
if (req.method !== 'GET' && req.method !== 'HEAD') fetchOptions.body = await req.text();
const res = await fetch(`${PLATFORM_URL}${targetPath}${qs}`, fetchOptions);
const data = await res.json().catch(() => null);
return NextResponse.json(data ?? { error: res.statusText }, { status: res.status });
} catch (error) {
logError('AI Diagnostics proxy error', error);
return NextResponse.json({ error: 'Service unavailable' }, { status: 502 });
}
}
export async function GET(req: NextRequest, ctx: { params: Promise<{ path: string[] }> }) {
return proxy(req, ctx);
}
export async function POST(req: NextRequest, ctx: { params: Promise<{ path: string[] }> }) {
return proxy(req, ctx);
}

View File

@ -0,0 +1,45 @@
/**
* Feedback API proxy forwards requests to platform-service.
*
* GET/POST/DELETE /api/feedback/* platform-service /api/feedback/*
*/
import { NextRequest, NextResponse } from 'next/server';
import { getCurrentUserFromRequest } from '@/lib/auth-server';
import { logError } from '@/lib/logger';
const PLATFORM_URL = process.env.PLATFORM_SERVICE_URL || 'http://localhost:4003';
async function proxy(req: NextRequest, { params }: { params: Promise<{ path: string[] }> }) {
try {
const caller = await getCurrentUserFromRequest(req);
if (!caller) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
const { path } = await params;
const targetPath = `/api/feedback/${path.join('/')}`;
const qs = new URL(req.url).search;
const headers: Record<string, string> = {
'Content-Type': 'application/json',
'x-request-id': req.headers.get('x-request-id') || crypto.randomUUID(),
'x-user-id': caller.id,
'x-product-id': req.headers.get('x-product-id') || process.env.PRODUCT_ID || 'lysnrai',
};
const fetchOptions: RequestInit = { method: req.method, headers };
if (req.method !== 'GET' && req.method !== 'HEAD') fetchOptions.body = await req.text();
const res = await fetch(`${PLATFORM_URL}${targetPath}${qs}`, fetchOptions);
const data = await res.json().catch(() => null);
return NextResponse.json(data ?? { error: res.statusText }, { status: res.status });
} catch (error) {
logError('Feedback proxy error', error);
return NextResponse.json({ error: 'Service unavailable' }, { status: 502 });
}
}
export async function GET(req: NextRequest, ctx: { params: Promise<{ path: string[] }> }) {
return proxy(req, ctx);
}
export async function POST(req: NextRequest, ctx: { params: Promise<{ path: string[] }> }) {
return proxy(req, ctx);
}
export async function DELETE(req: NextRequest, ctx: { params: Promise<{ path: string[] }> }) {
return proxy(req, ctx);
}

View File

@ -0,0 +1,39 @@
/**
* Feedback base route handles GET /api/feedback.
* Maps to platform-service GET /api/feedback.
*/
import { NextRequest, NextResponse } from 'next/server';
import { getCurrentUserFromRequest } from '@/lib/auth-server';
import { logError } from '@/lib/logger';
const PLATFORM_URL = process.env.PLATFORM_SERVICE_URL || 'http://localhost:4003';
async function proxyBase(req: NextRequest) {
try {
const caller = await getCurrentUserFromRequest(req);
if (!caller) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
const qs = new URL(req.url).search;
const headers: Record<string, string> = {
'Content-Type': 'application/json',
'x-request-id': req.headers.get('x-request-id') || crypto.randomUUID(),
'x-user-id': caller.id,
'x-product-id': req.headers.get('x-product-id') || process.env.PRODUCT_ID || 'lysnrai',
};
const fetchOptions: RequestInit = { method: req.method, headers };
if (req.method !== 'GET' && req.method !== 'HEAD') fetchOptions.body = await req.text();
const res = await fetch(`${PLATFORM_URL}/api/feedback${qs}`, fetchOptions);
const data = await res.json().catch(() => null);
return NextResponse.json(data ?? { error: res.statusText }, { status: res.status });
} catch (error) {
logError('Feedback base proxy error', error);
return NextResponse.json({ error: 'Service unavailable' }, { status: 502 });
}
}
export async function GET(req: NextRequest) {
return proxyBase(req);
}
export async function POST(req: NextRequest) {
return proxyBase(req);
}