feat: database schema and connection
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
);
|
||||||
|
`);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user