feat: add dashboard persistence store

This commit is contained in:
vince 2026-06-18 18:09:17 +02:00
parent 5eeec0dcb5
commit d377756988
18 changed files with 1118 additions and 19 deletions

View file

@ -0,0 +1,47 @@
import { mkdirSync } from "node:fs";
import { dirname, resolve } from "node:path";
import { Database } from "bun:sqlite";
import { drizzle, type BunSQLiteDatabase } from "drizzle-orm/bun-sqlite";
import { dashboardDbSchema } from "./schema";
import { applyDashboardMigrations } from "./migrations";
export const DEFAULT_DATABASE_URL = "file:./data/dimensionlab.sqlite";
export type DashboardDatabase = BunSQLiteDatabase<typeof dashboardDbSchema> & {
$client: Database;
};
export interface DashboardDatabaseConnection {
db: DashboardDatabase;
sqlite: Database;
filename: string;
close(): void;
}
export function openDashboardDatabase(
databaseUrl = process.env.DATABASE_URL || DEFAULT_DATABASE_URL,
): DashboardDatabaseConnection {
const filename = resolveSqliteFilename(databaseUrl);
mkdirSync(dirname(filename), { recursive: true });
const sqlite = new Database(filename, { create: true, readwrite: true });
const db = drizzle(sqlite, { schema: dashboardDbSchema }) as DashboardDatabase;
applyDashboardMigrations(db);
return {
db,
sqlite,
filename,
close() {
sqlite.close();
},
};
}
export function resolveSqliteFilename(databaseUrl: string): string {
if (!databaseUrl.startsWith("file:")) {
throw new Error(`Only file: SQLite DATABASE_URL values are supported: ${databaseUrl}`);
}
return resolve(databaseUrl.slice("file:".length));
}