@resvary/postgres 0.5.0 → 0.7.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.
@@ -1,12 +1,14 @@
1
+ import { creditUnitsToString, parseCreditUnits } from '@resvary/sdk/credits';
2
+ import { parseReceiptStoreValue, serializeReceiptStoreValue } from '@resvary/sdk/receipts';
1
3
  import { createPostgresHandle, table } from './connection.js';
2
- export const POSTGRES_SCHEMA_VERSION = 2;
4
+ export const POSTGRES_SCHEMA_VERSION = 3;
3
5
  const MIGRATION_LOCK_ID = 7_226_519_918;
4
6
  export async function getPostgresMigrationStatus(config) {
5
7
  const handle = createPostgresHandle(config);
6
8
  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'
9
+ const exists = await handle.pool.query(`SELECT EXISTS (
10
+ SELECT 1 FROM information_schema.tables
11
+ WHERE table_schema = $1 AND table_name = 'resvary_schema_migrations'
10
12
  ) AS exists`, [handle.schema]);
11
13
  let currentVersion = 0;
12
14
  if (exists.rows[0]?.exists) {
@@ -31,11 +33,11 @@ export async function migratePostgres(config) {
31
33
  try {
32
34
  await client.query('SELECT pg_advisory_lock($1)', [MIGRATION_LOCK_ID]);
33
35
  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
- )
36
+ await client.query(`
37
+ CREATE TABLE IF NOT EXISTS ${table(handle, 'resvary_schema_migrations')} (
38
+ version INTEGER PRIMARY KEY,
39
+ applied_at BIGINT NOT NULL
40
+ )
39
41
  `);
40
42
  const current = await client.query(`SELECT version FROM ${table(handle, 'resvary_schema_migrations')} ORDER BY version ASC`);
41
43
  const currentVersion = assertMigrationHistory(current.rows.map((row) => row.version));
@@ -43,6 +45,8 @@ export async function migratePostgres(config) {
43
45
  await applyV1(client, handle.schema);
44
46
  if (currentVersion < 2)
45
47
  await applyV2(client, handle.schema);
48
+ if (currentVersion < 3)
49
+ await applyV3(client, handle.schema);
46
50
  }
47
51
  finally {
48
52
  await client.query('SELECT pg_advisory_unlock($1)', [MIGRATION_LOCK_ID]).catch(() => undefined);
@@ -70,101 +74,101 @@ export async function applyV1(client, schema) {
70
74
  const t = (name) => table({ schema }, name);
71
75
  await client.query('BEGIN');
72
76
  try {
73
- await client.query(`
74
- CREATE TABLE ${t('resvary_credit_accounts')} (
75
- id TEXT PRIMARY KEY, project_id TEXT NOT NULL, customer_id TEXT NOT NULL,
76
- currency TEXT NOT NULL, posted_units NUMERIC(78,0) NOT NULL,
77
- reserved_units NUMERIC(78,0) NOT NULL, updated_at BIGINT NOT NULL, payload JSONB NOT NULL,
78
- UNIQUE(project_id, customer_id)
79
- );
80
- CREATE TABLE ${t('resvary_credit_grants')} (
81
- id TEXT PRIMARY KEY, account_id TEXT NOT NULL, amount_units NUMERIC(78,0) NOT NULL,
82
- created_at BIGINT NOT NULL, payload JSONB NOT NULL
83
- );
84
- CREATE INDEX resvary_credit_grants_account ON ${t('resvary_credit_grants')}(account_id);
85
- CREATE TABLE ${t('resvary_meters')} (
86
- id TEXT PRIMARY KEY, project_id TEXT NOT NULL, meter_key TEXT NOT NULL, payload JSONB NOT NULL,
87
- UNIQUE(project_id, meter_key)
88
- );
89
- CREATE TABLE ${t('resvary_price_versions')} (
90
- id TEXT PRIMARY KEY, meter_id TEXT NOT NULL, version INTEGER NOT NULL,
91
- created_at BIGINT NOT NULL, payload JSONB NOT NULL, UNIQUE(meter_id, version)
92
- );
93
- CREATE TABLE ${t('resvary_credit_reservations')} (
94
- id TEXT PRIMARY KEY, account_id TEXT NOT NULL, project_id TEXT NOT NULL,
95
- customer_id TEXT NOT NULL, status TEXT NOT NULL,
96
- reserved_units NUMERIC(78,0) NOT NULL, expires_at BIGINT NOT NULL,
97
- created_at BIGINT NOT NULL, payload JSONB NOT NULL
98
- );
99
- CREATE INDEX resvary_credit_reservations_open
100
- ON ${t('resvary_credit_reservations')}(project_id, customer_id, status, expires_at);
101
- CREATE TABLE ${t('resvary_usage_events')} (
102
- id TEXT PRIMARY KEY, account_id TEXT NOT NULL, received_at BIGINT NOT NULL, payload JSONB NOT NULL
103
- );
104
- CREATE TABLE ${t('resvary_usage_receipts')} (
105
- id TEXT PRIMARY KEY, account_id TEXT NOT NULL, reservation_id TEXT NOT NULL UNIQUE,
106
- usage_event_id TEXT NOT NULL UNIQUE, charged_units NUMERIC(78,0) NOT NULL,
107
- created_at BIGINT NOT NULL, payload JSONB NOT NULL
108
- );
109
- CREATE INDEX resvary_usage_receipts_account
110
- ON ${t('resvary_usage_receipts')}(account_id, created_at);
111
- CREATE TABLE ${t('resvary_ledger_entries')} (
112
- id TEXT PRIMARY KEY, account_id TEXT NOT NULL, delta_units NUMERIC(78,0) NOT NULL,
113
- balance_after_units NUMERIC(78,0) NOT NULL, created_at BIGINT NOT NULL, payload JSONB NOT NULL
114
- );
115
- CREATE INDEX resvary_ledger_entries_account
116
- ON ${t('resvary_ledger_entries')}(account_id, created_at);
117
- CREATE TABLE ${t('resvary_funding_intents')} (
118
- id TEXT PRIMARY KEY, project_id TEXT NOT NULL, customer_id TEXT NOT NULL,
119
- status TEXT NOT NULL, requested_units NUMERIC(78,0) NOT NULL,
120
- created_at BIGINT NOT NULL, payload JSONB NOT NULL
121
- );
122
- CREATE TABLE ${t('resvary_funding_transactions')} (
123
- id TEXT PRIMARY KEY, funding_intent_id TEXT NOT NULL, rail TEXT NOT NULL,
124
- network TEXT NOT NULL, external_payment_id_norm TEXT NOT NULL, tx_hash_norm TEXT,
125
- amount_units NUMERIC(78,0) NOT NULL, created_at BIGINT NOT NULL, payload JSONB NOT NULL,
126
- UNIQUE(rail, network, external_payment_id_norm)
127
- );
128
- CREATE UNIQUE INDEX resvary_funding_transactions_tx_hash
129
- ON ${t('resvary_funding_transactions')}(network, tx_hash_norm)
130
- WHERE tx_hash_norm IS NOT NULL;
131
- CREATE TABLE ${t('resvary_idempotency_keys')} (
132
- scope TEXT NOT NULL, key TEXT NOT NULL, created_at BIGINT NOT NULL, payload JSONB NOT NULL,
133
- PRIMARY KEY(scope, key)
134
- );
135
- CREATE TABLE ${t('resvary_outbox_events')} (
136
- id TEXT PRIMARY KEY, project_id TEXT NOT NULL, type TEXT NOT NULL, status TEXT NOT NULL,
137
- created_at BIGINT NOT NULL, attempt_count INTEGER NOT NULL DEFAULT 0,
138
- next_attempt_at BIGINT NOT NULL, lease_owner TEXT, lease_expires_at BIGINT,
139
- last_attempt_at BIGINT, last_error TEXT, delivered_at BIGINT, payload JSONB NOT NULL
140
- );
141
- CREATE INDEX resvary_outbox_events_due
142
- ON ${t('resvary_outbox_events')}(project_id, status, next_attempt_at, created_at);
143
-
144
- CREATE TABLE ${t('resvary_invoices')} (
145
- id TEXT PRIMARY KEY, status TEXT NOT NULL, customer_id TEXT, amount_units NUMERIC(78,0) NOT NULL,
146
- created_at BIGINT NOT NULL, payload JSONB NOT NULL
147
- );
148
- CREATE INDEX resvary_invoices_status ON ${t('resvary_invoices')}(status);
149
- CREATE INDEX resvary_invoices_customer_id ON ${t('resvary_invoices')}(customer_id);
150
- CREATE TABLE ${t('resvary_receipts')} (
151
- id TEXT PRIMARY KEY, invoice_id TEXT NOT NULL, tx_hash_norm TEXT, status TEXT NOT NULL,
152
- amount_units NUMERIC(78,0) NOT NULL, created_at BIGINT NOT NULL, payload JSONB NOT NULL
153
- );
154
- CREATE UNIQUE INDEX resvary_receipts_invoice_tx_hash
155
- ON ${t('resvary_receipts')}(invoice_id, tx_hash_norm) WHERE tx_hash_norm IS NOT NULL;
156
- CREATE TABLE ${t('arc_webhook_events')} (
157
- id TEXT PRIMARY KEY, type TEXT NOT NULL, created_at BIGINT NOT NULL, payload JSONB NOT NULL
158
- );
159
- CREATE TABLE ${t('arc_webhook_deliveries')} (
160
- id TEXT PRIMARY KEY, event_id TEXT NOT NULL, event_type TEXT NOT NULL, attempt INTEGER NOT NULL,
161
- status TEXT NOT NULL, received_at BIGINT NOT NULL, payload JSONB NOT NULL
162
- );
163
- CREATE INDEX arc_webhook_deliveries_event_id ON ${t('arc_webhook_deliveries')}(event_id);
164
- CREATE TABLE ${t('arc_watcher_cursors')} (
165
- key TEXT PRIMARY KEY, network TEXT NOT NULL, invoice_id TEXT, memo_id_norm TEXT,
166
- next_from_block NUMERIC(78,0) NOT NULL, updated_at BIGINT NOT NULL, payload JSONB NOT NULL
167
- );
77
+ await client.query(`
78
+ CREATE TABLE ${t('resvary_credit_accounts')} (
79
+ id TEXT PRIMARY KEY, project_id TEXT NOT NULL, customer_id TEXT NOT NULL,
80
+ currency TEXT NOT NULL, posted_units NUMERIC(78,0) NOT NULL,
81
+ reserved_units NUMERIC(78,0) NOT NULL, updated_at BIGINT NOT NULL, payload JSONB NOT NULL,
82
+ UNIQUE(project_id, customer_id)
83
+ );
84
+ CREATE TABLE ${t('resvary_credit_grants')} (
85
+ id TEXT PRIMARY KEY, account_id TEXT NOT NULL, amount_units NUMERIC(78,0) NOT NULL,
86
+ created_at BIGINT NOT NULL, payload JSONB NOT NULL
87
+ );
88
+ CREATE INDEX resvary_credit_grants_account ON ${t('resvary_credit_grants')}(account_id);
89
+ CREATE TABLE ${t('resvary_meters')} (
90
+ id TEXT PRIMARY KEY, project_id TEXT NOT NULL, meter_key TEXT NOT NULL, payload JSONB NOT NULL,
91
+ UNIQUE(project_id, meter_key)
92
+ );
93
+ CREATE TABLE ${t('resvary_price_versions')} (
94
+ id TEXT PRIMARY KEY, meter_id TEXT NOT NULL, version INTEGER NOT NULL,
95
+ created_at BIGINT NOT NULL, payload JSONB NOT NULL, UNIQUE(meter_id, version)
96
+ );
97
+ CREATE TABLE ${t('resvary_credit_reservations')} (
98
+ id TEXT PRIMARY KEY, account_id TEXT NOT NULL, project_id TEXT NOT NULL,
99
+ customer_id TEXT NOT NULL, status TEXT NOT NULL,
100
+ reserved_units NUMERIC(78,0) NOT NULL, expires_at BIGINT NOT NULL,
101
+ created_at BIGINT NOT NULL, payload JSONB NOT NULL
102
+ );
103
+ CREATE INDEX resvary_credit_reservations_open
104
+ ON ${t('resvary_credit_reservations')}(project_id, customer_id, status, expires_at);
105
+ CREATE TABLE ${t('resvary_usage_events')} (
106
+ id TEXT PRIMARY KEY, account_id TEXT NOT NULL, received_at BIGINT NOT NULL, payload JSONB NOT NULL
107
+ );
108
+ CREATE TABLE ${t('resvary_usage_receipts')} (
109
+ id TEXT PRIMARY KEY, account_id TEXT NOT NULL, reservation_id TEXT NOT NULL UNIQUE,
110
+ usage_event_id TEXT NOT NULL UNIQUE, charged_units NUMERIC(78,0) NOT NULL,
111
+ created_at BIGINT NOT NULL, payload JSONB NOT NULL
112
+ );
113
+ CREATE INDEX resvary_usage_receipts_account
114
+ ON ${t('resvary_usage_receipts')}(account_id, created_at);
115
+ CREATE TABLE ${t('resvary_ledger_entries')} (
116
+ id TEXT PRIMARY KEY, account_id TEXT NOT NULL, delta_units NUMERIC(78,0) NOT NULL,
117
+ balance_after_units NUMERIC(78,0) NOT NULL, created_at BIGINT NOT NULL, payload JSONB NOT NULL
118
+ );
119
+ CREATE INDEX resvary_ledger_entries_account
120
+ ON ${t('resvary_ledger_entries')}(account_id, created_at);
121
+ CREATE TABLE ${t('resvary_funding_intents')} (
122
+ id TEXT PRIMARY KEY, project_id TEXT NOT NULL, customer_id TEXT NOT NULL,
123
+ status TEXT NOT NULL, requested_units NUMERIC(78,0) NOT NULL,
124
+ created_at BIGINT NOT NULL, payload JSONB NOT NULL
125
+ );
126
+ CREATE TABLE ${t('resvary_funding_transactions')} (
127
+ id TEXT PRIMARY KEY, funding_intent_id TEXT NOT NULL, rail TEXT NOT NULL,
128
+ network TEXT NOT NULL, external_payment_id_norm TEXT NOT NULL, tx_hash_norm TEXT,
129
+ amount_units NUMERIC(78,0) NOT NULL, created_at BIGINT NOT NULL, payload JSONB NOT NULL,
130
+ UNIQUE(rail, network, external_payment_id_norm)
131
+ );
132
+ CREATE UNIQUE INDEX resvary_funding_transactions_tx_hash
133
+ ON ${t('resvary_funding_transactions')}(network, tx_hash_norm)
134
+ WHERE tx_hash_norm IS NOT NULL;
135
+ CREATE TABLE ${t('resvary_idempotency_keys')} (
136
+ scope TEXT NOT NULL, key TEXT NOT NULL, created_at BIGINT NOT NULL, payload JSONB NOT NULL,
137
+ PRIMARY KEY(scope, key)
138
+ );
139
+ CREATE TABLE ${t('resvary_outbox_events')} (
140
+ id TEXT PRIMARY KEY, project_id TEXT NOT NULL, type TEXT NOT NULL, status TEXT NOT NULL,
141
+ created_at BIGINT NOT NULL, attempt_count INTEGER NOT NULL DEFAULT 0,
142
+ next_attempt_at BIGINT NOT NULL, lease_owner TEXT, lease_expires_at BIGINT,
143
+ last_attempt_at BIGINT, last_error TEXT, delivered_at BIGINT, payload JSONB NOT NULL
144
+ );
145
+ CREATE INDEX resvary_outbox_events_due
146
+ ON ${t('resvary_outbox_events')}(project_id, status, next_attempt_at, created_at);
147
+
148
+ CREATE TABLE ${t('resvary_invoices')} (
149
+ id TEXT PRIMARY KEY, status TEXT NOT NULL, customer_id TEXT, amount_units NUMERIC(78,0) NOT NULL,
150
+ created_at BIGINT NOT NULL, payload JSONB NOT NULL
151
+ );
152
+ CREATE INDEX resvary_invoices_status ON ${t('resvary_invoices')}(status);
153
+ CREATE INDEX resvary_invoices_customer_id ON ${t('resvary_invoices')}(customer_id);
154
+ CREATE TABLE ${t('resvary_receipts')} (
155
+ id TEXT PRIMARY KEY, invoice_id TEXT NOT NULL, tx_hash_norm TEXT, status TEXT NOT NULL,
156
+ amount_units NUMERIC(78,0) NOT NULL, created_at BIGINT NOT NULL, payload JSONB NOT NULL
157
+ );
158
+ CREATE UNIQUE INDEX resvary_receipts_invoice_tx_hash
159
+ ON ${t('resvary_receipts')}(invoice_id, tx_hash_norm) WHERE tx_hash_norm IS NOT NULL;
160
+ CREATE TABLE ${t('arc_webhook_events')} (
161
+ id TEXT PRIMARY KEY, type TEXT NOT NULL, created_at BIGINT NOT NULL, payload JSONB NOT NULL
162
+ );
163
+ CREATE TABLE ${t('arc_webhook_deliveries')} (
164
+ id TEXT PRIMARY KEY, event_id TEXT NOT NULL, event_type TEXT NOT NULL, attempt INTEGER NOT NULL,
165
+ status TEXT NOT NULL, received_at BIGINT NOT NULL, payload JSONB NOT NULL
166
+ );
167
+ CREATE INDEX arc_webhook_deliveries_event_id ON ${t('arc_webhook_deliveries')}(event_id);
168
+ CREATE TABLE ${t('arc_watcher_cursors')} (
169
+ key TEXT PRIMARY KEY, network TEXT NOT NULL, invoice_id TEXT, memo_id_norm TEXT,
170
+ next_from_block NUMERIC(78,0) NOT NULL, updated_at BIGINT NOT NULL, payload JSONB NOT NULL
171
+ );
168
172
  `);
169
173
  await client.query(`INSERT INTO ${t('resvary_schema_migrations')}(version, applied_at) VALUES (1, $1)`, [Date.now()]);
170
174
  await client.query('COMMIT');
@@ -174,83 +178,84 @@ export async function applyV1(client, schema) {
174
178
  throw error;
175
179
  }
176
180
  }
177
- async function applyV2(client, schema) {
181
+ /** @internal Exported for sequential-migration verification. */
182
+ export async function applyV2(client, schema) {
178
183
  const t = (name) => table({ schema }, name);
179
184
  await client.query('BEGIN');
180
185
  try {
181
- const duplicateReceipt = await client.query(`SELECT tx_hash_norm, COUNT(*)::text AS count
182
- FROM ${t('resvary_receipts')}
183
- WHERE tx_hash_norm IS NOT NULL
184
- GROUP BY tx_hash_norm
185
- HAVING COUNT(*) > 1
186
+ const duplicateReceipt = await client.query(`SELECT tx_hash_norm, COUNT(*)::text AS count
187
+ FROM ${t('resvary_receipts')}
188
+ WHERE tx_hash_norm IS NOT NULL
189
+ GROUP BY tx_hash_norm
190
+ HAVING COUNT(*) > 1
186
191
  LIMIT 1`);
187
192
  if (duplicateReceipt.rows[0]) {
188
193
  throw new Error(`Cannot enforce receipt transaction uniqueness: ${duplicateReceipt.rows[0].count} receipts use ${duplicateReceipt.rows[0].tx_hash_norm}`);
189
194
  }
190
- await client.query(`
191
- DROP INDEX IF EXISTS "${schema}".resvary_receipts_invoice_tx_hash;
192
- CREATE UNIQUE INDEX resvary_receipts_tx_hash
193
- ON ${t('resvary_receipts')}(tx_hash_norm)
194
- WHERE tx_hash_norm IS NOT NULL;
195
-
196
- ALTER TABLE ${t('resvary_credit_accounts')}
197
- ADD CONSTRAINT resvary_credit_accounts_nonnegative
198
- CHECK (posted_units >= 0 AND reserved_units >= 0 AND reserved_units <= posted_units);
199
- ALTER TABLE ${t('resvary_credit_grants')}
200
- ADD CONSTRAINT resvary_credit_grants_amount_positive CHECK (amount_units > 0),
201
- ADD CONSTRAINT resvary_credit_grants_account_fk FOREIGN KEY (account_id)
202
- REFERENCES ${t('resvary_credit_accounts')}(id);
203
- ALTER TABLE ${t('resvary_price_versions')}
204
- ADD CONSTRAINT resvary_price_versions_version_positive CHECK (version > 0),
205
- ADD CONSTRAINT resvary_price_versions_meter_fk FOREIGN KEY (meter_id)
206
- REFERENCES ${t('resvary_meters')}(id);
207
- ALTER TABLE ${t('resvary_credit_reservations')}
208
- ADD CONSTRAINT resvary_credit_reservations_status
209
- CHECK (status IN ('open', 'committed', 'released', 'expired')),
210
- ADD CONSTRAINT resvary_credit_reservations_units_nonnegative CHECK (reserved_units >= 0),
211
- ADD CONSTRAINT resvary_credit_reservations_account_fk FOREIGN KEY (account_id)
212
- REFERENCES ${t('resvary_credit_accounts')}(id);
213
- ALTER TABLE ${t('resvary_usage_events')}
214
- ADD CONSTRAINT resvary_usage_events_account_fk FOREIGN KEY (account_id)
215
- REFERENCES ${t('resvary_credit_accounts')}(id);
216
- ALTER TABLE ${t('resvary_usage_receipts')}
217
- ADD CONSTRAINT resvary_usage_receipts_units_nonnegative CHECK (charged_units >= 0),
218
- ADD CONSTRAINT resvary_usage_receipts_account_fk FOREIGN KEY (account_id)
219
- REFERENCES ${t('resvary_credit_accounts')}(id),
220
- ADD CONSTRAINT resvary_usage_receipts_reservation_fk FOREIGN KEY (reservation_id)
221
- REFERENCES ${t('resvary_credit_reservations')}(id),
222
- ADD CONSTRAINT resvary_usage_receipts_usage_event_fk FOREIGN KEY (usage_event_id)
223
- REFERENCES ${t('resvary_usage_events')}(id);
224
- ALTER TABLE ${t('resvary_ledger_entries')}
225
- ADD CONSTRAINT resvary_ledger_entries_balance_nonnegative CHECK (balance_after_units >= 0),
226
- ADD CONSTRAINT resvary_ledger_entries_account_fk FOREIGN KEY (account_id)
227
- REFERENCES ${t('resvary_credit_accounts')}(id);
228
- ALTER TABLE ${t('resvary_funding_intents')}
229
- ADD CONSTRAINT resvary_funding_intents_status
230
- CHECK (status IN ('pending', 'confirmed', 'failed')),
231
- ADD CONSTRAINT resvary_funding_intents_units_positive CHECK (requested_units > 0);
232
- ALTER TABLE ${t('resvary_funding_transactions')}
233
- ADD CONSTRAINT resvary_funding_transactions_units_positive CHECK (amount_units > 0),
234
- ADD CONSTRAINT resvary_funding_transactions_intent_fk FOREIGN KEY (funding_intent_id)
235
- REFERENCES ${t('resvary_funding_intents')}(id);
236
- ALTER TABLE ${t('resvary_outbox_events')}
237
- ADD CONSTRAINT resvary_outbox_events_status
238
- CHECK (status IN ('pending', 'processing', 'delivered', 'dead_letter')),
239
- ADD CONSTRAINT resvary_outbox_events_attempt_nonnegative CHECK (attempt_count >= 0);
240
- ALTER TABLE ${t('resvary_invoices')}
241
- ADD CONSTRAINT resvary_invoices_status
242
- CHECK (status IN ('open', 'observed', 'paid', 'expired', 'refunded', 'void')),
243
- ADD CONSTRAINT resvary_invoices_amount_positive CHECK (amount_units > 0);
244
- ALTER TABLE ${t('resvary_receipts')}
245
- ADD CONSTRAINT resvary_receipts_status CHECK (status IN ('paid', 'refunded')),
246
- ADD CONSTRAINT resvary_receipts_amount_positive CHECK (amount_units > 0),
247
- ADD CONSTRAINT resvary_receipts_invoice_fk FOREIGN KEY (invoice_id)
248
- REFERENCES ${t('resvary_invoices')}(id);
249
- ALTER TABLE ${t('arc_webhook_deliveries')}
250
- ADD CONSTRAINT arc_webhook_deliveries_status CHECK (status IN ('verified', 'failed')),
251
- ADD CONSTRAINT arc_webhook_deliveries_attempt_positive CHECK (attempt > 0);
252
- ALTER TABLE ${t('arc_watcher_cursors')}
253
- ADD CONSTRAINT arc_watcher_cursors_block_nonnegative CHECK (next_from_block >= 0);
195
+ await client.query(`
196
+ DROP INDEX IF EXISTS "${schema}".resvary_receipts_invoice_tx_hash;
197
+ CREATE UNIQUE INDEX resvary_receipts_tx_hash
198
+ ON ${t('resvary_receipts')}(tx_hash_norm)
199
+ WHERE tx_hash_norm IS NOT NULL;
200
+
201
+ ALTER TABLE ${t('resvary_credit_accounts')}
202
+ ADD CONSTRAINT resvary_credit_accounts_nonnegative
203
+ CHECK (posted_units >= 0 AND reserved_units >= 0 AND reserved_units <= posted_units);
204
+ ALTER TABLE ${t('resvary_credit_grants')}
205
+ ADD CONSTRAINT resvary_credit_grants_amount_positive CHECK (amount_units > 0),
206
+ ADD CONSTRAINT resvary_credit_grants_account_fk FOREIGN KEY (account_id)
207
+ REFERENCES ${t('resvary_credit_accounts')}(id);
208
+ ALTER TABLE ${t('resvary_price_versions')}
209
+ ADD CONSTRAINT resvary_price_versions_version_positive CHECK (version > 0),
210
+ ADD CONSTRAINT resvary_price_versions_meter_fk FOREIGN KEY (meter_id)
211
+ REFERENCES ${t('resvary_meters')}(id);
212
+ ALTER TABLE ${t('resvary_credit_reservations')}
213
+ ADD CONSTRAINT resvary_credit_reservations_status
214
+ CHECK (status IN ('open', 'committed', 'released', 'expired')),
215
+ ADD CONSTRAINT resvary_credit_reservations_units_nonnegative CHECK (reserved_units >= 0),
216
+ ADD CONSTRAINT resvary_credit_reservations_account_fk FOREIGN KEY (account_id)
217
+ REFERENCES ${t('resvary_credit_accounts')}(id);
218
+ ALTER TABLE ${t('resvary_usage_events')}
219
+ ADD CONSTRAINT resvary_usage_events_account_fk FOREIGN KEY (account_id)
220
+ REFERENCES ${t('resvary_credit_accounts')}(id);
221
+ ALTER TABLE ${t('resvary_usage_receipts')}
222
+ ADD CONSTRAINT resvary_usage_receipts_units_nonnegative CHECK (charged_units >= 0),
223
+ ADD CONSTRAINT resvary_usage_receipts_account_fk FOREIGN KEY (account_id)
224
+ REFERENCES ${t('resvary_credit_accounts')}(id),
225
+ ADD CONSTRAINT resvary_usage_receipts_reservation_fk FOREIGN KEY (reservation_id)
226
+ REFERENCES ${t('resvary_credit_reservations')}(id),
227
+ ADD CONSTRAINT resvary_usage_receipts_usage_event_fk FOREIGN KEY (usage_event_id)
228
+ REFERENCES ${t('resvary_usage_events')}(id);
229
+ ALTER TABLE ${t('resvary_ledger_entries')}
230
+ ADD CONSTRAINT resvary_ledger_entries_balance_nonnegative CHECK (balance_after_units >= 0),
231
+ ADD CONSTRAINT resvary_ledger_entries_account_fk FOREIGN KEY (account_id)
232
+ REFERENCES ${t('resvary_credit_accounts')}(id);
233
+ ALTER TABLE ${t('resvary_funding_intents')}
234
+ ADD CONSTRAINT resvary_funding_intents_status
235
+ CHECK (status IN ('pending', 'confirmed', 'failed')),
236
+ ADD CONSTRAINT resvary_funding_intents_units_positive CHECK (requested_units > 0);
237
+ ALTER TABLE ${t('resvary_funding_transactions')}
238
+ ADD CONSTRAINT resvary_funding_transactions_units_positive CHECK (amount_units > 0),
239
+ ADD CONSTRAINT resvary_funding_transactions_intent_fk FOREIGN KEY (funding_intent_id)
240
+ REFERENCES ${t('resvary_funding_intents')}(id);
241
+ ALTER TABLE ${t('resvary_outbox_events')}
242
+ ADD CONSTRAINT resvary_outbox_events_status
243
+ CHECK (status IN ('pending', 'processing', 'delivered', 'dead_letter')),
244
+ ADD CONSTRAINT resvary_outbox_events_attempt_nonnegative CHECK (attempt_count >= 0);
245
+ ALTER TABLE ${t('resvary_invoices')}
246
+ ADD CONSTRAINT resvary_invoices_status
247
+ CHECK (status IN ('open', 'observed', 'paid', 'expired', 'refunded', 'void')),
248
+ ADD CONSTRAINT resvary_invoices_amount_positive CHECK (amount_units > 0);
249
+ ALTER TABLE ${t('resvary_receipts')}
250
+ ADD CONSTRAINT resvary_receipts_status CHECK (status IN ('paid', 'refunded')),
251
+ ADD CONSTRAINT resvary_receipts_amount_positive CHECK (amount_units > 0),
252
+ ADD CONSTRAINT resvary_receipts_invoice_fk FOREIGN KEY (invoice_id)
253
+ REFERENCES ${t('resvary_invoices')}(id);
254
+ ALTER TABLE ${t('arc_webhook_deliveries')}
255
+ ADD CONSTRAINT arc_webhook_deliveries_status CHECK (status IN ('verified', 'failed')),
256
+ ADD CONSTRAINT arc_webhook_deliveries_attempt_positive CHECK (attempt > 0);
257
+ ALTER TABLE ${t('arc_watcher_cursors')}
258
+ ADD CONSTRAINT arc_watcher_cursors_block_nonnegative CHECK (next_from_block >= 0);
254
259
  `);
255
260
  await client.query(`INSERT INTO ${t('resvary_schema_migrations')}(version, applied_at) VALUES (2, $1)`, [Date.now()]);
256
261
  await client.query('COMMIT');
@@ -260,4 +265,188 @@ async function applyV2(client, schema) {
260
265
  throw error;
261
266
  }
262
267
  }
268
+ /** @internal Exported for sequential-migration verification. */
269
+ export async function applyV3(client, schema) {
270
+ const t = (name) => table({ schema }, name);
271
+ await client.query('BEGIN');
272
+ try {
273
+ await client.query(`
274
+ CREATE TABLE ${t('resvary_grant_policies')} (
275
+ id TEXT PRIMARY KEY, project_id TEXT NOT NULL, policy_key TEXT NOT NULL,
276
+ version INTEGER NOT NULL CHECK (version > 0), created_at BIGINT NOT NULL,
277
+ payload JSONB NOT NULL, UNIQUE(project_id, policy_key, version)
278
+ );
279
+ CREATE INDEX resvary_grant_policies_project
280
+ ON ${t('resvary_grant_policies')}(project_id, created_at);
281
+
282
+ CREATE TABLE ${t('resvary_credit_lots')} (
283
+ id TEXT PRIMARY KEY, account_id TEXT NOT NULL, project_id TEXT NOT NULL,
284
+ customer_id TEXT NOT NULL, kind TEXT NOT NULL,
285
+ policy_id TEXT, original_units NUMERIC(78,0) NOT NULL,
286
+ available_units NUMERIC(78,0) NOT NULL, reserved_units NUMERIC(78,0) NOT NULL,
287
+ consumed_units NUMERIC(78,0) NOT NULL, expired_units NUMERIC(78,0) NOT NULL,
288
+ expires_at BIGINT, created_at BIGINT NOT NULL, payload JSONB NOT NULL,
289
+ CONSTRAINT resvary_credit_lots_kind
290
+ CHECK (kind IN ('legacy', 'general', 'allowance', 'promotion')),
291
+ CONSTRAINT resvary_credit_lots_balances_nonnegative
292
+ CHECK (original_units > 0 AND available_units >= 0 AND reserved_units >= 0
293
+ AND consumed_units >= 0 AND expired_units >= 0),
294
+ CONSTRAINT resvary_credit_lots_balance_total
295
+ CHECK (available_units + reserved_units + consumed_units + expired_units = original_units),
296
+ CONSTRAINT resvary_credit_lots_account_fk FOREIGN KEY (account_id)
297
+ REFERENCES ${t('resvary_credit_accounts')}(id),
298
+ CONSTRAINT resvary_credit_lots_policy_fk FOREIGN KEY (policy_id)
299
+ REFERENCES ${t('resvary_grant_policies')}(id)
300
+ );
301
+ CREATE INDEX resvary_credit_lots_account
302
+ ON ${t('resvary_credit_lots')}(account_id, created_at);
303
+ CREATE INDEX resvary_credit_lots_expiry
304
+ ON ${t('resvary_credit_lots')}(project_id, expires_at)
305
+ WHERE expires_at IS NOT NULL;
306
+
307
+ CREATE TABLE ${t('resvary_credit_lot_allocations')} (
308
+ id TEXT PRIMARY KEY, reservation_id TEXT NOT NULL, lot_id TEXT NOT NULL,
309
+ account_id TEXT NOT NULL, allocated_units NUMERIC(78,0) NOT NULL,
310
+ reserved_units NUMERIC(78,0) NOT NULL, consumed_units NUMERIC(78,0) NOT NULL,
311
+ released_units NUMERIC(78,0) NOT NULL, expired_units NUMERIC(78,0) NOT NULL,
312
+ created_at BIGINT NOT NULL, payload JSONB NOT NULL,
313
+ CONSTRAINT resvary_credit_lot_allocations_balances_nonnegative
314
+ CHECK (allocated_units > 0 AND reserved_units >= 0 AND consumed_units >= 0
315
+ AND released_units >= 0 AND expired_units >= 0),
316
+ CONSTRAINT resvary_credit_lot_allocations_balance_total
317
+ CHECK (reserved_units + consumed_units + released_units + expired_units = allocated_units),
318
+ CONSTRAINT resvary_credit_lot_allocations_reservation_fk FOREIGN KEY (reservation_id)
319
+ REFERENCES ${t('resvary_credit_reservations')}(id),
320
+ CONSTRAINT resvary_credit_lot_allocations_lot_fk FOREIGN KEY (lot_id)
321
+ REFERENCES ${t('resvary_credit_lots')}(id),
322
+ CONSTRAINT resvary_credit_lot_allocations_account_fk FOREIGN KEY (account_id)
323
+ REFERENCES ${t('resvary_credit_accounts')}(id),
324
+ UNIQUE(reservation_id, lot_id)
325
+ );
326
+ CREATE INDEX resvary_credit_lot_allocations_reservation
327
+ ON ${t('resvary_credit_lot_allocations')}(reservation_id, created_at);
328
+
329
+ CREATE TABLE ${t('resvary_grant_policy_applications')} (
330
+ id TEXT PRIMARY KEY, policy_id TEXT NOT NULL, account_id TEXT NOT NULL,
331
+ project_id TEXT NOT NULL, customer_id TEXT NOT NULL, policy_type TEXT NOT NULL,
332
+ period_key TEXT NOT NULL, created_at BIGINT NOT NULL, payload JSONB NOT NULL,
333
+ CONSTRAINT resvary_grant_policy_applications_type
334
+ CHECK (policy_type IN ('allowance', 'promotion')),
335
+ CONSTRAINT resvary_grant_policy_applications_policy_fk FOREIGN KEY (policy_id)
336
+ REFERENCES ${t('resvary_grant_policies')}(id),
337
+ CONSTRAINT resvary_grant_policy_applications_account_fk FOREIGN KEY (account_id)
338
+ REFERENCES ${t('resvary_credit_accounts')}(id),
339
+ UNIQUE(policy_id, account_id, period_key)
340
+ );
341
+ CREATE INDEX resvary_grant_policy_applications_customer
342
+ ON ${t('resvary_grant_policy_applications')}(project_id, customer_id, created_at);
343
+ `);
344
+ const accounts = await client.query(`SELECT payload::text AS payload FROM ${t('resvary_credit_accounts')} ORDER BY id`);
345
+ for (const accountRow of accounts.rows) {
346
+ const account = parseReceiptStoreValue(accountRow.payload);
347
+ const posted = parseCreditUnits(account.postedUnits);
348
+ const reserved = parseCreditUnits(account.reservedUnits);
349
+ if (reserved > posted) {
350
+ throw new Error(`Cannot migrate Postgres credit lots: account invariant failed for ${account.id}`);
351
+ }
352
+ const reservations = await client.query(`SELECT payload::text AS payload FROM ${t('resvary_credit_reservations')}
353
+ WHERE account_id = $1 AND status = 'open' ORDER BY created_at, id`, [account.id]);
354
+ const open = reservations.rows.map((item) => parseReceiptStoreValue(item.payload));
355
+ const reservationTotal = open.reduce((total, reservation) => total + parseCreditUnits(reservation.reservedUnits), 0n);
356
+ if (reservationTotal !== reserved) {
357
+ throw new Error(`Cannot migrate Postgres credit lots: open reservations do not match account ${account.id}`);
358
+ }
359
+ if (posted === 0n)
360
+ continue;
361
+ const available = posted - reserved;
362
+ const lot = {
363
+ id: `lot_legacy_${account.id}`,
364
+ accountId: account.id,
365
+ projectId: account.projectId,
366
+ customerId: account.customerId,
367
+ kind: 'legacy',
368
+ originalAmount: creditUnitsToString(posted),
369
+ originalUnits: posted.toString(),
370
+ availableAmount: creditUnitsToString(available),
371
+ availableUnits: available.toString(),
372
+ reservedAmount: creditUnitsToString(reserved),
373
+ reservedUnits: reserved.toString(),
374
+ consumedAmount: '0',
375
+ consumedUnits: '0',
376
+ expiredAmount: '0',
377
+ expiredUnits: '0',
378
+ createdAt: account.createdAt,
379
+ updatedAt: account.updatedAt,
380
+ metadata: { migratedFrom: 'postgres-v2' },
381
+ };
382
+ await client.query(`INSERT INTO ${t('resvary_credit_lots')} (
383
+ id, account_id, project_id, customer_id, kind, policy_id,
384
+ original_units, available_units, reserved_units, consumed_units, expired_units,
385
+ expires_at, created_at, payload
386
+ ) VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14::jsonb)`, [
387
+ lot.id,
388
+ lot.accountId,
389
+ lot.projectId,
390
+ lot.customerId,
391
+ lot.kind,
392
+ null,
393
+ lot.originalUnits,
394
+ lot.availableUnits,
395
+ lot.reservedUnits,
396
+ lot.consumedUnits,
397
+ lot.expiredUnits,
398
+ null,
399
+ lot.createdAt,
400
+ serializeReceiptStoreValue(lot),
401
+ ]);
402
+ for (const reservation of open) {
403
+ const units = parseCreditUnits(reservation.reservedUnits);
404
+ if (units === 0n)
405
+ continue;
406
+ const allocation = {
407
+ id: `cla_legacy_${reservation.id}`,
408
+ reservationId: reservation.id,
409
+ lotId: lot.id,
410
+ accountId: account.id,
411
+ projectId: account.projectId,
412
+ customerId: account.customerId,
413
+ allocatedAmount: creditUnitsToString(units),
414
+ allocatedUnits: units.toString(),
415
+ reservedAmount: creditUnitsToString(units),
416
+ reservedUnits: units.toString(),
417
+ consumedAmount: '0',
418
+ consumedUnits: '0',
419
+ releasedAmount: '0',
420
+ releasedUnits: '0',
421
+ expiredAmount: '0',
422
+ expiredUnits: '0',
423
+ createdAt: reservation.createdAt,
424
+ updatedAt: account.updatedAt,
425
+ };
426
+ await client.query(`INSERT INTO ${t('resvary_credit_lot_allocations')} (
427
+ id, reservation_id, lot_id, account_id, allocated_units, reserved_units,
428
+ consumed_units, released_units, expired_units, created_at, payload
429
+ ) VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11::jsonb)`, [
430
+ allocation.id,
431
+ allocation.reservationId,
432
+ allocation.lotId,
433
+ allocation.accountId,
434
+ allocation.allocatedUnits,
435
+ allocation.reservedUnits,
436
+ allocation.consumedUnits,
437
+ allocation.releasedUnits,
438
+ allocation.expiredUnits,
439
+ allocation.createdAt,
440
+ serializeReceiptStoreValue(allocation),
441
+ ]);
442
+ }
443
+ }
444
+ await client.query(`INSERT INTO ${t('resvary_schema_migrations')}(version, applied_at) VALUES (3, $1)`, [Date.now()]);
445
+ await client.query('COMMIT');
446
+ }
447
+ catch (error) {
448
+ await client.query('ROLLBACK');
449
+ throw error;
450
+ }
451
+ }
263
452
  //# sourceMappingURL=migrations.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"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"}