diff --git a/src/js/app.js b/src/js/app.js index efbec4c..655f0ee 100644 --- a/src/js/app.js +++ b/src/js/app.js @@ -10,6 +10,14 @@ async function init() { boards = savedBoards ?? getDefaultBoards(); trash = Array.isArray(savedTrash) ? savedTrash : []; + + // Auto-Cleanup: Eintraege aelter als 30 Tage verwerfen (TRASH-02). Muss VOR + // renderBoards() laufen, damit der Papierkorb-Stand konsistent ist. Schreibt nur + // zurueck, wenn wirklich etwas entfernt wurde (kein unnoetiger Storage-Write). + const cutoff = Date.now() - TRASH_RETENTION_MS; + const beforeCount = trash.length; + trash = trash.filter(entry => typeof entry.deletedAt === 'number' && entry.deletedAt >= cutoff); + if (trash.length !== beforeCount) await saveTrash(); if (savedSettings) Object.assign(settings, savedSettings); I18n.init(); diff --git a/src/js/state.js b/src/js/state.js index 4c8d1b7..55c4240 100644 --- a/src/js/state.js +++ b/src/js/state.js @@ -9,6 +9,13 @@ let boards = []; // Eintrag-Schema: { item, type: 'bookmark'|'board', deletedAt, originBoardId } let trash = []; +// Papierkorb: Auto-Cleanup-Fenster und harte Obergrenze (Quota-Schutz, TRASH-04). +// 30 Tage in Millisekunden; ueber dieser Zeit wird ein Eintrag beim Laden auto-geloescht. +const TRASH_RETENTION_MS = 30 * 24 * 60 * 60 * 1000; +// Max. Anzahl trash-Eintraege. Bei Ueberlauf werden die aeltesten zuerst verworfen, +// damit der Papierkorb nicht das 10-MB-Storage-Limit sprengt (kein blindes Wachstum). +const TRASH_MAX_ENTRIES = 100; + let settings = { compact: false, shortenTitles: false,