Die Basis-URL der API wurde bisher aus dem Port der Seite abgeleitet (office.html: `if (location.port === "8090")`). Laeuft das Frontend hinter anderen Ports - in Produktion 4443 (web) / 4444 (api) - griff die Bedingung nicht, der relative Default /api/v1 lief gegen den Webserver ins Leere, und die Szene fiel still auf Demo-Daten zurueck: fremde Agenten-Namen und erfundene Ticketzahlen bei gleichzeitig leeren Detail-Modals. Die URL kommt jetzt aus MONITOR_API_BASE (.env, Default passend zum Port-Mapping in docker-compose.yml). Der Webserver liefert den Wert zur Laufzeit als /config.js aus; das nginx-Image setzt ihn beim Start per envsubst in die Config ein (default.conf -> default.conf.template). Damit bleibt html/ ein rein statisches, read-only gemountetes Verzeichnis - kein Build-Schritt, kein eigenes Entrypoint-Skript. Ein leerer Wert bedeutet "gleicher Origin" und faellt auf /api/v1 zurueck. Zusaetzlich macht ein roter Banner "API nicht erreichbar!" den Demo-Fallback sichtbar, statt ihn wie bisher stillschweigend als echte Daten auszugeben. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
62 lines
2.1 KiB
JavaScript
62 lines
2.1 KiB
JavaScript
// Duenne fetch()-Wrapper fuer die Phase-1-REST-API (siehe API.md). Reine Daten-Ebene, kein
|
|
// DOM-Zugriff - office-render.js ruft diese Funktionen auf und reicht die Ergebnisse an die
|
|
// Layoutlogik (office-scene.js) weiter. Basis-URL ist per window.MONITOR_API_BASE
|
|
// ueberschreibbar - gesetzt wird sie zur Laufzeit von /config.js, das der Webserver aus der
|
|
// Umgebungsvariable MONITOR_API_BASE erzeugt (siehe .env.example und
|
|
// docker/nginx/default.conf.template). Noetig, weil Frontend und API auf unterschiedlichen
|
|
// Origins laufen koennen (Dev: web :8090, api :8091); die API liefert dafuer CORS-Header,
|
|
// siehe api/src/Http/Response.php.
|
|
|
|
const DEFAULT_API_BASE = "/api/v1";
|
|
|
|
function apiBase() {
|
|
const configured = typeof window !== "undefined" ? window.MONITOR_API_BASE : null;
|
|
// Leer = gleicher Origin. Der startsWith-Check faengt einen nicht ersetzten Platzhalter
|
|
// ab (z.B. wenn config.js von einem anderen Webserver ohne Substitution ausgeliefert
|
|
// wird) - der waere sonst eine truthy Muell-URL.
|
|
if (!configured || configured.startsWith("${")) {
|
|
return DEFAULT_API_BASE;
|
|
}
|
|
return configured;
|
|
}
|
|
|
|
async function getJson(path) {
|
|
const response = await fetch(`${apiBase()}${path}`, { headers: { Accept: "application/json" } });
|
|
if (!response.ok) {
|
|
throw new Error(`GET ${path} fehlgeschlagen: HTTP ${response.status}`);
|
|
}
|
|
return response.json();
|
|
}
|
|
|
|
export async function fetchTickets() {
|
|
const { tickets } = await getJson("/tickets");
|
|
return tickets;
|
|
}
|
|
|
|
export async function fetchEvents(limit = 200) {
|
|
const { events } = await getJson(`/events?limit=${encodeURIComponent(limit)}`);
|
|
return events;
|
|
}
|
|
|
|
export async function fetchSystems() {
|
|
const { systems } = await getJson("/systems");
|
|
return systems;
|
|
}
|
|
|
|
export async function fetchKpis() {
|
|
const { kpis } = await getJson("/kpis");
|
|
return kpis;
|
|
}
|
|
|
|
export async function fetchAgents() {
|
|
const { agents } = await getJson("/agents");
|
|
return agents;
|
|
}
|
|
|
|
/**
|
|
* Baut die Stream-URL fuer den SSE-Push-Endpoint (F13, Phase 4). Wird von office-realtime.js
|
|
* an EventSource() uebergeben.
|
|
*/
|
|
export function streamUrl() {
|
|
return `${apiBase()}/stream`;
|
|
}
|