@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 +37 -25
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +290 -185
- package/dist/db.js.map +1 -1
- package/dist/transaction-reconciler.d.ts +7 -6
- package/dist/transaction-reconciler.d.ts.map +1 -1
- package/dist/transaction-reconciler.js +39 -18
- package/dist/transaction-reconciler.js.map +1 -1
- package/package.json +2 -2
package/dist/db.d.ts
CHANGED
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
*
|
|
23
23
|
* ─────────────────────────────────────────────────────────────────────────────
|
|
24
24
|
*/
|
|
25
|
-
import Database from '
|
|
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
|
-
|
|
104
|
+
private ensureInitialized;
|
|
105
|
+
private rowsToObjects;
|
|
106
|
+
private normalizeParams;
|
|
103
107
|
close(): void;
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,
|
|
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
|
|
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
|
-
|
|
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.
|
|
58
|
+
async initialize() {
|
|
59
|
+
if (this.initialized)
|
|
61
60
|
return;
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
|
|
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
|
|
88
|
-
|
|
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
|
|
92
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
126
|
-
|
|
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
|
-
|
|
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
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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
|
|
141
|
-
}
|
|
142
|
-
getTransaction(id) {
|
|
143
|
-
const db = this.
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
}
|
|
148
|
-
getTransactionsForCard(cardId, limit = 100) {
|
|
149
|
-
const db = this.
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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
|
|
238
|
+
return authorizations[0];
|
|
170
239
|
}
|
|
171
|
-
updateAuthorization(id, updates) {
|
|
172
|
-
const db = this.
|
|
173
|
-
const
|
|
174
|
-
|
|
175
|
-
|
|
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
|
-
|
|
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
|
-
|
|
188
|
-
|
|
189
|
-
.
|
|
190
|
-
|
|
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
|
|
194
|
-
}
|
|
195
|
-
getAuthorization(id) {
|
|
196
|
-
const db = this.
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
}
|
|
201
|
-
getAuthorizationByStripeId(stripeId) {
|
|
202
|
-
const db = this.
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
}
|
|
207
|
-
getPendingAuthorizationsOlderThan(cardId, hours) {
|
|
208
|
-
const db = this.
|
|
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
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
const
|
|
219
|
-
const
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
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
|
-
|
|
228
|
-
const result = db
|
|
229
|
-
|
|
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
|
|
234
|
-
}
|
|
235
|
-
getRuleHistory(ruleId) {
|
|
236
|
-
const db = this.
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
const
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
const
|
|
249
|
-
const existing =
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
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.
|
|
276
|
-
db.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
296
|
-
|
|
297
|
-
.
|
|
298
|
-
.
|
|
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
|
|
302
|
-
}
|
|
303
|
-
getApprovalRequest(id) {
|
|
304
|
-
const db = this.
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
}
|
|
309
|
-
listPendingApprovalRequests() {
|
|
310
|
-
const db = this.
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
const
|
|
317
|
-
return
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
const
|
|
323
|
-
|
|
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.
|
|
406
|
+
db.run(`
|
|
334
407
|
UPDATE approval_requests
|
|
335
408
|
SET status = 'approved', decided_by = ?, decided_at = ?, decision_note = ?
|
|
336
409
|
WHERE id = ?
|
|
337
|
-
|
|
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
|
-
|
|
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.
|
|
344
|
-
const
|
|
345
|
-
|
|
346
|
-
|
|
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.
|
|
429
|
+
db.run(`
|
|
355
430
|
UPDATE approval_requests
|
|
356
431
|
SET status = 'denied', decided_by = ?, decided_at = ?, decision_note = ?
|
|
357
432
|
WHERE id = ?
|
|
358
|
-
|
|
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
|
-
|
|
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.
|
|
441
|
+
async expireStaleApprovalRequests() {
|
|
442
|
+
const db = await this.ensureInitialized();
|
|
365
443
|
const now = new Date().toISOString().replace('T', ' ').slice(0, 19);
|
|
366
|
-
|
|
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
|
-
|
|
371
|
-
|
|
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 ${
|
|
457
|
+
console.log(`[OpenCardDB] Expired ${changes} stale approval request(s)`);
|
|
374
458
|
}
|
|
375
|
-
return
|
|
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
|
-
|
|
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
|
-
|
|
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;
|
|
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
|
-
|
|
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 =
|
|
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
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
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
|
|
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 =
|
|
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":";AAAA;;;GAGG;;;AAGH,6BAA8F;AAC9F,qCAAqC;AAErC,MAAM,MAAM,GAAG,IAAA,kBAAS,EAAC,YAAY,CAAC,CAAC;AASvC,MAAa,qBAAqB;IACxB,QAAQ,CAAmB;
|
|
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.
|
|
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
|
-
"
|
|
15
|
+
"sql.js": "^1.11.0",
|
|
16
16
|
"stripe": "^14.0.0"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|