import cuid2 from '@paralleldrive/cuid2' import Database from 'better-sqlite3' import type { Room, RoomData } from './model' import type { Question } from '@/ggwp' import { emitRoomUpdate } from './events' const db = new Database('ggwp.db') db.pragma('journal_mode = WAL') db.pragma('foreign_keys = ON') db.exec(` CREATE TABLE IF NOT EXISTS rooms ( id TEXT PRIMARY KEY, password TEXT NOT NULL, created_at TEXT NOT NULL, data TEXT NOT NULL ); `) // db.exec(` // CREATE TABLE IF NOT EXISTS game_actions ( // id INTEGER PRIMARY KEY, // room_id TEXT NOT NULL, // created_at TEXT NOT NULL, // data TEXT NOT NULL, // FOREIGN KEY (room_id) REFERENCES rooms (id) // ); // `) export function databaseStatus(): string { return 'ok' } export function createRoom(id: string, teams: string[], questions: Question[]): string { const password = cuid2.createId() const data: RoomData = { teams, questions, actions: [], } db.prepare<[string, string, string, string]>( ` INSERT INTO rooms (id, password, created_at, data) VALUES (?, ?, ?, ?); ` ).run(id, password, new Date().toISOString(), JSON.stringify(data)) return password } export function updateRoom(id: string, data: RoomData): void { emitRoomUpdate(id, data) db.prepare<[string, string]>( ` UPDATE rooms SET data = ? WHERE id = ?; ` ).run(JSON.stringify(data), id) } export function getRoom(id: string): RoomData | null { const row = db .prepare< [string], { id: string created_at: string data: string } >('SELECT * FROM rooms WHERE id = ?') .get(id) if (!row) { return null } return JSON.parse(row.data) } export function getRoomByPassword(password: string): string | null { const row = db .prepare< [string], { id: string } >('SELECT id FROM rooms WHERE password = ?') .get(password) if (!row) { return null } return row.id } export function getRooms(): Room[] { const rows = db .prepare< [], { id: string data: string } >('SELECT id, data FROM rooms') .all() return rows.map(row => ({ id: row.id, ...JSON.parse(row.data), })) }