// ----------------------------- // Projektübersicht — Datenbank-Import (Backup-Wiederherstellung) // ----------------------------- // Stellt importDb() bereit: wählt über einen Datei-Dialog eine mit "DB Backup" // erzeugte .db-Datei aus, lädt sie als rohen Binär-Body an POST /import und // lädt nach erfolgreicher Wiederherstellung die Seite neu. Da der Import den // kompletten Datenbestand ersetzt, ist die Route serverseitig admin-only // abgesichert (requireRecht('a.import'), server.js); der Button ist im UI // zusätzlich nur für Admins sichtbar (js/auth.js: renderUserBar()). Zusätzlich // wird der Import im Browser per Bestätigungsdialog abgesichert. // importDb: bestätigt die destruktive Aktion und startet danach den // Datei-Dialog für das Backup. Keine Rückgabe. function importDb(){ // Genau benennen, was ersetzt wird: Der Server tauscht nur die // Sitzungstabellen (IMPORT_TABLES in server.js). Benutzerkonten, Rollen, // Abwesenheiten, hochgeladene Dateien und deren Freigaben bleiben stehen — // die frühere Formulierung "Alle aktuellen Daten werden ersetzt" führte in // die Irre, etwa beim Versuch, einen gelöschten Benutzer zurückzuholen. if(!confirm('Datenbank-Backup wirklich wiederherstellen?\n\n' + 'ERSETZT WERDEN: alle Sitzungen mit Projekten, Zuordnungen, Kommentaren, Terminplänen und Aufgaben.\n\n' + 'NICHT BETROFFEN: Benutzerkonten, Rollen, Abwesenheiten, hochgeladene Dateien und deren Freigaben.\n\n' + 'Der aktuelle Stand wird vorher automatisch als Backup gesichert.')){ return; } const input = document.createElement('input'); input.type = 'file'; input.accept = '.db,application/octet-stream,application/x-sqlite3'; input.onchange = () => { const file = input.files && input.files[0]; if(!file) return; uploadBackup(file); }; input.click(); } // uploadBackup: lädt die gewählte .db-Datei als rohen Binär-Body an // POST /import und informiert über das Ergebnis. Bei Erfolg wird die Seite neu // geladen, damit das Frontend den wiederhergestellten Datenbestand zeigt. async function uploadBackup(file){ try { const res = await fetch(baseUrl() + '/import', { method: 'POST', headers: { 'Content-Type': 'application/octet-stream' }, body: file }); if(!res.ok){ if(res.status === 403){ alert('Nur Administratoren dürfen die Datenbank importieren.'); return; } let msg = 'Server HTTP ' + res.status; try { const json = await res.json(); if(json && json.error) msg = json.error; } catch(e){ /* Antwort war kein JSON */ } throw new Error(msg); } alert('Sitzungsdaten aus dem Backup wiederhergestellt.\n\n' + 'Benutzerkonten, Abwesenheiten und hochgeladene Dateien wurden dabei nicht verändert.\n' + 'Die Seite wird neu geladen.'); window.location.reload(); } catch(err){ console.error('DB-Import fehlgeschlagen:', err); alert('DB-Import fehlgeschlagen: ' + (err.message || err)); } }