feat: add unified API proxy layer, debug endpoint, and systemd service for node-guardian

This commit is contained in:
Apple
2025-12-01 03:43:06 -08:00
parent b3e3c6417d
commit 1a81cf75f1
3 changed files with 150 additions and 0 deletions

View File

@@ -0,0 +1,16 @@
import { NextResponse } from 'next/server';
import { getApiConfig } from '@/lib/apiProxy';
/**
* Debug endpoint to check API configuration
* GET /api/_debug/api-config
*/
export async function GET() {
const config = getApiConfig();
return NextResponse.json({
...config,
timestamp: new Date().toISOString(),
});
}

View File

@@ -0,0 +1,111 @@
/**
* Unified API Proxy Layer for DAARION.city
*
* Provides consistent access to backend services:
* - city-service (main API)
* - dagi-router (AI routing)
* - swapper-service (model management)
*/
// Environment configuration
const CITY_API_BASE_URL = process.env.INTERNAL_API_URL || process.env.CITY_SERVICE_URL || 'http://daarion-city-service:7001';
const DAGI_ROUTER_API_URL = process.env.DAGI_ROUTER_API_URL || 'http://dagi-router:9102';
const SWAPPER_API_BASE_URL = process.env.SWAPPER_API_BASE_URL || 'http://swapper-service:8890';
/**
* Get API configuration (for debugging)
*/
export function getApiConfig() {
return {
CITY_API_BASE_URL,
DAGI_ROUTER_API_URL,
SWAPPER_API_BASE_URL,
NODE_ENV: process.env.NODE_ENV,
};
}
/**
* Proxy request to city-service
*/
export async function proxyCity(
path: string,
init: RequestInit = {}
): Promise<Response> {
const url = `${CITY_API_BASE_URL}${path.startsWith('/') ? path : `/${path}`}`;
console.log(`[proxyCity] ${init.method || 'GET'} ${url}`);
try {
const response = await fetch(url, {
...init,
headers: {
...init.headers,
},
});
console.log(`[proxyCity] Response: ${response.status}`);
return response;
} catch (error) {
console.error(`[proxyCity] Error:`, error);
throw error;
}
}
/**
* Proxy request to dagi-router
*/
export async function proxyRouter(
path: string,
init: RequestInit = {}
): Promise<Response> {
const url = `${DAGI_ROUTER_API_URL}${path.startsWith('/') ? path : `/${path}`}`;
console.log(`[proxyRouter] ${init.method || 'GET'} ${url}`);
try {
const response = await fetch(url, init);
console.log(`[proxyRouter] Response: ${response.status}`);
return response;
} catch (error) {
console.error(`[proxyRouter] Error:`, error);
throw error;
}
}
/**
* Proxy request to swapper-service
*/
export async function proxySwapper(
path: string,
init: RequestInit = {}
): Promise<Response> {
const url = `${SWAPPER_API_BASE_URL}${path.startsWith('/') ? path : `/${path}`}`;
console.log(`[proxySwapper] ${init.method || 'GET'} ${url}`);
try {
const response = await fetch(url, init);
console.log(`[proxySwapper] Response: ${response.status}`);
return response;
} catch (error) {
console.error(`[proxySwapper] Error:`, error);
throw error;
}
}
/**
* Helper to safely parse JSON response
*/
export async function safeJsonParse<T>(response: Response, fallback: T): Promise<T> {
try {
if (!response.ok) {
console.warn(`[safeJsonParse] Non-OK response: ${response.status}`);
return fallback;
}
return await response.json();
} catch (error) {
console.error(`[safeJsonParse] Error parsing JSON:`, error);
return fallback;
}
}