55 lines
1.5 KiB
JavaScript
55 lines
1.5 KiB
JavaScript
/**
|
|
* @module api
|
|
* @description Kommunikationsmodul zur Backend-API für aggregierte Zeitmessungsdaten.
|
|
* Bietet Funktionen zum Laden der /results-Daten mit optionalen Filtern.
|
|
*/
|
|
|
|
const API_BASE_URL = '/results';
|
|
|
|
/**
|
|
* Führt einen GET-Request an /results aus und gibt die JSON-Daten zurück.
|
|
* @async
|
|
* @function loadResults
|
|
* @param {Object} [filters={}] - Optionales Filterobjekt.
|
|
* @param {string} [filters.runType] - Typ der Messung (z.B. 'pinned' oder 'unpinned').
|
|
* @param {string} [filters.metric] - Optionaler Metrikname.
|
|
* @returns {Promise<Array>} Promise mit Ergebnisobjekten.
|
|
*/
|
|
export async function loadResults(filters = {}) {
|
|
try {
|
|
const params = new URLSearchParams();
|
|
|
|
if (filters.runType) {
|
|
params.append('runType', filters.runType);
|
|
}
|
|
|
|
if (filters.metric) {
|
|
params.append('metric', filters.metric);
|
|
}
|
|
|
|
const url = params.toString() ? `${API_BASE_URL}?${params.toString()}` : API_BASE_URL;
|
|
|
|
const response = await fetch(url, {
|
|
method: 'GET',
|
|
headers: {
|
|
'Accept': 'application/json'
|
|
}
|
|
});
|
|
|
|
if (!response.ok) {
|
|
throw new Error(`Fehler beim Laden der Ergebnisse: ${response.status}`);
|
|
}
|
|
|
|
const data = await response.json();
|
|
|
|
if (!Array.isArray(data)) {
|
|
throw new Error('Ungültiges Datenformat von /results. Erwartet wird ein Array.');
|
|
}
|
|
|
|
return data;
|
|
} catch (error) {
|
|
console.error('API Fehler:', error);
|
|
// Defensive: leeres Array zurückgeben, damit UI stabil bleibt
|
|
return [];
|
|
}
|
|
}
|