diff --git a/src/db/index.ts b/src/db/index.ts new file mode 100644 index 0000000..5336bf4 --- /dev/null +++ b/src/db/index.ts @@ -0,0 +1,17 @@ +import Database from 'better-sqlite3'; +import { applySchema } from './schema'; + +let _db: Database.Database | null = null; + +export function getDb(path: string = ':memory:'): Database.Database { + if (_db) return _db; + _db = new Database(path); + _db.pragma('journal_mode = WAL'); + _db.pragma('foreign_keys = ON'); + applySchema(_db); + return _db; +} + +export function resetDb(): void { + _db = null; +} diff --git a/src/db/schema.ts b/src/db/schema.ts new file mode 100644 index 0000000..d950b96 --- /dev/null +++ b/src/db/schema.ts @@ -0,0 +1,28 @@ +import type { Database } from 'better-sqlite3'; + +export function applySchema(db: Database): void { + db.exec(` + CREATE TABLE IF NOT EXISTS sessions ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + date TEXT NOT NULL, + duration_min INTEGER NOT NULL, + notes TEXT, + created_at TEXT NOT NULL DEFAULT (datetime('now')) + ); + + CREATE TABLE IF NOT EXISTS schedule ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + date TEXT NOT NULL UNIQUE, + planned_min INTEGER NOT NULL, + status TEXT NOT NULL DEFAULT 'pending', + skip_reason TEXT, + ai_rationale TEXT, + created_at TEXT NOT NULL DEFAULT (datetime('now')) + ); + + CREATE TABLE IF NOT EXISTS settings ( + key TEXT PRIMARY KEY, + value TEXT NOT NULL + ); + `); +}