payment-kit 1.29.1 → 1.29.2

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 (310) hide show
  1. package/api/dev.ts +41 -2
  2. package/api/hono.d.ts +42 -0
  3. package/api/node-sqlite.d.ts +12 -0
  4. package/api/src/bootstrap.ts +36 -0
  5. package/api/src/crons/base.ts +3 -3
  6. package/api/src/crons/currency.ts +1 -1
  7. package/api/src/crons/index.ts +27 -24
  8. package/api/src/crons/metering-subscription-detection.ts +1 -1
  9. package/api/src/crons/overdue-detection.ts +2 -2
  10. package/api/src/crons/retry-pending-events.ts +6 -0
  11. package/api/src/index.ts +22 -161
  12. package/api/src/integrations/app-store/client.ts +3 -4
  13. package/api/src/integrations/app-store/handlers/subscription.ts +7 -7
  14. package/api/src/integrations/app-store/signed-data-verifier.ts +3 -2
  15. package/api/src/integrations/arcblock/token.ts +21 -7
  16. package/api/src/integrations/google-play/handlers/subscription.ts +6 -6
  17. package/api/src/integrations/google-play/handlers/voided.ts +2 -2
  18. package/api/src/integrations/google-play/verify.ts +3 -2
  19. package/api/src/integrations/iap-reconcile.ts +3 -5
  20. package/api/src/integrations/stripe/handlers/invoice.ts +2 -2
  21. package/api/src/integrations/stripe/handlers/subscription.ts +3 -3
  22. package/api/src/libs/archive/query.ts +19 -0
  23. package/api/src/libs/audit.ts +61 -4
  24. package/api/src/libs/auth.ts +99 -38
  25. package/api/src/libs/context.ts +78 -1
  26. package/api/src/libs/currency.ts +2 -2
  27. package/api/src/libs/dayjs.ts +8 -2
  28. package/api/src/libs/drivers/auth-storage.ts +118 -0
  29. package/api/src/libs/drivers/cron.ts +264 -0
  30. package/api/src/libs/drivers/db.ts +170 -0
  31. package/api/src/libs/drivers/identity.ts +81 -0
  32. package/api/src/libs/drivers/index.ts +40 -0
  33. package/api/src/libs/drivers/locks.ts +226 -0
  34. package/api/src/libs/drivers/migrate-runner.ts +70 -0
  35. package/api/src/libs/drivers/queue.ts +104 -0
  36. package/api/src/libs/drivers/secrets.ts +194 -0
  37. package/api/src/libs/env.ts +170 -54
  38. package/api/src/libs/exchange-rate/service.ts +7 -6
  39. package/api/src/libs/http-fetch-adapter.ts +50 -0
  40. package/api/src/libs/invoice.ts +1 -1
  41. package/api/src/libs/lock.ts +51 -47
  42. package/api/src/libs/logger.ts +48 -8
  43. package/api/src/libs/notification/index.ts +1 -1
  44. package/api/src/libs/notification/template/customer-credit-low-balance.ts +2 -1
  45. package/api/src/libs/notification/template/customer-revenue-succeeded.ts +1 -1
  46. package/api/src/libs/notification/template/customer-reward-succeeded.ts +1 -1
  47. package/api/src/libs/overdraft-protection.ts +1 -1
  48. package/api/src/libs/payout.ts +1 -1
  49. package/api/src/libs/queue/index.ts +259 -52
  50. package/api/src/libs/queue/runtime.ts +175 -0
  51. package/api/src/libs/resource.ts +3 -3
  52. package/api/src/libs/secrets.ts +38 -0
  53. package/api/src/libs/session.ts +3 -2
  54. package/api/src/libs/subscription.ts +5 -5
  55. package/api/src/libs/tenant.ts +92 -0
  56. package/api/src/libs/url.ts +3 -3
  57. package/api/src/libs/util.ts +21 -13
  58. package/api/src/middlewares/hono/cdn.ts +63 -0
  59. package/api/src/middlewares/hono/context.ts +73 -0
  60. package/api/src/middlewares/hono/csrf.ts +72 -0
  61. package/api/src/middlewares/hono/fallback.ts +194 -0
  62. package/api/src/middlewares/hono/pipeline.ts +73 -0
  63. package/api/src/middlewares/hono/resource-mount.ts +42 -0
  64. package/api/src/middlewares/hono/resource.ts +63 -0
  65. package/api/src/middlewares/hono/security.ts +214 -0
  66. package/api/src/middlewares/hono/session.ts +114 -0
  67. package/api/src/middlewares/hono/xss.ts +61 -0
  68. package/api/src/queues/auto-recharge.ts +12 -10
  69. package/api/src/queues/checkout-session.ts +17 -12
  70. package/api/src/queues/credit-consume.ts +40 -36
  71. package/api/src/queues/credit-grant.ts +25 -18
  72. package/api/src/queues/credit-reconciliation.ts +7 -5
  73. package/api/src/queues/discount-status.ts +9 -6
  74. package/api/src/queues/event.ts +12 -4
  75. package/api/src/queues/exchange-rate-health.ts +49 -30
  76. package/api/src/queues/invoice.ts +18 -15
  77. package/api/src/queues/notification.ts +14 -7
  78. package/api/src/queues/payment.ts +41 -28
  79. package/api/src/queues/payout.ts +9 -5
  80. package/api/src/queues/refund.ts +18 -12
  81. package/api/src/queues/subscription.ts +83 -53
  82. package/api/src/queues/token-transfer.ts +15 -10
  83. package/api/src/queues/usage-record.ts +8 -5
  84. package/api/src/queues/vendors/commission.ts +7 -5
  85. package/api/src/queues/vendors/fulfillment-coordinator.ts +17 -13
  86. package/api/src/queues/vendors/fulfillment.ts +4 -2
  87. package/api/src/queues/vendors/return-processor.ts +5 -3
  88. package/api/src/queues/vendors/return-scanner.ts +5 -4
  89. package/api/src/queues/vendors/status-check.ts +10 -7
  90. package/api/src/queues/webhook.ts +60 -32
  91. package/api/src/routes/connect/shared.ts +1 -2
  92. package/api/src/routes/connect/subscribe.ts +3 -3
  93. package/api/src/routes/{archive.ts → hono/archive.ts} +69 -64
  94. package/api/src/routes/{auto-recharge-configs.ts → hono/auto-recharge-configs.ts} +39 -28
  95. package/api/src/routes/{checkout-sessions.ts → hono/checkout-sessions.ts} +790 -923
  96. package/api/src/routes/{coupons.ts → hono/coupons.ts} +93 -76
  97. package/api/src/routes/{credit-grants.ts → hono/credit-grants.ts} +140 -126
  98. package/api/src/routes/hono/credit-tokens.ts +43 -0
  99. package/api/src/routes/{credit-transactions.ts → hono/credit-transactions.ts} +37 -29
  100. package/api/src/routes/{customers.ts → hono/customers.ts} +193 -223
  101. package/api/src/routes/{donations.ts → hono/donations.ts} +41 -32
  102. package/api/src/routes/{entitlements.ts → hono/entitlements.ts} +28 -25
  103. package/api/src/routes/{events.ts → hono/events.ts} +107 -71
  104. package/api/src/routes/{exchange-rate-providers.ts → hono/exchange-rate-providers.ts} +138 -126
  105. package/api/src/routes/hono/exchange-rates.ts +77 -0
  106. package/api/src/routes/hono/index.ts +115 -0
  107. package/api/src/routes/{integrations → hono/integrations}/app-store.ts +68 -48
  108. package/api/src/routes/{integrations → hono/integrations}/google-play.ts +78 -58
  109. package/api/src/routes/hono/integrations/stripe.ts +74 -0
  110. package/api/src/routes/{invoices.ts → hono/invoices.ts} +253 -244
  111. package/api/src/routes/{meter-events.ts → hono/meter-events.ts} +120 -110
  112. package/api/src/routes/hono/meters.ts +288 -0
  113. package/api/src/routes/hono/passports.ts +73 -0
  114. package/api/src/routes/{payment-currencies.ts → hono/payment-currencies.ts} +219 -197
  115. package/api/src/routes/{payment-intents.ts → hono/payment-intents.ts} +136 -132
  116. package/api/src/routes/{payment-links.ts → hono/payment-links.ts} +145 -128
  117. package/api/src/routes/{payment-methods.ts → hono/payment-methods.ts} +125 -93
  118. package/api/src/routes/{payment-stats.ts → hono/payment-stats.ts} +30 -25
  119. package/api/src/routes/{payouts.ts → hono/payouts.ts} +55 -47
  120. package/api/src/routes/{prices.ts → hono/prices.ts} +265 -242
  121. package/api/src/routes/{pricing-table.ts → hono/pricing-table.ts} +94 -87
  122. package/api/src/routes/{products.ts → hono/products.ts} +172 -159
  123. package/api/src/routes/{promotion-codes.ts → hono/promotion-codes.ts} +207 -185
  124. package/api/src/routes/hono/redirect.ts +24 -0
  125. package/api/src/routes/{refunds.ts → hono/refunds.ts} +96 -80
  126. package/api/src/routes/{settings.ts → hono/settings.ts} +64 -55
  127. package/api/src/routes/{subscription-items.ts → hono/subscription-items.ts} +64 -57
  128. package/api/src/routes/{subscriptions.ts → hono/subscriptions.ts} +475 -528
  129. package/api/src/routes/{tax-rates.ts → hono/tax-rates.ts} +71 -70
  130. package/api/src/routes/hono/tool.ts +69 -0
  131. package/api/src/routes/{usage-records.ts → hono/usage-records.ts} +47 -42
  132. package/api/src/routes/{vendor.ts → hono/vendor.ts} +315 -167
  133. package/api/src/routes/{webhook-attempts.ts → hono/webhook-attempts.ts} +17 -13
  134. package/api/src/routes/hono/webhook-endpoints.ts +126 -0
  135. package/api/src/service.ts +667 -0
  136. package/api/src/store/migrations/20230911-seeding.ts +2 -1
  137. package/api/src/store/migrations/20260609-remove-did-space-jobs.ts +23 -0
  138. package/api/src/store/migrations/20260610-tenant-columns.ts +40 -0
  139. package/api/src/store/migrations/20260611-tenant-backfill.ts +33 -0
  140. package/api/src/store/models/auto-recharge-config.ts +22 -10
  141. package/api/src/store/models/checkout-session.ts +15 -14
  142. package/api/src/store/models/coupon.ts +29 -20
  143. package/api/src/store/models/credit-grant.ts +38 -29
  144. package/api/src/store/models/credit-transaction.ts +32 -21
  145. package/api/src/store/models/customer.ts +19 -17
  146. package/api/src/store/models/discount.ts +11 -2
  147. package/api/src/store/models/entitlement-grant.ts +21 -9
  148. package/api/src/store/models/entitlement-product.ts +21 -9
  149. package/api/src/store/models/entitlement.ts +19 -10
  150. package/api/src/store/models/event.ts +18 -9
  151. package/api/src/store/models/exchange-rate-provider.ts +17 -4
  152. package/api/src/store/models/invoice-item.ts +18 -9
  153. package/api/src/store/models/invoice.ts +16 -8
  154. package/api/src/store/models/meter-event.ts +27 -9
  155. package/api/src/store/models/meter.ts +31 -22
  156. package/api/src/store/models/payment-currency.ts +25 -8
  157. package/api/src/store/models/payment-intent.ts +15 -6
  158. package/api/src/store/models/payment-link.ts +15 -6
  159. package/api/src/store/models/payment-method.ts +38 -22
  160. package/api/src/store/models/payment-stat.ts +18 -9
  161. package/api/src/store/models/payout.ts +15 -6
  162. package/api/src/store/models/price-quote.ts +17 -8
  163. package/api/src/store/models/price.ts +24 -12
  164. package/api/src/store/models/pricing-table.ts +29 -20
  165. package/api/src/store/models/product-vendor.ts +20 -10
  166. package/api/src/store/models/product.ts +15 -6
  167. package/api/src/store/models/promotion-code.ts +14 -6
  168. package/api/src/store/models/refund.ts +15 -6
  169. package/api/src/store/models/revenue-snapshot.ts +21 -9
  170. package/api/src/store/models/setting.ts +18 -9
  171. package/api/src/store/models/setup-intent.ts +36 -27
  172. package/api/src/store/models/subscription-item.ts +21 -9
  173. package/api/src/store/models/subscription-schedule.ts +21 -9
  174. package/api/src/store/models/subscription.ts +21 -10
  175. package/api/src/store/models/tax-rate.ts +29 -21
  176. package/api/src/store/models/usage-record.ts +11 -2
  177. package/api/src/store/models/webhook-attempt.ts +18 -9
  178. package/api/src/store/models/webhook-endpoint.ts +18 -9
  179. package/api/src/store/scoped-core.ts +55 -0
  180. package/api/src/store/scoped.ts +247 -0
  181. package/api/src/store/sequelize.ts +66 -22
  182. package/api/src/store/sql-migrations.ts +20 -0
  183. package/api/src/store/tenant-backfill.ts +260 -0
  184. package/api/src/store/tenant-model.ts +124 -0
  185. package/api/src/store/tenant-tables.ts +50 -0
  186. package/api/tests/embedded/embedded-multi-mode-d3.spec.ts +257 -0
  187. package/api/tests/fixtures/bare-query-violation.ts +13 -0
  188. package/api/tests/fixtures/core-env-violation.ts +10 -0
  189. package/api/tests/fixtures/host-read-violation.ts +19 -0
  190. package/api/tests/fixtures/tenants.ts +4 -0
  191. package/api/tests/integrations/iap-tenant.spec.ts +284 -0
  192. package/api/tests/libs/archive-query.spec.ts +26 -0
  193. package/api/tests/libs/audit-tenant.spec.ts +153 -0
  194. package/api/tests/libs/context.spec.ts +204 -0
  195. package/api/tests/libs/core-config.spec.ts +115 -0
  196. package/api/tests/libs/cron-driver-d2.spec.ts +237 -0
  197. package/api/tests/libs/crons-conservation-d2.spec.ts +52 -0
  198. package/api/tests/libs/lock-tenant.spec.ts +66 -0
  199. package/api/tests/libs/scoped.spec.ts +222 -0
  200. package/api/tests/libs/secrets-facade.spec.ts +52 -0
  201. package/api/tests/libs/tenancy-slot-authority.spec.ts +209 -0
  202. package/api/tests/libs/tenant-middleware.spec.ts +42 -0
  203. package/api/tests/libs/tenant-scanner.spec.ts +120 -0
  204. package/api/tests/middlewares/hono/cdn.spec.ts +70 -0
  205. package/api/tests/middlewares/hono/context.spec.ts +113 -0
  206. package/api/tests/middlewares/hono/csrf.spec.ts +136 -0
  207. package/api/tests/middlewares/hono/fallback.spec.ts +67 -0
  208. package/api/tests/middlewares/hono/pipeline.spec.ts +47 -0
  209. package/api/tests/middlewares/hono/security.spec.ts +181 -0
  210. package/api/tests/middlewares/hono/session.spec.ts +42 -0
  211. package/api/tests/middlewares/hono/xss.spec.ts +81 -0
  212. package/api/tests/models/tenant-backfill.spec.ts +287 -0
  213. package/api/tests/models/tenant-columns-model.spec.ts +46 -0
  214. package/api/tests/models/tenant-columns.spec.ts +161 -0
  215. package/api/tests/queues/credit-consume-batch.spec.ts +8 -1
  216. package/api/tests/queues/credit-consume.spec.ts +8 -1
  217. package/api/tests/queues/event-tenant.spec.ts +236 -0
  218. package/api/tests/queues/exchange-rate-health-tenant-d6.spec.ts +62 -0
  219. package/api/tests/queues/queue-parity.spec.ts +249 -0
  220. package/api/tests/queues/queue-runtime-surface.spec.ts +277 -0
  221. package/api/tests/queues/queue-teardown-d2.spec.ts +127 -0
  222. package/api/tests/queues/tenant-matrix-a.spec.ts +245 -0
  223. package/api/tests/queues/tenant-matrix-b.spec.ts +168 -0
  224. package/api/tests/routes/connect/hono-attach.spec.ts +107 -0
  225. package/api/tests/service/collapse.spec.ts +96 -0
  226. package/api/tests/store/tenant-crosscut.spec.ts +202 -0
  227. package/api/tests/store/tenant-model-spike.spec.ts +177 -0
  228. package/api/tests/store/tenant-model.spec.ts +162 -0
  229. package/api/tests/store/tenant-residual.spec.ts +196 -0
  230. package/api/third.d.ts +4 -0
  231. package/blocklet.yml +1 -1
  232. package/cloudflare/README.md +26 -6
  233. package/cloudflare/build.ts +28 -13
  234. package/cloudflare/did-connect-auth.ts +0 -217
  235. package/cloudflare/migrations/0006_tenant_columns.sql +46 -0
  236. package/cloudflare/migrations/0007_tenant_backfill_indexes.sql +65 -0
  237. package/cloudflare/migrations/0008_schema_parity.sql +16 -0
  238. package/cloudflare/migrations/0009_remove_did_space_jobs.sql +5 -0
  239. package/cloudflare/queue-runtime-mode.ts +13 -0
  240. package/cloudflare/run-build.js +10 -56
  241. package/cloudflare/shims/blocklet-sdk/asset-host-transformer.ts +20 -0
  242. package/cloudflare/shims/blocklet-sdk/config.ts +8 -1
  243. package/cloudflare/shims/blocklet-sdk/login.ts +12 -0
  244. package/cloudflare/shims/blocklet-sdk/service-api.ts +14 -0
  245. package/cloudflare/shims/blocklet-sdk/session.ts +4 -2
  246. package/cloudflare/shims/blocklet-sdk/util-constants.ts +8 -0
  247. package/cloudflare/shims/blocklet-sdk/util-csrf.ts +13 -0
  248. package/cloudflare/shims/blocklet-sdk/util-wallet.ts +8 -0
  249. package/cloudflare/shims/cron.ts +38 -158
  250. package/cloudflare/shims/events.ts +124 -0
  251. package/cloudflare/shims/fastq.ts +15 -1
  252. package/cloudflare/shims/nedb-storage.ts +16 -8
  253. package/cloudflare/shims/xss.ts +8 -0
  254. package/cloudflare/tenant-middleware.ts +36 -0
  255. package/cloudflare/tests/tenant-middleware.spec.ts +160 -0
  256. package/cloudflare/tests/worker-handler-gate.spec.ts +44 -0
  257. package/cloudflare/worker.ts +204 -433
  258. package/cloudflare/wrangler.local-e2e.jsonc +26 -0
  259. package/jest.config.js +3 -1
  260. package/package.json +33 -38
  261. package/scripts/core-env-whitelist.json +1 -0
  262. package/scripts/e2e-12b-runtime.ts +149 -0
  263. package/scripts/e2e-core-config.ts +125 -0
  264. package/scripts/e2e-d1-tenancy.ts +116 -0
  265. package/scripts/e2e-d2-cron-queue.ts +139 -0
  266. package/scripts/e2e-d3-embedded-multi.ts +171 -0
  267. package/scripts/e2e-hono-s2.ts +125 -0
  268. package/scripts/e2e-hono-s3e.ts +135 -0
  269. package/scripts/e2e-hono-s4.ts +114 -0
  270. package/scripts/e2e-migration-contract.ts +100 -0
  271. package/scripts/e2e-s0.ts +61 -0
  272. package/scripts/e2e-s1.ts +107 -0
  273. package/scripts/e2e-s2.ts +178 -0
  274. package/scripts/e2e-s3.ts +110 -0
  275. package/scripts/e2e-s4.ts +191 -0
  276. package/scripts/e2e-s5.ts +139 -0
  277. package/scripts/e2e-s6.ts +127 -0
  278. package/scripts/e2e-tenant-model.ts +119 -0
  279. package/scripts/e2e-tenant-worker.ts +199 -0
  280. package/scripts/gen-sql-migrations.js +46 -0
  281. package/scripts/phase8-codemod.js +219 -0
  282. package/scripts/phase9a-env-getters-codemod.js +82 -0
  283. package/scripts/scan-core-env.js +109 -0
  284. package/scripts/scan-tenant-queries.js +235 -0
  285. package/scripts/schema-drift-guard.ts +210 -0
  286. package/scripts/tenant-scan-whitelist.json +1 -0
  287. package/src/env.d.ts +13 -1
  288. package/tsconfig.json +1 -1
  289. package/api/src/libs/did-space.ts +0 -235
  290. package/api/src/libs/middleware.ts +0 -50
  291. package/api/src/libs/security.ts +0 -192
  292. package/api/src/queues/space.ts +0 -662
  293. package/api/src/routes/credit-tokens.ts +0 -38
  294. package/api/src/routes/exchange-rates.ts +0 -87
  295. package/api/src/routes/index.ts +0 -142
  296. package/api/src/routes/integrations/stripe.ts +0 -61
  297. package/api/src/routes/meters.ts +0 -274
  298. package/api/src/routes/passports.ts +0 -68
  299. package/api/src/routes/redirect.ts +0 -20
  300. package/api/src/routes/tool.ts +0 -65
  301. package/api/src/routes/webhook-endpoints.ts +0 -126
  302. package/api/tests/routes/credit-grants.spec.ts +0 -1261
  303. package/cloudflare/shims/did-space-js.ts +0 -17
  304. package/cloudflare/shims/did-space.ts +0 -11
  305. package/cloudflare/shims/express-compat/index.ts +0 -80
  306. package/cloudflare/shims/express-compat/types.ts +0 -41
  307. package/cloudflare/shims/lock.ts +0 -115
  308. package/cloudflare/shims/queue.ts +0 -611
  309. package/cloudflare/tests/shims/queue-delayed-persist.spec.ts +0 -87
  310. package/cloudflare/tests/shims/queue-scheduled.spec.ts +0 -186
