48 lines
1.6 KiB
JavaScript
48 lines
1.6 KiB
JavaScript
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;
|