@opencard-dev/core 0.2.3 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/db.d.ts CHANGED
@@ -22,7 +22,7 @@
22
22
  *
23
23
  * ─────────────────────────────────────────────────────────────────────────────
24
24
  */
25
- import Database from 'better-sqlite3';
25
+ import { Database as SqlJsDatabase } from 'sql.js';
26
26
  export interface ApprovalRequest {
27
27
  id: string;
28
28
  card_id: string;
@@ -96,28 +96,34 @@ export interface StoredCardholder {
96
96
  export declare class OpenCardDatabase {
97
97
  private readonly dbPath;
98
98
  private db;
99
+ private initialized;
99
100
  constructor(dbPath?: string);
100
101
  private initialize;
102
+ private save;
101
103
  private runMigrations;
102
- getDb(): Database.Database;
104
+ private ensureInitialized;
105
+ private rowsToObjects;
106
+ private normalizeParams;
103
107
  close(): void;
104
- createTransaction(record: Omit<StoredTransaction, 'id' | 'recorded_at'>): StoredTransaction;
105
- getTransaction(id: string): StoredTransaction | null;
106
- getTransactionsForCard(cardId: string, limit?: number): StoredTransaction[];
107
- createAuthorization(record: Omit<StoredAuthorization, 'id' | 'created_at' | 'updated_at'>): StoredAuthorization;
108
- updateAuthorization(id: string, updates: Partial<Omit<StoredAuthorization, 'id' | 'stripe_id' | 'created_at'>>): StoredAuthorization;
109
- getAuthorization(id: string): StoredAuthorization | null;
110
- getAuthorizationByStripeId(stripeId: string): StoredAuthorization | null;
111
- getPendingAuthorizationsOlderThan(cardId: string, hours: number): StoredAuthorization[];
112
- createRuleVersion(ruleId: string, config: string, changeType: string, changedBy?: string): RuleVersion;
113
- getRuleHistory(ruleId: string): RuleVersion[];
114
- getRuleAtVersion(ruleId: string, version: number): RuleVersion | null;
115
- saveRule(id: string, cardId: string | null, name: string | null, config: string): void;
116
- getRule(id: string): {
108
+ getDb(): Promise<SqlJsDatabase>;
109
+ createTransaction(record: Omit<StoredTransaction, 'id' | 'recorded_at'>): Promise<StoredTransaction>;
110
+ getTransaction(id: string): Promise<StoredTransaction | null>;
111
+ getTransactionsForCard(cardId: string, limit?: number): Promise<StoredTransaction[]>;
112
+ updateTransaction(stripeId: string, updates: Partial<Omit<StoredTransaction, 'id' | 'stripe_id' | 'card_id' | 'recorded_at'>>): Promise<StoredTransaction>;
113
+ createAuthorization(record: Omit<StoredAuthorization, 'id' | 'created_at' | 'updated_at'>): Promise<StoredAuthorization>;
114
+ updateAuthorization(id: string, updates: Partial<Omit<StoredAuthorization, 'id' | 'stripe_id' | 'created_at'>>): Promise<StoredAuthorization>;
115
+ getAuthorization(id: string): Promise<StoredAuthorization | null>;
116
+ getAuthorizationByStripeId(stripeId: string): Promise<StoredAuthorization | null>;
117
+ getPendingAuthorizationsOlderThan(cardId: string, hours: number): Promise<StoredAuthorization[]>;
118
+ createRuleVersion(ruleId: string, config: string, changeType: string, changedBy?: string): Promise<RuleVersion>;
119
+ getRuleHistory(ruleId: string): Promise<RuleVersion[]>;
120
+ getRuleAtVersion(ruleId: string, version: number): Promise<RuleVersion | null>;
121
+ saveRule(id: string, cardId: string | null, name: string | null, config: string): Promise<void>;
122
+ getRule(id: string): Promise<{
117
123
  id: string;
118
124
  config: string;
119
- } | null;
120
- deleteRule(id: string): void;
125
+ } | null>;
126
+ deleteRule(id: string): Promise<void>;
121
127
  createApprovalRequest(record: {
122
128
  card_id: string;
123
129
  amount: number;
@@ -126,13 +132,19 @@ export declare class OpenCardDatabase {
126
132
  merchant_category?: string | null;
127
133
  reason: string;
128
134
  timeout_seconds?: number;
129
- }): ApprovalRequest;
130
- getApprovalRequest(id: string): ApprovalRequest | null;
131
- listPendingApprovalRequests(): ApprovalRequest[];
132
- listAllApprovalRequests(limit?: number): ApprovalRequest[];
133
- approveRequest(id: string, decidedBy: string, note?: string): ApprovalRequest;
134
- denyRequest(id: string, decidedBy: string, note?: string): ApprovalRequest;
135
- expireStaleApprovalRequests(): number;
135
+ }): Promise<ApprovalRequest>;
136
+ getApprovalRequest(id: string): Promise<ApprovalRequest | null>;
137
+ listPendingApprovalRequests(): Promise<ApprovalRequest[]>;
138
+ listAllApprovalRequests(limit?: number): Promise<ApprovalRequest[]>;
139
+ approveRequest(id: string, decidedBy: string, note?: string): Promise<ApprovalRequest>;
140
+ denyRequest(id: string, decidedBy: string, note?: string): Promise<ApprovalRequest>;
141
+ expireStaleApprovalRequests(): Promise<number>;
142
+ getSpendTotals(cardId: string): Promise<{
143
+ daily_cents: number;
144
+ monthly_cents: number;
145
+ all_time_cents: number;
146
+ }>;
147
+ getRecentTransactions(cardId: string, limit?: number): Promise<StoredTransaction[]>;
136
148
  }
137
149
  /**
138
150
  * Initialize and return a new database instance.
@@ -141,5 +153,5 @@ export declare class OpenCardDatabase {
141
153
  *
142
154
  * @param dbPath - Optional path override. Defaults to OPENCARD_DB_PATH env var or ~/.opencard/opencard.db
143
155
  */
144
- export declare function initDatabase(dbPath?: string): OpenCardDatabase;
156
+ export declare function initDatabase(dbPath?: string): Promise<OpenCardDatabase>;
145
157
  //# sourceMappingURL=db.d.ts.map
package/dist/db.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
package/dist/db.js CHANGED
@@ -29,13 +29,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
29
29
  Object.defineProperty(exports, "__esModule", { value: true });
30
30
  exports.OpenCardDatabase = void 0;
31
31
  exports.initDatabase = initDatabase;
32
- const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
32
+ const sql_js_1 = __importDefault(require("sql.js"));
33
33
  const fs_1 = __importDefault(require("fs"));
34
34
  const path_1 = __importDefault(require("path"));
35
35
  const os_1 = __importDefault(require("os"));
36
36
  class OpenCardDatabase {
37
37
  dbPath;
38
38
  db = null;
39
+ initialized = false;
39
40
  constructor(dbPath) {
40
41
  if (dbPath) {
41
42
  this.dbPath = dbPath;
@@ -51,22 +52,37 @@ class OpenCardDatabase {
51
52
  if (!fs_1.default.existsSync(dir)) {
52
53
  fs_1.default.mkdirSync(dir, { recursive: true });
53
54
  if (process.env.OPENCARD_LOG !== 'silent')
54
- if (process.env.OPENCARD_LOG !== 'silent')
55
- console.log(`[OpenCardDB] Created directory: ${dir}`);
55
+ console.log(`[OpenCardDB] Created directory: ${dir}`);
56
56
  }
57
- this.initialize();
58
57
  }
59
- initialize() {
60
- if (this.db)
58
+ async initialize() {
59
+ if (this.initialized)
61
60
  return;
62
- this.db = new better_sqlite3_1.default(this.dbPath);
63
- this.db.pragma('journal_mode = WAL');
64
- this.db.pragma('foreign_keys = ON');
61
+ const SQL = await (0, sql_js_1.default)();
62
+ // Load existing DB or create new
63
+ if (fs_1.default.existsSync(this.dbPath)) {
64
+ const buffer = fs_1.default.readFileSync(this.dbPath);
65
+ this.db = new SQL.Database(buffer);
66
+ }
67
+ else {
68
+ this.db = new SQL.Database();
69
+ }
70
+ // Enable foreign keys pragma (sql.js doesn't have WAL, but we handle persistence manually)
71
+ this.db.run('PRAGMA foreign_keys = ON');
65
72
  if (process.env.OPENCARD_LOG !== 'silent')
66
73
  console.log(`[OpenCardDB] Opened database: ${this.dbPath}`);
67
- this.runMigrations();
74
+ await this.runMigrations();
75
+ this.initialized = true;
68
76
  }
69
- runMigrations() {
77
+ save() {
78
+ if (!this.db) {
79
+ throw new Error('[OpenCardDB] Database not initialized');
80
+ }
81
+ const data = this.db.export();
82
+ const buffer = Buffer.from(data);
83
+ fs_1.default.writeFileSync(this.dbPath, buffer);
84
+ }
85
+ async runMigrations() {
70
86
  if (!this.db) {
71
87
  throw new Error('[OpenCardDB] Database not initialized');
72
88
  }
@@ -84,13 +100,11 @@ class OpenCardDatabase {
84
100
  const migrationPath = path_1.default.join(migrationsDir, file);
85
101
  const sql = fs_1.default.readFileSync(migrationPath, 'utf-8');
86
102
  // Check if migrations table exists each iteration — the first migration creates it.
87
- const migrationsTableExists = this.db
88
- .prepare("SELECT 1 FROM sqlite_master WHERE type='table' AND name='migrations'")
89
- .get();
103
+ const checkMigrationsTable = this.db.exec("SELECT 1 FROM sqlite_master WHERE type='table' AND name='migrations'");
104
+ const migrationsTableExists = checkMigrationsTable.length > 0;
90
105
  if (migrationsTableExists) {
91
- const alreadyApplied = this.db
92
- .prepare('SELECT 1 FROM migrations WHERE name = ?')
93
- .get(migrationName);
106
+ const result = this.db.exec('SELECT 1 FROM migrations WHERE name = ?', [migrationName]);
107
+ const alreadyApplied = result.length > 0 && result[0].values.length > 0;
94
108
  if (alreadyApplied) {
95
109
  if (process.env.OPENCARD_LOG !== 'silent')
96
110
  console.log(`[OpenCardDB] Already applied: ${migrationName}`);
@@ -98,8 +112,10 @@ class OpenCardDatabase {
98
112
  }
99
113
  }
100
114
  try {
115
+ // sql.js exec() can handle multiple statements separated by semicolons
101
116
  this.db.exec(sql);
102
- this.db.prepare('INSERT INTO migrations (name) VALUES (?)').run(migrationName);
117
+ this.db.run('INSERT INTO migrations (name) VALUES (?)', [migrationName]);
118
+ this.save();
103
119
  if (process.env.OPENCARD_LOG !== 'silent')
104
120
  console.log(`[OpenCardDB] Applied migration: ${migrationName}`);
105
121
  }
@@ -108,271 +124,358 @@ class OpenCardDatabase {
108
124
  }
109
125
  }
110
126
  }
111
- getDb() {
127
+ async ensureInitialized() {
128
+ if (!this.initialized) {
129
+ await this.initialize();
130
+ }
112
131
  if (!this.db) {
113
132
  throw new Error('[OpenCardDB] Database not initialized');
114
133
  }
115
134
  return this.db;
116
135
  }
136
+ rowsToObjects(result) {
137
+ if (!result.length)
138
+ return [];
139
+ const { columns, values } = result[0];
140
+ return values.map((row) => {
141
+ const obj = {};
142
+ columns.forEach((col, i) => {
143
+ obj[col] = row[i];
144
+ });
145
+ return obj;
146
+ });
147
+ }
148
+ normalizeParams(params) {
149
+ // sql.js doesn't accept undefined; convert to null
150
+ return params.map(p => p === undefined ? null : p);
151
+ }
117
152
  close() {
118
153
  if (this.db) {
154
+ this.save();
119
155
  this.db.close();
120
156
  this.db = null;
157
+ this.initialized = false;
121
158
  if (process.env.OPENCARD_LOG !== 'silent')
122
159
  console.log(`[OpenCardDB] Closed database`);
123
160
  }
124
161
  }
125
- createTransaction(record) {
126
- const db = this.getDb();
162
+ async getDb() {
163
+ return this.ensureInitialized();
164
+ }
165
+ async createTransaction(record) {
166
+ const db = await this.ensureInitialized();
127
167
  const id = `txn_${Date.now()}_${Math.random().toString(36).substring(7)}`;
128
- const stmt = db.prepare(`
168
+ db.run(`
129
169
  INSERT INTO transactions (
130
170
  id, stripe_id, card_id, amount, currency,
131
171
  merchant_name, merchant_category, status, stripe_created_at
132
172
  ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
133
- `);
134
- stmt.run(id, record.stripe_id, record.card_id, record.amount, record.currency, record.merchant_name, record.merchant_category, record.status, record.stripe_created_at);
135
- const result = db
136
- .prepare('SELECT * FROM transactions WHERE id = ?')
137
- .get(id);
173
+ `, this.normalizeParams([
174
+ id, record.stripe_id, record.card_id, record.amount, record.currency,
175
+ record.merchant_name, record.merchant_category, record.status, record.stripe_created_at
176
+ ]));
177
+ this.save();
178
+ const result = db.exec('SELECT * FROM transactions WHERE id = ?', [id]);
179
+ const transactions = this.rowsToObjects(result);
138
180
  if (process.env.OPENCARD_LOG !== 'silent')
139
181
  console.log(`[OpenCardDB] Created transaction: ${id}`);
140
- return result;
141
- }
142
- getTransaction(id) {
143
- const db = this.getDb();
144
- return db
145
- .prepare('SELECT * FROM transactions WHERE id = ?')
146
- .get(id) || null;
147
- }
148
- getTransactionsForCard(cardId, limit = 100) {
149
- const db = this.getDb();
150
- return db
151
- .prepare('SELECT * FROM transactions WHERE card_id = ? ORDER BY stripe_created_at DESC LIMIT ?')
152
- .all(cardId, limit);
153
- }
154
- createAuthorization(record) {
155
- const db = this.getDb();
182
+ return transactions[0];
183
+ }
184
+ async getTransaction(id) {
185
+ const db = await this.ensureInitialized();
186
+ const result = db.exec('SELECT * FROM transactions WHERE id = ?', [id]);
187
+ const transactions = this.rowsToObjects(result);
188
+ return transactions[0] || null;
189
+ }
190
+ async getTransactionsForCard(cardId, limit = 100) {
191
+ const db = await this.ensureInitialized();
192
+ const result = db.exec('SELECT * FROM transactions WHERE card_id = ? ORDER BY stripe_created_at DESC LIMIT ?', [cardId, limit]);
193
+ return this.rowsToObjects(result);
194
+ }
195
+ async updateTransaction(stripeId, updates) {
196
+ const db = await this.ensureInitialized();
197
+ const result = db.exec('SELECT * FROM transactions WHERE stripe_id = ?', [stripeId]);
198
+ const transactions = this.rowsToObjects(result);
199
+ const existing = transactions[0];
200
+ if (!existing) {
201
+ throw new Error(`[OpenCardDB] Transaction ${stripeId} not found`);
202
+ }
203
+ const updatedTxn = { ...existing, ...updates };
204
+ db.run(`
205
+ UPDATE transactions
206
+ SET amount = ?, currency = ?, merchant_name = ?, merchant_category = ?,
207
+ status = ?, stripe_created_at = ?
208
+ WHERE stripe_id = ?
209
+ `, [
210
+ updatedTxn.amount, updatedTxn.currency,
211
+ updatedTxn.merchant_name, updatedTxn.merchant_category,
212
+ updatedTxn.status, updatedTxn.stripe_created_at, stripeId
213
+ ]);
214
+ this.save();
215
+ const updatedResult = db.exec('SELECT * FROM transactions WHERE stripe_id = ?', [stripeId]);
216
+ const updated = this.rowsToObjects(updatedResult);
217
+ if (process.env.OPENCARD_LOG !== 'silent')
218
+ console.log(`[OpenCardDB] Updated transaction: ${stripeId}`);
219
+ return updated[0];
220
+ }
221
+ async createAuthorization(record) {
222
+ const db = await this.ensureInitialized();
156
223
  const id = `auth_${Date.now()}_${Math.random().toString(36).substring(7)}`;
157
- const stmt = db.prepare(`
224
+ db.run(`
158
225
  INSERT INTO authorizations (
159
226
  id, stripe_id, card_id, amount, currency,
160
227
  merchant_name, merchant_category, status, decision_reason
161
228
  ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
162
- `);
163
- stmt.run(id, record.stripe_id, record.card_id, record.amount, record.currency, record.merchant_name, record.merchant_category, record.status, record.decision_reason);
164
- const result = db
165
- .prepare('SELECT * FROM authorizations WHERE id = ?')
166
- .get(id);
229
+ `, [
230
+ id, record.stripe_id, record.card_id, record.amount, record.currency,
231
+ record.merchant_name, record.merchant_category, record.status, record.decision_reason
232
+ ]);
233
+ this.save();
234
+ const result = db.exec('SELECT * FROM authorizations WHERE id = ?', [id]);
235
+ const authorizations = this.rowsToObjects(result);
167
236
  if (process.env.OPENCARD_LOG !== 'silent')
168
237
  console.log(`[OpenCardDB] Created authorization: ${id}`);
169
- return result;
238
+ return authorizations[0];
170
239
  }
171
- updateAuthorization(id, updates) {
172
- const db = this.getDb();
173
- const existingAuth = db
174
- .prepare('SELECT * FROM authorizations WHERE id = ?')
175
- .get(id);
240
+ async updateAuthorization(id, updates) {
241
+ const db = await this.ensureInitialized();
242
+ const result = db.exec('SELECT * FROM authorizations WHERE id = ?', [id]);
243
+ const authorizations = this.rowsToObjects(result);
244
+ const existingAuth = authorizations[0];
176
245
  if (!existingAuth) {
177
246
  throw new Error(`[OpenCardDB] Authorization ${id} not found`);
178
247
  }
179
248
  const updatedAuth = { ...existingAuth, ...updates };
180
- const stmt = db.prepare(`
249
+ db.run(`
181
250
  UPDATE authorizations
182
251
  SET card_id = ?, amount = ?, currency = ?,
183
252
  merchant_name = ?, merchant_category = ?, status = ?, decision_reason = ?,
184
253
  updated_at = CURRENT_TIMESTAMP
185
254
  WHERE id = ?
186
- `);
187
- stmt.run(updatedAuth.card_id, updatedAuth.amount, updatedAuth.currency, updatedAuth.merchant_name, updatedAuth.merchant_category, updatedAuth.status, updatedAuth.decision_reason, id);
188
- const result = db
189
- .prepare('SELECT * FROM authorizations WHERE id = ?')
190
- .get(id);
255
+ `, [
256
+ updatedAuth.card_id, updatedAuth.amount, updatedAuth.currency,
257
+ updatedAuth.merchant_name, updatedAuth.merchant_category, updatedAuth.status,
258
+ updatedAuth.decision_reason, id
259
+ ]);
260
+ this.save();
261
+ const updatedResult = db.exec('SELECT * FROM authorizations WHERE id = ?', [id]);
262
+ const updatedAuthorizations = this.rowsToObjects(updatedResult);
191
263
  if (process.env.OPENCARD_LOG !== 'silent')
192
264
  console.log(`[OpenCardDB] Updated authorization: ${id}`);
193
- return result;
194
- }
195
- getAuthorization(id) {
196
- const db = this.getDb();
197
- return db
198
- .prepare('SELECT * FROM authorizations WHERE id = ?')
199
- .get(id) || null;
200
- }
201
- getAuthorizationByStripeId(stripeId) {
202
- const db = this.getDb();
203
- return db
204
- .prepare('SELECT * FROM authorizations WHERE stripe_id = ?')
205
- .get(stripeId) || null;
206
- }
207
- getPendingAuthorizationsOlderThan(cardId, hours) {
208
- const db = this.getDb();
265
+ return updatedAuthorizations[0];
266
+ }
267
+ async getAuthorization(id) {
268
+ const db = await this.ensureInitialized();
269
+ const result = db.exec('SELECT * FROM authorizations WHERE id = ?', [id]);
270
+ const authorizations = this.rowsToObjects(result);
271
+ return authorizations[0] || null;
272
+ }
273
+ async getAuthorizationByStripeId(stripeId) {
274
+ const db = await this.ensureInitialized();
275
+ const result = db.exec('SELECT * FROM authorizations WHERE stripe_id = ?', [stripeId]);
276
+ const authorizations = this.rowsToObjects(result);
277
+ return authorizations[0] || null;
278
+ }
279
+ async getPendingAuthorizationsOlderThan(cardId, hours) {
280
+ const db = await this.ensureInitialized();
209
281
  // Use SQLite's datetime() to compute the cutoff relative to 'now' — this
210
282
  // avoids timezone/format mismatches between JS ISO strings and SQLite's
211
283
  // CURRENT_TIMESTAMP format ('YYYY-MM-DD HH:MM:SS' without timezone).
212
284
  const cutoffExpr = `-${hours} hours`;
213
- return db
214
- .prepare("SELECT * FROM authorizations WHERE card_id = ? AND status = ? AND created_at < datetime('now', ?) ORDER BY created_at")
215
- .all(cardId, 'pending', cutoffExpr);
216
- }
217
- createRuleVersion(ruleId, config, changeType, changedBy) {
218
- const db = this.getDb();
219
- const maxVersion = db
220
- .prepare('SELECT MAX(version) as v FROM rule_versions WHERE rule_id = ?')
221
- .get(ruleId);
222
- const nextVersion = (maxVersion.v || 0) + 1;
223
- const stmt = db.prepare(`
285
+ const result = db.exec("SELECT * FROM authorizations WHERE card_id = ? AND status = ? AND created_at < datetime('now', ?) ORDER BY created_at", [cardId, 'pending', cutoffExpr]);
286
+ return this.rowsToObjects(result);
287
+ }
288
+ async createRuleVersion(ruleId, config, changeType, changedBy) {
289
+ const db = await this.ensureInitialized();
290
+ const maxVersionResult = db.exec('SELECT MAX(version) as v FROM rule_versions WHERE rule_id = ?', [ruleId]);
291
+ const maxVersionRows = this.rowsToObjects(maxVersionResult);
292
+ const maxVersion = maxVersionRows[0]?.v || 0;
293
+ const nextVersion = (maxVersion || 0) + 1;
294
+ db.run(`
224
295
  INSERT INTO rule_versions (rule_id, version, config, changed_by, change_type)
225
296
  VALUES (?, ?, ?, ?, ?)
226
- `);
227
- stmt.run(ruleId, nextVersion, config, changedBy || null, changeType);
228
- const result = db
229
- .prepare('SELECT * FROM rule_versions WHERE rule_id = ? AND version = ?')
230
- .get(ruleId, nextVersion);
297
+ `, [ruleId, nextVersion, config, changedBy || null, changeType]);
298
+ this.save();
299
+ const result = db.exec('SELECT * FROM rule_versions WHERE rule_id = ? AND version = ?', [ruleId, nextVersion]);
300
+ const versions = this.rowsToObjects(result);
231
301
  if (process.env.OPENCARD_LOG !== 'silent')
232
302
  console.log(`[OpenCardDB] Created rule version: ${ruleId} v${nextVersion} (${changeType})`);
233
- return result;
234
- }
235
- getRuleHistory(ruleId) {
236
- const db = this.getDb();
237
- return db
238
- .prepare('SELECT * FROM rule_versions WHERE rule_id = ? ORDER BY version ASC')
239
- .all(ruleId);
240
- }
241
- getRuleAtVersion(ruleId, version) {
242
- const db = this.getDb();
243
- return db
244
- .prepare('SELECT * FROM rule_versions WHERE rule_id = ? AND version = ?')
245
- .get(ruleId, version) || null;
246
- }
247
- saveRule(id, cardId, name, config) {
248
- const db = this.getDb();
249
- const existing = db
250
- .prepare('SELECT 1 FROM rules WHERE id = ?')
251
- .get(id);
303
+ return versions[0];
304
+ }
305
+ async getRuleHistory(ruleId) {
306
+ const db = await this.ensureInitialized();
307
+ const result = db.exec('SELECT * FROM rule_versions WHERE rule_id = ? ORDER BY version ASC', [ruleId]);
308
+ return this.rowsToObjects(result);
309
+ }
310
+ async getRuleAtVersion(ruleId, version) {
311
+ const db = await this.ensureInitialized();
312
+ const result = db.exec('SELECT * FROM rule_versions WHERE rule_id = ? AND version = ?', [ruleId, version]);
313
+ const versions = this.rowsToObjects(result);
314
+ return versions[0] || null;
315
+ }
316
+ async saveRule(id, cardId, name, config) {
317
+ const db = await this.ensureInitialized();
318
+ const existingResult = db.exec('SELECT 1 FROM rules WHERE id = ?', [id]);
319
+ const existing = existingResult.length > 0 && existingResult[0].values.length > 0;
252
320
  if (existing) {
253
- const stmt = db.prepare(`
321
+ db.run(`
254
322
  UPDATE rules
255
323
  SET card_id = ?, name = ?, config = ?, updated_at = CURRENT_TIMESTAMP
256
324
  WHERE id = ?
257
- `);
258
- stmt.run(cardId, name, config, id);
325
+ `, [cardId, name, config, id]);
259
326
  }
260
327
  else {
261
- const stmt = db.prepare(`
328
+ db.run(`
262
329
  INSERT INTO rules (id, card_id, name, config)
263
330
  VALUES (?, ?, ?, ?)
264
- `);
265
- stmt.run(id, cardId, name, config);
331
+ `, [id, cardId, name, config]);
266
332
  }
333
+ this.save();
267
334
  }
268
- getRule(id) {
269
- const db = this.getDb();
270
- return db
271
- .prepare('SELECT id, config FROM rules WHERE id = ?')
272
- .get(id) || null;
335
+ async getRule(id) {
336
+ const db = await this.ensureInitialized();
337
+ const result = db.exec('SELECT id, config FROM rules WHERE id = ?', [id]);
338
+ const rules = this.rowsToObjects(result);
339
+ return rules[0] || null;
273
340
  }
274
- deleteRule(id) {
275
- const db = this.getDb();
276
- db.prepare('DELETE FROM rules WHERE id = ?').run(id);
341
+ async deleteRule(id) {
342
+ const db = await this.ensureInitialized();
343
+ db.run('DELETE FROM rules WHERE id = ?', [id]);
344
+ this.save();
277
345
  if (process.env.OPENCARD_LOG !== 'silent')
278
346
  console.log(`[OpenCardDB] Deleted rule: ${id}`);
279
347
  }
280
348
  // ─── Approval Requests ───────────────────────────────────────────────────
281
- createApprovalRequest(record) {
282
- const db = this.getDb();
349
+ async createApprovalRequest(record) {
350
+ const db = await this.ensureInitialized();
283
351
  const id = `apr_${Date.now()}_${Math.random().toString(36).substring(7)}`;
284
352
  const timeoutSeconds = record.timeout_seconds ?? 300;
285
353
  const expiresAt = new Date(Date.now() + timeoutSeconds * 1000)
286
354
  .toISOString()
287
355
  .replace('T', ' ')
288
356
  .slice(0, 19);
289
- const stmt = db.prepare(`
357
+ db.run(`
290
358
  INSERT INTO approval_requests (
291
359
  id, card_id, amount, currency, merchant_name, merchant_category,
292
360
  reason, status, expires_at
293
361
  ) VALUES (?, ?, ?, ?, ?, ?, ?, 'pending', ?)
294
- `);
295
- stmt.run(id, record.card_id, record.amount, record.currency ?? 'usd', record.merchant_name, record.merchant_category ?? null, record.reason, expiresAt);
296
- const result = db
297
- .prepare('SELECT * FROM approval_requests WHERE id = ?')
298
- .get(id);
362
+ `, [
363
+ id,
364
+ record.card_id,
365
+ record.amount,
366
+ record.currency ?? 'usd',
367
+ record.merchant_name,
368
+ record.merchant_category ?? null,
369
+ record.reason,
370
+ expiresAt,
371
+ ]);
372
+ this.save();
373
+ const result = db.exec('SELECT * FROM approval_requests WHERE id = ?', [id]);
374
+ const requests = this.rowsToObjects(result);
299
375
  if (process.env.OPENCARD_LOG !== 'silent')
300
376
  console.log(`[OpenCardDB] Created approval request: ${id}`);
301
- return result;
302
- }
303
- getApprovalRequest(id) {
304
- const db = this.getDb();
305
- return db
306
- .prepare('SELECT * FROM approval_requests WHERE id = ?')
307
- .get(id) || null;
308
- }
309
- listPendingApprovalRequests() {
310
- const db = this.getDb();
311
- return db
312
- .prepare("SELECT * FROM approval_requests WHERE status = 'pending' ORDER BY created_at ASC")
313
- .all();
314
- }
315
- listAllApprovalRequests(limit = 50) {
316
- const db = this.getDb();
317
- return db
318
- .prepare('SELECT * FROM approval_requests ORDER BY created_at DESC LIMIT ?')
319
- .all(limit);
320
- }
321
- approveRequest(id, decidedBy, note) {
322
- const db = this.getDb();
323
- const existing = db
324
- .prepare('SELECT * FROM approval_requests WHERE id = ?')
325
- .get(id);
326
- if (!existing) {
377
+ return requests[0];
378
+ }
379
+ async getApprovalRequest(id) {
380
+ const db = await this.ensureInitialized();
381
+ const result = db.exec('SELECT * FROM approval_requests WHERE id = ?', [id]);
382
+ const requests = this.rowsToObjects(result);
383
+ return requests[0] || null;
384
+ }
385
+ async listPendingApprovalRequests() {
386
+ const db = await this.ensureInitialized();
387
+ const result = db.exec("SELECT * FROM approval_requests WHERE status = 'pending' ORDER BY created_at ASC");
388
+ return this.rowsToObjects(result);
389
+ }
390
+ async listAllApprovalRequests(limit = 50) {
391
+ const db = await this.ensureInitialized();
392
+ const result = db.exec('SELECT * FROM approval_requests ORDER BY created_at DESC LIMIT ?', [limit]);
393
+ return this.rowsToObjects(result);
394
+ }
395
+ async approveRequest(id, decidedBy, note) {
396
+ const db = await this.ensureInitialized();
397
+ const existingResult = db.exec('SELECT * FROM approval_requests WHERE id = ?', [id]);
398
+ const existing = this.rowsToObjects(existingResult);
399
+ if (!existing[0]) {
327
400
  throw new Error(`Approval request ${id} not found`);
328
401
  }
329
- if (existing.status !== 'pending') {
330
- throw new Error(`Approval request ${id} is already ${existing.status}`);
402
+ if (existing[0].status !== 'pending') {
403
+ throw new Error(`Approval request ${id} is already ${existing[0].status}`);
331
404
  }
332
405
  const now = new Date().toISOString().replace('T', ' ').slice(0, 19);
333
- db.prepare(`
406
+ db.run(`
334
407
  UPDATE approval_requests
335
408
  SET status = 'approved', decided_by = ?, decided_at = ?, decision_note = ?
336
409
  WHERE id = ?
337
- `).run(decidedBy, now, note ?? null, id);
410
+ `, [decidedBy, now, note ?? null, id]);
411
+ this.save();
338
412
  if (process.env.OPENCARD_LOG !== 'silent')
339
413
  console.log(`[OpenCardDB] Approved request: ${id} by ${decidedBy}`);
340
- return db.prepare('SELECT * FROM approval_requests WHERE id = ?').get(id);
414
+ const updatedResult = db.exec('SELECT * FROM approval_requests WHERE id = ?', [id]);
415
+ const updated = this.rowsToObjects(updatedResult);
416
+ return updated[0];
341
417
  }
342
- denyRequest(id, decidedBy, note) {
343
- const db = this.getDb();
344
- const existing = db
345
- .prepare('SELECT * FROM approval_requests WHERE id = ?')
346
- .get(id);
347
- if (!existing) {
418
+ async denyRequest(id, decidedBy, note) {
419
+ const db = await this.ensureInitialized();
420
+ const existingResult = db.exec('SELECT * FROM approval_requests WHERE id = ?', [id]);
421
+ const existing = this.rowsToObjects(existingResult);
422
+ if (!existing[0]) {
348
423
  throw new Error(`Approval request ${id} not found`);
349
424
  }
350
- if (existing.status !== 'pending') {
351
- throw new Error(`Approval request ${id} is already ${existing.status}`);
425
+ if (existing[0].status !== 'pending') {
426
+ throw new Error(`Approval request ${id} is already ${existing[0].status}`);
352
427
  }
353
428
  const now = new Date().toISOString().replace('T', ' ').slice(0, 19);
354
- db.prepare(`
429
+ db.run(`
355
430
  UPDATE approval_requests
356
431
  SET status = 'denied', decided_by = ?, decided_at = ?, decision_note = ?
357
432
  WHERE id = ?
358
- `).run(decidedBy, now, note ?? null, id);
433
+ `, [decidedBy, now, note ?? null, id]);
434
+ this.save();
359
435
  if (process.env.OPENCARD_LOG !== 'silent')
360
436
  console.log(`[OpenCardDB] Denied request: ${id} by ${decidedBy}`);
361
- return db.prepare('SELECT * FROM approval_requests WHERE id = ?').get(id);
437
+ const updatedResult = db.exec('SELECT * FROM approval_requests WHERE id = ?', [id]);
438
+ const updated = this.rowsToObjects(updatedResult);
439
+ return updated[0];
362
440
  }
363
- expireStaleApprovalRequests() {
364
- const db = this.getDb();
441
+ async expireStaleApprovalRequests() {
442
+ const db = await this.ensureInitialized();
365
443
  const now = new Date().toISOString().replace('T', ' ').slice(0, 19);
366
- const result = db.prepare(`
444
+ // sql.js run() returns void, so we count affected rows differently
445
+ db.run(`
367
446
  UPDATE approval_requests
368
447
  SET status = 'expired'
369
448
  WHERE status = 'pending' AND expires_at <= ?
370
- `).run(now);
371
- if (result.changes > 0) {
449
+ `, [now]);
450
+ this.save();
451
+ // Count expired requests to report changes
452
+ const countResult = db.exec("SELECT COUNT(*) as changes FROM approval_requests WHERE status = 'expired' AND expires_at <= ?", [now]);
453
+ const countRows = this.rowsToObjects(countResult);
454
+ const changes = countRows[0]?.changes || 0;
455
+ if (changes > 0) {
372
456
  if (process.env.OPENCARD_LOG !== 'silent')
373
- console.log(`[OpenCardDB] Expired ${result.changes} stale approval request(s)`);
457
+ console.log(`[OpenCardDB] Expired ${changes} stale approval request(s)`);
374
458
  }
375
- return result.changes;
459
+ return changes;
460
+ }
461
+ // ── Aggregate query methods for spend tracking ──────────────────────────
462
+ async getSpendTotals(cardId) {
463
+ const db = await this.ensureInitialized();
464
+ const dailyResult = db.exec("SELECT COALESCE(SUM(amount), 0) as total FROM authorizations WHERE card_id = ? AND status = 'approved' AND created_at >= date('now')", [cardId]);
465
+ const dailyRows = this.rowsToObjects(dailyResult);
466
+ const daily_cents = dailyRows[0]?.total || 0;
467
+ const monthlyResult = db.exec("SELECT COALESCE(SUM(amount), 0) as total FROM authorizations WHERE card_id = ? AND status = 'approved' AND created_at >= strftime('%Y-%m-01', 'now')", [cardId]);
468
+ const monthlyRows = this.rowsToObjects(monthlyResult);
469
+ const monthly_cents = monthlyRows[0]?.total || 0;
470
+ const allTimeResult = db.exec("SELECT COALESCE(SUM(amount), 0) as total FROM transactions WHERE card_id = ? AND status = 'captured'", [cardId]);
471
+ const allTimeRows = this.rowsToObjects(allTimeResult);
472
+ const all_time_cents = allTimeRows[0]?.total || 0;
473
+ return { daily_cents, monthly_cents, all_time_cents };
474
+ }
475
+ async getRecentTransactions(cardId, limit = 5) {
476
+ const db = await this.ensureInitialized();
477
+ const result = db.exec("SELECT id, stripe_id, card_id, amount, currency, merchant_name, merchant_category, status, stripe_created_at, recorded_at FROM transactions WHERE card_id = ? AND status = 'captured' ORDER BY stripe_created_at DESC LIMIT ?", [cardId, limit]);
478
+ return this.rowsToObjects(result);
376
479
  }
377
480
  }
378
481
  exports.OpenCardDatabase = OpenCardDatabase;
@@ -383,7 +486,9 @@ exports.OpenCardDatabase = OpenCardDatabase;
383
486
  *
384
487
  * @param dbPath - Optional path override. Defaults to OPENCARD_DB_PATH env var or ~/.opencard/opencard.db
385
488
  */
386
- function initDatabase(dbPath) {
387
- return new OpenCardDatabase(dbPath);
489
+ async function initDatabase(dbPath) {
490
+ const db = new OpenCardDatabase(dbPath);
491
+ await db['initialize'](); // Call private initialize() to set up sql.js
492
+ return db;
388
493
  }
389
494
  //# sourceMappingURL=db.js.map
package/dist/db.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
@@ -12,7 +12,8 @@ export interface ReconciliationResult {
12
12
  }
13
13
  export declare class TransactionReconciler {
14
14
  private database;
15
- constructor(database?: OpenCardDatabase);
15
+ private databasePromise;
16
+ constructor(database?: OpenCardDatabase | Promise<OpenCardDatabase>);
16
17
  /**
17
18
  * Handle an authorization request event.
18
19
  * Persists the authorization with 'pending' status and the given decision reason.
@@ -20,11 +21,11 @@ export declare class TransactionReconciler {
20
21
  * @param auth - Stripe authorization object
21
22
  * @param decisionReason - The actual reason string from the rules engine (optional)
22
23
  */
23
- handleAuthorizationRequest(auth: Stripe.Issuing.Authorization, decisionReason?: string): StoredAuthorization;
24
- handleAuthorizationCreated(auth: Stripe.Issuing.Authorization): StoredAuthorization | null;
25
- handleTransactionCreated(txn: Stripe.Issuing.Transaction): StoredTransaction;
26
- handleTransactionUpdated(txn: Stripe.Issuing.Transaction): StoredTransaction | null;
27
- findOrphanedAuthorizations(cardId?: string, hoursOld?: number): StoredAuthorization[];
24
+ handleAuthorizationRequest(auth: Stripe.Issuing.Authorization, decisionReason?: string): Promise<StoredAuthorization>;
25
+ handleAuthorizationCreated(auth: Stripe.Issuing.Authorization): Promise<StoredAuthorization | null>;
26
+ handleTransactionCreated(txn: Stripe.Issuing.Transaction): Promise<StoredTransaction>;
27
+ handleTransactionUpdated(txn: Stripe.Issuing.Transaction): Promise<StoredTransaction | null>;
28
+ findOrphanedAuthorizations(cardId?: string, hoursOld?: number): Promise<StoredAuthorization[]>;
28
29
  reconcile(): Promise<ReconciliationResult>;
29
30
  }
30
31
  //# sourceMappingURL=transaction-reconciler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"transaction-reconciler.d.ts","sourceRoot":"","sources":["../src/transaction-reconciler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,gBAAgB,EAAgB,MAAM,MAAM,CAAC;AAK9F,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAmB;gBAEvB,QAAQ,CAAC,EAAE,gBAAgB;IAIvC;;;;;;OAMG;IACH,0BAA0B,CACxB,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,aAAa,EAClC,cAAc,CAAC,EAAE,MAAM,GACtB,mBAAmB;IAkBtB,0BAA0B,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,aAAa,GAAG,mBAAmB,GAAG,IAAI;IAiC1F,wBAAwB,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,GAAG,iBAAiB;IAuB5E,wBAAwB,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,GAAG,iBAAiB,GAAG,IAAI;IAwBnF,0BAA0B,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,SAAI,GAAG,mBAAmB,EAAE;IAe1E,SAAS,IAAI,OAAO,CAAC,oBAAoB,CAAC;CAqBjD"}
1
+ {"version":3,"file":"transaction-reconciler.d.ts","sourceRoot":"","sources":["../src/transaction-reconciler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,gBAAgB,EAAgB,MAAM,MAAM,CAAC;AAK9F,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,eAAe,CAA4B;gBAEvC,QAAQ,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAkBnE;;;;;;OAMG;IACG,0BAA0B,CAC9B,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,aAAa,EAClC,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,mBAAmB,CAAC;IAmBzB,0BAA0B,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,aAAa,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAkCnG,wBAAwB,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAwBrF,wBAAwB,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAwB5F,0BAA0B,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,SAAI,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAgBzF,SAAS,IAAI,OAAO,CAAC,oBAAoB,CAAC;CAqBjD"}
@@ -10,8 +10,24 @@ const logger_1 = require("./logger");
10
10
  const logger = (0, logger_1.getLogger)('reconciler');
11
11
  class TransactionReconciler {
12
12
  database;
13
+ databasePromise;
13
14
  constructor(database) {
14
- this.database = database || (0, db_1.initDatabase)();
15
+ if (database instanceof Promise) {
16
+ this.databasePromise = database;
17
+ this.database = null; // Will be populated after initialization
18
+ }
19
+ else if (database) {
20
+ this.database = database;
21
+ this.databasePromise = Promise.resolve(database);
22
+ }
23
+ else {
24
+ this.databasePromise = (0, db_1.initDatabase)();
25
+ this.database = null;
26
+ }
27
+ // Initialize database property once the promise resolves
28
+ this.databasePromise.then(db => {
29
+ this.database = db;
30
+ });
15
31
  }
16
32
  /**
17
33
  * Handle an authorization request event.
@@ -20,9 +36,10 @@ class TransactionReconciler {
20
36
  * @param auth - Stripe authorization object
21
37
  * @param decisionReason - The actual reason string from the rules engine (optional)
22
38
  */
23
- handleAuthorizationRequest(auth, decisionReason) {
39
+ async handleAuthorizationRequest(auth, decisionReason) {
40
+ const db = await this.databasePromise;
24
41
  const cardId = typeof auth.card === 'string' ? auth.card : auth.card.id;
25
- const result = this.database.createAuthorization({
42
+ const result = await db.createAuthorization({
26
43
  stripe_id: auth.id,
27
44
  card_id: cardId,
28
45
  amount: auth.amount,
@@ -35,8 +52,9 @@ class TransactionReconciler {
35
52
  logger.info('Created pending authorization', { stripe_id: auth.id, decision_reason: decisionReason });
36
53
  return result;
37
54
  }
38
- handleAuthorizationCreated(auth) {
39
- const existing = this.database.getAuthorizationByStripeId(auth.id);
55
+ async handleAuthorizationCreated(auth) {
56
+ const db = await this.databasePromise;
57
+ const existing = await db.getAuthorizationByStripeId(auth.id);
40
58
  if (!existing) {
41
59
  logger.warn('Authorization.created for unknown auth', { stripe_id: auth.id });
42
60
  return null;
@@ -55,20 +73,21 @@ class TransactionReconciler {
55
73
  // If the existing record already has a specific decision reason (set during .request),
56
74
  // don't overwrite it — the .request reason is richer and more valuable.
57
75
  const finalReason = existing.decision_reason || decisionReason;
58
- const updated = this.database.updateAuthorization(existing.id, {
76
+ const updated = await db.updateAuthorization(existing.id, {
59
77
  status: newStatus,
60
78
  decision_reason: finalReason,
61
79
  });
62
80
  logger.info('Updated authorization status', { stripe_id: auth.id, status: newStatus });
63
81
  return updated;
64
82
  }
65
- handleTransactionCreated(txn) {
83
+ async handleTransactionCreated(txn) {
84
+ const db = await this.databasePromise;
66
85
  const cardId = typeof txn.card === 'string' ? txn.card : txn.card.id;
67
86
  // Stripe's Issuing.Transaction does not have a 'status' field.
68
87
  // Transactions are always captured by the time we receive issuing_transaction.created.
69
88
  // Refunds/reversals come via issuing_transaction.updated with a different type check.
70
89
  const status = 'captured';
71
- const result = this.database.createTransaction({
90
+ const result = await db.createTransaction({
72
91
  stripe_id: txn.id,
73
92
  card_id: cardId,
74
93
  amount: txn.amount,
@@ -81,8 +100,9 @@ class TransactionReconciler {
81
100
  logger.info('Created transaction', { stripe_id: txn.id, amount: txn.amount });
82
101
  return result;
83
102
  }
84
- handleTransactionUpdated(txn) {
85
- const existing = this.database.getTransaction(txn.id);
103
+ async handleTransactionUpdated(txn) {
104
+ const db = await this.databasePromise;
105
+ const existing = await db.getTransaction(txn.id);
86
106
  if (!existing) {
87
107
  logger.warn('Transaction.updated for unknown txn', { stripe_id: txn.id });
88
108
  return null;
@@ -92,17 +112,18 @@ class TransactionReconciler {
92
112
  // if it's a refund/reversal; otherwise assume captured.
93
113
  const isRefund = txn.type === 'refund';
94
114
  const newStatus = isRefund ? 'reversed' : 'captured';
95
- const db_inst = this.database.getDb();
96
- const stmt = db_inst.prepare('UPDATE transactions SET amount = ?, status = ? WHERE stripe_id = ?');
97
- stmt.run(txn.amount, newStatus, txn.id);
98
- const result = this.database.getTransaction(txn.id);
115
+ const result = await db.updateTransaction(txn.id, {
116
+ amount: txn.amount,
117
+ status: newStatus,
118
+ });
99
119
  logger.info('Updated transaction', { stripe_id: txn.id, status: newStatus });
100
- return result || null;
120
+ return result;
101
121
  }
102
- findOrphanedAuthorizations(cardId, hoursOld = 1) {
122
+ async findOrphanedAuthorizations(cardId, hoursOld = 1) {
123
+ const db = await this.databasePromise;
103
124
  const orphaned = [];
104
125
  if (cardId) {
105
- const pending = this.database.getPendingAuthorizationsOlderThan(cardId, hoursOld);
126
+ const pending = await db.getPendingAuthorizationsOlderThan(cardId, hoursOld);
106
127
  orphaned.push(...pending);
107
128
  }
108
129
  if (orphaned.length > 0) {
@@ -118,7 +139,7 @@ class TransactionReconciler {
118
139
  errors: [],
119
140
  };
120
141
  try {
121
- const orphaned = this.findOrphanedAuthorizations(undefined, 1);
142
+ const orphaned = await this.findOrphanedAuthorizations(undefined, 1);
122
143
  result.orphaned = orphaned.length;
123
144
  }
124
145
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"transaction-reconciler.js","sourceRoot":"","sources":["../src/transaction-reconciler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transaction-reconciler.js","sourceRoot":"","sources":["../src/transaction-reconciler.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opencard-dev/core",
3
- "version": "0.2.3",
3
+ "version": "0.3.0",
4
4
  "description": "Stripe Issuing wrapper with rules engine for AI agent spending",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -12,7 +12,7 @@
12
12
  "test:watch": "vitest"
13
13
  },
14
14
  "dependencies": {
15
- "better-sqlite3": "^11.0.0",
15
+ "sql.js": "^1.11.0",
16
16
  "stripe": "^14.0.0"
17
17
  },
18
18
  "devDependencies": {