import Database from "better-sqlite3"; import { fileURLToPath } from "url"; import path from "path"; import fs from "fs"; const __dirname = path.dirname(fileURLToPath(import.meta.url)); const DATA_DIR = path.join(__dirname, "data"); fs.mkdirSync(DATA_DIR, { recursive: true }); const db = new Database(path.join(DATA_DIR, "spectre.db")); db.pragma("journal_mode = WAL"); db.exec(` CREATE TABLE IF NOT EXISTS admins ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE NOT NULL, pw_hash TEXT NOT NULL, created TEXT NOT NULL DEFAULT (datetime('now')) ); CREATE TABLE IF NOT EXISTS ghosts ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, gif_file TEXT NOT NULL, -- filename under /uploads rarity TEXT NOT NULL DEFAULT 'common', -- common | rare | legendary scale REAL NOT NULL DEFAULT 1.0, -- billboard size multiplier enabled INTEGER NOT NULL DEFAULT 1, created TEXT NOT NULL DEFAULT (datetime('now')) ); CREATE TABLE IF NOT EXISTS sets ( id INTEGER PRIMARY KEY AUTOINCREMENT, code TEXT UNIQUE NOT NULL, -- the QR payload that unlocks this set title TEXT NOT NULL, enabled INTEGER NOT NULL DEFAULT 1, created TEXT NOT NULL DEFAULT (datetime('now')) ); -- which ghosts a given set can spawn (many-to-many) CREATE TABLE IF NOT EXISTS set_ghosts ( set_id INTEGER NOT NULL REFERENCES sets(id) ON DELETE CASCADE, ghost_id INTEGER NOT NULL REFERENCES ghosts(id) ON DELETE CASCADE, PRIMARY KEY (set_id, ghost_id) ); `); export default db;