88 lines
2.1 KiB
TypeScript
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 }
|