storeInvoice method
Store an invoice read model (insert, or replace an existing row with
the same invoiceId).
Implementation
@override
Future<void> storeInvoice(InvoiceReadModel invoice) async {
_ensureInitialized();
await _pool!.execute(
Sql.named('''
INSERT INTO invoices (
invoice_id, wallet_id, addresses_json, amount, description,
status, created_at, expires_at, paid_at, payment_txid,
amount_received, metadata_json, outputs_json
) VALUES (
@invoiceId, @walletId, @addressesJson, @amount, @description,
@status, @createdAt, @expiresAt, @paidAt, @paymentTxid,
@amountReceived, CAST(@metadataJson AS JSONB),
CAST(@outputsJson AS JSONB)
)
ON CONFLICT (invoice_id) DO UPDATE SET
wallet_id = EXCLUDED.wallet_id,
addresses_json = EXCLUDED.addresses_json,
amount = EXCLUDED.amount,
description = EXCLUDED.description,
status = EXCLUDED.status,
expires_at = EXCLUDED.expires_at,
paid_at = EXCLUDED.paid_at,
payment_txid = EXCLUDED.payment_txid,
amount_received = EXCLUDED.amount_received,
metadata_json = EXCLUDED.metadata_json,
outputs_json = EXCLUDED.outputs_json
'''),
parameters: {
'invoiceId': invoice.invoiceId,
'walletId': invoice.walletId,
'addressesJson': jsonEncode(invoice.addresses),
'amount': invoice.amount.toInt(),
'description': invoice.description,
'status': invoice.status.name,
'createdAt': invoice.createdAt,
'expiresAt': invoice.expiresAt,
'paidAt': invoice.paidAt,
'paymentTxid': invoice.paymentTxid,
'amountReceived': invoice.amountReceived?.toInt(),
'metadataJson': jsonEncode(invoice.metadata),
'outputsJson': invoice.outputs == null
? null
: jsonEncode(invoice.outputs!.map((o) => o.toMap()).toList()),
},
);
}