diff --git a/apps/web/src/app/api/internal/node/[nodeId]/swapper/route.ts b/apps/web/src/app/api/internal/node/[nodeId]/swapper/route.ts new file mode 100644 index 00000000..a5664a8c --- /dev/null +++ b/apps/web/src/app/api/internal/node/[nodeId]/swapper/route.ts @@ -0,0 +1,44 @@ +import { NextResponse } from 'next/server'; + +const CITY_SERVICE_URL = + process.env.INTERNAL_API_URL || + process.env.CITY_SERVICE_URL || + 'http://daarion-city-service:7001'; + +export async function GET( + _request: Request, + { params }: { params: { nodeId: string } } +) { + const nodeId = params?.nodeId; + + if (!nodeId) { + return NextResponse.json( + { error: 'nodeId is required' }, + { status: 400 } + ); + } + + try { + const upstream = await fetch( + `${CITY_SERVICE_URL}/city/internal/node/${encodeURIComponent(nodeId)}/swapper`, + { + cache: 'no-store', + headers: { + 'content-type': 'application/json', + }, + } + ); + + const payload = await upstream.json(); + return NextResponse.json(payload, { status: upstream.status }); + } catch (error) { + return NextResponse.json( + { + error: 'Failed to fetch swapper data', + details: error instanceof Error ? error.message : String(error), + }, + { status: 500 } + ); + } +} + diff --git a/apps/web/src/components/node-dashboard/NodeSwapperCard.tsx b/apps/web/src/components/node-dashboard/NodeSwapperCard.tsx index 99710ceb..64156eda 100644 --- a/apps/web/src/components/node-dashboard/NodeSwapperCard.tsx +++ b/apps/web/src/components/node-dashboard/NodeSwapperCard.tsx @@ -10,6 +10,13 @@ interface NodeSwapperCardProps { export function NodeSwapperCard({ nodeId }: NodeSwapperCardProps) { const { swapper, isLoading, error, mutate } = useNodeSwapper(nodeId); const [isExpanded, setIsExpanded] = useState(false); + const hasData = Boolean(swapper); + const summary = swapper ?? { + healthy: false, + models_loaded: 0, + models_total: 0, + models: [], + }; if (isLoading) { return ( @@ -35,8 +42,6 @@ export function NodeSwapperCard({ nodeId }: NodeSwapperCardProps) { ); } - if (!swapper) return null; - return (
No models found
) : ( - swapper.models.map((model, idx) => ( + summary.models.map((model, idx) => (