import { adminDeleteUploadAction, adminExtendUploadAction, adminLogoutAction, } from '@/src/lib/actions.js'; import { adminHash } from '@/src/lib/config.js'; import { all, get, runCleanupIfNeeded } from '@/src/lib/db.js'; import { formatBytes, formatCountdown, formatTimestamp, parseLogDetail, readSearchParam, } from '@/src/lib/format.js'; import { ensureCsrfToken, requireAdminUser } from '@/src/lib/security.js'; import { CopyLinkButton } from '../../_components/copy-link-button.js'; import { StatusMessage } from '../../_components/status-message.js'; export const dynamic = 'force-dynamic'; export default async function AdminDashboardPage({ searchParams }) { await runCleanupIfNeeded(); if (!adminHash) { return (

Adminzugang nicht konfiguriert

Setze MANAGEMENT_ADMIN_HASH in der Umgebungskonfiguration.

Zurück
); } await requireAdminUser(); const csrfToken = await ensureCsrfToken(); const [ activeCount, activeBytes, distinctOwners, totalUploads, totalDownloads, totalDeletes, lastCleanup, recentLogs, allUploads, ] = await Promise.all([ get('SELECT COUNT(*) AS count FROM uploads'), get('SELECT COALESCE(SUM(size_bytes), 0) AS total FROM uploads'), get('SELECT COUNT(DISTINCT owner) AS count FROM uploads'), get('SELECT COUNT(*) AS count FROM admin_logs WHERE event = ?', ['upload']), get('SELECT COALESCE(SUM(downloads), 0) AS count FROM uploads'), get('SELECT COUNT(*) AS count FROM admin_logs WHERE event IN (?, ?, ?)', [ 'delete', 'cleanup', 'admin_delete', ]), get('SELECT MAX(created_at) AS ts FROM admin_logs WHERE event = ?', ['cleanup']), all( 'SELECT event, owner, detail, created_at, ip, user_agent FROM admin_logs ORDER BY created_at DESC LIMIT 250' ), all( 'SELECT id, owner, original_name, stored_name, size_bytes, uploaded_at, expires_at FROM uploads ORDER BY uploaded_at DESC LIMIT 500' ), ]); const resolvedSearchParams = await searchParams; const error = readSearchParam(resolvedSearchParams, 'error'); const success = readSearchParam(resolvedSearchParams, 'success'); return (

Adminübersicht

Metriken, Ereignisse und direkte Eingriffe in Uploads.

Dateimanager Benutzer verwalten

Statistiken

Aktive Uploads {activeCount?.count || 0}
Aktive Dateigröße {formatBytes(activeBytes?.total || 0)}
Aktive Nutzer {distinctOwners?.count || 0}
Uploads gesamt {totalUploads?.count || 0}
Downloads gesamt {totalDownloads?.count || 0}
Löschungen gesamt {totalDeletes?.count || 0}
Letztes Cleanup {lastCleanup?.ts ? formatTimestamp(lastCleanup.ts) : '-'}

Aktuelle Uploads

{allUploads.length === 0 ? (

Noch keine Uploads vorhanden.

) : (
{allUploads.map((item) => { const sharePath = `/_share/${encodeURIComponent(item.stored_name)}`; return ( ); })}
Nutzer Datei Größe Hochgeladen Ablauf Aktionen
{item.owner} {item.original_name}
{item.stored_name}
{formatBytes(item.size_bytes)} {formatTimestamp(item.uploaded_at)}
{formatTimestamp(item.expires_at)}
Noch {formatCountdown(item.expires_at)}
)}

Letzte Ereignisse

{recentLogs.length === 0 ? (

Keine Logs vorhanden.

) : (
{recentLogs.map((entry, index) => { const details = parseLogDetail(entry.detail); return ( ); })}
Zeit Event Nutzer IP Details User-Agent
{formatTimestamp(entry.created_at)} {entry.event} {entry.owner || '-'} {entry.ip || '-'} {details.length === 0 ? ( - ) : (
{details.map((detail) => (
{detail.key}: {detail.value}
))}
)}
{entry.user_agent || '-'}
)}
); }