Files
markone/packages/server/src/database.ts

88 lines
2.1 KiB
TypeScript

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 }