let settings = { publicBaseUrl: '', bookTitle: '' }; async function checkSession() { const res = await fetch('/api/session'); const data = await res.json(); if (data.role !== 'admin') { window.location.href = '/'; } } async function loadSettings() { const res = await fetch('/api/settings'); if (!res.ok) return; const data = await res.json(); settings = data.settings || { publicBaseUrl: '', bookTitle: '' }; document.getElementById('publicBaseUrl').value = settings.publicBaseUrl || ''; document.getElementById('bookTitle').value = settings.bookTitle || ''; } document.getElementById('saveSettingsBtn').addEventListener('click', async () => { const publicBaseUrl = document.getElementById('publicBaseUrl').value.trim(); const bookTitle = document.getElementById('bookTitle').value.trim(); const res = await fetch('/api/settings', { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ publicBaseUrl, bookTitle }), }); const data = await res.json(); if (res.ok) { settings = data.settings; const msg = document.getElementById('settingsSaved'); msg.textContent = 'Gespeichert ✓'; msg.classList.add('show'); setTimeout(() => msg.classList.remove('show'), 1800); } }); document.getElementById('logoutBtn').addEventListener('click', async () => { await fetch('/api/logout', { method: 'POST' }); window.location.href = '/'; }); // --- Sichern & Wiederherstellen --- function showTransferMsg(text, isError) { const box = document.getElementById('transferMsg'); box.innerHTML = isError ? `
${text}
` : `${text}
`; } document.getElementById('bookExportBtn').addEventListener('click', () => { window.location.href = '/api/book/export'; }); document.getElementById('bookImportBtn').addEventListener('click', async () => { const fileInput = document.getElementById('bookImportFile'); const file = fileInput.files[0]; if (!file) { showTransferMsg('Bitte zuerst eine ZIP-Datei auswählen.', true); return; } const replaceAll = document.getElementById('bookImportReplace').checked; if (replaceAll && !confirm('Wirklich ALLE bestehenden Freunde vor dem Import löschen?')) return; const fd = new FormData(); fd.append('file', file); fd.append('replaceAll', replaceAll ? 'true' : 'false'); showTransferMsg('Importiere...', false); const res = await fetch('/api/book/import', { method: 'POST', body: fd }); const data = await res.json(); if (res.ok) { showTransferMsg(`${data.imported.length} Freund(e) importiert: ${data.imported.join(', ') || '–'}`, false); fileInput.value = ''; } else { showTransferMsg(data.error || 'Import fehlgeschlagen.', true); } }); document.getElementById('friendImportBtn').addEventListener('click', async () => { const fileInput = document.getElementById('friendImportFile'); const file = fileInput.files[0]; if (!file) { showTransferMsg('Bitte zuerst eine ZIP-Datei auswählen.', true); return; } const fd = new FormData(); fd.append('file', file); showTransferMsg('Importiere...', false); const res = await fetch('/api/friends/import', { method: 'POST', body: fd }); const data = await res.json(); if (res.ok) { showTransferMsg(`"${data.friend.name}" wurde importiert.`, false); fileInput.value = ''; } else { showTransferMsg(data.error || 'Import fehlgeschlagen.', true); } }); checkSession(); loadSettings();