diff --git a/server/db.js b/server/db.js new file mode 100644 index 0000000..50c9248 --- /dev/null +++ b/server/db.js @@ -0,0 +1,47 @@ +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;