Spaces:
Sleeping
Sleeping
| ; | |
| 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; | |
| } | |