import Database from "better-sqlite3"; import { mkdirSync, readFileSync, existsSync } from "node:fs"; import { dirname, resolve, join } from "node:path"; import { fileURLToPath } from "node:url"; let _db: Database.Database | null = null; function dbPath(): string { // DB_PATH hat Vorrang — docker-compose setzt es absolut. // Sonst ./data/eldov.db relativ zum CWD (Repo-Root bei `next start`). if (process.env.DB_PATH) return resolve(process.env.DB_PATH); return resolve(process.cwd(), "data", "eldov.db"); } function schemaSql(): string { // schema.sql liegt in src/lib/. Wir probieren mehrere plausible Pfade, // weil `import.meta.url` im Build auf `.next/server/chunks/...` zeigt. const here = dirname(fileURLToPath(import.meta.url)); const candidates = [ join(here, "schema.sql"), resolve(here, "..", "..", "schema.sql"), resolve(here, "..", "..", "..", "schema.sql"), resolve(process.cwd(), "src/lib/schema.sql"), resolve(process.cwd(), "schema.sql"), ]; for (const p of candidates) { if (existsSync(p)) return readFileSync(p, "utf8"); } throw new Error(`schema.sql nicht gefunden. Geprüft: ${candidates.join(", ")}`); } export function getDb(): Database.Database { if (_db) return _db; const path = dbPath(); mkdirSync(dirname(path), { recursive: true }); const db = new Database(path); db.exec(schemaSql()); // Singleton-Profile wird NICHT hier angelegt — `seedIfEmpty()` ist dafür // zuständig, damit der erste Seed klar als solcher erkennbar ist. _db = db; return db; } // Test-Hook: DB-Instanz wegwerfen (nicht für Production). export function __resetDbForTest(): void { if (_db) { _db.close(); _db = null; } }