@adonis-agora/payments 0.2.0 → 0.4.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/CHANGELOG.md +2375 -0
- package/dist/assets/spa/assets/index-B7rU8eIL.css +2 -0
- package/dist/assets/spa/assets/index-BcM2VH5k.js +10 -0
- package/dist/assets/spa/assets/index-BcM2VH5k.js.map +1 -0
- package/dist/assets/spa/index.html +20 -0
- package/dist/commands/main.d.ts +4 -3
- package/dist/commands/main.d.ts.map +1 -1
- package/dist/commands/main.js +9 -2
- package/dist/commands/main.js.map +1 -1
- package/dist/commands/make_billable.d.ts.map +1 -1
- package/dist/commands/make_billable.js +1 -1
- package/dist/commands/make_billable.js.map +1 -1
- package/dist/commands/make_webhook_handler.d.ts.map +1 -1
- package/dist/commands/make_webhook_handler.js +1 -1
- package/dist/commands/make_webhook_handler.js.map +1 -1
- package/dist/commands/payments_health.d.ts +31 -0
- package/dist/commands/payments_health.d.ts.map +1 -0
- package/dist/commands/payments_health.js +113 -0
- package/dist/commands/payments_health.js.map +1 -0
- package/dist/commands/payments_sync.d.ts +18 -4
- package/dist/commands/payments_sync.d.ts.map +1 -1
- package/dist/commands/payments_sync.js +136 -40
- package/dist/commands/payments_sync.js.map +1 -1
- package/dist/commands/payments_webhook.d.ts.map +1 -1
- package/dist/commands/payments_webhook.js.map +1 -1
- package/dist/configure.d.ts +12 -5
- package/dist/configure.d.ts.map +1 -1
- package/dist/configure.js +18 -5
- package/dist/configure.js.map +1 -1
- package/dist/providers/dashboard_provider.d.ts +97 -0
- package/dist/providers/dashboard_provider.d.ts.map +1 -0
- package/dist/providers/dashboard_provider.js +430 -0
- package/dist/providers/dashboard_provider.js.map +1 -0
- package/dist/providers/payments_client_provider.d.ts +41 -0
- package/dist/providers/payments_client_provider.d.ts.map +1 -0
- package/dist/providers/payments_client_provider.js +95 -0
- package/dist/providers/payments_client_provider.js.map +1 -0
- package/dist/providers/payments_provider.d.ts +35 -0
- package/dist/providers/payments_provider.d.ts.map +1 -1
- package/dist/providers/payments_provider.js +250 -36
- package/dist/providers/payments_provider.js.map +1 -1
- package/dist/src/billing/billing_health.d.ts +85 -0
- package/dist/src/billing/billing_health.d.ts.map +1 -0
- package/dist/src/billing/billing_health.js +155 -0
- package/dist/src/billing/billing_health.js.map +1 -0
- package/dist/src/billing/billing_overview.d.ts +4 -3
- package/dist/src/billing/billing_overview.d.ts.map +1 -1
- package/dist/src/billing/billing_overview.js +14 -5
- package/dist/src/billing/billing_overview.js.map +1 -1
- package/dist/src/billing/billing_store.d.ts +634 -5
- package/dist/src/billing/billing_store.d.ts.map +1 -1
- package/dist/src/billing/billing_store.js +18 -1
- package/dist/src/billing/billing_store.js.map +1 -1
- package/dist/src/billing/index.d.ts +4 -3
- package/dist/src/billing/index.d.ts.map +1 -1
- package/dist/src/billing/index.js +2 -1
- package/dist/src/billing/index.js.map +1 -1
- package/dist/src/billing/list_query.d.ts +16 -0
- package/dist/src/billing/list_query.d.ts.map +1 -0
- package/dist/src/billing/list_query.js +28 -0
- package/dist/src/billing/list_query.js.map +1 -0
- package/dist/src/billing/lucid_billing_store.d.ts +122 -4
- package/dist/src/billing/lucid_billing_store.d.ts.map +1 -1
- package/dist/src/billing/lucid_billing_store.js +811 -13
- package/dist/src/billing/lucid_billing_store.js.map +1 -1
- package/dist/src/billing/mixins/index.d.ts +5 -2
- package/dist/src/billing/mixins/index.d.ts.map +1 -1
- package/dist/src/billing/mixins/index.js +5 -2
- package/dist/src/billing/mixins/index.js.map +1 -1
- package/dist/src/billing/mixins/with_audit_event.d.ts +48 -0
- package/dist/src/billing/mixins/with_audit_event.d.ts.map +1 -0
- package/dist/src/billing/mixins/with_audit_event.js +77 -0
- package/dist/src/billing/mixins/with_audit_event.js.map +1 -0
- package/dist/src/billing/mixins/with_billable.d.ts.map +1 -1
- package/dist/src/billing/mixins/with_customer.d.ts +39 -0
- package/dist/src/billing/mixins/with_customer.d.ts.map +1 -0
- package/dist/src/billing/mixins/with_customer.js +68 -0
- package/dist/src/billing/mixins/with_customer.js.map +1 -0
- package/dist/src/billing/mixins/with_dispute.d.ts +68 -0
- package/dist/src/billing/mixins/with_dispute.d.ts.map +1 -0
- package/dist/src/billing/mixins/with_dispute.js +83 -0
- package/dist/src/billing/mixins/with_dispute.js.map +1 -0
- package/dist/src/billing/mixins/with_payment.d.ts +42 -0
- package/dist/src/billing/mixins/with_payment.d.ts.map +1 -1
- package/dist/src/billing/mixins/with_payment.js +29 -3
- package/dist/src/billing/mixins/with_payment.js.map +1 -1
- package/dist/src/billing/mixins/with_subscription.d.ts +7 -0
- package/dist/src/billing/mixins/with_subscription.d.ts.map +1 -1
- package/dist/src/billing/mixins/with_subscription.js +15 -1
- package/dist/src/billing/mixins/with_subscription.js.map +1 -1
- package/dist/src/billing/mixins/with_usage_event.d.ts +7 -0
- package/dist/src/billing/mixins/with_usage_event.d.ts.map +1 -1
- package/dist/src/billing/mixins/with_usage_event.js +15 -1
- package/dist/src/billing/mixins/with_usage_event.js.map +1 -1
- package/dist/src/billing/mixins/with_webhook_event.d.ts +18 -0
- package/dist/src/billing/mixins/with_webhook_event.d.ts.map +1 -1
- package/dist/src/billing/mixins/with_webhook_event.js +18 -1
- package/dist/src/billing/mixins/with_webhook_event.js.map +1 -1
- package/dist/src/billing/resolve_dispatch.d.ts +22 -0
- package/dist/src/billing/resolve_dispatch.d.ts.map +1 -0
- package/dist/src/billing/resolve_dispatch.js +44 -0
- package/dist/src/billing/resolve_dispatch.js.map +1 -0
- package/dist/src/billing/resolve_store.d.ts +18 -0
- package/dist/src/billing/resolve_store.d.ts.map +1 -0
- package/dist/src/billing/resolve_store.js +35 -0
- package/dist/src/billing/resolve_store.js.map +1 -0
- package/dist/src/billing/schema.d.ts +108 -0
- package/dist/src/billing/schema.d.ts.map +1 -0
- package/dist/src/billing/schema.js +350 -0
- package/dist/src/billing/schema.js.map +1 -0
- package/dist/src/billing/webhook_dispatcher.d.ts +95 -16
- package/dist/src/billing/webhook_dispatcher.d.ts.map +1 -1
- package/dist/src/billing/webhook_dispatcher.js +186 -33
- package/dist/src/billing/webhook_dispatcher.js.map +1 -1
- package/dist/src/billing/webhook_events.d.ts +67 -1
- package/dist/src/billing/webhook_events.d.ts.map +1 -1
- package/dist/src/billing/webhook_events.js +15 -0
- package/dist/src/billing/webhook_events.js.map +1 -1
- package/dist/src/billing/webhook_processor.d.ts.map +1 -1
- package/dist/src/billing/webhook_processor.js +325 -5
- package/dist/src/billing/webhook_processor.js.map +1 -1
- package/dist/src/client/define_config.d.ts +150 -0
- package/dist/src/client/define_config.d.ts.map +1 -0
- package/dist/src/client/define_config.js +98 -0
- package/dist/src/client/define_config.js.map +1 -0
- package/dist/src/client/handlers.d.ts +71 -0
- package/dist/src/client/handlers.d.ts.map +1 -0
- package/dist/src/client/handlers.js +119 -0
- package/dist/src/client/handlers.js.map +1 -0
- package/dist/src/client/index.d.ts +15 -0
- package/dist/src/client/index.d.ts.map +1 -0
- package/dist/src/client/index.js +12 -0
- package/dist/src/client/index.js.map +1 -0
- package/dist/src/client/statuses.d.ts +38 -0
- package/dist/src/client/statuses.d.ts.map +1 -0
- package/dist/src/client/statuses.js +42 -0
- package/dist/src/client/statuses.js.map +1 -0
- package/dist/src/dashboard/actions.d.ts +143 -0
- package/dist/src/dashboard/actions.d.ts.map +1 -0
- package/dist/src/dashboard/actions.js +112 -0
- package/dist/src/dashboard/actions.js.map +1 -0
- package/dist/src/dashboard/auth.d.ts +136 -0
- package/dist/src/dashboard/auth.d.ts.map +1 -0
- package/dist/src/dashboard/auth.js +152 -0
- package/dist/src/dashboard/auth.js.map +1 -0
- package/dist/src/dashboard/define_config.d.ts +80 -0
- package/dist/src/dashboard/define_config.d.ts.map +1 -0
- package/dist/src/dashboard/define_config.js +83 -0
- package/dist/src/dashboard/define_config.js.map +1 -0
- package/dist/src/dashboard/handlers.d.ts +281 -0
- package/dist/src/dashboard/handlers.d.ts.map +1 -0
- package/dist/src/dashboard/handlers.js +960 -0
- package/dist/src/dashboard/handlers.js.map +1 -0
- package/dist/src/dashboard/index.d.ts +17 -0
- package/dist/src/dashboard/index.d.ts.map +1 -0
- package/dist/src/dashboard/index.js +13 -0
- package/dist/src/dashboard/index.js.map +1 -0
- package/dist/src/dashboard/login_page.d.ts +23 -0
- package/dist/src/dashboard/login_page.d.ts.map +1 -0
- package/dist/src/dashboard/login_page.js +170 -0
- package/dist/src/dashboard/login_page.js.map +1 -0
- package/dist/src/dashboard/period.d.ts +31 -0
- package/dist/src/dashboard/period.d.ts.map +1 -0
- package/dist/src/dashboard/period.js +44 -0
- package/dist/src/dashboard/period.js.map +1 -0
- package/dist/src/dashboard/session_cookie.d.ts +42 -0
- package/dist/src/dashboard/session_cookie.d.ts.map +1 -0
- package/dist/src/dashboard/session_cookie.js +97 -0
- package/dist/src/dashboard/session_cookie.js.map +1 -0
- package/dist/src/dashboard/spa.d.ts +24 -0
- package/dist/src/dashboard/spa.d.ts.map +1 -0
- package/dist/src/dashboard/spa.js +52 -0
- package/dist/src/dashboard/spa.js.map +1 -0
- package/dist/src/define_config.d.ts +245 -10
- package/dist/src/define_config.d.ts.map +1 -1
- package/dist/src/define_config.js +97 -1
- package/dist/src/define_config.js.map +1 -1
- package/dist/src/diagnostics.d.ts +287 -7
- package/dist/src/diagnostics.d.ts.map +1 -1
- package/dist/src/diagnostics.js +317 -1
- package/dist/src/diagnostics.js.map +1 -1
- package/dist/src/driver.d.ts +139 -5
- package/dist/src/driver.d.ts.map +1 -1
- package/dist/src/drivers/abacate.d.ts +13 -3
- package/dist/src/drivers/abacate.d.ts.map +1 -1
- package/dist/src/drivers/abacate.js +112 -19
- package/dist/src/drivers/abacate.js.map +1 -1
- package/dist/src/drivers/adyen.d.ts +164 -0
- package/dist/src/drivers/adyen.d.ts.map +1 -0
- package/dist/src/drivers/adyen.js +678 -0
- package/dist/src/drivers/adyen.js.map +1 -0
- package/dist/src/drivers/asaas.d.ts +53 -3
- package/dist/src/drivers/asaas.d.ts.map +1 -1
- package/dist/src/drivers/asaas.js +364 -29
- package/dist/src/drivers/asaas.js.map +1 -1
- package/dist/src/drivers/dodo.d.ts +135 -0
- package/dist/src/drivers/dodo.d.ts.map +1 -0
- package/dist/src/drivers/dodo.js +864 -0
- package/dist/src/drivers/dodo.js.map +1 -0
- package/dist/src/drivers/efi.d.ts +98 -0
- package/dist/src/drivers/efi.d.ts.map +1 -0
- package/dist/src/drivers/efi.js +628 -0
- package/dist/src/drivers/efi.js.map +1 -0
- package/dist/src/drivers/infinitepay.d.ts +156 -0
- package/dist/src/drivers/infinitepay.d.ts.map +1 -0
- package/dist/src/drivers/infinitepay.js +321 -0
- package/dist/src/drivers/infinitepay.js.map +1 -0
- package/dist/src/drivers/lemonsqueezy.d.ts +125 -0
- package/dist/src/drivers/lemonsqueezy.d.ts.map +1 -0
- package/dist/src/drivers/lemonsqueezy.js +632 -0
- package/dist/src/drivers/lemonsqueezy.js.map +1 -0
- package/dist/src/drivers/mercadopago.d.ts +97 -0
- package/dist/src/drivers/mercadopago.d.ts.map +1 -0
- package/dist/src/drivers/mercadopago.js +844 -0
- package/dist/src/drivers/mercadopago.js.map +1 -0
- package/dist/src/drivers/mollie.d.ts +125 -0
- package/dist/src/drivers/mollie.d.ts.map +1 -0
- package/dist/src/drivers/mollie.js +812 -0
- package/dist/src/drivers/mollie.js.map +1 -0
- package/dist/src/drivers/paddle.d.ts +148 -0
- package/dist/src/drivers/paddle.d.ts.map +1 -0
- package/dist/src/drivers/paddle.js +738 -0
- package/dist/src/drivers/paddle.js.map +1 -0
- package/dist/src/drivers/pagarme.d.ts +97 -0
- package/dist/src/drivers/pagarme.d.ts.map +1 -0
- package/dist/src/drivers/pagarme.js +829 -0
- package/dist/src/drivers/pagarme.js.map +1 -0
- package/dist/src/drivers/pagbank.d.ts +57 -0
- package/dist/src/drivers/pagbank.d.ts.map +1 -0
- package/dist/src/drivers/pagbank.js +499 -0
- package/dist/src/drivers/pagbank.js.map +1 -0
- package/dist/src/drivers/paypal.d.ts +120 -0
- package/dist/src/drivers/paypal.d.ts.map +1 -0
- package/dist/src/drivers/paypal.js +891 -0
- package/dist/src/drivers/paypal.js.map +1 -0
- package/dist/src/drivers/polar.d.ts +118 -0
- package/dist/src/drivers/polar.d.ts.map +1 -0
- package/dist/src/drivers/polar.js +604 -0
- package/dist/src/drivers/polar.js.map +1 -0
- package/dist/src/drivers/razorpay.d.ts +103 -0
- package/dist/src/drivers/razorpay.d.ts.map +1 -0
- package/dist/src/drivers/razorpay.js +867 -0
- package/dist/src/drivers/razorpay.js.map +1 -0
- package/dist/src/drivers/shared.d.ts +33 -0
- package/dist/src/drivers/shared.d.ts.map +1 -0
- package/dist/src/drivers/shared.js +37 -0
- package/dist/src/drivers/shared.js.map +1 -0
- package/dist/src/drivers/square.d.ts +133 -0
- package/dist/src/drivers/square.d.ts.map +1 -0
- package/dist/src/drivers/square.js +905 -0
- package/dist/src/drivers/square.js.map +1 -0
- package/dist/src/drivers/stripe.d.ts +41 -4
- package/dist/src/drivers/stripe.d.ts.map +1 -1
- package/dist/src/drivers/stripe.js +823 -26
- package/dist/src/drivers/stripe.js.map +1 -1
- package/dist/src/drivers/woovi.d.ts +11 -4
- package/dist/src/drivers/woovi.d.ts.map +1 -1
- package/dist/src/drivers/woovi.js +162 -29
- package/dist/src/drivers/woovi.js.map +1 -1
- package/dist/src/ensure_customer.d.ts +34 -1
- package/dist/src/ensure_customer.d.ts.map +1 -1
- package/dist/src/ensure_customer.js +29 -4
- package/dist/src/ensure_customer.js.map +1 -1
- package/dist/src/hooks/webhook_handlers.d.ts.map +1 -1
- package/dist/src/hooks/webhook_handlers.js.map +1 -1
- package/dist/src/http.d.ts +37 -3
- package/dist/src/http.d.ts.map +1 -1
- package/dist/src/http.js +69 -5
- package/dist/src/http.js.map +1 -1
- package/dist/src/index.d.ts +54 -26
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +29 -12
- package/dist/src/index.js.map +1 -1
- package/dist/src/invoice/drivers/asaas.d.ts.map +1 -1
- package/dist/src/invoice/drivers/asaas.js.map +1 -1
- package/dist/src/invoice/drivers/enotas.d.ts.map +1 -1
- package/dist/src/invoice/drivers/enotas.js.map +1 -1
- package/dist/src/invoice/drivers/focus.d.ts.map +1 -1
- package/dist/src/invoice/drivers/focus.js.map +1 -1
- package/dist/src/invoice/drivers/plugnotas.d.ts.map +1 -1
- package/dist/src/invoice/drivers/plugnotas.js.map +1 -1
- package/dist/src/invoice/drivers/tecnospeed.d.ts.map +1 -1
- package/dist/src/invoice/drivers/tecnospeed.js.map +1 -1
- package/dist/src/invoice/emit_invoice.d.ts.map +1 -1
- package/dist/src/invoice/emit_invoice.js +31 -11
- package/dist/src/invoice/emit_invoice.js.map +1 -1
- package/dist/src/invoice/invoice_manager.d.ts.map +1 -1
- package/dist/src/money.d.ts +23 -5
- package/dist/src/money.d.ts.map +1 -1
- package/dist/src/money.js +72 -7
- package/dist/src/money.js.map +1 -1
- package/dist/src/payments_manager.d.ts +8 -1
- package/dist/src/payments_manager.d.ts.map +1 -1
- package/dist/src/payments_manager.js +168 -6
- package/dist/src/payments_manager.js.map +1 -1
- package/dist/src/services/main.d.ts +38 -0
- package/dist/src/services/main.d.ts.map +1 -1
- package/dist/src/services/main.js +130 -0
- package/dist/src/services/main.js.map +1 -1
- package/dist/src/telescope/index.d.ts +2 -0
- package/dist/src/telescope/index.d.ts.map +1 -1
- package/dist/src/telescope/index.js +1 -0
- package/dist/src/telescope/index.js.map +1 -1
- package/dist/src/telescope/payments_watcher.d.ts +10 -4
- package/dist/src/telescope/payments_watcher.d.ts.map +1 -1
- package/dist/src/telescope/payments_watcher.js +66 -14
- package/dist/src/telescope/payments_watcher.js.map +1 -1
- package/dist/src/telescope/register.d.ts +62 -0
- package/dist/src/telescope/register.d.ts.map +1 -0
- package/dist/src/telescope/register.js +48 -0
- package/dist/src/telescope/register.js.map +1 -0
- package/dist/src/testing/fake_payments.d.ts +62 -0
- package/dist/src/testing/fake_payments.d.ts.map +1 -0
- package/dist/src/testing/fake_payments.js +82 -0
- package/dist/src/testing/fake_payments.js.map +1 -0
- package/dist/src/testing/fake_payments_driver.d.ts +1 -1
- package/dist/src/testing/fake_payments_driver.d.ts.map +1 -1
- package/dist/src/testing/fake_payments_driver.js.map +1 -1
- package/dist/src/testing/in_memory_billing_store.d.ts +151 -2
- package/dist/src/testing/in_memory_billing_store.d.ts.map +1 -1
- package/dist/src/testing/in_memory_billing_store.js +517 -4
- package/dist/src/testing/in_memory_billing_store.js.map +1 -1
- package/dist/src/testing/index.d.ts +3 -2
- package/dist/src/testing/index.d.ts.map +1 -1
- package/dist/src/testing/index.js +1 -0
- package/dist/src/testing/index.js.map +1 -1
- package/dist/src/testing/mutable_clock.d.ts.map +1 -1
- package/dist/src/types.d.ts +161 -5
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +30 -1
- package/dist/src/types.js.map +1 -1
- package/dist/src/webhook_handlers.d.ts +96 -2
- package/dist/src/webhook_handlers.d.ts.map +1 -1
- package/dist/src/webhook_handlers.js +91 -10
- package/dist/src/webhook_handlers.js.map +1 -1
- package/dist/src/webhook_security.d.ts +94 -3
- package/dist/src/webhook_security.d.ts.map +1 -1
- package/dist/src/webhook_security.js +173 -9
- package/dist/src/webhook_security.js.map +1 -1
- package/dist/stubs/config/payments.stub +13 -0
- package/dist/stubs/config/payments_client.stub +42 -0
- package/dist/stubs/config/payments_dashboard.stub +38 -0
- package/dist/stubs/database/migrations/create_billing_tables.stub +35 -77
- package/dist/stubs/main.js.map +1 -1
- package/dist/stubs/make/webhook_handler/main.stub +29 -11
- package/package.json +67 -32
|
@@ -1,13 +1,179 @@
|
|
|
1
|
+
import { OPEN_DISPUTE_STATUSES, } from '../billing/billing_store.js';
|
|
2
|
+
import { clampLimit, clampOffset } from '../billing/list_query.js';
|
|
3
|
+
/** Is this status one that still needs an answer? Shares the constant with the Lucid store. */
|
|
4
|
+
function isOpenDispute(status) {
|
|
5
|
+
return OPEN_DISPUTE_STATUSES.includes(status);
|
|
6
|
+
}
|
|
7
|
+
/** One dispute row, normalized for reading — the same shape the Lucid store returns. */
|
|
8
|
+
function disputeItem(row) {
|
|
9
|
+
return {
|
|
10
|
+
id: row.id,
|
|
11
|
+
gatewayId: row.gatewayId,
|
|
12
|
+
paymentGatewayId: row.paymentGatewayId,
|
|
13
|
+
provider: row.provider,
|
|
14
|
+
status: row.status,
|
|
15
|
+
reason: row.reason,
|
|
16
|
+
amount: row.amount,
|
|
17
|
+
currency: row.currency,
|
|
18
|
+
evidenceDueBy: row.evidenceDueBy,
|
|
19
|
+
outcome: row.outcome,
|
|
20
|
+
openedAt: row.openedAt,
|
|
21
|
+
closedAt: row.closedAt,
|
|
22
|
+
createdAt: row.createdAt,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/** One audit row, normalized for reading — the same shape the Lucid store returns. */
|
|
26
|
+
function auditItem(row) {
|
|
27
|
+
return {
|
|
28
|
+
id: row.id,
|
|
29
|
+
action: row.action,
|
|
30
|
+
actor: row.actor,
|
|
31
|
+
provider: row.provider,
|
|
32
|
+
subjectType: row.subjectType,
|
|
33
|
+
subjectId: row.subjectId,
|
|
34
|
+
amount: row.amount,
|
|
35
|
+
currency: row.currency,
|
|
36
|
+
message: row.message,
|
|
37
|
+
metadata: row.metadata,
|
|
38
|
+
createdAt: row.createdAt,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/** One ledger row, normalized for reading. The stored payload is NEVER part of it. */
|
|
42
|
+
function webhookEventItem(row) {
|
|
43
|
+
return {
|
|
44
|
+
id: row.id,
|
|
45
|
+
gatewayEventId: row.gatewayEventId,
|
|
46
|
+
provider: row.provider,
|
|
47
|
+
type: row.type,
|
|
48
|
+
status: row.status,
|
|
49
|
+
error: row.error,
|
|
50
|
+
createdAt: row.createdAt,
|
|
51
|
+
updatedAt: row.updatedAt,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/** One customer-mapping row, normalized for reading — the same shape the Lucid store returns. */
|
|
55
|
+
function customerItem(row) {
|
|
56
|
+
return {
|
|
57
|
+
id: row.id,
|
|
58
|
+
gatewayId: row.gatewayId,
|
|
59
|
+
provider: row.provider,
|
|
60
|
+
ownerType: row.ownerType,
|
|
61
|
+
ownerId: row.ownerId,
|
|
62
|
+
email: row.email,
|
|
63
|
+
name: row.name,
|
|
64
|
+
taxId: row.taxId,
|
|
65
|
+
createdAt: row.createdAt,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
1
68
|
/**
|
|
2
69
|
* In-memory {@link BillingStore} for tests — no database required. Mirrors the shape of
|
|
3
70
|
* the Lucid models so the billing layer behaves identically.
|
|
4
71
|
*/
|
|
5
72
|
export class InMemoryBillingStore {
|
|
73
|
+
customers = new Map();
|
|
6
74
|
subscriptions = new Map();
|
|
7
75
|
payments = new Map();
|
|
8
76
|
webhookEvents = new Map();
|
|
9
77
|
usageEvents = new Map();
|
|
78
|
+
/** Keyed by the DISPUTE's gateway id, mirroring the table's unique column. */
|
|
79
|
+
disputes = new Map();
|
|
80
|
+
/** Append-only, like the table — keyed by the row's own id, because nothing looks one up. */
|
|
81
|
+
auditEvents = new Map();
|
|
10
82
|
#nextId = 1;
|
|
83
|
+
/** Overridable clock so a test can pin `createdAt`/`updatedAt`. Defaults to the wall clock. */
|
|
84
|
+
now = () => new Date();
|
|
85
|
+
#now() {
|
|
86
|
+
return this.now();
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* The `BillingCountQuery` filter, applied identically for both count/breakdown reads.
|
|
90
|
+
*
|
|
91
|
+
* A window the store silently ignored would report a healthy zero, which is the one wrong
|
|
92
|
+
* answer an alert must never get — so both bounds are applied here, in one place, rather
|
|
93
|
+
* than re-derived per method.
|
|
94
|
+
*/
|
|
95
|
+
#matchesCount(row, query) {
|
|
96
|
+
if (query.status !== undefined && row.status !== query.status)
|
|
97
|
+
return false;
|
|
98
|
+
if (query.createdBefore !== undefined && row.createdAt >= query.createdBefore)
|
|
99
|
+
return false;
|
|
100
|
+
if (query.createdAfter !== undefined && row.createdAt < query.createdAfter)
|
|
101
|
+
return false;
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Newest first: `createdAt` descending, ties broken by insertion order descending.
|
|
106
|
+
*
|
|
107
|
+
* The tie-break matters — several rows written inside the same millisecond is the normal
|
|
108
|
+
* case in a test, and `sort` alone would leave them in whatever order the map yields.
|
|
109
|
+
* `Array.prototype.sort` is stable, so reversing first and sorting after gives
|
|
110
|
+
* last-inserted-first within a tie. Mirrors the Lucid store's `order by created_at desc`.
|
|
111
|
+
*/
|
|
112
|
+
#page(rows, query) {
|
|
113
|
+
const sorted = [...rows]
|
|
114
|
+
.reverse()
|
|
115
|
+
.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());
|
|
116
|
+
const offset = clampOffset(query.offset);
|
|
117
|
+
return sorted.slice(offset, offset + clampLimit(query.limit));
|
|
118
|
+
}
|
|
119
|
+
async saveCustomer(customer) {
|
|
120
|
+
const existing = this.customers.get(customer.gatewayId);
|
|
121
|
+
const row = existing ?? {
|
|
122
|
+
id: String(this.#nextId++),
|
|
123
|
+
gatewayId: customer.gatewayId,
|
|
124
|
+
provider: customer.provider,
|
|
125
|
+
ownerType: null,
|
|
126
|
+
ownerId: null,
|
|
127
|
+
email: null,
|
|
128
|
+
name: null,
|
|
129
|
+
taxId: null,
|
|
130
|
+
metadata: null,
|
|
131
|
+
createdAt: this.#now(),
|
|
132
|
+
};
|
|
133
|
+
row.provider = customer.provider;
|
|
134
|
+
// Absent fields do NOT erase what is already recorded — mirrors the Lucid store, where
|
|
135
|
+
// a later, less-informed call must not blank the owner mapping an earlier one wrote.
|
|
136
|
+
if (customer.ownerType !== undefined)
|
|
137
|
+
row.ownerType = customer.ownerType;
|
|
138
|
+
if (customer.ownerId !== undefined)
|
|
139
|
+
row.ownerId = customer.ownerId;
|
|
140
|
+
if (customer.email !== undefined)
|
|
141
|
+
row.email = customer.email;
|
|
142
|
+
if (customer.name !== undefined)
|
|
143
|
+
row.name = customer.name;
|
|
144
|
+
if (customer.taxId !== undefined)
|
|
145
|
+
row.taxId = customer.taxId;
|
|
146
|
+
if (customer.metadata !== undefined)
|
|
147
|
+
row.metadata = customer.metadata;
|
|
148
|
+
this.customers.set(customer.gatewayId, row);
|
|
149
|
+
return row;
|
|
150
|
+
}
|
|
151
|
+
async findCustomerByGatewayId(gatewayId) {
|
|
152
|
+
return this.customers.get(gatewayId) ?? null;
|
|
153
|
+
}
|
|
154
|
+
async findCustomerByOwner(ownerType, ownerId, provider) {
|
|
155
|
+
for (const row of this.customers.values()) {
|
|
156
|
+
if (row.ownerType === ownerType && row.ownerId === ownerId && row.provider === provider) {
|
|
157
|
+
return row;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
async listCustomers(query) {
|
|
163
|
+
const matching = [...this.customers.values()].filter((row) => (query.provider === undefined || row.provider === query.provider) &&
|
|
164
|
+
(query.ownerType === undefined || row.ownerType === query.ownerType) &&
|
|
165
|
+
(query.ownerId === undefined || row.ownerId === query.ownerId) &&
|
|
166
|
+
(query.gatewayId === undefined || row.gatewayId === query.gatewayId));
|
|
167
|
+
return this.#page(matching, query).map(customerItem);
|
|
168
|
+
}
|
|
169
|
+
async listCustomersByGatewayIds(gatewayIds) {
|
|
170
|
+
if (gatewayIds.length === 0)
|
|
171
|
+
return [];
|
|
172
|
+
const wanted = new Set(gatewayIds);
|
|
173
|
+
return [...this.customers.values()]
|
|
174
|
+
.filter((row) => wanted.has(row.gatewayId))
|
|
175
|
+
.map(customerItem);
|
|
176
|
+
}
|
|
11
177
|
async saveSubscription(sub) {
|
|
12
178
|
const existing = this.subscriptions.get(sub.gatewayId);
|
|
13
179
|
const row = {
|
|
@@ -20,10 +186,36 @@ export class InMemoryBillingStore {
|
|
|
20
186
|
trialEndsAt: sub.trialEndsAt ?? null,
|
|
21
187
|
endsAt: sub.endsAt ?? null,
|
|
22
188
|
payload: sub.payload ?? {},
|
|
189
|
+
// Preserved across upserts: a subscription's creation time is when it was FIRST
|
|
190
|
+
// recorded, not when its status last changed, or every update would reorder the list.
|
|
191
|
+
createdAt: existing?.createdAt ?? this.#now(),
|
|
23
192
|
};
|
|
24
193
|
this.subscriptions.set(sub.gatewayId, row);
|
|
25
194
|
return row;
|
|
26
195
|
}
|
|
196
|
+
async listSubscriptions(query) {
|
|
197
|
+
const matching = [...this.subscriptions.values()].filter((row) => (query.status === undefined || row.status === query.status) &&
|
|
198
|
+
(query.provider === undefined || row.provider === query.provider));
|
|
199
|
+
return this.#page(matching, query).map((row) => ({
|
|
200
|
+
id: row.id,
|
|
201
|
+
gatewayId: row.gatewayId,
|
|
202
|
+
provider: row.provider,
|
|
203
|
+
status: row.status,
|
|
204
|
+
planId: row.planId,
|
|
205
|
+
customerId: row.customerId ?? null,
|
|
206
|
+
trialEndsAt: row.trialEndsAt,
|
|
207
|
+
endsAt: row.endsAt,
|
|
208
|
+
createdAt: row.createdAt,
|
|
209
|
+
}));
|
|
210
|
+
}
|
|
211
|
+
async countSubscriptions(query) {
|
|
212
|
+
let count = 0;
|
|
213
|
+
for (const row of this.subscriptions.values()) {
|
|
214
|
+
if (this.#matchesCount(row, query))
|
|
215
|
+
count += 1;
|
|
216
|
+
}
|
|
217
|
+
return count;
|
|
218
|
+
}
|
|
27
219
|
async findSubscriptionByGatewayId(gatewayId) {
|
|
28
220
|
return this.subscriptions.get(gatewayId) ?? null;
|
|
29
221
|
}
|
|
@@ -38,8 +230,23 @@ export class InMemoryBillingStore {
|
|
|
38
230
|
currency: payment.currency,
|
|
39
231
|
customerId: payment.customerId ?? null,
|
|
40
232
|
subscriptionId: payment.subscriptionId ?? null,
|
|
41
|
-
|
|
233
|
+
// Mirrors the Lucid store: an ABSENT reference keeps the stored one. `payment.refunded`
|
|
234
|
+
// and `payment.disputed` routinely carry no reference, and blanking it there would throw
|
|
235
|
+
// away the only key `findPaymentByExternalReference` can route on. `null` still clears.
|
|
236
|
+
externalReference: payment.externalReference !== undefined
|
|
237
|
+
? payment.externalReference
|
|
238
|
+
: (existing?.externalReference ?? null),
|
|
239
|
+
// Mirrors the Lucid store again, and this one is about money: `payment.refunded`,
|
|
240
|
+
// `payment.disputed` and `payment.dispute_closed` all save WITHOUT a `paidAt`, and
|
|
241
|
+
// `revenue()` filters on it. Writing `undefined` through as `null` erased the only
|
|
242
|
+
// record of when a charge landed, so a dispute closed as WON came back as `paid` with no
|
|
243
|
+
// date and left every windowed revenue figure. `null` still clears it.
|
|
244
|
+
paidAt: payment.paidAt !== undefined ? payment.paidAt : (existing?.paidAt ?? null),
|
|
245
|
+
refundedAmount: payment.refundedAmount !== undefined
|
|
246
|
+
? payment.refundedAmount
|
|
247
|
+
: (existing?.refundedAmount ?? null),
|
|
42
248
|
payload: payment.payload ?? {},
|
|
249
|
+
createdAt: existing?.createdAt ?? this.#now(),
|
|
43
250
|
};
|
|
44
251
|
this.payments.set(payment.gatewayId, row);
|
|
45
252
|
return row;
|
|
@@ -47,10 +254,239 @@ export class InMemoryBillingStore {
|
|
|
47
254
|
async findPaymentByGatewayId(gatewayId) {
|
|
48
255
|
return this.payments.get(gatewayId) ?? null;
|
|
49
256
|
}
|
|
257
|
+
async findPaymentByExternalReference(reference) {
|
|
258
|
+
// Newest first, like the Lucid store's `order by created_at desc`: an app may reuse a
|
|
259
|
+
// reference across retries, and the row it means is the most recent one. Insertion order
|
|
260
|
+
// breaks ties — several rows inside one millisecond is the normal case in a test.
|
|
261
|
+
let found = null;
|
|
262
|
+
for (const row of this.payments.values()) {
|
|
263
|
+
if (row.externalReference !== reference)
|
|
264
|
+
continue;
|
|
265
|
+
if (found === null || row.createdAt >= found.createdAt)
|
|
266
|
+
found = row;
|
|
267
|
+
}
|
|
268
|
+
return found;
|
|
269
|
+
}
|
|
270
|
+
async listPayments(query) {
|
|
271
|
+
const matching = [...this.payments.values()].filter((row) => (query.status === undefined || row.status === query.status) &&
|
|
272
|
+
(query.provider === undefined || row.provider === query.provider) &&
|
|
273
|
+
(query.gatewayId === undefined || row.gatewayId === query.gatewayId) &&
|
|
274
|
+
(query.customerId === undefined || row.customerId === query.customerId) &&
|
|
275
|
+
// EXACT, like the Lucid store's `where('external_reference', ?)`. A substring match
|
|
276
|
+
// here would make `order-4` return `order-42` in tests and not in production.
|
|
277
|
+
(query.externalReference === undefined ||
|
|
278
|
+
row.externalReference === query.externalReference));
|
|
279
|
+
return this.#page(matching, query).map((row) => ({
|
|
280
|
+
id: row.id,
|
|
281
|
+
gatewayId: row.gatewayId,
|
|
282
|
+
provider: row.provider,
|
|
283
|
+
status: row.status,
|
|
284
|
+
amount: row.amount,
|
|
285
|
+
currency: row.currency,
|
|
286
|
+
customerId: row.customerId,
|
|
287
|
+
subscriptionId: row.subscriptionId,
|
|
288
|
+
externalReference: row.externalReference,
|
|
289
|
+
refundedAmount: row.refundedAmount,
|
|
290
|
+
paidAt: row.paidAt,
|
|
291
|
+
createdAt: row.createdAt,
|
|
292
|
+
}));
|
|
293
|
+
}
|
|
294
|
+
async countPayments(query) {
|
|
295
|
+
let count = 0;
|
|
296
|
+
for (const row of this.payments.values()) {
|
|
297
|
+
if (this.#matchesCount(row, query))
|
|
298
|
+
count += 1;
|
|
299
|
+
}
|
|
300
|
+
return count;
|
|
301
|
+
}
|
|
302
|
+
async saveDispute(dispute) {
|
|
303
|
+
const existing = this.disputes.get(dispute.gatewayId);
|
|
304
|
+
const row = existing ?? {
|
|
305
|
+
id: `dis_${this.#nextId++}`,
|
|
306
|
+
gatewayId: dispute.gatewayId,
|
|
307
|
+
paymentGatewayId: dispute.paymentGatewayId,
|
|
308
|
+
provider: dispute.provider,
|
|
309
|
+
status: dispute.status,
|
|
310
|
+
reason: null,
|
|
311
|
+
amount: null,
|
|
312
|
+
currency: null,
|
|
313
|
+
evidenceDueBy: null,
|
|
314
|
+
outcome: null,
|
|
315
|
+
// Stamped once, on insert, and never moved afterwards — mirrors the Lucid store, where
|
|
316
|
+
// re-stamping it on a later event would make every dispute look brand new.
|
|
317
|
+
openedAt: dispute.openedAt ?? this.#now(),
|
|
318
|
+
closedAt: null,
|
|
319
|
+
payload: {},
|
|
320
|
+
createdAt: this.#now(),
|
|
321
|
+
};
|
|
322
|
+
row.paymentGatewayId = dispute.paymentGatewayId;
|
|
323
|
+
row.provider = dispute.provider;
|
|
324
|
+
row.status = dispute.status;
|
|
325
|
+
// Absent does NOT erase — mirrors the Lucid store: the event that opens a dispute carries
|
|
326
|
+
// the deadline and the reason, and the one that closes it carries neither.
|
|
327
|
+
if (dispute.reason !== undefined)
|
|
328
|
+
row.reason = dispute.reason;
|
|
329
|
+
if (dispute.amount !== undefined)
|
|
330
|
+
row.amount = dispute.amount;
|
|
331
|
+
if (dispute.currency !== undefined)
|
|
332
|
+
row.currency = dispute.currency;
|
|
333
|
+
if (dispute.evidenceDueBy !== undefined)
|
|
334
|
+
row.evidenceDueBy = dispute.evidenceDueBy;
|
|
335
|
+
if (dispute.outcome !== undefined)
|
|
336
|
+
row.outcome = dispute.outcome;
|
|
337
|
+
if (dispute.closedAt !== undefined)
|
|
338
|
+
row.closedAt = dispute.closedAt;
|
|
339
|
+
if (existing !== undefined && existing.openedAt === null) {
|
|
340
|
+
row.openedAt = dispute.openedAt ?? this.#now();
|
|
341
|
+
}
|
|
342
|
+
if (dispute.payload !== undefined)
|
|
343
|
+
row.payload = dispute.payload;
|
|
344
|
+
this.disputes.set(dispute.gatewayId, row);
|
|
345
|
+
return row;
|
|
346
|
+
}
|
|
347
|
+
async findDisputeByGatewayId(gatewayId) {
|
|
348
|
+
return this.disputes.get(gatewayId) ?? null;
|
|
349
|
+
}
|
|
350
|
+
async findOpenDisputeByPayment(paymentGatewayId) {
|
|
351
|
+
// Newest first, like the Lucid store's `order by created_at desc`; insertion order breaks
|
|
352
|
+
// ties, because several rows inside one millisecond is the normal case in a test.
|
|
353
|
+
let found = null;
|
|
354
|
+
for (const row of this.disputes.values()) {
|
|
355
|
+
if (row.paymentGatewayId !== paymentGatewayId)
|
|
356
|
+
continue;
|
|
357
|
+
if (!isOpenDispute(row.status))
|
|
358
|
+
continue;
|
|
359
|
+
if (found === null || row.createdAt >= found.createdAt)
|
|
360
|
+
found = row;
|
|
361
|
+
}
|
|
362
|
+
return found;
|
|
363
|
+
}
|
|
364
|
+
async listDisputes(query) {
|
|
365
|
+
const matching = [...this.disputes.values()].filter((row) => (query.status === undefined || row.status === query.status) &&
|
|
366
|
+
(query.provider === undefined || row.provider === query.provider));
|
|
367
|
+
return this.#page(matching, query).map(disputeItem);
|
|
368
|
+
}
|
|
369
|
+
async countDisputes(query) {
|
|
370
|
+
let count = 0;
|
|
371
|
+
for (const row of this.disputes.values()) {
|
|
372
|
+
if (this.#matchesCount(row, query))
|
|
373
|
+
count += 1;
|
|
374
|
+
}
|
|
375
|
+
return count;
|
|
376
|
+
}
|
|
377
|
+
async listDisputesDueWithin(query) {
|
|
378
|
+
const matching = this.#dueWithin(query)
|
|
379
|
+
// Soonest first — the priority order, not the arrival order. The only list here that
|
|
380
|
+
// is not newest-first, and it mirrors the Lucid store's `order by evidence_due_by asc`.
|
|
381
|
+
.sort((a, b) => (a.evidenceDueBy?.getTime() ?? 0) - (b.evidenceDueBy?.getTime() ?? 0));
|
|
382
|
+
const offset = clampOffset(query.offset);
|
|
383
|
+
return matching.slice(offset, offset + clampLimit(query.limit)).map(disputeItem);
|
|
384
|
+
}
|
|
385
|
+
async countDisputesDueWithin(query) {
|
|
386
|
+
return this.#dueWithin(query).length;
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* The open disputes whose window closes by `now + withinHours`.
|
|
390
|
+
*
|
|
391
|
+
* No lower bound: a deadline that has already passed is still open and still unanswered,
|
|
392
|
+
* and dropping it the moment it expires would make the alert go quiet exactly when it
|
|
393
|
+
* became true. Rows with no deadline are excluded — nothing to be late for.
|
|
394
|
+
*/
|
|
395
|
+
#dueWithin(query) {
|
|
396
|
+
const now = query.now ?? this.#now();
|
|
397
|
+
const cutoff = now.getTime() + query.withinHours * 3_600_000;
|
|
398
|
+
return [...this.disputes.values()].filter((row) => isOpenDispute(row.status) &&
|
|
399
|
+
row.evidenceDueBy !== null &&
|
|
400
|
+
row.evidenceDueBy.getTime() <= cutoff &&
|
|
401
|
+
(query.provider === undefined || row.provider === query.provider));
|
|
402
|
+
}
|
|
403
|
+
async listOpenDisputes(query) {
|
|
404
|
+
const matching = [...this.disputes.values()]
|
|
405
|
+
.filter((row) => isOpenDispute(row.status) &&
|
|
406
|
+
(query.provider === undefined || row.provider === query.provider))
|
|
407
|
+
// Oldest FIRST — mirrors the Lucid store's `order by created_at asc`. With no deadline
|
|
408
|
+
// to rank on, how long a dispute has gone unanswered is the only priority left.
|
|
409
|
+
.sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());
|
|
410
|
+
const offset = clampOffset(query.offset);
|
|
411
|
+
return matching.slice(offset, offset + clampLimit(query.limit)).map(disputeItem);
|
|
412
|
+
}
|
|
413
|
+
async countOpenDisputes(query) {
|
|
414
|
+
let count = 0;
|
|
415
|
+
for (const row of this.disputes.values()) {
|
|
416
|
+
if (!isOpenDispute(row.status))
|
|
417
|
+
continue;
|
|
418
|
+
if (query.provider !== undefined && row.provider !== query.provider)
|
|
419
|
+
continue;
|
|
420
|
+
count += 1;
|
|
421
|
+
}
|
|
422
|
+
return count;
|
|
423
|
+
}
|
|
424
|
+
async recordAuditEvent(event) {
|
|
425
|
+
const row = {
|
|
426
|
+
id: `audit_${this.#nextId++}`,
|
|
427
|
+
action: event.action,
|
|
428
|
+
actor: event.actor ?? null,
|
|
429
|
+
provider: event.provider ?? null,
|
|
430
|
+
subjectType: event.subjectType ?? null,
|
|
431
|
+
subjectId: event.subjectId ?? null,
|
|
432
|
+
amount: event.amount ?? null,
|
|
433
|
+
currency: event.currency ?? null,
|
|
434
|
+
message: event.message ?? null,
|
|
435
|
+
metadata: event.metadata ?? null,
|
|
436
|
+
createdAt: event.createdAt ?? this.#now(),
|
|
437
|
+
};
|
|
438
|
+
this.auditEvents.set(row.id, row);
|
|
439
|
+
return auditItem(row);
|
|
440
|
+
}
|
|
441
|
+
async listAuditEvents(query) {
|
|
442
|
+
const matching = [...this.auditEvents.values()].filter((row) => this.#matchesAudit(row, query));
|
|
443
|
+
return this.#page(matching, query).map(auditItem);
|
|
444
|
+
}
|
|
445
|
+
async countAuditEvents(query) {
|
|
446
|
+
let count = 0;
|
|
447
|
+
for (const row of this.auditEvents.values()) {
|
|
448
|
+
if (this.#matchesAudit(row, query))
|
|
449
|
+
count += 1;
|
|
450
|
+
}
|
|
451
|
+
return count;
|
|
452
|
+
}
|
|
453
|
+
/** One filter for the list and the count — see `#matchesCount`: a bound only one of them
|
|
454
|
+
* applied is how an alert learns to report a healthy zero. */
|
|
455
|
+
#matchesAudit(row, query) {
|
|
456
|
+
if (query.action !== undefined && row.action !== query.action)
|
|
457
|
+
return false;
|
|
458
|
+
if (query.actions !== undefined && !query.actions.includes(row.action))
|
|
459
|
+
return false;
|
|
460
|
+
if (query.actor !== undefined && row.actor !== query.actor)
|
|
461
|
+
return false;
|
|
462
|
+
if (query.provider !== undefined && row.provider !== query.provider)
|
|
463
|
+
return false;
|
|
464
|
+
if (query.subjectType !== undefined && row.subjectType !== query.subjectType)
|
|
465
|
+
return false;
|
|
466
|
+
if (query.subjectId !== undefined && row.subjectId !== query.subjectId)
|
|
467
|
+
return false;
|
|
468
|
+
if (query.createdBefore !== undefined && row.createdAt >= query.createdBefore)
|
|
469
|
+
return false;
|
|
470
|
+
if (query.createdAfter !== undefined && row.createdAt < query.createdAfter)
|
|
471
|
+
return false;
|
|
472
|
+
return true;
|
|
473
|
+
}
|
|
50
474
|
async recordWebhookEvent(event) {
|
|
51
475
|
const existing = this.webhookEvents.get(event.gatewayEventId);
|
|
52
|
-
if (existing)
|
|
53
|
-
|
|
476
|
+
if (existing) {
|
|
477
|
+
// Mirrors LucidBillingStore: a failed attempt is claimable again so the
|
|
478
|
+
// retry re-runs; in-flight and processed events are redeliveries.
|
|
479
|
+
if (existing.status !== 'failed')
|
|
480
|
+
return null;
|
|
481
|
+
existing.status = 'received';
|
|
482
|
+
existing.error = null;
|
|
483
|
+
// `payload` and `normalized` are deliberately NOT touched: the retry re-claims this row
|
|
484
|
+
// precisely to read back what the original delivery recorded.
|
|
485
|
+
existing.updatedAt = this.#now();
|
|
486
|
+
return existing;
|
|
487
|
+
}
|
|
488
|
+
const now = this.#now();
|
|
489
|
+
const normalized = event.normalized;
|
|
54
490
|
const row = {
|
|
55
491
|
id: `wh_${this.#nextId++}`,
|
|
56
492
|
gatewayEventId: event.gatewayEventId,
|
|
@@ -58,7 +494,15 @@ export class InMemoryBillingStore {
|
|
|
58
494
|
type: event.type,
|
|
59
495
|
status: 'received',
|
|
60
496
|
payload: event.payload,
|
|
497
|
+
// Only an object shape survives the jsonb column in the Lucid store; anything else is
|
|
498
|
+
// stored as `null` there, so it is `null` here too rather than a shape a test could pass
|
|
499
|
+
// and production could not.
|
|
500
|
+
normalized: typeof normalized === 'object' && normalized !== null && !Array.isArray(normalized)
|
|
501
|
+
? normalized
|
|
502
|
+
: null,
|
|
61
503
|
error: null,
|
|
504
|
+
createdAt: now,
|
|
505
|
+
updatedAt: now,
|
|
62
506
|
};
|
|
63
507
|
this.webhookEvents.set(event.gatewayEventId, row);
|
|
64
508
|
return row;
|
|
@@ -67,6 +511,7 @@ export class InMemoryBillingStore {
|
|
|
67
511
|
for (const row of this.webhookEvents.values()) {
|
|
68
512
|
if (row.id === id) {
|
|
69
513
|
row.status = 'processed';
|
|
514
|
+
row.updatedAt = this.#now();
|
|
70
515
|
return;
|
|
71
516
|
}
|
|
72
517
|
}
|
|
@@ -76,10 +521,54 @@ export class InMemoryBillingStore {
|
|
|
76
521
|
if (row.id === id) {
|
|
77
522
|
row.status = 'failed';
|
|
78
523
|
row.error = error;
|
|
524
|
+
row.updatedAt = this.#now();
|
|
79
525
|
return;
|
|
80
526
|
}
|
|
81
527
|
}
|
|
82
528
|
}
|
|
529
|
+
async listWebhookEvents(query) {
|
|
530
|
+
const matching = [...this.webhookEvents.values()].filter((row) => (query.status === undefined || row.status === query.status) &&
|
|
531
|
+
(query.provider === undefined || row.provider === query.provider) &&
|
|
532
|
+
(query.type === undefined || row.type === query.type));
|
|
533
|
+
return this.#page(matching, query).map(webhookEventItem);
|
|
534
|
+
}
|
|
535
|
+
async listWebhookEventsForPayment(paymentGatewayId, query = {}) {
|
|
536
|
+
if (paymentGatewayId === '')
|
|
537
|
+
return [];
|
|
538
|
+
// Mirrors the Lucid store's `CAST(payload AS TEXT) LIKE '%id%'`, substring semantics and
|
|
539
|
+
// all — including the false positives. A test that matched more precisely here than the
|
|
540
|
+
// database can would be testing a store nobody ships.
|
|
541
|
+
const matching = [...this.webhookEvents.values()].filter((row) => JSON.stringify(row.payload).includes(paymentGatewayId));
|
|
542
|
+
return this.#page(matching, query.limit === undefined ? {} : { limit: query.limit }).map(webhookEventItem);
|
|
543
|
+
}
|
|
544
|
+
async findWebhookEventByGatewayEventId(gatewayEventId) {
|
|
545
|
+
const row = this.webhookEvents.get(gatewayEventId);
|
|
546
|
+
if (!row)
|
|
547
|
+
return null;
|
|
548
|
+
return webhookEventItem(row);
|
|
549
|
+
}
|
|
550
|
+
async countWebhookEvents(query) {
|
|
551
|
+
let count = 0;
|
|
552
|
+
for (const row of this.webhookEvents.values()) {
|
|
553
|
+
if (this.#matchesCount(row, query))
|
|
554
|
+
count += 1;
|
|
555
|
+
}
|
|
556
|
+
return count;
|
|
557
|
+
}
|
|
558
|
+
async webhookEventBreakdown(query) {
|
|
559
|
+
const totals = new Map();
|
|
560
|
+
for (const row of this.webhookEvents.values()) {
|
|
561
|
+
if (!this.#matchesCount(row, query))
|
|
562
|
+
continue;
|
|
563
|
+
const key = `${row.provider}\u0000${row.type}`;
|
|
564
|
+
const line = totals.get(key);
|
|
565
|
+
if (line)
|
|
566
|
+
line.count += 1;
|
|
567
|
+
else
|
|
568
|
+
totals.set(key, { provider: row.provider, type: row.type, count: 1 });
|
|
569
|
+
}
|
|
570
|
+
return [...totals.values()].sort((a, b) => b.count - a.count);
|
|
571
|
+
}
|
|
83
572
|
async recordUsage(event) {
|
|
84
573
|
const row = {
|
|
85
574
|
id: `usage_${this.#nextId++}`,
|
|
@@ -112,15 +601,39 @@ export class InMemoryBillingStore {
|
|
|
112
601
|
return [...totals.entries()].map(([meter, quantity]) => ({ meter, quantity }));
|
|
113
602
|
}
|
|
114
603
|
async revenue(query) {
|
|
604
|
+
return this.#sumPaid(query, (row) => row.amount);
|
|
605
|
+
}
|
|
606
|
+
/**
|
|
607
|
+
* Gross minus what came back, on exactly the rows `revenue()` sums.
|
|
608
|
+
*
|
|
609
|
+
* A `null` `refundedAmount` — every row written before the column existed, and every row no
|
|
610
|
+
* refund has ever touched — reads as zero, mirroring the `COALESCE(refunded_amount, 0)` the
|
|
611
|
+
* Lucid store emits. Reading it as anything else here would make the in-memory store
|
|
612
|
+
* disagree with the database, which is the one thing a fake store must never do: a contract
|
|
613
|
+
* fixed in one implementation of two is not fixed.
|
|
614
|
+
*/
|
|
615
|
+
async netRevenue(query) {
|
|
616
|
+
return this.#sumPaid(query, (row) => row.amount - (row.refundedAmount ?? 0));
|
|
617
|
+
}
|
|
618
|
+
/** The row selection `revenue()` and `netRevenue()` share; only the summed figure differs. */
|
|
619
|
+
#sumPaid(query, figure) {
|
|
115
620
|
let total = 0;
|
|
116
621
|
for (const row of this.payments.values()) {
|
|
117
622
|
if (row.status !== 'paid')
|
|
118
623
|
continue;
|
|
624
|
+
// A row with NO `paid_at` is in no window at all. The Lucid store emits
|
|
625
|
+
// `paid_at >= from AND paid_at < to`, and SQL `NULL` satisfies neither comparison — so
|
|
626
|
+
// counting it here would make the in-memory store report revenue the database cannot,
|
|
627
|
+
// and would hide the exact bug (a won dispute restored with `paid_at = NULL`) that the
|
|
628
|
+
// leave-alone rule in `savePayment` exists to prevent.
|
|
629
|
+
const windowed = query.from !== undefined || query.to !== undefined;
|
|
630
|
+
if (windowed && row.paidAt === null)
|
|
631
|
+
continue;
|
|
119
632
|
if (query.from !== undefined && row.paidAt !== null && row.paidAt < query.from)
|
|
120
633
|
continue;
|
|
121
634
|
if (query.to !== undefined && row.paidAt !== null && row.paidAt >= query.to)
|
|
122
635
|
continue;
|
|
123
|
-
total += row
|
|
636
|
+
total += figure(row);
|
|
124
637
|
}
|
|
125
638
|
return total;
|
|
126
639
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"in_memory_billing_store.js","sourceRoot":"","sources":["../../../src/testing/in_memory_billing_store.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"in_memory_billing_store.js","sourceRoot":"","sources":["../../../src/testing/in_memory_billing_store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { fakePayments, flushWebhooks, swapBillingStore, swapPayments, } from './fake_payments.js';
|
|
2
2
|
export type { FakePaymentsDriverOptions } from './fake_payments_driver.js';
|
|
3
|
+
export { FakePaymentsDriver } from './fake_payments_driver.js';
|
|
4
|
+
export type { InMemoryCustomerRow, InMemoryDisputeRow, InMemoryPaymentRow, InMemorySubscriptionRow, InMemoryUsageEventRow, InMemoryWebhookEventRow, } from './in_memory_billing_store.js';
|
|
3
5
|
export { InMemoryBillingStore } from './in_memory_billing_store.js';
|
|
4
|
-
export type { InMemorySubscriptionRow, InMemoryPaymentRow, InMemoryWebhookEventRow, } from './in_memory_billing_store.js';
|
|
5
6
|
export { MutableClock } from './mutable_clock.js';
|
|
6
7
|
//# sourceMappingURL=index.d.ts.map
|