/* ===================================================================== postfach.js — Logik für postfach.html ===================================================================== */ const API_BASE_URL = "https://dogfather-universe-postfach.dogfather1608.workers.dev"; const { getSession, sessionHasPermission, apiCall, doLogin, doLogout } = window.AdminAuth; const STATUS_OPTIONS = ["neu", "in_bearbeitung", "beantwortet"]; function $(id) { return document.getElementById(id); } function showApp(session) { $("gate-container").style.display = "none"; $("session-bar").style.display = "block"; $("inbox-section").style.display = "block"; $("role-badge").textContent = session.isOwner ? "Eingeloggt als: Dogi (Owner)" : `Eingeloggt als: ${session.name} (${session.roleName})`; const canSeeTeam = session.isOwner || sessionHasPermission(session, "TEAM_VIEW"); $("team-link").style.display = canSeeTeam ? "inline-flex" : "none"; if (session.isOwner) { $("live-toggle-section").style.display = "block"; loadLiveStatus(); } loadInbox(); } function showGate() { $("gate-container").style.display = "block"; $("session-bar").style.display = "none"; $("live-toggle-section").style.display = "none"; $("inbox-section").style.display = "none"; } /* ---------------- Bewerbungen ---------------- */ async function loadInbox() { const session = getSession(); const includeArchived = $("show-archived").checked; const res = await apiCall(API_BASE_URL, "/admin/applications/list", { includeArchived }); if (!res.ok) { if (!getSession()) showGate(); return; } renderInbox(res.applications, session); } function renderInbox(applications, session) { const list = $("inbox-list"); if (!applications.length) { list.innerHTML = `
Keine Bewerbungen in dieser Ansicht.
`; return; } list.innerHTML = applications .map((a) => { const fields = a.data ? Object.entries(a.data).map(([k, v]) => `${k}: ${v}
`).join("") : `Keine Berechtigung, den vollen Inhalt zu öffnen.
`; const date = new Date(a.createdAt).toLocaleString("de-DE"); const actions = []; if (sessionHasPermission(session, "APPLICATIONS_TAKE_OVER")) { actions.push(``); } if (sessionHasPermission(session, "APPLICATIONS_MARK_ANSWERED")) { actions.push(``); } if (sessionHasPermission(session, "APPLICATIONS_ARCHIVE") && !a.archived) { actions.push(``); } if (sessionHasPermission(session, "APPLICATIONS_RESTORE") && a.archived) { actions.push(``); } if (sessionHasPermission(session, "APPLICATIONS_DELETE")) { actions.push(``); } if (sessionHasPermission(session, "NOTES_READ")) { actions.push(``); } const statusSelect = sessionHasPermission(session, "APPLICATIONS_CHANGE_STATUS") ? `` : `${a.status}`; return `${date}
Lädt…
Konnte Notizen nicht laden.
`; return; } box.innerHTML = res.notes .map((n) => `Noch keine Notizen.
`; } /* ---------------- Live-Status ---------------- Der Status kommt automatisch von TikTok (Cron im Worker, jede Minute). Die Handschaltung ist nur ein zeitlich begrenzter Vorrang. ------------------------------------------------------------------- */ function formatSince(iso) { if (!iso) return null; const diffMin = Math.floor((Date.now() - new Date(iso).getTime()) / 60000); if (diffMin < 1) return "gerade eben"; if (diffMin === 1) return "vor 1 Minute"; if (diffMin < 60) return `vor ${diffMin} Minuten`; const h = Math.floor(diffMin / 60); return h === 1 ? "vor 1 Stunde" : `vor ${h} Stunden`; } function renderLiveStatus(data) { const live = !!(data && data.live); const dot = $("admin-live-dot"); dot.classList.remove("is-unknown"); dot.classList.toggle("is-live", live); $("admin-live-text").textContent = live ? "Jetzt live" : "Gerade offline"; const manual = data && data.source === "manuell"; $("go-auto-btn").style.display = manual ? "inline-flex" : "none"; const lines = []; if (manual) { lines.push("⚠️ Von Hand gesetzt — die Automatik ist gerade übersteuert."); if (data.overrideUntil) { const until = new Date(data.overrideUntil); lines.push(`Läuft aus um ${until.toLocaleTimeString("de-DE", { hour: "2-digit", minute: "2-digit" })} Uhr.`); } if (data.autoLive !== null && data.autoLive !== undefined) { lines.push(`TikTok meldet gerade: ${data.autoLive ? "live" : "offline"}.`); } } else { if (data && data.title && live) lines.push(`Titel: ${data.title}`); const since = formatSince(data && data.autoCheckedAt); if (since) lines.push(`Automatisch geprüft ${since}.`); if (data && data.autoHealthy === false) { lines.push("⚠️ Der letzte Abruf bei TikTok hat nicht geklappt — angezeigt wird der letzte bekannte Stand."); } } $("admin-live-detail").innerHTML = lines.join("