import { Database } from "bun:sqlite" const SCHEMA_VERSION = 0 const db = new Database("data.sqlite", { strict: true }) const createMetadataTableQuery = db.query(` CREATE TABLE IF NOT EXISTS metadata( key TEXT NOT NULL PRIMARY KEY, value, UNIQUE(key) ); `) const migrations = [ ` CREATE TABLE IF NOT EXISTS users( id TEXT PRIMARY KEY, username TEXT NOT NULL, password TEXT NOT NULL ); CREATE TABLE IF NOT EXISTS bookmarks( id TEXT PRIMARY KEY, user_id TEXT NOT NULL, kind TEXT NOT NULL, title TEXT NOT NULL, url TEXT NOT NULL ); CREATE TABLE IF NOT EXISTS tags( id TEXT PRIMARY KEY, name TEXT NOT NULL, bookmark_id TEXT NOT NULL ); CREATE TABLE IF NOT EXISTS sessions( session_id TEXT NOT NULL, user_id TEXT NOT NULL, expires_at_unix_ms INTEGER NOT NULL, PRIMARY KEY (session_id, user_id) ); CREATE TABLE IF NOT EXISTS auth_tokens( id TEXT PRIMARY KEY, token TEXT NOT NULL, user_id TEXT NOT NULL, expires_at_unix_ms INTEGER NOT NULL ); `, ] const executeMigrations = db.transaction((migrations) => { for (const migration of migrations) { db.run(migration) } }) function migrateDatabase() { createMetadataTableQuery.run() const schemaVersionQuery = db.query("SELECT value FROM metadata WHERE key = 'schema_version'") const setSchemaVersionQuery = db.query("INSERT OR REPLACE INTO metadata VALUES ('schema_version', $schemaVersion)") const row = schemaVersionQuery.get() let currentVersion: number if (row) { currentVersion = (row as { value: number }).value } else { currentVersion = -1 } if (currentVersion < SCHEMA_VERSION) { if (currentVersion < 0) { console.log("Initializing database...") } else { console.log(`Migrating database from version ${currentVersion} to version ${SCHEMA_VERSION}...`) } executeMigrations(migrations.slice(currentVersion + 1, SCHEMA_VERSION + 1)) setSchemaVersionQuery.run({ schemaVersion: SCHEMA_VERSION }) console.log("Database successfully migrated!") } else if (currentVersion > SCHEMA_VERSION) { console.error("Rolling back database to a previous version is unsupported. Are you trying to downgrade MARKONE?") } } export { db, migrateDatabase }