/** * Service-Klasse für die Spielstände (Score Service). * Kapselt alle REST-Anfragen an das Backend zur Speicherung und zum Laden von Scores. */ class ScoreService { /** * Erstellt eine Instanz des ScoreService. * @param {Object} config - Das globale Konfigurationsobjekt. */ constructor(config) { this.baseUrl = config.API_BASE_URL; this.urlTail = "score"; } /** * Lädt alle Scores eines bestimmten Benutzers. * @param {string} username - Der Name des Benutzers, dessen Scores geladen werden sollen. * @returns {Promise} Ein Promise mit der Liste aller Benutzer-Scores im Body. */ async getScoreByName(username) { // Hinweis: Wenn der Benutzer nicht existiert, liefert das Backend einen Status 200 // mit einem leeren Array statt eines 404-Fehlers. const response = await fetch(`${this.baseUrl}${this.urlTail}/${username}`, { method: "GET", }); let body = null; try { body = await response.json(); } catch { console.error("Error in getScoreByName"); } return { status: response.status, ok: response.ok, body: body, }; } /** * Speichert einen neu erzielten Score im Backend. * @param {string} username - Benutzername des Spielers. * @param {string} password - Passwort des Spielers zur Autorisierung. * @param {number} score - Die erreichte Punktzahl (Anzahl korrekter Wörter). * @param {number} time - Die für die Eingabe benötigte Zeit in Sekunden. * @param {string} text - Der vorgegebene Originaltext der Spielrunde. * @param {string} userWrittenText - Der vom Benutzer eingegebene Text. * @returns {Promise} Ein Promise mit der Antwort des Servers (inkl. vergebenem Rang im Body). */ async postScore(username, password, score, time, text, userWrittenText) { const response = await fetch(`${this.baseUrl}${this.urlTail}`, { method: "POST", headers: { "Content-Type": "application/json", "X-Username": username, "X-Password": password, }, body: JSON.stringify({ score: score, time: time, text: text, userWrittenText: userWrittenText, }), }); let body = null; try { body = await response.json(); } catch { console.error("Error in postScore"); } return { status: response.status, ok: response.ok, body: body, }; } /** * Löscht ein bestimmtes Score-Ergebnis anhand seiner ID (falls vom Backend unterstützt). * @param {string} username - Benutzername des Spielers. * @param {string} password - Passwort des Spielers zur Autorisierung. * @param {string|number} scoreId - Die eindeutige ID des zu löschenden Scores. * @returns {Promise} Ein Promise mit dem Resultat der Löschung. */ async deleteScore(username, password, scoreId) { const response = await fetch(`${this.baseUrl}${this.urlTail}/${scoreId}`, { method: "DELETE", headers: { "X-Username": username, "X-Password": password, }, }); let body = null; try { body = await response.json(); } catch { console.error("Error in deleteScore"); } return { status: response.status, ok: response.ok, body: body, }; } } // Global verfügbar machen window.ScoreService = ScoreService;