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