// ----------------------------- // 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 er passwortgeschützt (gleiche Logik wie // Wochen-Löschung über requestedAction/isAuthenticated, siehe js/tabs-auth.js // und js/weeks.js) und wird zusätzlich im Browser per Bestätigungsdialog // abgesichert. // importDb: öffnet bei Bedarf das Passwort-Modal (requestedAction 'importDb') // und startet danach den Datei-Dialog für das Backup. Parameter `skipAuth=true` // überspringt die Passwortabfrage (wird von confirmPassword() genutzt). // Keine Rückgabe. function importDb(skipAuth = false){ if(!skipAuth && !isAuthenticated){ requestedAction = { type: 'importDb' }; document.getElementById('passwordModal').style.display = 'flex'; document.getElementById('passwordInput').value = ''; document.getElementById('passwordInput').focus(); return; } if(!confirm('Datenbank-Backup wirklich wiederherstellen?\n\nAlle aktuellen Daten werden ersetzt.')){ requestedAction = null; 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){ requestedAction = null; return; } uploadBackup(file); }; input.click(); requestedAction = null; } // 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){ 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('Datenbank-Backup erfolgreich wiederhergestellt.\nDie Seite wird neu geladen.'); window.location.reload(); } catch(err){ console.error('DB-Import fehlgeschlagen:', err); alert('DB-Import fehlgeschlagen: ' + (err.message || err)); } }