65 lines
3.0 KiB
JavaScript
65 lines
3.0 KiB
JavaScript
// -----------------------------
|
|
// 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 (requireRole('admin'), 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));
|
|
}
|
|
}
|