diff --git a/apps/web/src/app/api/assets/upload/route.ts b/apps/web/src/app/api/assets/upload/route.ts index ae1ba6f4..7b1e18b7 100644 --- a/apps/web/src/app/api/assets/upload/route.ts +++ b/apps/web/src/app/api/assets/upload/route.ts @@ -7,24 +7,54 @@ const CITY_SERVICE_URL = export async function POST(request: NextRequest) { try { - const formData = await request.formData(); + // Read the original form data + const incomingFormData = await request.formData(); + + // Create new FormData for upstream request + const upstreamFormData = new FormData(); + + // Copy all fields + for (const [key, value] of incomingFormData.entries()) { + if (value instanceof File) { + // For files, we need to create a new Blob + const arrayBuffer = await value.arrayBuffer(); + const blob = new Blob([arrayBuffer], { type: value.type }); + upstreamFormData.append(key, blob, value.name); + } else { + upstreamFormData.append(key, value); + } + } + + console.log('[upload] Proxying to:', `${CITY_SERVICE_URL}/city/assets/upload`); + console.log('[upload] Fields:', [...incomingFormData.keys()]); const upstream = await fetch(`${CITY_SERVICE_URL}/city/assets/upload`, { method: 'POST', - body: formData, + body: upstreamFormData, }); + const responseText = await upstream.text(); + console.log('[upload] Response status:', upstream.status); + console.log('[upload] Response body:', responseText.substring(0, 500)); + if (!upstream.ok) { - const errorText = await upstream.text(); return NextResponse.json( - { error: 'Upload failed', details: errorText }, + { error: 'Upload failed', details: responseText }, { status: upstream.status } ); } - const data = await upstream.json(); - return NextResponse.json(data, { status: 200 }); + try { + const data = JSON.parse(responseText); + return NextResponse.json(data, { status: 200 }); + } catch { + return NextResponse.json( + { error: 'Invalid response from server', details: responseText }, + { status: 500 } + ); + } } catch (error) { + console.error('[upload] Error:', error); return NextResponse.json( { error: 'Upload failed', 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 index c61def3b..d0c89082 100644 --- a/apps/web/src/app/api/internal/node/[nodeId]/swapper/route.ts +++ b/apps/web/src/app/api/internal/node/[nodeId]/swapper/route.ts @@ -5,6 +5,15 @@ const CITY_SERVICE_URL = process.env.CITY_SERVICE_URL || 'http://daarion-city-service:7001'; +// Fallback response when swapper data is unavailable +const fallbackResponse = (nodeId: string) => ({ + node_id: nodeId, + healthy: false, + models_loaded: 0, + models_total: 0, + models: [], +}); + export async function GET( _request: NextRequest, { params }: { params: Promise<{ nodeId: string }> } @@ -19,26 +28,30 @@ export async function GET( } try { - const upstream = await fetch( - `${CITY_SERVICE_URL}/city/internal/node/${encodeURIComponent(nodeId)}/swapper`, - { - cache: 'no-store', - headers: { - 'content-type': 'application/json', - }, - } - ); + const url = `${CITY_SERVICE_URL}/city/internal/node/${encodeURIComponent(nodeId)}/swapper`; + console.log('[swapper] Fetching:', url); + + const upstream = await fetch(url, { + cache: 'no-store', + headers: { + 'content-type': 'application/json', + }, + }); + + console.log('[swapper] Response status:', upstream.status); + + if (!upstream.ok) { + // Return fallback instead of error + console.log('[swapper] Upstream not ok, returning fallback'); + return NextResponse.json(fallbackResponse(nodeId), { status: 200 }); + } const payload = await upstream.json(); - return NextResponse.json(payload, { status: upstream.status }); + return NextResponse.json(payload, { status: 200 }); } catch (error) { - return NextResponse.json( - { - error: 'Failed to fetch swapper data', - details: error instanceof Error ? error.message : String(error), - }, - { status: 500 } - ); + // Return fallback instead of error + console.error('[swapper] Error:', error); + return NextResponse.json(fallbackResponse(nodeId), { status: 200 }); } } diff --git a/apps/web/src/components/node-dashboard/NodeSwapperCard.tsx b/apps/web/src/components/node-dashboard/NodeSwapperCard.tsx index 64156eda..34b7460d 100644 --- a/apps/web/src/components/node-dashboard/NodeSwapperCard.tsx +++ b/apps/web/src/components/node-dashboard/NodeSwapperCard.tsx @@ -27,20 +27,8 @@ export function NodeSwapperCard({ nodeId }: NodeSwapperCardProps) { ); } - if (error) { - return ( -
Failed to load swapper details.
- -