Aufgaben-Python/courses/javascript/10_web_storage_und_json/aufgabe.js

113 lines
4.2 KiB
JavaScript

/**
* 🌐 JS 10: WEB STORAGE & JSON SERIALISIERUNG 🌐
* ===============================================
* In diesem Modul lernst du, wie Daten dauerhaft im Browser
* (localStorage & sessionStorage) als JSON persistiert werden.
*/
/**
* Hilfsfunktion zum Auflösen des Speichers (Echter Storage oder Mock)
* @param {Object} [storageMock=null]
* @returns {Storage | Object | null}
*/
function ermittleStorage(storageMock = null) {
if (storageMock) return storageMock;
if (typeof localStorage !== "undefined") return localStorage;
return null;
}
/**
* 🎯 TEILZIEL 1 (TODO 1): speichereDaten(schluessel, daten, storageMock)
* Serialisiert Daten zu einem JSON-String und speichert sie im Web Storage.
*
* Anforderungen:
* - schluessel: string (muss ein nicht-leerer String sein, sonst TypeError)
* - daten: Beliebige serialisierbare Daten (Objekt, Array, Zahl, Boolean, String)
* - storageMock: Optionaler Storage-Ersatz für isolierte Tests
* - Serialisiert `daten` mit JSON.stringify()
* - Speichert mit storage.setItem(schluessel, jsonString)
* - Fängt Speicherfehler (z.B. QuotaExceededError) ab und gibt false zurück
* - Gibt bei Erfolg true zurück.
*
* @param {string} schluessel
* @param {any} daten
* @param {Object} [storageMock=null]
* @returns {boolean}
*/
function speichereDaten(schluessel, daten, storageMock = null) {
// TODO: Schlüssel validieren, JSON.stringify verwenden und in Storage schreiben
return false;
}
/**
* 🎯 TEILZIEL 2 (TODO 2): ladeDaten(schluessel, standardWert, storageMock)
* Lädt Daten aus dem Storage und deserialisiert sie sicher von JSON.
*
* Anforderungen:
* - schluessel: string
* - standardWert: Rückfallwert (Default: null), falls Schlüssel nicht existiert oder defekt ist
* - storageMock: Optionaler Storage-Ersatz
* - Liest den Rohwert mit storage.getItem(schluessel)
* - Falls der Schlüssel nicht existiert (getItem liefert null), gib `standardWert` zurück.
* - Versucht JSON.parse() auf den Rohdaten.
* - Bei SyntaxError (defektes JSON im Storage) fange den Fehler ab und gib `standardWert` zurück.
* - Gibt die deserialisierten Daten zurück.
*
* @param {string} schluessel
* @param {any} [standardWert=null]
* @param {Object} [storageMock=null]
* @returns {any}
*/
function ladeDaten(schluessel, standardWert = null, storageMock = null) {
// TODO: storage.getItem abrufen, JSON.parse mit try/catch ausführen
return standardWert;
}
/**
* 🎯 TEILZIEL 3 (TODO 3): loescheDaten(schluessel, storageMock)
* Entfernt einen Eintrag aus dem Storage.
*
* Anforderungen:
* - schluessel: string (muss ein gültiger String sein)
* - Ruft storage.removeItem(schluessel) auf.
* - Gibt true zurück wenn erfolgreich, sonst false bei ungültigem Schlüssel.
*
* @param {string} schluessel
* @param {Object} [storageMock=null]
* @returns {boolean}
*/
function loescheDaten(schluessel, storageMock = null) {
// TODO: storage.removeItem ausführen
return false;
}
/**
* @typedef {Object} HighscoreEintrag
* @property {string} name - Name des Spielers
* @property {number} punkte - Erzielte Punktzahl
* @property {string} datum - ISO-Datumsstring
*/
/**
* 🎯 TEILZIEL 4 (TODO 4): aktualisiereHighscore(spielerName, punkte, storageMock)
* Verwaltet eine Highscore-Bestenliste unter dem Schlüssel "highscores".
*
* Anforderungen:
* - spielerName: string (nach .trim() nicht leer, sonst TypeError werfen)
* - punkte: number (muss Zahl >= 0 und !isNaN sein, sonst TypeError werfen)
* - Lädt bestehende Highscores mit ladeDaten("highscores", [], storageMock).
* - Erstellt neuen Eintrag: { name: spielerName.trim(), punkte: punkte, datum: new Date().toISOString() }
* - Sortiert die Highscores absteigend nach `punkte` (höchste Punktzahl auf Index 0).
* - Begrenzt die Liste auf die Top 10 Einträge.
* - Speichert die aktualisierte Liste mit speichereDaten("highscores", liste, storageMock).
* - Gibt das sortierte Array der HighscoreEintraege zurück.
*
* @param {string} spielerName
* @param {number} punkte
* @param {Object} [storageMock=null]
* @returns {HighscoreEintrag[]}
*/
function aktualisiereHighscore(spielerName, punkte, storageMock = null) {
// TODO: Highscores laden, neuen Eintrag einfügen, sortieren, begrenzen und speichern
return [];
}