@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,5 +1,20 @@
|
|
|
1
1
|
import { publishPayments } from '../diagnostics.js';
|
|
2
|
-
import { isPaymentWebhookData, isSubscriptionWebhookData } from './webhook_events.js';
|
|
2
|
+
import { isDisputeWebhookData, isPaymentWebhookData, isSubscriptionWebhookData, } from './webhook_events.js';
|
|
3
|
+
/**
|
|
4
|
+
* A gateway-sent instant (`actionableUntil`, `paidAt`) as a `Date`, or `null` when there is
|
|
5
|
+
* nothing usable to store.
|
|
6
|
+
*
|
|
7
|
+
* An unparseable value is dropped rather than written: `new Date('soon')` is an Invalid Date,
|
|
8
|
+
* which Postgres rejects — so a driver with one bad field would fail the whole webhook and,
|
|
9
|
+
* through the ledger, every redelivery of it. Dropping one field loses a deadline's urgency;
|
|
10
|
+
* throwing here loses the chargeback itself.
|
|
11
|
+
*/
|
|
12
|
+
function parseInstant(value) {
|
|
13
|
+
if (value === undefined)
|
|
14
|
+
return null;
|
|
15
|
+
const parsed = new Date(value);
|
|
16
|
+
return Number.isNaN(parsed.getTime()) ? null : parsed;
|
|
17
|
+
}
|
|
3
18
|
/**
|
|
4
19
|
* Routes normalized webhook events to handlers, enforcing idempotency through the
|
|
5
20
|
* `billing_webhook_events` ledger (keyed by gateway event id), and keeps the local
|
|
@@ -29,6 +44,10 @@ export class WebhookProcessor {
|
|
|
29
44
|
provider: event.provider,
|
|
30
45
|
type: event.type,
|
|
31
46
|
payload: event.raw,
|
|
47
|
+
// The NORMALIZED event, stored beside the raw payload so the dashboard's retry can
|
|
48
|
+
// replay this delivery without calling `parseWebhook` again — which would re-verify a
|
|
49
|
+
// signature computed from headers the ledger never kept.
|
|
50
|
+
normalized: event.data,
|
|
32
51
|
});
|
|
33
52
|
// Already seen → idempotent replay, skip.
|
|
34
53
|
if (ledger === null)
|
|
@@ -72,6 +91,14 @@ export class WebhookProcessor {
|
|
|
72
91
|
return this.#onPaymentFailed(event);
|
|
73
92
|
case 'payment.refunded':
|
|
74
93
|
return this.#onPaymentRefunded(event);
|
|
94
|
+
case 'payment.disputed':
|
|
95
|
+
return this.#onPaymentDisputed(event);
|
|
96
|
+
case 'payment.dispute_warning':
|
|
97
|
+
return this.#onDisputeWarning(event);
|
|
98
|
+
case 'payment.dispute_closed':
|
|
99
|
+
return this.#onDisputeClosed(event);
|
|
100
|
+
case 'payment.updated':
|
|
101
|
+
return this.#onPaymentUpdated(event);
|
|
75
102
|
case 'subscription.created':
|
|
76
103
|
case 'subscription.updated':
|
|
77
104
|
return this.#onSubscriptionChanged(event);
|
|
@@ -85,7 +112,7 @@ export class WebhookProcessor {
|
|
|
85
112
|
if (!isPaymentWebhookData(event.data)) {
|
|
86
113
|
throw new Error(`[payments] Malformed payment.succeeded payload for event ${event.id}.`);
|
|
87
114
|
}
|
|
88
|
-
const { gatewayId, amount, currency, customerId, subscriptionId } = event.data;
|
|
115
|
+
const { gatewayId, amount, currency, customerId, subscriptionId, externalReference } = event.data;
|
|
89
116
|
await this.#store.savePayment({
|
|
90
117
|
gatewayId,
|
|
91
118
|
provider: event.provider,
|
|
@@ -94,7 +121,15 @@ export class WebhookProcessor {
|
|
|
94
121
|
currency,
|
|
95
122
|
...(customerId !== undefined ? { customerId } : {}),
|
|
96
123
|
...(subscriptionId !== undefined ? { subscriptionId } : {}),
|
|
97
|
-
|
|
124
|
+
// Spread away when absent, never passed as `null`: the store keeps what it already has
|
|
125
|
+
// for an `undefined` reference, and a later event that does not echo one must not blank
|
|
126
|
+
// the key the app routes on.
|
|
127
|
+
...(externalReference !== undefined ? { externalReference } : {}),
|
|
128
|
+
// The GATEWAY's settlement date when it sent one, and the arrival time only as a last
|
|
129
|
+
// resort. `revenue()` windows on `paid_at`, so stamping "now" over a confirmation that
|
|
130
|
+
// is being redelivered — or replayed from the ledger a month later — files the money in
|
|
131
|
+
// the wrong month.
|
|
132
|
+
paidAt: parseInstant(event.data.paidAt) ?? new Date(),
|
|
98
133
|
payload: event.raw,
|
|
99
134
|
});
|
|
100
135
|
publishPayments('payment.succeeded', {
|
|
@@ -111,7 +146,7 @@ export class WebhookProcessor {
|
|
|
111
146
|
if (!isPaymentWebhookData(event.data)) {
|
|
112
147
|
throw new Error(`[payments] Malformed payment.failed payload for event ${event.id}.`);
|
|
113
148
|
}
|
|
114
|
-
const { gatewayId, amount, currency, customerId, subscriptionId } = event.data;
|
|
149
|
+
const { gatewayId, amount, currency, customerId, subscriptionId, externalReference } = event.data;
|
|
115
150
|
await this.#store.savePayment({
|
|
116
151
|
gatewayId,
|
|
117
152
|
provider: event.provider,
|
|
@@ -120,6 +155,7 @@ export class WebhookProcessor {
|
|
|
120
155
|
currency,
|
|
121
156
|
...(customerId !== undefined ? { customerId } : {}),
|
|
122
157
|
...(subscriptionId !== undefined ? { subscriptionId } : {}),
|
|
158
|
+
...(externalReference !== undefined ? { externalReference } : {}),
|
|
123
159
|
payload: event.raw,
|
|
124
160
|
});
|
|
125
161
|
publishPayments('payment.failed', {
|
|
@@ -127,6 +163,10 @@ export class WebhookProcessor {
|
|
|
127
163
|
provider: event.provider,
|
|
128
164
|
amount,
|
|
129
165
|
currency,
|
|
166
|
+
// `reason` is on the payload type and was never published, so a subscriber could not
|
|
167
|
+
// see it even on the gateways that normalize one. It is the field that answers "why",
|
|
168
|
+
// which is the only question anyone asks of a failed payment.
|
|
169
|
+
...(event.data.reason !== undefined ? { reason: event.data.reason } : {}),
|
|
130
170
|
...(event.data.externalReference !== undefined
|
|
131
171
|
? { externalReference: event.data.externalReference }
|
|
132
172
|
: {}),
|
|
@@ -136,7 +176,7 @@ export class WebhookProcessor {
|
|
|
136
176
|
if (!isPaymentWebhookData(event.data)) {
|
|
137
177
|
throw new Error(`[payments] Malformed payment.refunded payload for event ${event.id}.`);
|
|
138
178
|
}
|
|
139
|
-
const { gatewayId, amount, currency } = event.data;
|
|
179
|
+
const { gatewayId, amount, currency, externalReference } = event.data;
|
|
140
180
|
const existing = await this.#store.findPaymentByGatewayId(gatewayId);
|
|
141
181
|
if (existing) {
|
|
142
182
|
await this.#store.savePayment({
|
|
@@ -145,6 +185,11 @@ export class WebhookProcessor {
|
|
|
145
185
|
status: 'refunded',
|
|
146
186
|
amount,
|
|
147
187
|
currency,
|
|
188
|
+
// A FULL refund, by definition — a partial one arrives as `payment.updated`, because
|
|
189
|
+
// this handler writes the whole charge off. Recorded so `amount - refundedAmount` is
|
|
190
|
+
// the net figure on every refunded row, not just the partial ones.
|
|
191
|
+
refundedAmount: amount,
|
|
192
|
+
...(externalReference !== undefined ? { externalReference } : {}),
|
|
148
193
|
...(existing.customerId !== undefined ? { customerId: existing.customerId } : {}),
|
|
149
194
|
...(existing.subscriptionId !== undefined
|
|
150
195
|
? { subscriptionId: existing.subscriptionId }
|
|
@@ -159,6 +204,281 @@ export class WebhookProcessor {
|
|
|
159
204
|
currency,
|
|
160
205
|
});
|
|
161
206
|
}
|
|
207
|
+
/**
|
|
208
|
+
* "This payment changed" — the catch-all every driver falls back to, and until now the one
|
|
209
|
+
* case `#runBuiltIn` answered with `Promise.resolve()`.
|
|
210
|
+
*
|
|
211
|
+
* The cost of that no-op was not theoretical. A **partial refund** arrives as exactly this
|
|
212
|
+
* type on Asaas (`PAYMENT_PARTIALLY_REFUNDED`), deliberately: routing it to
|
|
213
|
+
* `payment.refunded` would overwrite the row's status with `refunded` and write off the
|
|
214
|
+
* whole charge. So the money came back, the ledger row went to `processed`, and nothing
|
|
215
|
+
* else happened — revenue stayed overstated by the refunded part, permanently. Same for a
|
|
216
|
+
* deleted charge, a restored one, a denied refund, and a cash receipt taken back.
|
|
217
|
+
*
|
|
218
|
+
* What it does now: keeps the row CURRENT — status, amount, refunded amount, settlement
|
|
219
|
+
* date — and nothing more. It never creates a row (an update about a charge this install
|
|
220
|
+
* never recorded is not a charge; a `payment.succeeded` or a reconcile creates those), and
|
|
221
|
+
* it moves nothing when the driver sends no `status`.
|
|
222
|
+
*/
|
|
223
|
+
async #onPaymentUpdated(event) {
|
|
224
|
+
if (!isPaymentWebhookData(event.data)) {
|
|
225
|
+
throw new Error(`[payments] Malformed payment.updated payload for event ${event.id}.`);
|
|
226
|
+
}
|
|
227
|
+
const { gatewayId, amount, currency, status, refundedAmount, externalReference } = event.data;
|
|
228
|
+
const existing = await this.#store.findPaymentByGatewayId(gatewayId);
|
|
229
|
+
if (existing === null)
|
|
230
|
+
return;
|
|
231
|
+
const settledAt = parseInstant(event.data.paidAt);
|
|
232
|
+
const target = this.#updatedStatus(existing.status, status);
|
|
233
|
+
await this.#store.savePayment({
|
|
234
|
+
gatewayId,
|
|
235
|
+
provider: event.provider,
|
|
236
|
+
status: target,
|
|
237
|
+
// The charge's own amount, which an update CAN legitimately change — editing the value
|
|
238
|
+
// of a pending boleto is what `PAYMENT_UPDATED` means on Asaas. A partial refund does
|
|
239
|
+
// not change it: the refunded part travels as `refundedAmount`, so `amount` stays the
|
|
240
|
+
// charge and `amount - refundedAmount` stays the net. Never divide either.
|
|
241
|
+
amount,
|
|
242
|
+
currency,
|
|
243
|
+
...(existing.customerId !== null ? { customerId: existing.customerId } : {}),
|
|
244
|
+
...(existing.subscriptionId !== null ? { subscriptionId: existing.subscriptionId } : {}),
|
|
245
|
+
...(externalReference !== undefined ? { externalReference } : {}),
|
|
246
|
+
...(refundedAmount !== undefined ? { refundedAmount } : {}),
|
|
247
|
+
// Absent leaves the stored one alone — see `savePayment`. An update is exactly the
|
|
248
|
+
// event that carries no settlement date, and blanking `paid_at` here would drop the row
|
|
249
|
+
// out of every windowed revenue figure.
|
|
250
|
+
...(settledAt !== null ? { paidAt: settledAt } : {}),
|
|
251
|
+
payload: event.raw,
|
|
252
|
+
});
|
|
253
|
+
publishPayments('payment.updated', {
|
|
254
|
+
gatewayId,
|
|
255
|
+
provider: event.provider,
|
|
256
|
+
status: target,
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* The status an update is allowed to write, given what the row already says.
|
|
261
|
+
*
|
|
262
|
+
* Two rules, both about not losing money:
|
|
263
|
+
*
|
|
264
|
+
* 1. **No status, no move.** Most drivers normalize no status onto `payment.updated` — the
|
|
265
|
+
* event says only "something changed" — and inventing one from an event that named none
|
|
266
|
+
* is how a paid row becomes pending.
|
|
267
|
+
* 2. **An update never moves a row OUT of `disputed`.** A chargeback is the one webhook that
|
|
268
|
+
* takes revenue away, and the gateway's own payment resource often goes on reporting the
|
|
269
|
+
* charge as received while the bank holds the money. Only `payment.dispute_closed`, which
|
|
270
|
+
* carries an outcome, resolves a dispute — the same rule `payments:sync` follows, for the
|
|
271
|
+
* same reason.
|
|
272
|
+
*/
|
|
273
|
+
#updatedStatus(current, incoming) {
|
|
274
|
+
if (incoming === undefined)
|
|
275
|
+
return current;
|
|
276
|
+
if (current === 'disputed' && incoming !== 'disputed')
|
|
277
|
+
return current;
|
|
278
|
+
return incoming;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* A chargeback: the customer's bank has pulled the money back.
|
|
282
|
+
*
|
|
283
|
+
* The one webhook that takes revenue AWAY, and until now the library had no name for it —
|
|
284
|
+
* `BillingStatus` carried `'disputed'` while nothing could ever set it, so a dispute
|
|
285
|
+
* arrived as an unknown type, passed through unprocessed, and the payment row went on
|
|
286
|
+
* saying `paid`. The app found out from its bank statement.
|
|
287
|
+
*
|
|
288
|
+
* Deliberately does NOT invent the resolution event. A dispute that is later won or lost
|
|
289
|
+
* is reported differently by every gateway, and a canonical type no driver emits is worse
|
|
290
|
+
* than none — those arrive as `payment.updated`.
|
|
291
|
+
*/
|
|
292
|
+
async #onPaymentDisputed(event) {
|
|
293
|
+
if (!isPaymentWebhookData(event.data)) {
|
|
294
|
+
throw new Error(`[payments] Malformed payment.disputed payload for event ${event.id}.`);
|
|
295
|
+
}
|
|
296
|
+
const { gatewayId, amount, currency, externalReference } = event.data;
|
|
297
|
+
const existing = await this.#store.findPaymentByGatewayId(gatewayId);
|
|
298
|
+
if (existing) {
|
|
299
|
+
await this.#store.savePayment({
|
|
300
|
+
gatewayId,
|
|
301
|
+
provider: event.provider,
|
|
302
|
+
status: 'disputed',
|
|
303
|
+
amount,
|
|
304
|
+
currency,
|
|
305
|
+
...(externalReference !== undefined ? { externalReference } : {}),
|
|
306
|
+
...(existing.customerId !== undefined ? { customerId: existing.customerId } : {}),
|
|
307
|
+
...(existing.subscriptionId !== undefined
|
|
308
|
+
? { subscriptionId: existing.subscriptionId }
|
|
309
|
+
: {}),
|
|
310
|
+
payload: event.raw,
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
// The dispute row is written whether or not the payment is one we recorded: a chargeback
|
|
314
|
+
// against a charge this install never saw is exactly the one somebody has to be told
|
|
315
|
+
// about, and its deadline is the only thing that makes it actionable.
|
|
316
|
+
if (isDisputeWebhookData(event.data)) {
|
|
317
|
+
await this.#persistDispute(event, event.data, { status: 'open' });
|
|
318
|
+
}
|
|
319
|
+
publishPayments('payment.disputed', {
|
|
320
|
+
gatewayId,
|
|
321
|
+
provider: event.provider,
|
|
322
|
+
amount,
|
|
323
|
+
currency,
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* A pre-dispute alert: a Stripe inquiry or early fraud warning, an Adyen notification of
|
|
328
|
+
* chargeback or fraud. **The PAYMENT row is not touched** — a dispute row is written, so the
|
|
329
|
+
* deadline is somewhere, but no money has moved and a payment that says `paid` is telling
|
|
330
|
+
* the truth, and the one useful thing to do with the alert is put it in
|
|
331
|
+
* front of somebody while a refund still prevents the chargeback.
|
|
332
|
+
*
|
|
333
|
+
* That is what the diagnostics publish is for — and until this method existed, the event
|
|
334
|
+
* was declared on the bus with a payload type and published by nothing at all.
|
|
335
|
+
*/
|
|
336
|
+
async #onDisputeWarning(event) {
|
|
337
|
+
if (!isDisputeWebhookData(event.data)) {
|
|
338
|
+
throw new Error(`[payments] Malformed payment.dispute_warning payload for event ${event.id}.`);
|
|
339
|
+
}
|
|
340
|
+
const { gatewayId, reason, actionableUntil } = event.data;
|
|
341
|
+
// Still NOTHING is written to the payment — no money has moved, and a row that says
|
|
342
|
+
// `paid` is telling the truth. The DISPUTE row is new, and is the point: this is the
|
|
343
|
+
// moment the clock starts, and the alert is only actionable while it has somewhere to
|
|
344
|
+
// live. `warning` is a dispute status of its own, so nothing here can be mistaken for a
|
|
345
|
+
// chargeback that took money.
|
|
346
|
+
await this.#persistDispute(event, event.data, { status: 'warning' });
|
|
347
|
+
publishPayments('payment.dispute_warning', {
|
|
348
|
+
gatewayId,
|
|
349
|
+
provider: event.provider,
|
|
350
|
+
...(reason !== undefined ? { reason } : {}),
|
|
351
|
+
...(actionableUntil !== undefined ? { actionableUntil } : {}),
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* A dispute reaching its outcome. A WON dispute returns the money, and the row has been
|
|
356
|
+
* sitting at `disputed` since the chargeback arrived — `revenue()` sums rows that are
|
|
357
|
+
* `paid`, so leaving it there writes off money that came back.
|
|
358
|
+
*
|
|
359
|
+
* Only `won` moves it. `lost` and `expired` are money that is gone, and `canceled` — the
|
|
360
|
+
* cardholder withdrawing — is deliberately NOT treated as a win: on Stripe a withdrawn
|
|
361
|
+
* dispute still has to be closed in your favour with evidence, so calling it settled would
|
|
362
|
+
* count revenue the acquirer has not returned. Understating is the safe direction here.
|
|
363
|
+
*/
|
|
364
|
+
async #onDisputeClosed(event) {
|
|
365
|
+
if (!isDisputeWebhookData(event.data)) {
|
|
366
|
+
throw new Error(`[payments] Malformed payment.dispute_closed payload for event ${event.id}.`);
|
|
367
|
+
}
|
|
368
|
+
const { gatewayId, disputeId, outcome, amount, currency } = event.data;
|
|
369
|
+
// A close with no outcome is not a close. Defaulting it — to `lost`, to anything —
|
|
370
|
+
// would report a result the gateway never sent, which is the failure this whole event
|
|
371
|
+
// exists to avoid: a driver that cannot read the outcome is supposed to emit
|
|
372
|
+
// `payment.updated` instead.
|
|
373
|
+
if (outcome === undefined) {
|
|
374
|
+
throw new Error(`[payments] payment.dispute_closed for event ${event.id} carries no outcome. A driver that cannot read one must emit payment.updated instead.`);
|
|
375
|
+
}
|
|
376
|
+
const existing = await this.#store.findPaymentByGatewayId(gatewayId);
|
|
377
|
+
// A close moves the payment row in BOTH directions, and the second one is easy to miss.
|
|
378
|
+
//
|
|
379
|
+
// `won` returns money that a chargeback took, so a row sitting at `disputed` goes back
|
|
380
|
+
// to `paid` — `revenue()` sums `paid`, and leaving it writes off money that came back.
|
|
381
|
+
//
|
|
382
|
+
// `lost` is the mirror, and it does not assume a `payment.disputed` ever arrived. Plenty
|
|
383
|
+
// of gateways never send one: Razorpay documents that it does not debit provisionally at
|
|
384
|
+
// all, PayPal opens at an inquiry that takes nothing, and Woovi only blocks the balance.
|
|
385
|
+
// On those the sequence is warning → closed(lost), with nothing in between to move the
|
|
386
|
+
// row — so a payment whose money is definitively gone would still read `paid`.
|
|
387
|
+
//
|
|
388
|
+
// `expired` and `canceled` deliberately move nothing. Expired means the window closed
|
|
389
|
+
// with no verdict published, and canceled means the cardholder withdrew — on Stripe a
|
|
390
|
+
// withdrawn dispute still has to be closed in your favour with evidence. Neither is a
|
|
391
|
+
// statement about where the money ended up.
|
|
392
|
+
const target = outcome === 'won' && existing?.status === 'disputed'
|
|
393
|
+
? 'paid'
|
|
394
|
+
: outcome === 'lost' && existing !== null && existing.status !== 'disputed'
|
|
395
|
+
? 'disputed'
|
|
396
|
+
: undefined;
|
|
397
|
+
if (target !== undefined && existing !== null) {
|
|
398
|
+
await this.#store.savePayment({
|
|
399
|
+
gatewayId,
|
|
400
|
+
provider: event.provider,
|
|
401
|
+
status: target,
|
|
402
|
+
// The dispute's amount can differ from the charge's — a partial dispute, or a
|
|
403
|
+
// currency conversion between the charge and the chargeback. The ROW keeps the
|
|
404
|
+
// amount it was charged for; the dispute's own figure stays on the payload.
|
|
405
|
+
amount: existing.amount,
|
|
406
|
+
currency: existing.currency,
|
|
407
|
+
...(existing.customerId !== null ? { customerId: existing.customerId } : {}),
|
|
408
|
+
...(existing.subscriptionId !== null ? { subscriptionId: existing.subscriptionId } : {}),
|
|
409
|
+
payload: event.raw,
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
// The outcome IS the status: `won`/`lost`/`canceled`/`expired` are all `DisputeStatus`
|
|
413
|
+
// members, so a closed dispute stops matching the open-window read the moment it closes —
|
|
414
|
+
// which is what stops the deadline check alerting on a window nobody has to answer.
|
|
415
|
+
await this.#persistDispute(event, event.data, { status: outcome, closedAt: new Date() });
|
|
416
|
+
publishPayments('payment.dispute_closed', {
|
|
417
|
+
gatewayId,
|
|
418
|
+
provider: event.provider,
|
|
419
|
+
disputeId: disputeId ?? gatewayId,
|
|
420
|
+
outcome,
|
|
421
|
+
...(amount !== undefined ? { amount } : {}),
|
|
422
|
+
...(currency !== undefined ? { currency } : {}),
|
|
423
|
+
});
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* The key a dispute row is upserted on — the DISPUTE's own gateway id where the event
|
|
427
|
+
* carries one, and a reconcilable stand-in where it does not.
|
|
428
|
+
*
|
|
429
|
+
* Several gateways send no dispute id at all, and several more send one when the dispute
|
|
430
|
+
* opens and omit it when it closes. Both have to land on the SAME row, or the close opens a
|
|
431
|
+
* second dispute and the deadline check keeps alerting on a window that was already
|
|
432
|
+
* answered. So, in order:
|
|
433
|
+
*
|
|
434
|
+
* 1. `disputeId`, when the event carries one. That is the gateway's own identity.
|
|
435
|
+
* 2. Otherwise the payment's newest UNRESOLVED dispute, if there is one — this is the close
|
|
436
|
+
* (or the chargeback after a warning) rejoining the row its own opening event created.
|
|
437
|
+
* 3. Otherwise `dispute:<provider>:<payment gateway id>`, synthesized.
|
|
438
|
+
*
|
|
439
|
+
* The `dispute:` prefix is what makes step 3 safe to store in the same unique column as a
|
|
440
|
+
* real gateway id: no gateway issues an id in that shape, so a synthesized key can never
|
|
441
|
+
* collide with a real one, and it stays reconcilable by hand because the payment it names
|
|
442
|
+
* is right there in it. What it costs: a payment disputed TWICE by a gateway that sends no
|
|
443
|
+
* dispute id collapses into one row, because such a gateway gives us nothing to tell the
|
|
444
|
+
* two apart. Overwriting one row is the lesser error — a second row keyed on nothing could
|
|
445
|
+
* never be closed, and would alert on its deadline forever.
|
|
446
|
+
*/
|
|
447
|
+
async #disputeKey(provider, data) {
|
|
448
|
+
if (data.disputeId !== undefined && data.disputeId !== '')
|
|
449
|
+
return data.disputeId;
|
|
450
|
+
const open = await this.#store.findOpenDisputeByPayment(data.gatewayId);
|
|
451
|
+
if (open !== null)
|
|
452
|
+
return open.gatewayId;
|
|
453
|
+
return `dispute:${provider}:${data.gatewayId}`;
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* Write the dispute row that goes with a dispute event.
|
|
457
|
+
*
|
|
458
|
+
* ADDITIONAL to what each handler already does, never a replacement: the warning still
|
|
459
|
+
* moves no money, the chargeback still moves the payment to `disputed`, and a won close
|
|
460
|
+
* still puts it back to `paid`. What this adds is the one thing none of them kept — the
|
|
461
|
+
* response deadline, which arrived on the event, was published once, and was then gone.
|
|
462
|
+
*/
|
|
463
|
+
async #persistDispute(event, data, fields) {
|
|
464
|
+
const deadline = parseInstant(data.actionableUntil);
|
|
465
|
+
await this.#store.saveDispute({
|
|
466
|
+
gatewayId: await this.#disputeKey(event.provider, data),
|
|
467
|
+
paymentGatewayId: data.gatewayId,
|
|
468
|
+
provider: event.provider,
|
|
469
|
+
status: fields.status,
|
|
470
|
+
// Spread away when absent, never passed as `null`: the store keeps what it already has
|
|
471
|
+
// for an `undefined` field, and the closing event — which carries no reason, no amount
|
|
472
|
+
// and no deadline — must not blank what the opening event recorded.
|
|
473
|
+
...(data.reason !== undefined ? { reason: data.reason } : {}),
|
|
474
|
+
...(data.amount !== undefined ? { amount: data.amount } : {}),
|
|
475
|
+
...(data.currency !== undefined ? { currency: data.currency } : {}),
|
|
476
|
+
...(deadline !== null ? { evidenceDueBy: deadline } : {}),
|
|
477
|
+
...(data.outcome !== undefined ? { outcome: data.outcome } : {}),
|
|
478
|
+
...(fields.closedAt !== undefined ? { closedAt: fields.closedAt } : {}),
|
|
479
|
+
payload: event.raw,
|
|
480
|
+
});
|
|
481
|
+
}
|
|
162
482
|
async #onSubscriptionChanged(event) {
|
|
163
483
|
if (!isSubscriptionWebhookData(event.data)) {
|
|
164
484
|
throw new Error(`[payments] Malformed subscription payload for event ${event.id}.`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook_processor.js","sourceRoot":"","sources":["../../../src/billing/webhook_processor.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"webhook_processor.js","sourceRoot":"","sources":["../../../src/billing/webhook_processor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import type { HttpContext } from '@adonisjs/core/http';
|
|
2
|
+
import type { BillingStore } from '../billing/billing_store.js';
|
|
3
|
+
/**
|
|
4
|
+
* The app-side row a payment belongs to — the same `{ type, id }` pair
|
|
5
|
+
* `ensureCustomer({ owner })` writes into `billing_customers`.
|
|
6
|
+
*/
|
|
7
|
+
export interface PaymentOwner {
|
|
8
|
+
type: string;
|
|
9
|
+
id: string;
|
|
10
|
+
}
|
|
11
|
+
/** A normalized payment, built from named columns only. See `handlers.ts`. */
|
|
12
|
+
export interface ClientPayment {
|
|
13
|
+
gatewayId: string;
|
|
14
|
+
provider: string;
|
|
15
|
+
status: string;
|
|
16
|
+
/** Integer minor units, exactly as stored. */
|
|
17
|
+
amount: number;
|
|
18
|
+
currency: string;
|
|
19
|
+
customerId: string | null;
|
|
20
|
+
paidAt: Date | null;
|
|
21
|
+
}
|
|
22
|
+
/** Whether this request may talk to the client endpoint at all. */
|
|
23
|
+
export type ClientAuthorizeHook = (ctx: HttpContext) => boolean | Promise<boolean>;
|
|
24
|
+
/** Who is asking. `null` denies the request (`401`). */
|
|
25
|
+
export type ClientOwnerHook = (ctx: HttpContext) => PaymentOwner | null | Promise<PaymentOwner | null>;
|
|
26
|
+
/**
|
|
27
|
+
* Whether this caller may see the payment behind `externalReference`.
|
|
28
|
+
*
|
|
29
|
+
* The reference is the ONLY thing the browser supplies, so this hook is where an app says
|
|
30
|
+
* how a reference is tied back to a caller. It is never given the payment: a hook that
|
|
31
|
+
* received the row it is guarding invites "return true if the row exists", which is the
|
|
32
|
+
* IDOR this endpoint exists to make unwritable.
|
|
33
|
+
*/
|
|
34
|
+
export type ClientAuthorizeReferenceHook = (ctx: HttpContext, externalReference: string) => boolean | Promise<boolean>;
|
|
35
|
+
/**
|
|
36
|
+
* Map the reference the browser polls with onto the `gateway_id` the billing store keys
|
|
37
|
+
* payments by. Return `null` for "no such reference" (the endpoint answers `404`).
|
|
38
|
+
*
|
|
39
|
+
* **An escape hatch, and no longer the normal path.** `billing_payments.external_reference`
|
|
40
|
+
* now stores the reference a charge carried, so by default the endpoint looks the payment up
|
|
41
|
+
* by it directly and falls back to reading the reference AS a gateway id — which covers both
|
|
42
|
+
* the gateways that make the two equal (Woovi's `correlationID`, Efí's `txid`) and any row
|
|
43
|
+
* written before an earlier schema ran.
|
|
44
|
+
*
|
|
45
|
+
* Configure this only when your browser polls with something that is NEITHER — a checkout
|
|
46
|
+
* session id you map yourself, a hashed token. Doing so REPLACES the default lookup: the
|
|
47
|
+
* endpoint then reads only what this returns, by gateway id.
|
|
48
|
+
*
|
|
49
|
+
* This is a LOOKUP, not a guard: {@link ClientAuthorizeReferenceHook} still runs on what it
|
|
50
|
+
* resolves.
|
|
51
|
+
*/
|
|
52
|
+
export type ClientResolveReferenceHook = (ctx: HttpContext, reference: string) => string | null | Promise<string | null>;
|
|
53
|
+
/** Shape of `config/payments_client.ts`. */
|
|
54
|
+
export interface PaymentsClientConfig {
|
|
55
|
+
/**
|
|
56
|
+
* Master switch. Defaults to **`false`**: a payments endpoint reachable from a browser is
|
|
57
|
+
* an authorization surface, and an app takes one on deliberately or not at all.
|
|
58
|
+
*/
|
|
59
|
+
enabled?: boolean;
|
|
60
|
+
/** URL prefix the endpoint mounts under. Defaults to `/payments/client`. */
|
|
61
|
+
path?: string;
|
|
62
|
+
/**
|
|
63
|
+
* Is this request allowed at all. Defaults to "there is a resolved user" — read
|
|
64
|
+
* structurally off `ctx.auth` (see {@link resolveRequestUser}). A denial is `401`.
|
|
65
|
+
*/
|
|
66
|
+
authorize?: ClientAuthorizeHook;
|
|
67
|
+
/**
|
|
68
|
+
* Who is asking, as `{ type, id }`. Defaults to `{ type: 'User', id: String(user.id) }`
|
|
69
|
+
* from that same resolved user. `null` is a `401`.
|
|
70
|
+
*/
|
|
71
|
+
owner?: ClientOwnerHook;
|
|
72
|
+
/**
|
|
73
|
+
* May this caller see THIS payment. **The load-bearing one.**
|
|
74
|
+
*
|
|
75
|
+
* Defaults to the customer-registry check: resolve the owner, look them up with
|
|
76
|
+
* `findCustomerByOwner`, and allow only when the payment's `customerId` is the gateway
|
|
77
|
+
* customer that owner actually holds. An app that never recorded customers is DENIED with
|
|
78
|
+
* a message saying so — never allowed by default.
|
|
79
|
+
*/
|
|
80
|
+
authorizeReference?: ClientAuthorizeReferenceHook;
|
|
81
|
+
/**
|
|
82
|
+
* See {@link ClientResolveReferenceHook}. Unset by default — the endpoint looks the payment
|
|
83
|
+
* up by `external_reference`, then by gateway id.
|
|
84
|
+
*/
|
|
85
|
+
resolveReference?: ClientResolveReferenceHook;
|
|
86
|
+
}
|
|
87
|
+
/** Why a reference was refused. Developer-facing — it never reaches the browser. */
|
|
88
|
+
export interface ReferenceDenied {
|
|
89
|
+
allowed: false;
|
|
90
|
+
reason: string;
|
|
91
|
+
}
|
|
92
|
+
export type ReferenceOutcome = {
|
|
93
|
+
allowed: true;
|
|
94
|
+
} | ReferenceDenied;
|
|
95
|
+
/** Everything the ownership guard is allowed to see. */
|
|
96
|
+
export interface ReferenceGuardRequest {
|
|
97
|
+
ctx: HttpContext;
|
|
98
|
+
/** The reference as the browser sent it (before {@link ClientResolveReferenceHook}). */
|
|
99
|
+
reference: string;
|
|
100
|
+
/** The already-loaded payment, normalized. */
|
|
101
|
+
payment: ClientPayment;
|
|
102
|
+
/** The already-resolved caller. Never `null` — a request with no owner never gets here. */
|
|
103
|
+
owner: PaymentOwner;
|
|
104
|
+
store: BillingStore;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* The internal form of the ownership check. Always present on a resolved config, so there
|
|
108
|
+
* is no code path through the handler that reaches a payment without running one.
|
|
109
|
+
*/
|
|
110
|
+
export type ReferenceGuard = (request: ReferenceGuardRequest) => Promise<ReferenceOutcome>;
|
|
111
|
+
/** A fully-resolved config — every field present (defaults applied). */
|
|
112
|
+
export interface ResolvedPaymentsClientConfig {
|
|
113
|
+
enabled: boolean;
|
|
114
|
+
path: string;
|
|
115
|
+
authorize: ClientAuthorizeHook;
|
|
116
|
+
owner: ClientOwnerHook;
|
|
117
|
+
/**
|
|
118
|
+
* `null` — the common case — means "no app-supplied mapping": the handler uses the built-in
|
|
119
|
+
* `external_reference` → gateway-id lookup. A hook here replaces it entirely.
|
|
120
|
+
*/
|
|
121
|
+
resolveReference: ClientResolveReferenceHook | null;
|
|
122
|
+
/** The app's `authorizeReference`, adapted — or the built-in registry check. */
|
|
123
|
+
guard: ReferenceGuard;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* The user behind a request, or `null`.
|
|
127
|
+
*
|
|
128
|
+
* A throwing `getUser()` (some guards throw rather than return `null` for an anonymous
|
|
129
|
+
* request) is a denial, not a `500`.
|
|
130
|
+
*/
|
|
131
|
+
export declare function resolveRequestUser(ctx: unknown): Promise<unknown>;
|
|
132
|
+
/** The default {@link PaymentsClientConfig.authorize}: there must be a resolved user. */
|
|
133
|
+
export declare function defaultAuthorize(ctx: HttpContext): Promise<boolean>;
|
|
134
|
+
/** The default {@link PaymentsClientConfig.owner}: `{ type: 'User', id: String(user.id) }`. */
|
|
135
|
+
export declare function defaultOwner(ctx: HttpContext): Promise<PaymentOwner | null>;
|
|
136
|
+
/**
|
|
137
|
+
* The default ownership check: the payment's gateway customer must be the one this owner
|
|
138
|
+
* holds at that gateway, per `billing_customers`.
|
|
139
|
+
*
|
|
140
|
+
* Every branch that cannot PROVE ownership denies. In particular an app that never called
|
|
141
|
+
* `ensureCustomer({ store, owner })` has an empty registry, and an empty registry means
|
|
142
|
+
* "unknown", not "allowed" — the failure mode of the opposite choice is that every
|
|
143
|
+
* authenticated user can read every payment by guessing a reference.
|
|
144
|
+
*/
|
|
145
|
+
export declare const registryReferenceGuard: ReferenceGuard;
|
|
146
|
+
/** Apply defaults to a partial config, producing a fully-resolved one. */
|
|
147
|
+
export declare function resolveConfig(config?: PaymentsClientConfig): ResolvedPaymentsClientConfig;
|
|
148
|
+
/** Identity helper giving `config/payments_client.ts` full type-checking. */
|
|
149
|
+
export declare function defineConfig(config?: PaymentsClientConfig): PaymentsClientConfig;
|
|
150
|
+
//# sourceMappingURL=define_config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define_config.d.ts","sourceRoot":"","sources":["../../../src/client/define_config.ts"],"names":[],"mappings":"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"}
|