"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} 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: [] }; } }