@@ -1,20 +1,30 @@
1
+ // Phase 3 (express→hono) — hono fork of routes/refunds.ts. Sub-app with
2
+ // routes relative to /api/refunds (mounted via mountResourceGroup). The
3
+ // business logic is unchanged; only the express plumbing becomes hono:
4
+ // req.body → c.get('sanitizedBody') ?? {}; res.status(n).json(x) → c.json(x, n).
1
5
  /* eslint-disable no-console */
2
6
  /* eslint-disable consistent-return */
3
7
  import OcapClient from '@ocap/client';
4
8
  import { BN, fromTokenToUnit } from '@ocap/util';
5
9
  import { ethers } from 'ethers';
6
- import { Router } from 'express';
10
+ import { Hono } from 'hono';
7
11
  import Joi from 'joi';
8
12
  import pick from 'lodash/pick';
9
13
 
10
14
  import { getWallet } from '@blocklet/sdk/lib/wallet';
11
15
  import { Op } from 'sequelize';
12
- import { sendErc20ToUser } from '../integrations/ethereum/token';
13
- import { BNPositiveValidator, createListParamSchema, getOrder, getWhereFromKvQuery, MetadataSchema } from '../libs/api';
14
- import { wallet } from '../libs/auth';
15
- import { EVM_CHAIN_TYPES } from '../libs/constants';
16
- import { authenticate } from '../libs/security';
17
- import { formatMetadata } from '../libs/util';
16
+ import { sendErc20ToUser } from '../../integrations/ethereum/token';
17
+ import {
18
+ BNPositiveValidator,
19
+ createListParamSchema,
20
+ getOrder,
21
+ getWhereFromKvQuery,
22
+ MetadataSchema,
23
+ } from '../../libs/api';
24
+ import { wallet } from '../../libs/auth';
25
+ import { EVM_CHAIN_TYPES } from '../../libs/constants';
26
+ import { authenticate } from '../../middlewares/hono/security';
27
+ import { formatMetadata } from '../../libs/util';
18
28
  import {
19
29
  Customer,
20
30
  Invoice,
@@ -23,12 +33,12 @@ import {
23
33
  PaymentMethod,
24
34
  Refund,
25
35
  Subscription,
26
- } from '../store/models';
27
- import logger from '../libs/logger';
28
- import { getGasPayerExtra } from '../libs/payment';
29
- import { getRefundAmountSetup } from '../libs/refund';
36
+ } from '../../store/models';
37
+ import logger from '../../libs/logger';
38
+ import { getGasPayerExtra } from '../../libs/payment';
39
+ import { getRefundAmountSetup } from '../../libs/refund';
30
40
 
