import Database from 'better-sqlite3'; import path from 'path'; import fs from 'fs'; const DATA_DIR = process.env.DATA_DIR ?? '/data'; const DB_DIR = path.join(DATA_DIR, 'db'); const DB_PATH = path.join(DB_DIR, 'memer.db'); fs.mkdirSync(DB_DIR, { recursive: true }); const db = new Database(DB_PATH); // Enable WAL mode for better concurrent read performance db.pragma('journal_mode = WAL'); db.pragma('foreign_keys = ON'); db.exec(` CREATE TABLE IF NOT EXISTS memes ( id TEXT PRIMARY KEY, title TEXT NOT NULL, description TEXT, file_path TEXT NOT NULL, file_name TEXT NOT NULL, file_size INTEGER NOT NULL, mime_type TEXT NOT NULL, width INTEGER NOT NULL, height INTEGER NOT NULL, parent_id TEXT REFERENCES memes(id) ON DELETE CASCADE, created_at TEXT NOT NULL DEFAULT (datetime('now')) ); CREATE TABLE IF NOT EXISTS tags ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT UNIQUE NOT NULL COLLATE NOCASE ); CREATE TABLE IF NOT EXISTS meme_tags ( meme_id TEXT NOT NULL REFERENCES memes(id) ON DELETE CASCADE, tag_id INTEGER NOT NULL REFERENCES tags(id) ON DELETE CASCADE, PRIMARY KEY (meme_id, tag_id) ); CREATE INDEX IF NOT EXISTS idx_memes_parent_id ON memes(parent_id); CREATE INDEX IF NOT EXISTS idx_memes_created_at ON memes(created_at DESC); CREATE INDEX IF NOT EXISTS idx_meme_tags_meme_id ON meme_tags(meme_id); CREATE INDEX IF NOT EXISTS idx_meme_tags_tag_id ON meme_tags(tag_id); `); export default db;