@resvary/postgres 0.5.0-alpha.1
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/LICENSE +1 -0
- package/README.md +5 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +74 -0
- package/dist/cli.js.map +1 -0
- package/dist/connection.d.ts +19 -0
- package/dist/connection.d.ts.map +1 -0
- package/dist/connection.js +37 -0
- package/dist/connection.js.map +1 -0
- package/dist/credit.d.ts +41 -0
- package/dist/credit.d.ts.map +1 -0
- package/dist/credit.js +468 -0
- package/dist/credit.js.map +1 -0
- package/dist/health.d.ts +13 -0
- package/dist/health.d.ts.map +1 -0
- package/dist/health.js +40 -0
- package/dist/health.js.map +1 -0
- package/dist/import-sqlite.d.ts +19 -0
- package/dist/import-sqlite.d.ts.map +1 -0
- package/dist/import-sqlite.js +293 -0
- package/dist/import-sqlite.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/migrations.d.ts +11 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +160 -0
- package/dist/migrations.js.map +1 -0
- package/dist/receipt.d.ts +29 -0
- package/dist/receipt.d.ts.map +1 -0
- package/dist/receipt.js +129 -0
- package/dist/receipt.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
2
|
+
import { parseReceiptStoreValue } from '@resvary/sdk/receipts';
|
|
3
|
+
import { createPostgresHandle, rollback, table, } from './connection.js';
|
|
4
|
+
import { POSTGRES_SCHEMA_VERSION } from './migrations.js';
|
|
5
|
+
const TABLES = [
|
|
6
|
+
define('resvary_credit_accounts', ['id', 'project_id', 'customer_id', 'currency', 'posted_units', 'reserved_units', 'updated_at'], (p) => [
|
|
7
|
+
p.id,
|
|
8
|
+
p.projectId,
|
|
9
|
+
p.customerId,
|
|
10
|
+
p.currency,
|
|
11
|
+
p.postedUnits,
|
|
12
|
+
p.reservedUnits,
|
|
13
|
+
p.updatedAt,
|
|
14
|
+
]),
|
|
15
|
+
define('resvary_credit_grants', ['id', 'account_id', 'amount_units', 'created_at'], (p) => [
|
|
16
|
+
p.id,
|
|
17
|
+
p.accountId,
|
|
18
|
+
p.amountUnits,
|
|
19
|
+
p.createdAt,
|
|
20
|
+
]),
|
|
21
|
+
define('resvary_meters', ['id', 'project_id', 'meter_key'], (p) => [p.id, p.projectId, p.key]),
|
|
22
|
+
define('resvary_price_versions', ['id', 'meter_id', 'version', 'created_at'], (p) => [
|
|
23
|
+
p.id,
|
|
24
|
+
p.meterId,
|
|
25
|
+
p.version,
|
|
26
|
+
p.createdAt,
|
|
27
|
+
]),
|
|
28
|
+
define('resvary_credit_reservations', [
|
|
29
|
+
'id',
|
|
30
|
+
'account_id',
|
|
31
|
+
'project_id',
|
|
32
|
+
'customer_id',
|
|
33
|
+
'status',
|
|
34
|
+
'reserved_units',
|
|
35
|
+
'expires_at',
|
|
36
|
+
'created_at',
|
|
37
|
+
], (p) => [
|
|
38
|
+
p.id,
|
|
39
|
+
p.accountId,
|
|
40
|
+
p.projectId,
|
|
41
|
+
p.customerId,
|
|
42
|
+
p.status,
|
|
43
|
+
p.reservedUnits,
|
|
44
|
+
p.expiresAt,
|
|
45
|
+
p.createdAt,
|
|
46
|
+
]),
|
|
47
|
+
define('resvary_usage_events', ['id', 'account_id', 'received_at'], (p) => [
|
|
48
|
+
p.id,
|
|
49
|
+
p.accountId,
|
|
50
|
+
p.receivedAt,
|
|
51
|
+
]),
|
|
52
|
+
define('resvary_usage_receipts', ['id', 'account_id', 'reservation_id', 'usage_event_id', 'charged_units', 'created_at'], (p) => [p.id, p.accountId, p.reservationId, p.usageEventId, p.amountUnits, p.createdAt]),
|
|
53
|
+
define('resvary_ledger_entries', ['id', 'account_id', 'delta_units', 'balance_after_units', 'created_at'], (p) => [p.id, p.accountId, p.deltaUnits, p.balanceAfterUnits, p.createdAt]),
|
|
54
|
+
define('resvary_funding_intents', ['id', 'project_id', 'customer_id', 'status', 'requested_units', 'created_at'], (p) => [p.id, p.projectId, p.customerId, p.status, p.requestedUnits, p.createdAt]),
|
|
55
|
+
define('resvary_funding_transactions', [
|
|
56
|
+
'id',
|
|
57
|
+
'funding_intent_id',
|
|
58
|
+
'rail',
|
|
59
|
+
'network',
|
|
60
|
+
'external_payment_id_norm',
|
|
61
|
+
'tx_hash_norm',
|
|
62
|
+
'amount_units',
|
|
63
|
+
'created_at',
|
|
64
|
+
], (p) => [
|
|
65
|
+
p.id,
|
|
66
|
+
p.fundingIntentId,
|
|
67
|
+
p.rail,
|
|
68
|
+
p.network,
|
|
69
|
+
String(p.externalPaymentId).toLowerCase(),
|
|
70
|
+
typeof p.txHash === 'string' ? p.txHash.toLowerCase() : null,
|
|
71
|
+
p.amountUnits,
|
|
72
|
+
p.createdAt,
|
|
73
|
+
]),
|
|
74
|
+
define('resvary_idempotency_keys', ['scope', 'key', 'created_at'], (p) => [
|
|
75
|
+
p.scope,
|
|
76
|
+
p.key,
|
|
77
|
+
p.createdAt,
|
|
78
|
+
]),
|
|
79
|
+
define('resvary_outbox_events', [
|
|
80
|
+
'id',
|
|
81
|
+
'project_id',
|
|
82
|
+
'type',
|
|
83
|
+
'status',
|
|
84
|
+
'created_at',
|
|
85
|
+
'attempt_count',
|
|
86
|
+
'next_attempt_at',
|
|
87
|
+
'lease_owner',
|
|
88
|
+
'lease_expires_at',
|
|
89
|
+
'last_attempt_at',
|
|
90
|
+
'last_error',
|
|
91
|
+
'delivered_at',
|
|
92
|
+
], (p) => [
|
|
93
|
+
p.id,
|
|
94
|
+
p.projectId,
|
|
95
|
+
p.type,
|
|
96
|
+
p.status,
|
|
97
|
+
p.createdAt,
|
|
98
|
+
p.attemptCount ?? 0,
|
|
99
|
+
p.nextAttemptAt ?? p.createdAt,
|
|
100
|
+
p.leaseOwner ?? null,
|
|
101
|
+
p.leaseExpiresAt ?? null,
|
|
102
|
+
p.lastAttemptAt ?? null,
|
|
103
|
+
p.lastError ?? null,
|
|
104
|
+
p.deliveredAt ?? null,
|
|
105
|
+
]),
|
|
106
|
+
define('resvary_invoices', ['id', 'status', 'customer_id', 'amount_units', 'created_at'], (p) => [
|
|
107
|
+
p.id,
|
|
108
|
+
p.status,
|
|
109
|
+
p.customerId ?? null,
|
|
110
|
+
p.amountUnits,
|
|
111
|
+
p.createdAt,
|
|
112
|
+
]),
|
|
113
|
+
define('resvary_receipts', ['id', 'invoice_id', 'tx_hash_norm', 'status', 'amount_units', 'created_at'], (p) => [
|
|
114
|
+
p.id,
|
|
115
|
+
p.invoiceId,
|
|
116
|
+
typeof p.txHash === 'string' ? p.txHash.toLowerCase() : null,
|
|
117
|
+
p.status,
|
|
118
|
+
p.amountUnits,
|
|
119
|
+
p.createdAt,
|
|
120
|
+
]),
|
|
121
|
+
define('arc_webhook_events', ['id', 'type', 'created_at'], (p) => [p.id, p.type, p.createdAt]),
|
|
122
|
+
define('arc_webhook_deliveries', ['id', 'event_id', 'event_type', 'attempt', 'status', 'received_at'], (p) => [p.id, p.eventId, p.eventType, p.attempt, p.status, p.receivedAt]),
|
|
123
|
+
define('arc_watcher_cursors', ['key', 'network', 'invoice_id', 'memo_id_norm', 'next_from_block', 'updated_at'], (p) => [
|
|
124
|
+
p.key,
|
|
125
|
+
p.network,
|
|
126
|
+
p.invoiceId ?? null,
|
|
127
|
+
typeof p.memoId === 'string' ? p.memoId.toLowerCase() : null,
|
|
128
|
+
String(p.nextFromBlock),
|
|
129
|
+
p.updatedAt,
|
|
130
|
+
]),
|
|
131
|
+
];
|
|
132
|
+
export async function importSqliteDatabase(config) {
|
|
133
|
+
const source = new DatabaseSync(config.sqlitePath, { readOnly: true });
|
|
134
|
+
const handle = createPostgresHandle(config);
|
|
135
|
+
const client = await handle.pool.connect();
|
|
136
|
+
try {
|
|
137
|
+
const sqliteSchemaVersion = readSqliteSchemaVersion(source);
|
|
138
|
+
if (sqliteSchemaVersion < 2 || sqliteSchemaVersion > 3) {
|
|
139
|
+
throw new Error(`Unsupported SQLite schema version ${sqliteSchemaVersion}; expected 2 or 3`);
|
|
140
|
+
}
|
|
141
|
+
const postgresSchemaVersion = await readPostgresSchemaVersion(client, handle.schema);
|
|
142
|
+
if (postgresSchemaVersion !== POSTGRES_SCHEMA_VERSION) {
|
|
143
|
+
throw new Error(`Postgres schema version ${postgresSchemaVersion}; run resvary-postgres migrate first`);
|
|
144
|
+
}
|
|
145
|
+
const available = sourceTables(source);
|
|
146
|
+
await assertTargetEmpty(client, handle.schema);
|
|
147
|
+
await client.query('BEGIN ISOLATION LEVEL SERIALIZABLE');
|
|
148
|
+
const counts = {};
|
|
149
|
+
for (const definition of TABLES) {
|
|
150
|
+
if (!available.has(definition.name)) {
|
|
151
|
+
counts[definition.name] = 0;
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
const rows = source.prepare(`SELECT payload FROM ${definition.name}`).all();
|
|
155
|
+
for (const row of rows) {
|
|
156
|
+
const payload = parseReceiptStoreValue(row.payload);
|
|
157
|
+
const columns = [...definition.columns, 'payload'];
|
|
158
|
+
const placeholders = columns.map((_, index) => `$${index + 1}`).join(', ');
|
|
159
|
+
await client.query(`INSERT INTO ${table({ schema: handle.schema }, definition.name)} (${columns.join(', ')}) VALUES (${placeholders})`, [...definition.values(payload), row.payload]);
|
|
160
|
+
}
|
|
161
|
+
counts[definition.name] = rows.length;
|
|
162
|
+
}
|
|
163
|
+
const report = await buildReport(source, client, handle.schema, sqliteSchemaVersion, postgresSchemaVersion, counts, Boolean(config.dryRun));
|
|
164
|
+
if (report.balanceMismatches.length > 0 || report.ledgerMismatches.length > 0) {
|
|
165
|
+
throw new Error(`Financial verification failed: ${[...report.balanceMismatches, ...report.ledgerMismatches].join(', ')}`);
|
|
166
|
+
}
|
|
167
|
+
if (report.sourceOpenReservations !== report.targetOpenReservations) {
|
|
168
|
+
throw new Error(`Open reservation mismatch: source=${report.sourceOpenReservations} target=${report.targetOpenReservations}`);
|
|
169
|
+
}
|
|
170
|
+
if (config.dryRun)
|
|
171
|
+
await client.query('ROLLBACK');
|
|
172
|
+
else
|
|
173
|
+
await client.query('COMMIT');
|
|
174
|
+
return { ...report, committed: !config.dryRun };
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
await rollback(client);
|
|
178
|
+
throw error;
|
|
179
|
+
}
|
|
180
|
+
finally {
|
|
181
|
+
source.close();
|
|
182
|
+
client.release();
|
|
183
|
+
if (handle.ownsPool)
|
|
184
|
+
await handle.pool.end();
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
export async function verifySqliteImport(config) {
|
|
188
|
+
const source = new DatabaseSync(config.sqlitePath, { readOnly: true });
|
|
189
|
+
const handle = createPostgresHandle(config);
|
|
190
|
+
const client = await handle.pool.connect();
|
|
191
|
+
try {
|
|
192
|
+
const sqliteSchemaVersion = readSqliteSchemaVersion(source);
|
|
193
|
+
const postgresSchemaVersion = await readPostgresSchemaVersion(client, handle.schema);
|
|
194
|
+
const available = sourceTables(source);
|
|
195
|
+
const counts = {};
|
|
196
|
+
for (const definition of TABLES) {
|
|
197
|
+
counts[definition.name] = available.has(definition.name)
|
|
198
|
+
? source.prepare(`SELECT COUNT(*) AS count FROM ${definition.name}`).get().count
|
|
199
|
+
: 0;
|
|
200
|
+
}
|
|
201
|
+
return buildReport(source, client, handle.schema, sqliteSchemaVersion, postgresSchemaVersion, counts, false);
|
|
202
|
+
}
|
|
203
|
+
finally {
|
|
204
|
+
source.close();
|
|
205
|
+
client.release();
|
|
206
|
+
if (handle.ownsPool)
|
|
207
|
+
await handle.pool.end();
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
function define(name, columns, values) {
|
|
211
|
+
return { name, columns, values };
|
|
212
|
+
}
|
|
213
|
+
function readSqliteSchemaVersion(db) {
|
|
214
|
+
const row = db
|
|
215
|
+
.prepare('SELECT COALESCE(MAX(version), 0) AS version FROM resvary_schema_migrations')
|
|
216
|
+
.get();
|
|
217
|
+
return Number(row.version);
|
|
218
|
+
}
|
|
219
|
+
async function readPostgresSchemaVersion(client, schema) {
|
|
220
|
+
const result = await client.query(`SELECT COALESCE(MAX(version), 0)::int AS version FROM ${table({ schema }, 'resvary_schema_migrations')}`);
|
|
221
|
+
return result.rows[0]?.version ?? 0;
|
|
222
|
+
}
|
|
223
|
+
function sourceTables(db) {
|
|
224
|
+
return new Set(db.prepare("SELECT name FROM sqlite_master WHERE type = 'table'").all().map((row) => row.name));
|
|
225
|
+
}
|
|
226
|
+
async function assertTargetEmpty(client, schema) {
|
|
227
|
+
for (const definition of TABLES) {
|
|
228
|
+
const result = await client.query(`SELECT EXISTS (SELECT 1 FROM ${table({ schema }, definition.name)} LIMIT 1) AS exists`);
|
|
229
|
+
if (result.rows[0]?.exists)
|
|
230
|
+
throw new Error(`Target table is not empty: ${definition.name}`);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
async function buildReport(source, client, schema, sqliteSchemaVersion, postgresSchemaVersion, sourceCounts, dryRun) {
|
|
234
|
+
for (const definition of TABLES) {
|
|
235
|
+
const result = await client.query(`SELECT COUNT(*)::int AS count FROM ${table({ schema }, definition.name)}`);
|
|
236
|
+
if ((result.rows[0]?.count ?? 0) !== sourceCounts[definition.name]) {
|
|
237
|
+
throw new Error(`Count mismatch for ${definition.name}: source=${sourceCounts[definition.name]} target=${result.rows[0]?.count ?? 0}`);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
const balanceMismatches = [];
|
|
241
|
+
const ledgerMismatches = [];
|
|
242
|
+
if (sourceTables(source).has('resvary_credit_accounts')) {
|
|
243
|
+
const rows = source.prepare('SELECT payload FROM resvary_credit_accounts').all();
|
|
244
|
+
for (const row of rows) {
|
|
245
|
+
const account = parseReceiptStoreValue(row.payload);
|
|
246
|
+
const result = await client.query(`SELECT posted_units::text, reserved_units::text FROM ${table({ schema }, 'resvary_credit_accounts')} WHERE id = $1`, [account.id]);
|
|
247
|
+
const target = result.rows[0];
|
|
248
|
+
if (!target ||
|
|
249
|
+
target.posted_units !== account.postedUnits ||
|
|
250
|
+
target.reserved_units !== account.reservedUnits) {
|
|
251
|
+
balanceMismatches.push(String(account.id));
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
const sourceLedger = new Map();
|
|
256
|
+
if (sourceTables(source).has('resvary_ledger_entries')) {
|
|
257
|
+
const rows = source.prepare('SELECT payload FROM resvary_ledger_entries').all();
|
|
258
|
+
for (const row of rows) {
|
|
259
|
+
const entry = parseReceiptStoreValue(row.payload);
|
|
260
|
+
const key = `${String(entry.accountId)}:${String(entry.bucket)}`;
|
|
261
|
+
sourceLedger.set(key, (sourceLedger.get(key) ?? 0n) + BigInt(String(entry.deltaUnits)));
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
const targetLedgerResult = await client.query(`SELECT account_id, payload->>'bucket' AS bucket, SUM(delta_units)::text AS total
|
|
265
|
+
FROM ${table({ schema }, 'resvary_ledger_entries')}
|
|
266
|
+
GROUP BY account_id, payload->>'bucket'`);
|
|
267
|
+
const targetLedger = new Map(targetLedgerResult.rows.map((row) => [`${row.account_id}:${row.bucket}`, BigInt(row.total)]));
|
|
268
|
+
for (const key of new Set([...sourceLedger.keys(), ...targetLedger.keys()])) {
|
|
269
|
+
if ((sourceLedger.get(key) ?? 0n) !== (targetLedger.get(key) ?? 0n))
|
|
270
|
+
ledgerMismatches.push(key);
|
|
271
|
+
}
|
|
272
|
+
let sourceOpenReservations = 0;
|
|
273
|
+
if (sourceTables(source).has('resvary_credit_reservations')) {
|
|
274
|
+
const rows = source
|
|
275
|
+
.prepare('SELECT payload FROM resvary_credit_reservations')
|
|
276
|
+
.all();
|
|
277
|
+
sourceOpenReservations = rows.filter((row) => parseReceiptStoreValue(row.payload).status === 'open').length;
|
|
278
|
+
}
|
|
279
|
+
const openResult = await client.query(`SELECT COUNT(*)::int AS count FROM ${table({ schema }, 'resvary_credit_reservations')} WHERE status = 'open'`);
|
|
280
|
+
const targetOpenReservations = openResult.rows[0]?.count ?? 0;
|
|
281
|
+
return {
|
|
282
|
+
sqliteSchemaVersion,
|
|
283
|
+
postgresSchemaVersion,
|
|
284
|
+
dryRun,
|
|
285
|
+
committed: false,
|
|
286
|
+
counts: sourceCounts,
|
|
287
|
+
balanceMismatches,
|
|
288
|
+
ledgerMismatches,
|
|
289
|
+
sourceOpenReservations,
|
|
290
|
+
targetOpenReservations,
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=import-sqlite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-sqlite.js","sourceRoot":"","sources":["../src/import-sqlite.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { PostgresCreditStore, createPostgresCreditStore, type PostgresCreditStoreConfig, } from './credit.js';
|
|
2
|
+
export { PostgresReceiptStore, createPostgresReceiptStore, type PostgresReceiptStoreConfig, } from './receipt.js';
|
|
3
|
+
export { POSTGRES_SCHEMA_VERSION, getPostgresMigrationStatus, migratePostgres, type PostgresMigrationStatus, } from './migrations.js';
|
|
4
|
+
export { checkPostgresHealth, type PostgresHealth } from './health.js';
|
|
5
|
+
export type { PostgresConnectionConfig } from './connection.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,KAAK,yBAAyB,GAC/B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,KAAK,0BAA0B,GAChC,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,uBAAuB,EACvB,0BAA0B,EAC1B,eAAe,EACf,KAAK,uBAAuB,GAC7B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AACvE,YAAY,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { PostgresCreditStore, createPostgresCreditStore, } from './credit.js';
|
|
2
|
+
export { PostgresReceiptStore, createPostgresReceiptStore, } from './receipt.js';
|
|
3
|
+
export { POSTGRES_SCHEMA_VERSION, getPostgresMigrationStatus, migratePostgres, } from './migrations.js';
|
|
4
|
+
export { checkPostgresHealth } from './health.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,yBAAyB,GAE1B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,oBAAoB,EACpB,0BAA0B,GAE3B,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,uBAAuB,EACvB,0BAA0B,EAC1B,eAAe,GAEhB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,mBAAmB,EAAuB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type PostgresConnectionConfig } from './connection.js';
|
|
2
|
+
export declare const POSTGRES_SCHEMA_VERSION = 1;
|
|
3
|
+
export interface PostgresMigrationStatus {
|
|
4
|
+
schema: string;
|
|
5
|
+
currentVersion: number;
|
|
6
|
+
latestVersion: number;
|
|
7
|
+
pendingVersions: number[];
|
|
8
|
+
}
|
|
9
|
+
export declare function getPostgresMigrationStatus(config: PostgresConnectionConfig): Promise<PostgresMigrationStatus>;
|
|
10
|
+
export declare function migratePostgres(config: PostgresConnectionConfig): Promise<PostgresMigrationStatus>;
|
|
11
|
+
//# sourceMappingURL=migrations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"AACA,OAAO,EAA+B,KAAK,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAE7F,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAGzC,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,wBAAwB,GAC/B,OAAO,CAAC,uBAAuB,CAAC,CA6BlC;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,wBAAwB,GAC/B,OAAO,CAAC,uBAAuB,CAAC,CAsBlC"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { createPostgresHandle, table } from './connection.js';
|
|
2
|
+
export const POSTGRES_SCHEMA_VERSION = 1;
|
|
3
|
+
const MIGRATION_LOCK_ID = 7_226_519_918;
|
|
4
|
+
export async function getPostgresMigrationStatus(config) {
|
|
5
|
+
const handle = createPostgresHandle(config);
|
|
6
|
+
try {
|
|
7
|
+
const exists = await handle.pool.query(`SELECT EXISTS (
|
|
8
|
+
SELECT 1 FROM information_schema.tables
|
|
9
|
+
WHERE table_schema = $1 AND table_name = 'resvary_schema_migrations'
|
|
10
|
+
) AS exists`, [handle.schema]);
|
|
11
|
+
let currentVersion = 0;
|
|
12
|
+
if (exists.rows[0]?.exists) {
|
|
13
|
+
const result = await handle.pool.query(`SELECT COALESCE(MAX(version), 0)::int AS version FROM ${table(handle, 'resvary_schema_migrations')}`);
|
|
14
|
+
currentVersion = result.rows[0]?.version ?? 0;
|
|
15
|
+
}
|
|
16
|
+
return {
|
|
17
|
+
schema: handle.schema,
|
|
18
|
+
currentVersion,
|
|
19
|
+
latestVersion: POSTGRES_SCHEMA_VERSION,
|
|
20
|
+
pendingVersions: Array.from({ length: POSTGRES_SCHEMA_VERSION - currentVersion }, (_, index) => currentVersion + index + 1),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
finally {
|
|
24
|
+
if (handle.ownsPool)
|
|
25
|
+
await handle.pool.end();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export async function migratePostgres(config) {
|
|
29
|
+
const handle = createPostgresHandle(config);
|
|
30
|
+
const client = await handle.pool.connect();
|
|
31
|
+
try {
|
|
32
|
+
await client.query('SELECT pg_advisory_lock($1)', [MIGRATION_LOCK_ID]);
|
|
33
|
+
await client.query(`CREATE SCHEMA IF NOT EXISTS "${handle.schema}"`);
|
|
34
|
+
await client.query(`
|
|
35
|
+
CREATE TABLE IF NOT EXISTS ${table(handle, 'resvary_schema_migrations')} (
|
|
36
|
+
version INTEGER PRIMARY KEY,
|
|
37
|
+
applied_at BIGINT NOT NULL
|
|
38
|
+
)
|
|
39
|
+
`);
|
|
40
|
+
const current = await client.query(`SELECT COALESCE(MAX(version), 0)::int AS version FROM ${table(handle, 'resvary_schema_migrations')}`);
|
|
41
|
+
if ((current.rows[0]?.version ?? 0) < 1)
|
|
42
|
+
await applyV1(client, handle.schema);
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
await client.query('SELECT pg_advisory_unlock($1)', [MIGRATION_LOCK_ID]).catch(() => undefined);
|
|
46
|
+
client.release();
|
|
47
|
+
if (handle.ownsPool)
|
|
48
|
+
await handle.pool.end();
|
|
49
|
+
}
|
|
50
|
+
return getPostgresMigrationStatus(config);
|
|
51
|
+
}
|
|
52
|
+
async function applyV1(client, schema) {
|
|
53
|
+
const t = (name) => table({ schema }, name);
|
|
54
|
+
await client.query('BEGIN');
|
|
55
|
+
try {
|
|
56
|
+
await client.query(`
|
|
57
|
+
CREATE TABLE ${t('resvary_credit_accounts')} (
|
|
58
|
+
id TEXT PRIMARY KEY, project_id TEXT NOT NULL, customer_id TEXT NOT NULL,
|
|
59
|
+
currency TEXT NOT NULL, posted_units NUMERIC(78,0) NOT NULL,
|
|
60
|
+
reserved_units NUMERIC(78,0) NOT NULL, updated_at BIGINT NOT NULL, payload JSONB NOT NULL,
|
|
61
|
+
UNIQUE(project_id, customer_id)
|
|
62
|
+
);
|
|
63
|
+
CREATE TABLE ${t('resvary_credit_grants')} (
|
|
64
|
+
id TEXT PRIMARY KEY, account_id TEXT NOT NULL, amount_units NUMERIC(78,0) NOT NULL,
|
|
65
|
+
created_at BIGINT NOT NULL, payload JSONB NOT NULL
|
|
66
|
+
);
|
|
67
|
+
CREATE INDEX resvary_credit_grants_account ON ${t('resvary_credit_grants')}(account_id);
|
|
68
|
+
CREATE TABLE ${t('resvary_meters')} (
|
|
69
|
+
id TEXT PRIMARY KEY, project_id TEXT NOT NULL, meter_key TEXT NOT NULL, payload JSONB NOT NULL,
|
|
70
|
+
UNIQUE(project_id, meter_key)
|
|
71
|
+
);
|
|
72
|
+
CREATE TABLE ${t('resvary_price_versions')} (
|
|
73
|
+
id TEXT PRIMARY KEY, meter_id TEXT NOT NULL, version INTEGER NOT NULL,
|
|
74
|
+
created_at BIGINT NOT NULL, payload JSONB NOT NULL, UNIQUE(meter_id, version)
|
|
75
|
+
);
|
|
76
|
+
CREATE TABLE ${t('resvary_credit_reservations')} (
|
|
77
|
+
id TEXT PRIMARY KEY, account_id TEXT NOT NULL, project_id TEXT NOT NULL,
|
|
78
|
+
customer_id TEXT NOT NULL, status TEXT NOT NULL,
|
|
79
|
+
reserved_units NUMERIC(78,0) NOT NULL, expires_at BIGINT NOT NULL,
|
|
80
|
+
created_at BIGINT NOT NULL, payload JSONB NOT NULL
|
|
81
|
+
);
|
|
82
|
+
CREATE INDEX resvary_credit_reservations_open
|
|
83
|
+
ON ${t('resvary_credit_reservations')}(project_id, customer_id, status, expires_at);
|
|
84
|
+
CREATE TABLE ${t('resvary_usage_events')} (
|
|
85
|
+
id TEXT PRIMARY KEY, account_id TEXT NOT NULL, received_at BIGINT NOT NULL, payload JSONB NOT NULL
|
|
86
|
+
);
|
|
87
|
+
CREATE TABLE ${t('resvary_usage_receipts')} (
|
|
88
|
+
id TEXT PRIMARY KEY, account_id TEXT NOT NULL, reservation_id TEXT NOT NULL UNIQUE,
|
|
89
|
+
usage_event_id TEXT NOT NULL UNIQUE, charged_units NUMERIC(78,0) NOT NULL,
|
|
90
|
+
created_at BIGINT NOT NULL, payload JSONB NOT NULL
|
|
91
|
+
);
|
|
92
|
+
CREATE INDEX resvary_usage_receipts_account
|
|
93
|
+
ON ${t('resvary_usage_receipts')}(account_id, created_at);
|
|
94
|
+
CREATE TABLE ${t('resvary_ledger_entries')} (
|
|
95
|
+
id TEXT PRIMARY KEY, account_id TEXT NOT NULL, delta_units NUMERIC(78,0) NOT NULL,
|
|
96
|
+
balance_after_units NUMERIC(78,0) NOT NULL, created_at BIGINT NOT NULL, payload JSONB NOT NULL
|
|
97
|
+
);
|
|
98
|
+
CREATE INDEX resvary_ledger_entries_account
|
|
99
|
+
ON ${t('resvary_ledger_entries')}(account_id, created_at);
|
|
100
|
+
CREATE TABLE ${t('resvary_funding_intents')} (
|
|
101
|
+
id TEXT PRIMARY KEY, project_id TEXT NOT NULL, customer_id TEXT NOT NULL,
|
|
102
|
+
status TEXT NOT NULL, requested_units NUMERIC(78,0) NOT NULL,
|
|
103
|
+
created_at BIGINT NOT NULL, payload JSONB NOT NULL
|
|
104
|
+
);
|
|
105
|
+
CREATE TABLE ${t('resvary_funding_transactions')} (
|
|
106
|
+
id TEXT PRIMARY KEY, funding_intent_id TEXT NOT NULL, rail TEXT NOT NULL,
|
|
107
|
+
network TEXT NOT NULL, external_payment_id_norm TEXT NOT NULL, tx_hash_norm TEXT,
|
|
108
|
+
amount_units NUMERIC(78,0) NOT NULL, created_at BIGINT NOT NULL, payload JSONB NOT NULL,
|
|
109
|
+
UNIQUE(rail, network, external_payment_id_norm)
|
|
110
|
+
);
|
|
111
|
+
CREATE UNIQUE INDEX resvary_funding_transactions_tx_hash
|
|
112
|
+
ON ${t('resvary_funding_transactions')}(network, tx_hash_norm)
|
|
113
|
+
WHERE tx_hash_norm IS NOT NULL;
|
|
114
|
+
CREATE TABLE ${t('resvary_idempotency_keys')} (
|
|
115
|
+
scope TEXT NOT NULL, key TEXT NOT NULL, created_at BIGINT NOT NULL, payload JSONB NOT NULL,
|
|
116
|
+
PRIMARY KEY(scope, key)
|
|
117
|
+
);
|
|
118
|
+
CREATE TABLE ${t('resvary_outbox_events')} (
|
|
119
|
+
id TEXT PRIMARY KEY, project_id TEXT NOT NULL, type TEXT NOT NULL, status TEXT NOT NULL,
|
|
120
|
+
created_at BIGINT NOT NULL, attempt_count INTEGER NOT NULL DEFAULT 0,
|
|
121
|
+
next_attempt_at BIGINT NOT NULL, lease_owner TEXT, lease_expires_at BIGINT,
|
|
122
|
+
last_attempt_at BIGINT, last_error TEXT, delivered_at BIGINT, payload JSONB NOT NULL
|
|
123
|
+
);
|
|
124
|
+
CREATE INDEX resvary_outbox_events_due
|
|
125
|
+
ON ${t('resvary_outbox_events')}(project_id, status, next_attempt_at, created_at);
|
|
126
|
+
|
|
127
|
+
CREATE TABLE ${t('resvary_invoices')} (
|
|
128
|
+
id TEXT PRIMARY KEY, status TEXT NOT NULL, customer_id TEXT, amount_units NUMERIC(78,0) NOT NULL,
|
|
129
|
+
created_at BIGINT NOT NULL, payload JSONB NOT NULL
|
|
130
|
+
);
|
|
131
|
+
CREATE INDEX resvary_invoices_status ON ${t('resvary_invoices')}(status);
|
|
132
|
+
CREATE INDEX resvary_invoices_customer_id ON ${t('resvary_invoices')}(customer_id);
|
|
133
|
+
CREATE TABLE ${t('resvary_receipts')} (
|
|
134
|
+
id TEXT PRIMARY KEY, invoice_id TEXT NOT NULL, tx_hash_norm TEXT, status TEXT NOT NULL,
|
|
135
|
+
amount_units NUMERIC(78,0) NOT NULL, created_at BIGINT NOT NULL, payload JSONB NOT NULL
|
|
136
|
+
);
|
|
137
|
+
CREATE UNIQUE INDEX resvary_receipts_invoice_tx_hash
|
|
138
|
+
ON ${t('resvary_receipts')}(invoice_id, tx_hash_norm) WHERE tx_hash_norm IS NOT NULL;
|
|
139
|
+
CREATE TABLE ${t('arc_webhook_events')} (
|
|
140
|
+
id TEXT PRIMARY KEY, type TEXT NOT NULL, created_at BIGINT NOT NULL, payload JSONB NOT NULL
|
|
141
|
+
);
|
|
142
|
+
CREATE TABLE ${t('arc_webhook_deliveries')} (
|
|
143
|
+
id TEXT PRIMARY KEY, event_id TEXT NOT NULL, event_type TEXT NOT NULL, attempt INTEGER NOT NULL,
|
|
144
|
+
status TEXT NOT NULL, received_at BIGINT NOT NULL, payload JSONB NOT NULL
|
|
145
|
+
);
|
|
146
|
+
CREATE INDEX arc_webhook_deliveries_event_id ON ${t('arc_webhook_deliveries')}(event_id);
|
|
147
|
+
CREATE TABLE ${t('arc_watcher_cursors')} (
|
|
148
|
+
key TEXT PRIMARY KEY, network TEXT NOT NULL, invoice_id TEXT, memo_id_norm TEXT,
|
|
149
|
+
next_from_block NUMERIC(78,0) NOT NULL, updated_at BIGINT NOT NULL, payload JSONB NOT NULL
|
|
150
|
+
);
|
|
151
|
+
`);
|
|
152
|
+
await client.query(`INSERT INTO ${t('resvary_schema_migrations')}(version, applied_at) VALUES (1, $1)`, [Date.now()]);
|
|
153
|
+
await client.query('COMMIT');
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
await client.query('ROLLBACK');
|
|
157
|
+
throw error;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=migrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { PaymentInvoice, PaymentReceipt, ReceiptStore, ReceiptStoreDeliveryFilter, ReceiptStoreEventFilter, ReceiptStoreInvoiceFilter, WatcherCursor, WebhookDeliveryAttempt, WebhookEvent } from '@resvary/sdk/receipts';
|
|
2
|
+
import { type PostgresConnectionConfig } from './connection.js';
|
|
3
|
+
export interface PostgresReceiptStoreConfig extends PostgresConnectionConfig {
|
|
4
|
+
}
|
|
5
|
+
export declare class PostgresReceiptStore implements ReceiptStore {
|
|
6
|
+
private readonly handle;
|
|
7
|
+
constructor(config: PostgresReceiptStoreConfig);
|
|
8
|
+
saveInvoice(value: PaymentInvoice): Promise<void>;
|
|
9
|
+
getInvoice(id: string): Promise<PaymentInvoice | undefined>;
|
|
10
|
+
listInvoices(filter?: ReceiptStoreInvoiceFilter): Promise<PaymentInvoice[]>;
|
|
11
|
+
saveReceipt(value: PaymentReceipt): Promise<void>;
|
|
12
|
+
getReceipt(id: string): Promise<PaymentReceipt | undefined>;
|
|
13
|
+
getReceiptByTxHash(txHash: `0x${string}`, invoiceId?: string): Promise<PaymentReceipt | undefined>;
|
|
14
|
+
listReceipts(): Promise<PaymentReceipt[]>;
|
|
15
|
+
saveWebhookEvent(value: WebhookEvent): Promise<void>;
|
|
16
|
+
listWebhookEvents(filter?: ReceiptStoreEventFilter): Promise<WebhookEvent[]>;
|
|
17
|
+
saveWebhookDelivery(value: WebhookDeliveryAttempt): Promise<void>;
|
|
18
|
+
getWebhookDelivery(id: string): Promise<WebhookDeliveryAttempt | undefined>;
|
|
19
|
+
listWebhookDeliveries(filter?: ReceiptStoreDeliveryFilter): Promise<WebhookDeliveryAttempt[]>;
|
|
20
|
+
getWatcherCursor(key: string): Promise<WatcherCursor | undefined>;
|
|
21
|
+
listWatcherCursors(): Promise<WatcherCursor[]>;
|
|
22
|
+
saveWatcherCursor(value: WatcherCursor): Promise<void>;
|
|
23
|
+
deleteWatcherCursor(key: string): Promise<void>;
|
|
24
|
+
close(): Promise<void>;
|
|
25
|
+
private one;
|
|
26
|
+
private all;
|
|
27
|
+
}
|
|
28
|
+
export declare function createPostgresReceiptStore(config: PostgresReceiptStoreConfig): PostgresReceiptStore;
|
|
29
|
+
//# sourceMappingURL=receipt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receipt.d.ts","sourceRoot":"","sources":["../src/receipt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,YAAY,EACZ,0BAA0B,EAC1B,uBAAuB,EACvB,yBAAyB,EACzB,aAAa,EACb,sBAAsB,EACtB,YAAY,EACb,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAGL,KAAK,wBAAwB,EAE9B,MAAM,iBAAiB,CAAC;AAIzB,MAAM,WAAW,0BAA2B,SAAQ,wBAAwB;CAAG;AAE/E,qBAAa,oBAAqB,YAAW,YAAY;IACvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;gBAE5B,MAAM,EAAE,0BAA0B;IAIxC,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBvD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAOrD,YAAY,CAAC,MAAM,GAAE,yBAA8B,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAY/E,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBvD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAO3D,kBAAkB,CAChB,MAAM,EAAE,KAAK,MAAM,EAAE,EACrB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAQtC,YAAY,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAMnC,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAUpD,iBAAiB,CAAC,MAAM,GAAE,uBAA4B,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAQhF,mBAAmB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBvE,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC;IAOrE,qBAAqB,CACzB,MAAM,GAAE,0BAA+B,GACtC,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAYpC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAOjE,kBAAkB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAMxC,iBAAiB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBtD,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAId,GAAG;YAKH,GAAG;CAIlB;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,0BAA0B,GACjC,oBAAoB,CAEtB"}
|