Add Rust server

Owns the database, PIN rotation and all LiveKit token minting. Kiosk
registration, session-stable joins, admin auth, layouts, branding, media
uploads and the hosted installer script.

Claude-Session: https://claude.ai/code/session_01SS9F92jb51bMCRCKem6QtD
This commit is contained in:
2026-08-09 17:09:06 -04:00
parent d7733a6765
commit 2bca6f0e90
25 changed files with 2462 additions and 0 deletions
+49
View File
@@ -0,0 +1,49 @@
CREATE TABLE IF NOT EXISTS admins (
id TEXT PRIMARY KEY,
email TEXT NOT NULL UNIQUE,
password_hash TEXT NOT NULL,
created_at INTEGER NOT NULL
);
CREATE TABLE IF NOT EXISTS kiosks (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
location TEXT NOT NULL DEFAULT '',
room_name TEXT NOT NULL UNIQUE,
hardware_id TEXT,
enrollment_token_hash TEXT,
kiosk_token_hash TEXT,
status TEXT NOT NULL DEFAULT 'offline',
last_seen_at INTEGER,
created_at INTEGER NOT NULL
);
CREATE TABLE IF NOT EXISTS kiosk_pins (
pin TEXT PRIMARY KEY,
kiosk_id TEXT NOT NULL REFERENCES kiosks(id) ON DELETE CASCADE,
issued_at INTEGER NOT NULL,
expires_at INTEGER NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_kiosk_pins_kiosk ON kiosk_pins(kiosk_id, issued_at DESC);
CREATE INDEX IF NOT EXISTS idx_kiosk_pins_expiry ON kiosk_pins(expires_at);
CREATE TABLE IF NOT EXISTS kiosk_layouts (
kiosk_id TEXT PRIMARY KEY REFERENCES kiosks(id) ON DELETE CASCADE,
data TEXT NOT NULL,
updated_at INTEGER NOT NULL
);
CREATE TABLE IF NOT EXISTS sessions (
id TEXT PRIMARY KEY,
kiosk_id TEXT NOT NULL REFERENCES kiosks(id) ON DELETE CASCADE,
participant_id TEXT NOT NULL,
display_name TEXT NOT NULL,
role TEXT NOT NULL,
created_at INTEGER NOT NULL,
expires_at INTEGER NOT NULL,
revoked INTEGER NOT NULL DEFAULT 0
);
CREATE INDEX IF NOT EXISTS idx_sessions_kiosk ON sessions(kiosk_id);
CREATE INDEX IF NOT EXISTS idx_sessions_expiry ON sessions(expires_at);