@adonis-agora/payments 0.2.0 → 0.3.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.
Files changed (319) hide show
  1. package/CHANGELOG.md +2347 -0
  2. package/dist/assets/spa/assets/index-CT5Zon6P.css +1 -0
  3. package/dist/assets/spa/assets/index-CvEbJEnq.js +41 -0
  4. package/dist/assets/spa/assets/index-CvEbJEnq.js.map +1 -0
  5. package/dist/assets/spa/index.html +20 -0
  6. package/dist/commands/main.d.ts +4 -3
  7. package/dist/commands/main.d.ts.map +1 -1
  8. package/dist/commands/main.js +9 -2
  9. package/dist/commands/main.js.map +1 -1
  10. package/dist/commands/payments_health.d.ts +31 -0
  11. package/dist/commands/payments_health.d.ts.map +1 -0
  12. package/dist/commands/payments_health.js +113 -0
  13. package/dist/commands/payments_health.js.map +1 -0
  14. package/dist/commands/payments_sync.d.ts +18 -4
  15. package/dist/commands/payments_sync.d.ts.map +1 -1
  16. package/dist/commands/payments_sync.js +136 -40
  17. package/dist/commands/payments_sync.js.map +1 -1
  18. package/dist/configure.d.ts +12 -5
  19. package/dist/configure.d.ts.map +1 -1
  20. package/dist/configure.js +18 -5
  21. package/dist/configure.js.map +1 -1
  22. package/dist/providers/dashboard_provider.d.ts +97 -0
  23. package/dist/providers/dashboard_provider.d.ts.map +1 -0
  24. package/dist/providers/dashboard_provider.js +430 -0
  25. package/dist/providers/dashboard_provider.js.map +1 -0
  26. package/dist/providers/payments_client_provider.d.ts +41 -0
  27. package/dist/providers/payments_client_provider.d.ts.map +1 -0
  28. package/dist/providers/payments_client_provider.js +95 -0
  29. package/dist/providers/payments_client_provider.js.map +1 -0
  30. package/dist/providers/payments_provider.d.ts +35 -0
  31. package/dist/providers/payments_provider.d.ts.map +1 -1
  32. package/dist/providers/payments_provider.js +250 -36
  33. package/dist/providers/payments_provider.js.map +1 -1
  34. package/dist/src/billing/billing_health.d.ts +85 -0
  35. package/dist/src/billing/billing_health.d.ts.map +1 -0
  36. package/dist/src/billing/billing_health.js +155 -0
  37. package/dist/src/billing/billing_health.js.map +1 -0
  38. package/dist/src/billing/billing_overview.d.ts +4 -3
  39. package/dist/src/billing/billing_overview.d.ts.map +1 -1
  40. package/dist/src/billing/billing_overview.js +14 -5
  41. package/dist/src/billing/billing_overview.js.map +1 -1
  42. package/dist/src/billing/billing_store.d.ts +634 -5
  43. package/dist/src/billing/billing_store.d.ts.map +1 -1
  44. package/dist/src/billing/billing_store.js +18 -1
  45. package/dist/src/billing/billing_store.js.map +1 -1
  46. package/dist/src/billing/index.d.ts +2 -1
  47. package/dist/src/billing/index.d.ts.map +1 -1
  48. package/dist/src/billing/index.js +1 -0
  49. package/dist/src/billing/index.js.map +1 -1
  50. package/dist/src/billing/list_query.d.ts +16 -0
  51. package/dist/src/billing/list_query.d.ts.map +1 -0
  52. package/dist/src/billing/list_query.js +28 -0
  53. package/dist/src/billing/list_query.js.map +1 -0
  54. package/dist/src/billing/lucid_billing_store.d.ts +122 -4
  55. package/dist/src/billing/lucid_billing_store.d.ts.map +1 -1
  56. package/dist/src/billing/lucid_billing_store.js +811 -13
  57. package/dist/src/billing/lucid_billing_store.js.map +1 -1
  58. package/dist/src/billing/mixins/index.d.ts +3 -0
  59. package/dist/src/billing/mixins/index.d.ts.map +1 -1
  60. package/dist/src/billing/mixins/index.js +3 -0
  61. package/dist/src/billing/mixins/index.js.map +1 -1
  62. package/dist/src/billing/mixins/with_audit_event.d.ts +48 -0
  63. package/dist/src/billing/mixins/with_audit_event.d.ts.map +1 -0
  64. package/dist/src/billing/mixins/with_audit_event.js +77 -0
  65. package/dist/src/billing/mixins/with_audit_event.js.map +1 -0
  66. package/dist/src/billing/mixins/with_customer.d.ts +39 -0
  67. package/dist/src/billing/mixins/with_customer.d.ts.map +1 -0
  68. package/dist/src/billing/mixins/with_customer.js +68 -0
  69. package/dist/src/billing/mixins/with_customer.js.map +1 -0
  70. package/dist/src/billing/mixins/with_dispute.d.ts +68 -0
  71. package/dist/src/billing/mixins/with_dispute.d.ts.map +1 -0
  72. package/dist/src/billing/mixins/with_dispute.js +83 -0
  73. package/dist/src/billing/mixins/with_dispute.js.map +1 -0
  74. package/dist/src/billing/mixins/with_payment.d.ts +42 -0
  75. package/dist/src/billing/mixins/with_payment.d.ts.map +1 -1
  76. package/dist/src/billing/mixins/with_payment.js +29 -3
  77. package/dist/src/billing/mixins/with_payment.js.map +1 -1
  78. package/dist/src/billing/mixins/with_subscription.d.ts +7 -0
  79. package/dist/src/billing/mixins/with_subscription.d.ts.map +1 -1
  80. package/dist/src/billing/mixins/with_subscription.js +15 -1
  81. package/dist/src/billing/mixins/with_subscription.js.map +1 -1
  82. package/dist/src/billing/mixins/with_usage_event.d.ts +7 -0
  83. package/dist/src/billing/mixins/with_usage_event.d.ts.map +1 -1
  84. package/dist/src/billing/mixins/with_usage_event.js +15 -1
  85. package/dist/src/billing/mixins/with_usage_event.js.map +1 -1
  86. package/dist/src/billing/mixins/with_webhook_event.d.ts +18 -0
  87. package/dist/src/billing/mixins/with_webhook_event.d.ts.map +1 -1
  88. package/dist/src/billing/mixins/with_webhook_event.js +18 -1
  89. package/dist/src/billing/mixins/with_webhook_event.js.map +1 -1
  90. package/dist/src/billing/resolve_dispatch.d.ts +22 -0
  91. package/dist/src/billing/resolve_dispatch.d.ts.map +1 -0
  92. package/dist/src/billing/resolve_dispatch.js +44 -0
  93. package/dist/src/billing/resolve_dispatch.js.map +1 -0
  94. package/dist/src/billing/resolve_store.d.ts +18 -0
  95. package/dist/src/billing/resolve_store.d.ts.map +1 -0
  96. package/dist/src/billing/resolve_store.js +35 -0
  97. package/dist/src/billing/resolve_store.js.map +1 -0
  98. package/dist/src/billing/schema.d.ts +108 -0
  99. package/dist/src/billing/schema.d.ts.map +1 -0
  100. package/dist/src/billing/schema.js +350 -0
  101. package/dist/src/billing/schema.js.map +1 -0
  102. package/dist/src/billing/webhook_dispatcher.d.ts +95 -16
  103. package/dist/src/billing/webhook_dispatcher.d.ts.map +1 -1
  104. package/dist/src/billing/webhook_dispatcher.js +186 -33
  105. package/dist/src/billing/webhook_dispatcher.js.map +1 -1
  106. package/dist/src/billing/webhook_events.d.ts +67 -1
  107. package/dist/src/billing/webhook_events.d.ts.map +1 -1
  108. package/dist/src/billing/webhook_events.js +15 -0
  109. package/dist/src/billing/webhook_events.js.map +1 -1
  110. package/dist/src/billing/webhook_processor.d.ts.map +1 -1
  111. package/dist/src/billing/webhook_processor.js +325 -5
  112. package/dist/src/billing/webhook_processor.js.map +1 -1
  113. package/dist/src/client/define_config.d.ts +150 -0
  114. package/dist/src/client/define_config.d.ts.map +1 -0
  115. package/dist/src/client/define_config.js +98 -0
  116. package/dist/src/client/define_config.js.map +1 -0
  117. package/dist/src/client/handlers.d.ts +71 -0
  118. package/dist/src/client/handlers.d.ts.map +1 -0
  119. package/dist/src/client/handlers.js +119 -0
  120. package/dist/src/client/handlers.js.map +1 -0
  121. package/dist/src/client/index.d.ts +16 -0
  122. package/dist/src/client/index.d.ts.map +1 -0
  123. package/dist/src/client/index.js +13 -0
  124. package/dist/src/client/index.js.map +1 -0
  125. package/dist/src/client/statuses.d.ts +38 -0
  126. package/dist/src/client/statuses.d.ts.map +1 -0
  127. package/dist/src/client/statuses.js +42 -0
  128. package/dist/src/client/statuses.js.map +1 -0
  129. package/dist/src/dashboard/actions.d.ts +143 -0
  130. package/dist/src/dashboard/actions.d.ts.map +1 -0
  131. package/dist/src/dashboard/actions.js +112 -0
  132. package/dist/src/dashboard/actions.js.map +1 -0
  133. package/dist/src/dashboard/auth.d.ts +136 -0
  134. package/dist/src/dashboard/auth.d.ts.map +1 -0
  135. package/dist/src/dashboard/auth.js +152 -0
  136. package/dist/src/dashboard/auth.js.map +1 -0
  137. package/dist/src/dashboard/define_config.d.ts +80 -0
  138. package/dist/src/dashboard/define_config.d.ts.map +1 -0
  139. package/dist/src/dashboard/define_config.js +83 -0
  140. package/dist/src/dashboard/define_config.js.map +1 -0
  141. package/dist/src/dashboard/handlers.d.ts +281 -0
  142. package/dist/src/dashboard/handlers.d.ts.map +1 -0
  143. package/dist/src/dashboard/handlers.js +960 -0
  144. package/dist/src/dashboard/handlers.js.map +1 -0
  145. package/dist/src/dashboard/index.d.ts +18 -0
  146. package/dist/src/dashboard/index.d.ts.map +1 -0
  147. package/dist/src/dashboard/index.js +14 -0
  148. package/dist/src/dashboard/index.js.map +1 -0
  149. package/dist/src/dashboard/login_page.d.ts +23 -0
  150. package/dist/src/dashboard/login_page.d.ts.map +1 -0
  151. package/dist/src/dashboard/login_page.js +170 -0
  152. package/dist/src/dashboard/login_page.js.map +1 -0
  153. package/dist/src/dashboard/period.d.ts +31 -0
  154. package/dist/src/dashboard/period.d.ts.map +1 -0
  155. package/dist/src/dashboard/period.js +44 -0
  156. package/dist/src/dashboard/period.js.map +1 -0
  157. package/dist/src/dashboard/session_cookie.d.ts +42 -0
  158. package/dist/src/dashboard/session_cookie.d.ts.map +1 -0
  159. package/dist/src/dashboard/session_cookie.js +97 -0
  160. package/dist/src/dashboard/session_cookie.js.map +1 -0
  161. package/dist/src/dashboard/spa.d.ts +24 -0
  162. package/dist/src/dashboard/spa.d.ts.map +1 -0
  163. package/dist/src/dashboard/spa.js +52 -0
  164. package/dist/src/dashboard/spa.js.map +1 -0
  165. package/dist/src/define_config.d.ts +244 -9
  166. package/dist/src/define_config.d.ts.map +1 -1
  167. package/dist/src/define_config.js +97 -1
  168. package/dist/src/define_config.js.map +1 -1
  169. package/dist/src/diagnostics.d.ts +287 -7
  170. package/dist/src/diagnostics.d.ts.map +1 -1
  171. package/dist/src/diagnostics.js +317 -1
  172. package/dist/src/diagnostics.js.map +1 -1
  173. package/dist/src/driver.d.ts +139 -5
  174. package/dist/src/driver.d.ts.map +1 -1
  175. package/dist/src/drivers/abacate.d.ts +12 -2
  176. package/dist/src/drivers/abacate.d.ts.map +1 -1
  177. package/dist/src/drivers/abacate.js +112 -19
  178. package/dist/src/drivers/abacate.js.map +1 -1
  179. package/dist/src/drivers/adyen.d.ts +164 -0
  180. package/dist/src/drivers/adyen.d.ts.map +1 -0
  181. package/dist/src/drivers/adyen.js +678 -0
  182. package/dist/src/drivers/adyen.js.map +1 -0
  183. package/dist/src/drivers/asaas.d.ts +52 -2
  184. package/dist/src/drivers/asaas.d.ts.map +1 -1
  185. package/dist/src/drivers/asaas.js +364 -29
  186. package/dist/src/drivers/asaas.js.map +1 -1
  187. package/dist/src/drivers/dodo.d.ts +135 -0
  188. package/dist/src/drivers/dodo.d.ts.map +1 -0
  189. package/dist/src/drivers/dodo.js +864 -0
  190. package/dist/src/drivers/dodo.js.map +1 -0
  191. package/dist/src/drivers/efi.d.ts +98 -0
  192. package/dist/src/drivers/efi.d.ts.map +1 -0
  193. package/dist/src/drivers/efi.js +628 -0
  194. package/dist/src/drivers/efi.js.map +1 -0
  195. package/dist/src/drivers/infinitepay.d.ts +156 -0
  196. package/dist/src/drivers/infinitepay.d.ts.map +1 -0
  197. package/dist/src/drivers/infinitepay.js +321 -0
  198. package/dist/src/drivers/infinitepay.js.map +1 -0
  199. package/dist/src/drivers/lemonsqueezy.d.ts +125 -0
  200. package/dist/src/drivers/lemonsqueezy.d.ts.map +1 -0
  201. package/dist/src/drivers/lemonsqueezy.js +632 -0
  202. package/dist/src/drivers/lemonsqueezy.js.map +1 -0
  203. package/dist/src/drivers/mercadopago.d.ts +97 -0
  204. package/dist/src/drivers/mercadopago.d.ts.map +1 -0
  205. package/dist/src/drivers/mercadopago.js +844 -0
  206. package/dist/src/drivers/mercadopago.js.map +1 -0
  207. package/dist/src/drivers/mollie.d.ts +125 -0
  208. package/dist/src/drivers/mollie.d.ts.map +1 -0
  209. package/dist/src/drivers/mollie.js +812 -0
  210. package/dist/src/drivers/mollie.js.map +1 -0
  211. package/dist/src/drivers/paddle.d.ts +148 -0
  212. package/dist/src/drivers/paddle.d.ts.map +1 -0
  213. package/dist/src/drivers/paddle.js +738 -0
  214. package/dist/src/drivers/paddle.js.map +1 -0
  215. package/dist/src/drivers/pagarme.d.ts +97 -0
  216. package/dist/src/drivers/pagarme.d.ts.map +1 -0
  217. package/dist/src/drivers/pagarme.js +829 -0
  218. package/dist/src/drivers/pagarme.js.map +1 -0
  219. package/dist/src/drivers/pagbank.d.ts +57 -0
  220. package/dist/src/drivers/pagbank.d.ts.map +1 -0
  221. package/dist/src/drivers/pagbank.js +499 -0
  222. package/dist/src/drivers/pagbank.js.map +1 -0
  223. package/dist/src/drivers/paypal.d.ts +120 -0
  224. package/dist/src/drivers/paypal.d.ts.map +1 -0
  225. package/dist/src/drivers/paypal.js +891 -0
  226. package/dist/src/drivers/paypal.js.map +1 -0
  227. package/dist/src/drivers/polar.d.ts +118 -0
  228. package/dist/src/drivers/polar.d.ts.map +1 -0
  229. package/dist/src/drivers/polar.js +604 -0
  230. package/dist/src/drivers/polar.js.map +1 -0
  231. package/dist/src/drivers/razorpay.d.ts +103 -0
  232. package/dist/src/drivers/razorpay.d.ts.map +1 -0
  233. package/dist/src/drivers/razorpay.js +867 -0
  234. package/dist/src/drivers/razorpay.js.map +1 -0
  235. package/dist/src/drivers/shared.d.ts +33 -0
  236. package/dist/src/drivers/shared.d.ts.map +1 -0
  237. package/dist/src/drivers/shared.js +37 -0
  238. package/dist/src/drivers/shared.js.map +1 -0
  239. package/dist/src/drivers/square.d.ts +133 -0
  240. package/dist/src/drivers/square.d.ts.map +1 -0
  241. package/dist/src/drivers/square.js +905 -0
  242. package/dist/src/drivers/square.js.map +1 -0
  243. package/dist/src/drivers/stripe.d.ts +40 -3
  244. package/dist/src/drivers/stripe.d.ts.map +1 -1
  245. package/dist/src/drivers/stripe.js +806 -25
  246. package/dist/src/drivers/stripe.js.map +1 -1
  247. package/dist/src/drivers/woovi.d.ts +10 -3
  248. package/dist/src/drivers/woovi.d.ts.map +1 -1
  249. package/dist/src/drivers/woovi.js +162 -29
  250. package/dist/src/drivers/woovi.js.map +1 -1
  251. package/dist/src/ensure_customer.d.ts +34 -1
  252. package/dist/src/ensure_customer.d.ts.map +1 -1
  253. package/dist/src/ensure_customer.js +29 -4
  254. package/dist/src/ensure_customer.js.map +1 -1
  255. package/dist/src/http.d.ts +37 -3
  256. package/dist/src/http.d.ts.map +1 -1
  257. package/dist/src/http.js +69 -5
  258. package/dist/src/http.js.map +1 -1
  259. package/dist/src/index.d.ts +40 -10
  260. package/dist/src/index.d.ts.map +1 -1
  261. package/dist/src/index.js +22 -4
  262. package/dist/src/index.js.map +1 -1
  263. package/dist/src/invoice/emit_invoice.d.ts.map +1 -1
  264. package/dist/src/invoice/emit_invoice.js +31 -11
  265. package/dist/src/invoice/emit_invoice.js.map +1 -1
  266. package/dist/src/money.d.ts +23 -5
  267. package/dist/src/money.d.ts.map +1 -1
  268. package/dist/src/money.js +72 -7
  269. package/dist/src/money.js.map +1 -1
  270. package/dist/src/payments_manager.d.ts +8 -1
  271. package/dist/src/payments_manager.d.ts.map +1 -1
  272. package/dist/src/payments_manager.js +168 -6
  273. package/dist/src/payments_manager.js.map +1 -1
  274. package/dist/src/services/main.d.ts +38 -0
  275. package/dist/src/services/main.d.ts.map +1 -1
  276. package/dist/src/services/main.js +130 -0
  277. package/dist/src/services/main.js.map +1 -1
  278. package/dist/src/telescope/index.d.ts +2 -0
  279. package/dist/src/telescope/index.d.ts.map +1 -1
  280. package/dist/src/telescope/index.js +1 -0
  281. package/dist/src/telescope/index.js.map +1 -1
  282. package/dist/src/telescope/payments_watcher.d.ts +10 -4
  283. package/dist/src/telescope/payments_watcher.d.ts.map +1 -1
  284. package/dist/src/telescope/payments_watcher.js +65 -13
  285. package/dist/src/telescope/payments_watcher.js.map +1 -1
  286. package/dist/src/telescope/register.d.ts +62 -0
  287. package/dist/src/telescope/register.d.ts.map +1 -0
  288. package/dist/src/telescope/register.js +48 -0
  289. package/dist/src/telescope/register.js.map +1 -0
  290. package/dist/src/testing/fake_payments.d.ts +62 -0
  291. package/dist/src/testing/fake_payments.d.ts.map +1 -0
  292. package/dist/src/testing/fake_payments.js +82 -0
  293. package/dist/src/testing/fake_payments.js.map +1 -0
  294. package/dist/src/testing/in_memory_billing_store.d.ts +151 -2
  295. package/dist/src/testing/in_memory_billing_store.d.ts.map +1 -1
  296. package/dist/src/testing/in_memory_billing_store.js +517 -4
  297. package/dist/src/testing/in_memory_billing_store.js.map +1 -1
  298. package/dist/src/testing/index.d.ts +2 -1
  299. package/dist/src/testing/index.d.ts.map +1 -1
  300. package/dist/src/testing/index.js +1 -0
  301. package/dist/src/testing/index.js.map +1 -1
  302. package/dist/src/types.d.ts +161 -5
  303. package/dist/src/types.d.ts.map +1 -1
  304. package/dist/src/types.js +30 -1
  305. package/dist/src/types.js.map +1 -1
  306. package/dist/src/webhook_handlers.d.ts +96 -2
  307. package/dist/src/webhook_handlers.d.ts.map +1 -1
  308. package/dist/src/webhook_handlers.js +91 -10
  309. package/dist/src/webhook_handlers.js.map +1 -1
  310. package/dist/src/webhook_security.d.ts +94 -3
  311. package/dist/src/webhook_security.d.ts.map +1 -1
  312. package/dist/src/webhook_security.js +173 -9
  313. package/dist/src/webhook_security.js.map +1 -1
  314. package/dist/stubs/config/payments.stub +13 -0
  315. package/dist/stubs/config/payments_client.stub +42 -0
  316. package/dist/stubs/config/payments_dashboard.stub +38 -0
  317. package/dist/stubs/database/migrations/create_billing_tables.stub +35 -77
  318. package/dist/stubs/make/webhook_handler/main.stub +29 -11
  319. package/package.json +60 -25
@@ -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
- paidAt: new Date(),
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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"}