Add data_visualization/js/api.js

This commit is contained in:
Mika 2026-01-10 14:23:01 +00:00
parent c0f54d63a0
commit b45c562717

View file

@ -0,0 +1,54 @@
"use strict";
/**
* Modul zur Kommunikation mit der Backend-API für Migrationsmetriken.
* Bezieht strukturierte Datenobjekte und bereitet sie zur Nutzung in der Visualisierung vor.
*/
/**
* Baut eine Query-String-URL aus den optionalen Parametern.
* @param {object} params - Key-Value Paare für optionale Parameter.
* @returns {string} Query-String mit vorangestelltem ? oder leerem String.
*/
function buildQueryString(params = {}) {
const queryEntries = Object.entries(params).filter(([_, v]) => v !== undefined && v !== null && v !== "");
if (queryEntries.length === 0) return "";
const query = queryEntries.map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`).join("&");
return `?${query}`;
}
/**
* Lädt Metrikdaten der Migrationen vom Server.
* @param {object} [filters] - Optional: { filter: 'setup_type', run_id: string }
* @returns {Promise<object>} metric_report - Das JSON-Objekt mit setups, metrics und spikes.
*/
export async function fetchMigrationReport(filters = {}) {
const endpoint = "/migration_report";
const queryString = buildQueryString(filters);
const url = `${endpoint}${queryString}`;
try {
const response = await fetch(url, { method: "GET" });
if (!response.ok) {
console.error(`API request failed with status ${response.status}`);
return { setups: [], metrics: [], spikes: [] };
}
const data = await response.json();
// Strukturprüfung der erwarteten Felder
if (!data || typeof data !== "object") {
console.error("Invalid JSON structure from /migration_report");
return { setups: [], metrics: [], spikes: [] };
}
// Mindestvalidierungen der erwarteten Felder
const setups = Array.isArray(data.setups) ? data.setups : [];
const metrics = Array.isArray(data.metrics) ? data.metrics : [];
const spikes = Array.isArray(data.spikes) ? data.spikes : [];
return { setups, metrics, spikes };
} catch (error) {
console.error("Error fetching migration report:", error);
return { setups: [], metrics: [], spikes: [] };
}
}