import { adminCreateUploadTokenAction, adminDisableUploadTokenAction, adminLogoutAction, } from '@/src/lib/actions.js'; import { all, runCleanupIfNeeded } from '@/src/lib/db.js'; import { formatTimestamp, readSearchParam } from '@/src/lib/format.js'; import { ensureCsrfToken, requireAdminUser } from '@/src/lib/security.js'; import { AdminTabs } from '../../_components/admin-tabs.js'; import { CurlUploadExample } from '../../_components/curl-upload-example.js'; import { StatusMessage } from '../../_components/status-message.js'; export const dynamic = 'force-dynamic'; export default async function AdminUploadTokensPage({ searchParams }) { await runCleanupIfNeeded(); await requireAdminUser(); const csrfToken = await ensureCsrfToken(); const tokens = await all( `SELECT id, label, scope_path, created_by, created_at, expires_at, last_used_at, disabled_at FROM upload_tokens ORDER BY created_at DESC LIMIT 500` ); const resolvedSearchParams = await searchParams; const error = readSearchParam(resolvedSearchParams, 'error'); const success = readSearchParam(resolvedSearchParams, 'success'); const createdToken = readSearchParam(resolvedSearchParams, 'createdToken'); return (

Upload-Tokens

Bearer-Tokens für curl-Uploads in feste Zielordner.

{createdToken ? (

Neuer Token

Token jetzt kopieren. Er wird nicht erneut angezeigt.

{createdToken}
) : null}

Token erstellen

Aktive Tokens

{tokens.length === 0 ? (

Noch keine Upload-Tokens.

) : (
{tokens.map((token) => { const disabled = Number(token.disabled_at || 0) > 0; const expired = Number(token.expires_at || 0) > 0 && Number(token.expires_at) <= Date.now(); return ( ); })}
Name Zielordner Erstellt Ablauf Letzte Nutzung Status Aktionen
{token.label || `Token ${token.id}`}
von {token.created_by || '-'}
{token.scope_path} {formatTimestamp(token.created_at)} {token.expires_at ? formatTimestamp(token.expires_at) : 'Kein Ablauf'} {token.last_used_at ? formatTimestamp(token.last_used_at) : '-'} {disabled ? 'Deaktiviert' : expired ? 'Abgelaufen' : 'Aktiv'} {disabled ? null : (
)}
)}
); }