31
- const router = Router();
41
+ const app = new Hono();
32
42
  const authAdmin = authenticate<Invoice>({ component: true, roles: ['owner', 'admin'] });
33
43
  const auth = authenticate<Invoice>({
34
44
  component: true,
@@ -55,8 +65,8 @@ const paginationSchema = createListParamSchema<{
55
65
  subscription_id: Joi.string().empty(''),
56
66
  customer_id: Joi.string().empty(''),
57
67
  });
58
- router.get('/', auth, async (req, res) => {
59
- const { page, pageSize, livemode, status, ...query } = await paginationSchema.validateAsync(req.query, {
68
+ app.get('/', auth, async (c) => {
69
+ const { page, pageSize, livemode, status, ...query } = await paginationSchema.validateAsync(c.req.query(), {
60
70
  stripUnknown: false,
61
71
  allowUnknown: true,
62
72
  });
@@ -75,7 +85,7 @@ router.get('/', auth, async (req, res) => {
75
85
  }
76
86
 
77
87
  if (query.customer_id) {
78
- where.customer_id = query.customer_id;
88
+ where.customer_id = c.get('customer_id') ?? query.customer_id;
79
89
  }
80
90
 
81
91
  if (query.subscription_id) {
@@ -102,7 +112,7 @@ router.get('/', auth, async (req, res) => {
102
112
 
103
113
  const { rows: list, count } = await Refund.findAndCountAll({
104
114
  where,
105
- order: getOrder(req.query, [['created_at', query.o === 'asc' ? 'ASC' : 'DESC']]),
115
+ order: getOrder(c.req.query(), [['created_at', query.o === 'asc' ? 'ASC' : 'DESC']]),
106
116
  offset: (page - 1) * pageSize,
107
117
  limit: pageSize,
108
118
  include: [
@@ -116,7 +126,7 @@ router.get('/', auth, async (req, res) => {
116
126
  distinct: true,
117
127
  });
118
128
 
119
- res.json({ count, list, paging: { page, pageSize } });
129
+ return c.json({ count, list, paging: { page, pageSize } });
120
130
  });
121
131
 
122
132
  const searchSchema = createListParamSchema<{}>({});
@@ -134,35 +144,36 @@ const refundRequestSchema = Joi.object({
134
144
  invoice_id: Joi.string().optional(),
135
145
  subscription_id: Joi.string().optional(),
136
146
  });
137
- router.post('/', authAdmin, async (req, res) => {
138
- const { error } = refundRequestSchema.validate(req.body);
147
+ app.post('/', authAdmin, async (c) => {
148
+ const body = c.get('sanitizedBody') ?? {};
149
+ const { error } = refundRequestSchema.validate(body);
139
150
  if (error) {
140
- return res.status(400).json({ error: `Refund request invalid: ${error.message}` });
151
+ return c.json({ error: `Refund request invalid: ${error.message}` }, 400);
141
152
  }
142
153
  try {
143
- const paymentCurrency = await PaymentCurrency.findByPk(req.body.currency_id);
154
+ const paymentCurrency = await PaymentCurrency.findByPk(body.currency_id);
144
155
  if (!paymentCurrency) {
145
156
  throw new Error('payment currency not found');
146
157
  }
147
- const amount = fromTokenToUnit(req.body.amount, paymentCurrency?.decimal).toString();
158
+ const amount = fromTokenToUnit(body.amount, paymentCurrency?.decimal).toString();
148
159
  const amountBN = new BN(amount);
149
160
  const result = await getRefundAmountSetup({
150
- paymentIntentId: req.body.payment_intent_id,
161
+ paymentIntentId: body.payment_intent_id,
151
162
  });
152
163
  if (amountBN.gt(new BN(result.amount))) {
153
164
  throw new Error('refund amount exceeds the available amount');
154
165
  }
155
166
 
156
- const paymentMethod = await PaymentMethod.findByPk(req.body.payment_method_id);
167
+ const paymentMethod = await PaymentMethod.findByPk(body.payment_method_id);
157
168
  if (!paymentMethod) {
158
- throw new Error(`payment method not found: ${req.body.payment_method_id}`);
169
+ throw new Error(`payment method not found: ${body.payment_method_id}`);
159
170
  }
160
171
  const item = await Refund.create({
161
- ...req.body,
172
+ ...body,
162
173
  type: 'refund',
163
- livemode: !!req.livemode,
174
+ livemode: !!c.get('livemode'),
164
175
  amount,
165
- metadata: formatMetadata(req.body.metadata),
176
+ metadata: formatMetadata(body.metadata),
166
177
  attempt_count: 0,
167
178
  attempted: false,
168
179
  next_attempt: 0,
@@ -174,25 +185,25 @@ router.post('/', authAdmin, async (req, res) => {
174
185
  ending_token_balance: {},
175
186
  });
176
187
  logger.info('refund created', {
177
- ...req.params,
178
- ...req.body,
188
+ ...c.req.param(),
189
+ ...body,
179
190
  result: item.toJSON(),
180
- requestedBy: req.user?.did,
191
+ requestedBy: c.get('user')?.did,
181
192
  });
182
- res.json(item);
193
+ return c.json(item);
183
194
  } catch (err) {
184
195
  logger.error('Create refund failed', {
185
196
  error: err.message,
186
197
  stack: err.stack,
187
- requestBody: req.body,
188
- requestedBy: req.user?.did,
198
+ requestBody: body,
199
+ requestedBy: c.get('user')?.did,
189
200
  });
190
- res.status(400).json({ error: err.message });
201
+ return c.json({ error: err.message }, 400);
191
202
  }
192
203
  });
193
204
 
194
- router.get('/search', auth, async (req, res) => {
195
- const { page, pageSize, livemode, q, o } = await searchSchema.validateAsync(req.query, {
205
+ app.get('/search', auth, async (c) => {
206
+ const { page, pageSize, livemode, q, o } = await searchSchema.validateAsync(c.req.query(), {
196
207
  stripUnknown: false,
197
208
  allowUnknown: true,
198
209
  });
@@ -204,7 +215,7 @@ router.get('/search', auth, async (req, res) => {
204
215
 
205
216
  const { rows: list, count } = await Refund.findAndCountAll({
206
217
  where,
207
- order: getOrder(req.query, [['created_at', o === 'asc' ? 'ASC' : 'DESC']]),
218
+ order: getOrder(c.req.query(), [['created_at', o === 'asc' ? 'ASC' : 'DESC']]),
208
219
  offset: (page - 1) * pageSize,
209
220
  limit: pageSize,
210
221
  include: [
@@ -213,7 +224,7 @@ router.get('/search', auth, async (req, res) => {
213
224
  ],
214
225
  });
215
226
 
216
- res.json({ count, list, paging: { page, pageSize } });
227
+ return c.json({ count, list, paging: { page, pageSize } });
217
228
  });
218
229
 
219
230
  // Helper function: Query payment method and currency by contract and chain type
@@ -440,15 +451,16 @@ const syncRefundRequestSchema = Joi.object({
440
451
  metadata: MetadataSchema.optional(),
441
452
  });
442
453
 
443
- router.post('/sync', authAdmin, async (req: any, res: any) => {
444
- const { error } = syncRefundRequestSchema.validate(req.body);
454
+ app.post('/sync', authAdmin, async (c: any) => {
455
+ const body = c.get('sanitizedBody') ?? {};
456
+ const { error } = syncRefundRequestSchema.validate(body);
445
457
  if (error) {
446
- return res.status(400).json({ error: `Refund request invalid: ${error.message}` });
458
+ return c.json({ error: `Refund request invalid: ${error.message}` }, 400);
447
459
  }
448
460
 
449
461
  // Extract and validate request data
450
- const { livemode, amount, destination, contract, chainType, chainApiHost } = req.body;
451
- const { description, metadata, orderId, customerName } = req.body;
462
+ const { livemode, amount, destination, contract, chainType, chainApiHost } = body;
463
+ const { description, metadata, orderId, customerName } = body;
452
464
 
453
465
  try {
454
466
  // Convert and validate input types
@@ -482,7 +494,7 @@ router.post('/sync', authAdmin, async (req: any, res: any) => {
482
494
  status: existingRefund.status,
483
495
  });
484
496
 
485
- return res.json(existingRefund);
497
+ return c.json(existingRefund);
486
498
  }
487
499
  }
488
500
 
@@ -568,7 +580,7 @@ router.post('/sync', authAdmin, async (req: any, res: any) => {
568
580
  destination,
569
581
  amount,
570
582
  chainType,
571
- requestedBy: req.user?.did,
583
+ requestedBy: c.get('user')?.did,
572
584
  });
573
585
 
574
586
  // Process transfer
@@ -594,7 +606,7 @@ router.post('/sync', authAdmin, async (req: any, res: any) => {
594
606
  logger.info('Synchronous refund transfer completed', {
595
607
  refundId: refund.id,
596
608
  txHash,
597
- requestedBy: req.user?.did,
609
+ requestedBy: c.get('user')?.did,
598
610
  });
599
611
 
600
612
  // Reload and enrich refund data
@@ -610,11 +622,11 @@ router.post('/sync', authAdmin, async (req: any, res: any) => {
610
622
  throw new Error('Refund not found after processing');
611
623
  }
612
624
 
613
- return res.json(updatedRefund.toJSON());
625
+ return c.json(updatedRefund.toJSON());
614
626
  } catch (processError: any) {
615
627
  logger.error('Synchronous refund transfer failed', {
616
628
  error: processError,
617
- requestedBy: req.user?.did,
629
+ requestedBy: c.get('user')?.did,
618
630
  });
619
631
  // Handle transfer failure
620
632
  await refund.update({
@@ -632,7 +644,7 @@ router.post('/sync', authAdmin, async (req: any, res: any) => {
632
644
  logger.error('Synchronous refund transfer failed', {
633
645
  refundId: refund.id,
634
646
  error: processError.message || processError.error?.message,
635
- requestedBy: req.user?.did,
647
+ requestedBy: c.get('user')?.did,
636
648
  });
637
649
 
638
650
  // Reload and enrich failed refund data
@@ -645,24 +657,27 @@ router.post('/sync', authAdmin, async (req: any, res: any) => {
645
657
  });
646
658
 
647
659
  if (failedRefund) {
648
- return res.status(400).json({
649
- ...failedRefund.toJSON(),
650
- error: processError.message || processError.error?.message || 'Refund transfer failed',
651
- });
660
+ return c.json(
661
+ {
662
+ ...failedRefund.toJSON(),
663
+ error: processError.message || processError.error?.message || 'Refund transfer failed',
664
+ },
665
+ 400
666
+ );
652
667
  }
653
668
  throw processError;
654
669
  }
655
670
  } catch (err: any) {
656
671
  logger.error('Create synchronous refund failed', {
657
672
  error: err,
658
- requestedBy: req.user?.did,
673
+ requestedBy: c.get('user')?.did,
659
674
  });
660
- return res.status(400).json({ error: err.message });
675
+ return c.json({ error: err.message }, 400);
661
676
  }
662
677
  });
663
678
 
664
- router.get('/:id', auth, async (req, res) => {
665
- const doc = await Refund.findByPk(req.params.id as string, {
679
+ app.get('/:id', auth, async (c) => {
680
+ const doc = await Refund.findByPk(c.req.param('id') as string, {
666
681
  include: [
667
682
  { model: Customer, as: 'customer' },
668
683
  { model: PaymentCurrency, as: 'paymentCurrency' },
@@ -676,25 +691,26 @@ router.get('/:id', auth, async (req, res) => {
676
691
  if (doc) {
677
692
  // @ts-ignore
678
693
  const paymentMethod = await PaymentMethod.findByPk(doc.paymentCurrency.payment_method_id);
679
- return res.json({ ...doc.toJSON(), paymentMethod: paymentMethod?.toJSON() });
694
+ return c.json({ ...doc.toJSON(), paymentMethod: paymentMethod?.toJSON() });
680
695
  }
681
696
 
682
- return res.status(404).json(null);
697
+ return c.json(null, 404);
683
698
  });
684
699
 
685
700
  // eslint-disable-next-line consistent-return
686
- router.put('/:id', authAdmin, async (req, res) => {
701
+ app.put('/:id', authAdmin, async (c) => {
687
702
  try {
688
- const doc = await Refund.findByPk(req.params.id as string);
703
+ const body = c.get('sanitizedBody') ?? {};
704
+ const doc = await Refund.findByPk(c.req.param('id') as string);
689
705
  if (!doc) {
690
- return res.status(404).json({ error: 'Refund not found' });
706
+ return c.json({ error: 'Refund not found' }, 404);
691
707
  }
692
708
 
693
- const raw = pick(req.body, ['metadata']);
709
+ const raw = pick(body, ['metadata']);
694
710
  if (raw.metadata) {
695
711
  const { error: metadataError } = MetadataSchema.validate(raw.metadata);
696
712
  if (metadataError) {
697
- return res.status(400).json({ error: `metadata invalid: ${metadataError.message}` });
713
+ return c.json({ error: `metadata invalid: ${metadataError.message}` }, 400);
698
714
  }
699
715
  raw.metadata = formatMetadata(raw.metadata);
700
716
  }
@@ -703,40 +719,40 @@ router.put('/:id', authAdmin, async (req, res) => {
703
719
  logger.info('Refund updated', {
704
720
  refundId: doc.id,
705
721
  updatedFields: Object.keys(raw),
706
- requestedBy: req.user?.did,
722
+ requestedBy: c.get('user')?.did,
707
723
  });
708
- res.json(doc);
724
+ return c.json(doc);
709
725
  } catch (err) {
710
726
  logger.error('Update refund failed', {
711
- refundId: req.params.id,
727
+ refundId: c.req.param('id'),
712
728
  error: err.message,
713
729
  stack: err.stack,
714
- requestBody: req.body,
715
- requestedBy: req.user?.did,
730
+ requestBody: c.get('sanitizedBody') ?? {},
731
+ requestedBy: c.get('user')?.did,
716
732
  });
717
- return res.status(400).json({ error: err.message });
733
+ return c.json({ error: err.message }, 400);
718
734
  }
719
735
  });
720
736
 
721
- router.post('/:id/cancel', authAdmin, async (req, res) => {
722
- const doc = await Refund.findByPk(req.params.id as string);
737
+ app.post('/:id/cancel', authAdmin, async (c) => {
738
+ const doc = await Refund.findByPk(c.req.param('id') as string);
723
739
  if (!doc) {
724
- return res.status(404).json({ error: 'Refund not found' });
740
+ return c.json({ error: 'Refund not found' }, 404);
725
741
  }
726
742
  if (doc.status === 'succeeded') {
727
- return res.status(400).json({ error: 'Refund is already succeeded' });
743
+ return c.json({ error: 'Refund is already succeeded' }, 400);
728
744
  }
729
745
  try {
730
746
  await doc.update({ status: 'canceled' });
731
- return res.json(doc);
747
+ return c.json(doc);
732
748
  } catch (err) {
733
749
  logger.error('Cancel refund failed', {
734
- refundId: req.params.id,
750
+ refundId: c.req.param('id'),
735
751
  error: err.message,
736
- requestedBy: req.user?.did,
752
+ requestedBy: c.get('user')?.did,
737
753
  });
738
- return res.status(400).json({ error: err.message });
754
+ return c.json({ error: err.message }, 400);
739
755
  }
740
756
  });
741
757
 
742
- export default router;
758
+ export default app;