"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getDb = getDb; const sqlite3_1 = __importDefault(require("sqlite3")); const sqlite_1 = require("sqlite"); const path_1 = __importDefault(require("path")); const dbPath = path_1.default.resolve(__dirname, '../database.sqlite'); let dbInstance = null; async function getDb() { if (dbInstance) return dbInstance; dbInstance = await (0, sqlite_1.open)({ filename: dbPath, driver: sqlite3_1.default.Database }); // Enforce foreign key constraints await dbInstance.exec('PRAGMA foreign_keys = ON'); await dbInstance.exec(` CREATE TABLE IF NOT EXISTS wallets ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, type TEXT NOT NULL, currency TEXT NOT NULL ); CREATE TABLE IF NOT EXISTS transactions ( id INTEGER PRIMARY KEY AUTOINCREMENT, type TEXT NOT NULL, -- 'income' | 'expense' | 'transfer' amount REAL NOT NULL, currency TEXT NOT NULL, wallet_id INTEGER, to_wallet_id INTEGER, -- For transfers category TEXT, note TEXT, date TEXT NOT NULL, country_id TEXT, -- For travel mode FOREIGN KEY(wallet_id) REFERENCES wallets(id), FOREIGN KEY(to_wallet_id) REFERENCES wallets(id) ); CREATE TABLE IF NOT EXISTS exchanges ( id INTEGER PRIMARY KEY AUTOINCREMENT, from_amount REAL NOT NULL, from_currency TEXT NOT NULL, to_amount REAL NOT NULL, to_currency TEXT NOT NULL, rate REAL NOT NULL, date TEXT NOT NULL, note TEXT ); CREATE TABLE IF NOT EXISTS loans ( id INTEGER PRIMARY KEY AUTOINCREMENT, person TEXT NOT NULL, type TEXT NOT NULL, -- 'borrowed_from_me' | 'owed_by_me' amount REAL NOT NULL, currency TEXT NOT NULL, paid REAL DEFAULT 0, date TEXT NOT NULL, note TEXT ); `); // Insert default wallets if empty const walletCount = await dbInstance.get('SELECT COUNT(*) as count FROM wallets'); if (walletCount.count === 0) { await dbInstance.exec(` INSERT INTO wallets (name, type, currency) VALUES ('Cash', 'cash', 'USD'), ('FIB', 'bank', 'IQD'), ('SuperQi', 'ewallet', 'IQD'), ('Alipay', 'ewallet', 'RMB'), ('WeChat Pay', 'ewallet', 'RMB'); `); } return dbInstance; }