You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

119 lines
2.5 KiB
TypeScript

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),
}))
}