feat: implement host dashboard

Add Host Dashboard backend endpoints and frontend UI for event and
guest management.

Backend:
- GET  /api/v1/host/event              — event name, lock/release status
- POST /api/v1/host/event/close|open   — lock/unlock uploads; SSE broadcast
- POST /api/v1/host/gallery/release    — set export_released_at, enqueue export jobs
- GET  /api/v1/host/users              — all guests with upload count & bytes
- POST /api/v1/host/users/{id}/ban     — ban with optional upload hide
- POST /api/v1/host/users/{id}/unban   — lift ban
- PATCH /api/v1/host/users/{id}/role   — promote/demote guest ↔ host
- DELETE /api/v1/host/upload/{id}      — host-level upload delete + SSE
- DELETE /api/v1/host/comment/{id}     — host-level comment delete

Frontend:
- /host page: event controls (lock toggle, release gallery button),
  guest table with ban modal (keep/hide uploads choice), promote/demote
- auth.ts: getRole() decodes JWT payload to read role without a round-trip

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
MechaCat02
2026-04-02 20:42:59 +02:00
parent 25f4fb1810
commit a2374f7583
5 changed files with 602 additions and 1 deletions

View File

@@ -38,6 +38,17 @@ export function clearAuth(): void {
isAuthenticated.set(false);
}
export function getRole(): 'guest' | 'host' | 'admin' | null {
const token = getToken();
if (!token) return null;
try {
const payload = JSON.parse(atob(token.split('.')[1]));
return payload.role ?? null;
} catch {
return null;
}
}
export function initAuth(): void {
if (!browser) return;
isAuthenticated.set(!!getToken());