diff --git a/src/db/index.ts b/src/db/index.ts new file mode 100644 index 0000000..389a02f --- /dev/null +++ b/src/db/index.ts @@ -0,0 +1,55 @@ +import Database from "@tauri-apps/plugin-sql"; + +/** + * Thin typed data layer over the Tauri SQL plugin (SQLite). + * All persistence goes through here — components never touch SQL directly. + */ + +let db: Database | null = null; + +export async function getDb(): Promise { + if (!db) { + // Migrations (src-tauri/migrations) run automatically on first load. + db = await Database.load("sqlite:workspace.db"); + } + return db; +} + +export interface WorkspaceMeta { + id: number; + name: string; + theme: "light" | "dark" | "system"; + accent: string; + onboarded: number; + last_page_id: string | null; + settings: string; +} + +export async function getWorkspaceMeta(): Promise { + const d = await getDb(); + const rows = await d.select( + "SELECT * FROM workspace_meta WHERE id = 1", + ); + return rows[0]; +} + +export async function updateWorkspaceMeta( + patch: Partial>, +): Promise { + const d = await getDb(); + const keys = Object.keys(patch) as (keyof typeof patch)[]; + if (keys.length === 0) return; + const sets = keys.map((k, i) => `${k} = $${i + 1}`).join(", "); + await d.execute( + `UPDATE workspace_meta SET ${sets} WHERE id = 1`, + keys.map((k) => patch[k]), + ); +} + +export function newId(): string { + return crypto.randomUUID(); +} + +export function now(): number { + return Date.now(); +}