Files
EventSnap/frontend/src/lib/auth.ts
MechaCat02 a2374f7583 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>
2026-04-02 20:42:59 +02:00

56 lines
1.4 KiB
TypeScript

import { writable } from 'svelte/store';
import { browser } from '$app/environment';
const TOKEN_KEY = 'eventsnap_jwt';
const PIN_KEY = 'eventsnap_pin';
const USER_ID_KEY = 'eventsnap_user_id';
export const isAuthenticated = writable(false);
export function getToken(): string | null {
if (!browser) return null;
return localStorage.getItem(TOKEN_KEY);
}
export function getPin(): string | null {
if (!browser) return null;
return localStorage.getItem(PIN_KEY);
}
export function getUserId(): string | null {
if (!browser) return null;
return localStorage.getItem(USER_ID_KEY);
}
export function setAuth(jwt: string, pin: string | null, userId: string): void {
if (!browser) return;
localStorage.setItem(TOKEN_KEY, jwt);
if (pin) localStorage.setItem(PIN_KEY, pin);
localStorage.setItem(USER_ID_KEY, userId);
isAuthenticated.set(true);
}
export function clearAuth(): void {
if (!browser) return;
localStorage.removeItem(TOKEN_KEY);
localStorage.removeItem(USER_ID_KEY);
// PIN is intentionally kept so the user can recover
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());
}