cabloy 5.1.131 → 5.1.133

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 (210) hide show
  1. package/.cabloy-version +1 -1
  2. package/.claude/skills/cabloy-worktree-environment/SKILL.md +6 -6
  3. package/.claude/skills/cabloy-worktree-environment/evals/evals.json +2 -2
  4. package/.github/workflows/vona-test-pg.yml +1 -1
  5. package/.github/workflows/vona-test-sqlite3.yml +1 -1
  6. package/CHANGELOG.md +28 -0
  7. package/cabloy-docs/backend/dto-guide.md +39 -4
  8. package/cabloy-docs/backend/dto-infer-generation.md +29 -0
  9. package/cabloy-docs/backend/openapi-guide.md +16 -0
  10. package/cabloy-docs/backend/validation-guide.md +45 -0
  11. package/cabloy-docs/frontend/environment-config-guide.md +8 -15
  12. package/cabloy-docs/frontend/navigation-guards-guide.md +3 -3
  13. package/cabloy-docs/frontend/page-route-guide.md +4 -4
  14. package/cabloy-docs/frontend/ssr-env.md +22 -29
  15. package/cabloy-docs/frontend/theme-guide.md +4 -4
  16. package/cabloy-docs/frontend/zova-router-under-the-hood.md +1 -1
  17. package/cabloy-docs/fullstack/deploy-cloudflare-docker.md +6 -6
  18. package/cabloy-docs/fullstack/parallel-worktree-environment.md +2 -2
  19. package/e2e/specs/a-commerce/commerce.spec.ts +479 -17
  20. package/e2e/specs/cabloy-basic/basic.spec.ts +30 -5
  21. package/package.json +7 -7
  22. package/vona/.claude/skills/detect-ssr-leak/SKILL.md +1 -1
  23. package/vona/packages-vona/vona/package.json +1 -1
  24. package/vona/pnpm-lock.yaml +120 -10
  25. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/skuCreate.tsx +3 -1
  26. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/skuSelectResItem.tsx +13 -1
  27. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/skuUpdate.tsx +3 -1
  28. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/skuView.tsx +13 -1
  29. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/entity/sku.tsx +6 -0
  30. package/vona/src/suite/a-commerce/modules/commerce-catalog/test/skuPresentation.test.ts +227 -0
  31. package/vona/src/suite/a-commerce/modules/commerce-member/src/.metadata/index.ts +46 -36
  32. package/vona/src/suite/a-commerce/modules/commerce-member/src/dto/addressSelectResItem.tsx +5 -13
  33. package/vona/src/suite/a-commerce/modules/commerce-member/src/service/address.ts +16 -1
  34. package/vona/src/suite/a-commerce/modules/commerce-member/test/addressPresentation.test.ts +210 -0
  35. package/vona/src/suite/a-commerce/modules/commerce-payment/src/service/commercePayScene.ts +13 -2
  36. package/vona/src/suite/a-commerce/modules/commerce-payment/test/paymentAttempt.test.ts +12 -0
  37. package/vona/src/suite/a-commerce/modules/commerce-promotion/src/service/coupon.ts +7 -1
  38. package/vona/src/suite/a-commerce/modules/commerce-trade/src/.metadata/index.ts +45 -2
  39. package/vona/src/suite/a-commerce/modules/commerce-trade/src/config/locale/en-us.ts +23 -0
  40. package/vona/src/suite/a-commerce/modules/commerce-trade/src/config/locale/zh-cn.ts +23 -0
  41. package/vona/src/suite/a-commerce/modules/commerce-trade/src/controller/order.ts +31 -0
  42. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/orderAdminLineBase.tsx +56 -0
  43. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/orderAdminLineResItem.tsx +17 -0
  44. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/orderAdminLineView.tsx +13 -0
  45. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/orderSelectResItem.tsx +26 -2
  46. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/orderView.tsx +197 -3
  47. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/refundRecoveryAction.tsx +19 -0
  48. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/refundRecoveryView.tsx +70 -0
  49. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockAuditSelectResItem.tsx +7 -1
  50. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockAuditView.tsx +21 -1
  51. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockBalanceSelectResItem.tsx +7 -1
  52. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockBalanceView.tsx +3 -1
  53. package/vona/src/suite/a-commerce/modules/commerce-trade/src/entity/order.tsx +12 -0
  54. package/vona/src/suite/a-commerce/modules/commerce-trade/src/model/order.ts +15 -2
  55. package/vona/src/suite/a-commerce/modules/commerce-trade/src/service/order.ts +215 -3
  56. package/vona/src/suite/a-commerce/modules/commerce-trade/src/service/stockAudit.ts +25 -2
  57. package/vona/src/suite/a-commerce/modules/commerce-trade/src/service/stockBalance.ts +14 -3
  58. package/vona/src/suite/a-commerce/modules/commerce-trade/test/checkoutReservation.test.ts +4 -4
  59. package/vona/src/suite/a-commerce/modules/commerce-trade/test/orderPresentation.test.ts +358 -0
  60. package/vona/src/suite/a-commerce/modules/commerce-trade/test/orderSnapshot.test.ts +8 -8
  61. package/vona/src/suite/a-commerce/modules/commerce-trade/test/paymentOutcome.test.ts +5 -1
  62. package/vona/src/suite/a-commerce/modules/commerce-trade/test/refundLifecycle.test.ts +50 -1
  63. package/vona/src/suite/a-commerce/modules/commerce-trade/test/stockPresentation.test.ts +324 -0
  64. package/vona/src/suite/a-home/modules/home-base/package.json +3 -2
  65. package/vona/src/suite/a-home/modules/home-base/src/.metadata/index.ts +93 -16
  66. package/vona/src/suite/a-home/modules/home-base/src/controller/siteCatalog.ts +21 -0
  67. package/vona/src/suite/a-home/modules/home-base/src/dto/siteCatalogSelectRes.ts +11 -0
  68. package/vona/src/suite/a-home/modules/home-base/src/dto/siteCatalogSelectResItem.ts +15 -0
  69. package/vona/src/suite/a-home/modules/home-base/src/service/siteCatalog.ts +29 -0
  70. package/vona/src/suite/cabloy-basic/modules/basic-siteadmin/src/bean/ssrSite.admin.ts +3 -0
  71. package/vona/src/suite/cabloy-basic/modules/basic-siteadmin/src/config/locale/en-us.ts +1 -0
  72. package/vona/src/suite/cabloy-basic/modules/basic-siteadmin/src/config/locale/zh-cn.ts +1 -0
  73. package/vona/src/suite/cabloy-basic/modules/basic-siteweb/src/bean/ssrSite.web.ts +3 -0
  74. package/vona/src/suite/cabloy-basic/modules/basic-siteweb/src/config/locale/en-us.ts +1 -0
  75. package/vona/src/suite/cabloy-basic/modules/basic-siteweb/src/config/locale/zh-cn.ts +1 -0
  76. package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/cli/ssrSite/boilerplate/{{sceneName}}.{{beanName}}.ts_ +1 -0
  77. package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/package.json +1 -1
  78. package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/src/types/env.ts +1 -3
  79. package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/src/types/ssrSite.ts +2 -1
  80. package/vona/src/suite-vendor/a-cabloy/package.json +1 -1
  81. package/vona/src/suite-vendor/a-pay/modules/a-pay/package.json +1 -1
  82. package/vona/src/suite-vendor/a-pay/modules/a-pay/src/.metadata/index.ts +67 -0
  83. package/vona/src/suite-vendor/a-pay/modules/a-pay/src/bean/bean.payProvider.ts +1 -0
  84. package/vona/src/suite-vendor/a-pay/modules/a-pay/src/bean/bean.payScene.ts +5 -4
  85. package/vona/src/suite-vendor/a-pay/modules/a-pay/src/bean/meta.index.ts +8 -0
  86. package/vona/src/suite-vendor/a-pay/modules/a-pay/src/bean/meta.version.ts +22 -0
  87. package/vona/src/suite-vendor/a-pay/modules/a-pay/src/bean/schedule.providerOperationDispatch.ts +1 -1
  88. package/vona/src/suite-vendor/a-pay/modules/a-pay/src/entity/paymentSession.tsx +6 -0
  89. package/vona/src/suite-vendor/a-pay/modules/a-pay/src/entity/providerOperation.tsx +3 -0
  90. package/vona/src/suite-vendor/a-pay/modules/a-pay/src/entity/providerOperationRecoveryAudit.tsx +53 -0
  91. package/vona/src/suite-vendor/a-pay/modules/a-pay/src/entity/refundOperation.tsx +6 -0
  92. package/vona/src/suite-vendor/a-pay/modules/a-pay/src/model/providerOperationRecoveryAudit.ts +12 -0
  93. package/vona/src/suite-vendor/a-pay/modules/a-pay/src/service/paymentSession.ts +6 -2
  94. package/vona/src/suite-vendor/a-pay/modules/a-pay/src/service/providerOperation.ts +236 -30
  95. package/vona/src/suite-vendor/a-pay/modules/a-pay/src/service/refundOperation.ts +8 -5
  96. package/vona/src/suite-vendor/a-pay/modules/a-pay/src/service/webhook.ts +34 -0
  97. package/vona/src/suite-vendor/a-pay/modules/a-pay/src/types/payProvider.ts +4 -0
  98. package/vona/src/suite-vendor/a-pay/modules/a-pay/src/types/payment.ts +6 -0
  99. package/vona/src/suite-vendor/a-pay/modules/pay-mock/package.json +1 -1
  100. package/vona/src/suite-vendor/a-pay/modules/pay-mock/src/bean/payProvider.mock.ts +15 -7
  101. package/vona/src/suite-vendor/a-pay/modules/pay-mock/src/service/payMock.ts +9 -5
  102. package/vona/src/suite-vendor/a-pay/modules/pay-paypal/package.json +1 -1
  103. package/vona/src/suite-vendor/a-pay/modules/pay-paypal/src/bean/payProvider.paypal.ts +289 -86
  104. package/vona/src/suite-vendor/a-pay/modules/pay-paypal/src/lib/paypalGateway.ts +9 -1
  105. package/vona/src/suite-vendor/a-pay/modules/pay-stripe/package.json +1 -1
  106. package/vona/src/suite-vendor/a-pay/package.json +5 -5
  107. package/vona/src/suite-vendor/a-vona/modules/a-openapi/package.json +1 -1
  108. package/vona/src/suite-vendor/a-vona/modules/a-openapi/src/types/rest.ts +1 -0
  109. package/vona/src/suite-vendor/a-vona/modules/a-openapiutils/package.json +1 -1
  110. package/vona/src/suite-vendor/a-vona/modules/a-openapiutils/src/lib/utils.ts +12 -0
  111. package/vona/src/suite-vendor/a-vona/modules/a-orm/package.json +1 -1
  112. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/dto/dtoCreate.ts +5 -1
  113. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/dto/dtoUpdate.ts +5 -1
  114. package/vona/src/suite-vendor/a-vona/modules/a-validation/package.json +1 -1
  115. package/vona/src/suite-vendor/a-vona/modules/a-validation/src/bean/bean.validator.ts +60 -1
  116. package/vona/src/suite-vendor/a-vona/modules/a-web/package.json +1 -1
  117. package/vona/src/suite-vendor/a-vona/modules/a-web/src/lib/decorator/bean.ts +7 -4
  118. package/vona/src/suite-vendor/a-vona/modules/a-web/src/types/dto.ts +2 -1
  119. package/vona/src/suite-vendor/a-vona/package.json +1 -1
  120. package/zova/env/.env +3 -5
  121. package/zova/env/.env.cabloyBasicAdmin +1 -4
  122. package/zova/env/.env.cabloyBasicWeb +1 -5
  123. package/zova/env/.env.cabloyCommerce +1 -5
  124. package/zova/env/.env.cabloyCommerceAdmin +1 -4
  125. package/zova/env/.env.ssr.admin +1 -4
  126. package/zova/env/.env.ssr.web +1 -5
  127. package/zova/package.original.json +1 -1
  128. package/zova/packages-utils/zova-jsx/package.json +2 -2
  129. package/zova/packages-zova/zova/package.json +3 -3
  130. package/zova/packages-zova/zova-core/package.json +2 -1
  131. package/zova/packages-zova/zova-core/src/core/component/locale.ts +10 -4
  132. package/zova/packages-zova/zova-core/src/core/sys/config.ts +14 -6
  133. package/zova/packages-zova/zova-core/src/types/utils/env.ts +4 -2
  134. package/zova/pnpm-lock.yaml +24 -21
  135. package/zova/src/front/config/config/config.ts +22 -7
  136. package/zova/src/suite/a-commerce/modules/commerce-catalog/src/routes.ts +2 -2
  137. package/zova/src/suite/a-commerce/modules/commerce-member/src/api/openapi/schemas.ts +16 -8
  138. package/zova/src/suite/a-commerce/modules/commerce-member/src/api/openapi/types.ts +150 -216
  139. package/zova/src/suite/a-commerce/modules/commerce-member/src/model/addressMine.ts +1 -2
  140. package/zova/src/suite/a-commerce/modules/commerce-member/src/page/address/controller.tsx +5 -8
  141. package/zova/src/suite/a-commerce/modules/commerce-member/src/routes.ts +1 -1
  142. package/zova/src/suite/a-commerce/modules/commerce-promotion/src/model/coupon.ts +1 -2
  143. package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/routes.ts +3 -1
  144. package/zova/src/suite/a-commerce/modules/commerce-trade/cli/openapi.config.ts +3 -0
  145. package/zova/src/suite/a-commerce/modules/commerce-trade/src/api/commerceTradeOrder.ts +72 -0
  146. package/zova/src/suite/a-commerce/modules/commerce-trade/src/api/openapi/schemas.ts +8 -0
  147. package/zova/src/suite/a-commerce/modules/commerce-trade/src/api/openapi/types.ts +226 -16
  148. package/zova/src/suite/a-commerce/modules/commerce-trade/src/apiSchema/commerceTradeOrder.ts +15 -0
  149. package/zova/src/suite/a-commerce/modules/commerce-trade/src/component/tableCellActionRefund/controller.tsx +155 -36
  150. package/zova/src/suite/a-commerce/modules/commerce-trade/src/config/locale/en-us.ts +7 -0
  151. package/zova/src/suite/a-commerce/modules/commerce-trade/src/config/locale/zh-cn.ts +7 -0
  152. package/zova/src/suite/a-commerce/modules/commerce-trade/src/model/cart.ts +3 -4
  153. package/zova/src/suite/a-commerce/modules/commerce-trade/src/model/order.ts +42 -0
  154. package/zova/src/suite/a-commerce/modules/commerce-trade/src/model/orderMine.ts +2 -4
  155. package/zova/src/suite/a-commerce/modules/commerce-trade/src/page/cart/controller.tsx +5 -1
  156. package/zova/src/suite/a-commerce/modules/commerce-trade/src/page/checkout/controller.tsx +14 -10
  157. package/zova/src/suite/a-commerce/modules/commerce-trade/src/page/order/controller.tsx +5 -8
  158. package/zova/src/suite/a-commerce/modules/commerce-trade/src/page/orders/controller.tsx +5 -8
  159. package/zova/src/suite/a-commerce/modules/commerce-trade/src/page/payment/controller.tsx +151 -24
  160. package/zova/src/suite/a-commerce/modules/commerce-trade/src/routes.ts +5 -5
  161. package/zova/src/suite/a-demo/modules/demo-basic/src/routes.ts +26 -7
  162. package/zova/src/suite/a-demo/modules/demo-todo/src/routes.ts +2 -2
  163. package/zova/src/suite/a-devui/modules/devui-adapter/src/bean/meta.themeHandler.ts +1 -1
  164. package/zova/src/suite/a-home/modules/home-base/package.json +1 -0
  165. package/zova/src/suite/a-home/modules/home-base/src/routes.ts +5 -0
  166. package/zova/src/suite/a-home/modules/home-base/src/service/routerGuards.ts +1 -1
  167. package/zova/src/suite/a-home/modules/home-base/src/service/ssrLayout.ts +18 -14
  168. package/zova/src/suite/a-home/modules/home-indexadmin/src/routes.ts +1 -1
  169. package/zova/src/suite/a-home/modules/home-indexweb/src/routes.ts +1 -0
  170. package/zova/src/suite/a-home/modules/home-layoutadmin/src/component/layoutAdmin/controller.tsx +12 -4
  171. package/zova/src/suite/a-home/modules/home-layoutadmin/src/config/config.ts +8 -0
  172. package/zova/src/suite/a-home/modules/home-layoutadmin/src/model/layout.ts +5 -8
  173. package/zova/src/suite/a-home/modules/home-layoutempty/src/.metadata/index.ts +10 -3
  174. package/zova/src/suite/a-home/modules/home-layoutempty/src/component/layoutEmpty/controller.tsx +9 -3
  175. package/zova/src/suite/a-home/modules/home-layoutempty/src/config/config.ts +12 -0
  176. package/zova/src/suite/a-home/modules/home-layoutweb/src/component/layoutWeb/controller.tsx +13 -8
  177. package/zova/src/suite/a-home/modules/home-layoutweb/src/component/layoutWeb/render.header.tsx +1 -1
  178. package/zova/src/suite/a-home/modules/home-layoutweb/src/config/config.ts +4 -0
  179. package/zova/src/suite/a-home/modules/home-layoutweb/src/model/layout.ts +5 -8
  180. package/zova/src/suite/a-home/modules/home-login/src/routes.ts +1 -0
  181. package/zova/src/suite/a-home/modules/home-passport/src/model/passport.ts +2 -3
  182. package/zova/src/suite/cabloy-basic/modules/basic-metrics/src/routes.ts +3 -1
  183. package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/package.json +1 -1
  184. package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/model/resource.ts +1 -1
  185. package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/routes.ts +3 -0
  186. package/zova/src/suite-vendor/a-cabloy/package.json +2 -2
  187. package/zova/src/suite-vendor/a-pay/modules/a-pay/package.json +1 -1
  188. package/zova/src/suite-vendor/a-pay/modules/a-pay/src/model/paymentSession.ts +2 -2
  189. package/zova/src/suite-vendor/a-pay/package.json +2 -2
  190. package/zova/src/suite-vendor/a-zova/modules/a-interceptor/package.json +1 -1
  191. package/zova/src/suite-vendor/a-zova/modules/a-interceptor/src/bean/interceptor.jwt.ts +1 -1
  192. package/zova/src/suite-vendor/a-zova/modules/a-openapi/package.json +1 -1
  193. package/zova/src/suite-vendor/a-zova/modules/a-openapi/src/model/sdk.ts +1 -1
  194. package/zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/rest.ts +1 -0
  195. package/zova/src/suite-vendor/a-zova/modules/a-ssr/package.json +1 -1
  196. package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/config/config.ts +1 -17
  197. package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/lib/bodyReadyObserver.ts +27 -0
  198. package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/lib/index.ts +2 -0
  199. package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/lib/ssr.ts +33 -0
  200. package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/lib/ssrMetaStore.ts +3 -35
  201. package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/lib/ssrProfile.ts +38 -0
  202. package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/monkey.ts +10 -0
  203. package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/types/config.ts +3 -10
  204. package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/types/ssr.ts +17 -8
  205. package/zova/src/suite-vendor/a-zova/modules/a-ssrserver/package.json +1 -1
  206. package/zova/src/suite-vendor/a-zova/modules/a-ssrserver/src/service/ssrHandler.ts +33 -18
  207. package/zova/src/suite-vendor/a-zova/modules/a-style/package.json +1 -1
  208. package/zova/src/suite-vendor/a-zova/modules/a-style/src/bean/bean.theme.ts +2 -2
  209. package/zova/src/suite-vendor/a-zova/modules/a-zova/package.json +2 -2
  210. package/zova/src/suite-vendor/a-zova/package.json +7 -7
@@ -1,3 +1,4 @@
1
1
  export default {
2
2
  Home: 'Home',
3
+ SiteTitle: 'Web',
3
4
  };
@@ -1,3 +1,4 @@
1
1
  export default {
2
2
  Home: '首页',
3
+ SiteTitle: '网站',
3
4
  };
@@ -21,6 +21,7 @@ export interface ISsrSiteOptions<%=argv.beanNameCapitalize%> extends IDecoratorS
21
21
 
22
22
  @SsrSite<ISsrSiteOptions<%=argv.beanNameCapitalize%>>({
23
23
  siteId: 'some',
24
+ title: 'Some Site',
24
25
  publicPath: 'some',
25
26
  bundlePath: 'front-bundle-path',
26
27
  })
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-module-a-ssr",
3
- "version": "5.1.27",
3
+ "version": "5.1.28",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "",
6
6
  "keywords": [
@@ -18,9 +18,7 @@ export interface ZovaConfigEnv {
18
18
  API_BASE_URL: string | undefined;
19
19
  API_PREFIX: string | undefined;
20
20
  API_JWT: string | undefined;
21
- SSR_COOKIE_THEMENAME: string | undefined;
22
- SSR_COOKIE_THEMEDARK: string | undefined;
23
21
  SSR_COOKIE_THEMEDARK_DEFAULT: string | undefined;
24
- SSR_BODYREADYOBSERVER: string | undefined;
25
22
  SSR_WITH_VONA: string | undefined;
23
+ SSR_PROFILE: 'public' | 'session' | undefined;
26
24
  }
@@ -1,5 +1,5 @@
1
1
  import type http from 'node:http';
2
- import type { IInstanceRecord, OmitNever } from 'vona';
2
+ import type { IInstanceRecord, ILocaleMagic, OmitNever } from 'vona';
3
3
  import type {
4
4
  IOnionOptionsEnable,
5
5
  IOnionOptionsMatch,
@@ -70,6 +70,7 @@ export interface IDecoratorSsrSiteOptions<
70
70
  IOnionOptionsEnable,
71
71
  IOnionOptionsMatch<TypeOnionOptionsMatchRule<keyof IInstanceRecord>> {
72
72
  siteId: keyof ISsrSiteIdRecord;
73
+ title: string | ILocaleMagic;
73
74
  publicPath: keyof ISsrSitePublicPathRecord;
74
75
  bundlePath: string;
75
76
  diagnostics?: ISsrSiteDiagnosticsOptions;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-suite-a-cabloy",
3
- "version": "5.1.42",
3
+ "version": "5.1.43",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "",
6
6
  "author": "",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-module-a-pay",
3
- "version": "5.0.4",
3
+ "version": "5.0.5",
4
4
  "description": "",
5
5
  "keywords": [
6
6
  "Vona Module"
@@ -7,12 +7,14 @@ export * from '../entity/outboxEvent.tsx';
7
7
  export * from '../entity/paymentAudit.tsx';
8
8
  export * from '../entity/paymentSession.tsx';
9
9
  export * from '../entity/providerOperation.tsx';
10
+ export * from '../entity/providerOperationRecoveryAudit.tsx';
10
11
  export * from '../entity/refundOperation.tsx';
11
12
  export * from '../entity/webhookInbox.tsx';
12
13
  import type { IEntityOptionsOutboxEvent } from '../entity/outboxEvent.tsx';
13
14
  import type { IEntityOptionsPaymentAudit } from '../entity/paymentAudit.tsx';
14
15
  import type { IEntityOptionsPaymentSession } from '../entity/paymentSession.tsx';
15
16
  import type { IEntityOptionsProviderOperation } from '../entity/providerOperation.tsx';
17
+ import type { IEntityOptionsProviderOperationRecoveryAudit } from '../entity/providerOperationRecoveryAudit.tsx';
16
18
  import type { IEntityOptionsRefundOperation } from '../entity/refundOperation.tsx';
17
19
  import type { IEntityOptionsWebhookInbox } from '../entity/webhookInbox.tsx';
18
20
  import 'vona-module-a-orm';
@@ -23,6 +25,7 @@ declare module 'vona-module-a-orm' {
23
25
  'a-pay:paymentAudit': IEntityOptionsPaymentAudit;
24
26
  'a-pay:paymentSession': IEntityOptionsPaymentSession;
25
27
  'a-pay:providerOperation': IEntityOptionsProviderOperation;
28
+ 'a-pay:providerOperationRecoveryAudit': IEntityOptionsProviderOperationRecoveryAudit;
26
29
  'a-pay:refundOperation': IEntityOptionsRefundOperation;
27
30
  'a-pay:webhookInbox': IEntityOptionsWebhookInbox;
28
31
  }
@@ -38,6 +41,7 @@ import type { EntityOutboxEvent } from '../entity/outboxEvent.tsx';
38
41
  import type { EntityPaymentAudit } from '../entity/paymentAudit.tsx';
39
42
  import type { EntityPaymentSession } from '../entity/paymentSession.tsx';
40
43
  import type { EntityProviderOperation } from '../entity/providerOperation.tsx';
44
+ import type { EntityProviderOperationRecoveryAudit } from '../entity/providerOperationRecoveryAudit.tsx';
41
45
  import type { EntityRefundOperation } from '../entity/refundOperation.tsx';
42
46
  import type { EntityWebhookInbox } from '../entity/webhookInbox.tsx';
43
47
  export interface IModuleEntity {
@@ -45,6 +49,7 @@ export interface IModuleEntity {
45
49
  'paymentAudit': EntityPaymentAuditMeta;
46
50
  'paymentSession': EntityPaymentSessionMeta;
47
51
  'providerOperation': EntityProviderOperationMeta;
52
+ 'providerOperationRecoveryAudit': EntityProviderOperationRecoveryAuditMeta;
48
53
  'refundOperation': EntityRefundOperationMeta;
49
54
  'webhookInbox': EntityWebhookInboxMeta;
50
55
  }
@@ -54,12 +59,14 @@ export type EntityOutboxEventTableName = 'payOutboxEvent';
54
59
  export type EntityPaymentAuditTableName = 'payPaymentAudit';
55
60
  export type EntityPaymentSessionTableName = 'payPaymentSession';
56
61
  export type EntityProviderOperationTableName = 'payProviderOperation';
62
+ export type EntityProviderOperationRecoveryAuditTableName = 'payProviderOperationRecoveryAudit';
57
63
  export type EntityRefundOperationTableName = 'payRefundOperation';
58
64
  export type EntityWebhookInboxTableName = 'payWebhookInbox';
59
65
  export type EntityOutboxEventMeta=TypeEntityMeta<EntityOutboxEvent,EntityOutboxEventTableName>;
60
66
  export type EntityPaymentAuditMeta=TypeEntityMeta<EntityPaymentAudit,EntityPaymentAuditTableName>;
61
67
  export type EntityPaymentSessionMeta=TypeEntityMeta<EntityPaymentSession,EntityPaymentSessionTableName>;
62
68
  export type EntityProviderOperationMeta=TypeEntityMeta<EntityProviderOperation,EntityProviderOperationTableName>;
69
+ export type EntityProviderOperationRecoveryAuditMeta=TypeEntityMeta<EntityProviderOperationRecoveryAudit,EntityProviderOperationRecoveryAuditTableName>;
63
70
  export type EntityRefundOperationMeta=TypeEntityMeta<EntityRefundOperation,EntityRefundOperationTableName>;
64
71
  export type EntityWebhookInboxMeta=TypeEntityMeta<EntityWebhookInbox,EntityWebhookInboxTableName>;
65
72
  declare module 'vona-module-a-orm' {
@@ -68,6 +75,7 @@ declare module 'vona-module-a-orm' {
68
75
  'payPaymentAudit': EntityPaymentAuditMeta;
69
76
  'payPaymentSession': EntityPaymentSessionMeta;
70
77
  'payProviderOperation': EntityProviderOperationMeta;
78
+ 'payProviderOperationRecoveryAudit': EntityProviderOperationRecoveryAuditMeta;
71
79
  'payRefundOperation': EntityRefundOperationMeta;
72
80
  'payWebhookInbox': EntityWebhookInboxMeta;
73
81
  }
@@ -90,6 +98,10 @@ declare module 'vona-module-a-pay' {
90
98
  fields?: TypeEntityOptionsFields<EntityProviderOperation, IEntityOptionsProviderOperation[TypeSymbolKeyFieldsMore]>;
91
99
  }
92
100
 
101
+ export interface IEntityOptionsProviderOperationRecoveryAudit {
102
+ fields?: TypeEntityOptionsFields<EntityProviderOperationRecoveryAudit, IEntityOptionsProviderOperationRecoveryAudit[TypeSymbolKeyFieldsMore]>;
103
+ }
104
+
93
105
  export interface IEntityOptionsRefundOperation {
94
106
  fields?: TypeEntityOptionsFields<EntityRefundOperation, IEntityOptionsRefundOperation[TypeSymbolKeyFieldsMore]>;
95
107
  }
@@ -104,12 +116,14 @@ export * from '../model/outboxEvent.ts';
104
116
  export * from '../model/paymentAudit.ts';
105
117
  export * from '../model/paymentSession.ts';
106
118
  export * from '../model/providerOperation.ts';
119
+ export * from '../model/providerOperationRecoveryAudit.ts';
107
120
  export * from '../model/refundOperation.ts';
108
121
  export * from '../model/webhookInbox.ts';
109
122
  import type { IModelOptionsOutboxEvent } from '../model/outboxEvent.ts';
110
123
  import type { IModelOptionsPaymentAudit } from '../model/paymentAudit.ts';
111
124
  import type { IModelOptionsPaymentSession } from '../model/paymentSession.ts';
112
125
  import type { IModelOptionsProviderOperation } from '../model/providerOperation.ts';
126
+ import type { IModelOptionsProviderOperationRecoveryAudit } from '../model/providerOperationRecoveryAudit.ts';
113
127
  import type { IModelOptionsRefundOperation } from '../model/refundOperation.ts';
114
128
  import type { IModelOptionsWebhookInbox } from '../model/webhookInbox.ts';
115
129
  import 'vona-module-a-orm';
@@ -120,6 +134,7 @@ declare module 'vona-module-a-orm' {
120
134
  'a-pay:paymentAudit': IModelOptionsPaymentAudit;
121
135
  'a-pay:paymentSession': IModelOptionsPaymentSession;
122
136
  'a-pay:providerOperation': IModelOptionsProviderOperation;
137
+ 'a-pay:providerOperationRecoveryAudit': IModelOptionsProviderOperationRecoveryAudit;
123
138
  'a-pay:refundOperation': IModelOptionsRefundOperation;
124
139
  'a-pay:webhookInbox': IModelOptionsWebhookInbox;
125
140
  }
@@ -172,6 +187,17 @@ declare module 'vona-module-a-pay' {
172
187
  get $onionOptions(): IModelOptionsProviderOperation;
173
188
  }
174
189
 
190
+ export interface ModelProviderOperationRecoveryAudit {
191
+ /** @internal */
192
+ get scope(): ScopeModuleAPay;
193
+ }
194
+
195
+ export interface ModelProviderOperationRecoveryAudit {
196
+ get $beanFullName(): 'a-pay.model.providerOperationRecoveryAudit';
197
+ get $onionName(): 'a-pay:providerOperationRecoveryAudit';
198
+ get $onionOptions(): IModelOptionsProviderOperationRecoveryAudit;
199
+ }
200
+
175
201
  export interface ModelRefundOperation {
176
202
  /** @internal */
177
203
  get scope(): ScopeModuleAPay;
@@ -200,6 +226,7 @@ import type { ModelOutboxEvent } from '../model/outboxEvent.ts';
200
226
  import type { ModelPaymentAudit } from '../model/paymentAudit.ts';
201
227
  import type { ModelPaymentSession } from '../model/paymentSession.ts';
202
228
  import type { ModelProviderOperation } from '../model/providerOperation.ts';
229
+ import type { ModelProviderOperationRecoveryAudit } from '../model/providerOperationRecoveryAudit.ts';
203
230
  import type { ModelRefundOperation } from '../model/refundOperation.ts';
204
231
  import type { ModelWebhookInbox } from '../model/webhookInbox.ts';
205
232
  export interface IModuleModel {
@@ -207,6 +234,7 @@ export interface IModuleModel {
207
234
  'paymentAudit': ModelPaymentAudit;
208
235
  'paymentSession': ModelPaymentSession;
209
236
  'providerOperation': ModelProviderOperation;
237
+ 'providerOperationRecoveryAudit': ModelProviderOperationRecoveryAudit;
210
238
  'refundOperation': ModelRefundOperation;
211
239
  'webhookInbox': ModelWebhookInbox;
212
240
  }
@@ -220,6 +248,7 @@ declare module 'vona' {
220
248
  'a-pay.model.paymentAudit': ModelPaymentAudit;
221
249
  'a-pay.model.paymentSession': ModelPaymentSession;
222
250
  'a-pay.model.providerOperation': ModelProviderOperation;
251
+ 'a-pay.model.providerOperationRecoveryAudit': ModelProviderOperationRecoveryAudit;
223
252
  'a-pay.model.refundOperation': ModelRefundOperation;
224
253
  'a-pay.model.webhookInbox': ModelWebhookInbox;
225
254
  }
@@ -378,6 +407,43 @@ export interface ModelProviderOperation {
378
407
  updateById<T extends IModelUpdateOptions<EntityProviderOperation,ModelProviderOperation>>(id: TableIdentity, data: TypeModelMutateRelationData<EntityProviderOperation,ModelProviderOperation, T>, options?: T): Promise<TypeModelMutateRelationData<EntityProviderOperation,ModelProviderOperation, T>>;
379
408
  deleteById<T extends IModelDeleteOptions<EntityProviderOperation,ModelProviderOperation>>(id: TableIdentity, options?: T): Promise<void>;
380
409
  }
410
+ export interface ModelProviderOperationRecoveryAudit {
411
+ [SymbolKeyEntity]: EntityProviderOperationRecoveryAudit;
412
+ [SymbolKeyEntityMeta]: EntityProviderOperationRecoveryAuditMeta;
413
+ [SymbolKeyModelOptions]: IModelOptionsProviderOperationRecoveryAudit;
414
+ get<T extends IModelGetOptions<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit>>(where: TypeModelWhere<EntityProviderOperationRecoveryAudit>, options?: T): Promise<TypeModelRelationResult<EntityProviderOperationRecoveryAudit, ModelProviderOperationRecoveryAudit, T> | undefined>;
415
+ /**
416
+ * Retrieves one matching primary row with a pessimistic FOR UPDATE lock.
417
+ * Requires an active transaction. The lock is released when that transaction completes.
418
+ * Entity and query caches are bypassed.
419
+ */
420
+ getForUpdate<T extends IModelGetOptions<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit>>(where: TypeModelWhere<EntityProviderOperationRecoveryAudit>, options?: T): Promise<TypeModelRelationResult<EntityProviderOperationRecoveryAudit, ModelProviderOperationRecoveryAudit, T> | undefined>;
421
+ /**
422
+ * Retrieves a primary row by ID with the same pessimistic FOR UPDATE lock semantics.
423
+ * Requires an active transaction. The lock is released when that transaction completes.
424
+ * Entity and query caches are bypassed.
425
+ */
426
+ getByIdForUpdate<T extends IModelGetOptions<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit>>(id: TableIdentity, options?: T): Promise<TypeModelRelationResult<EntityProviderOperationRecoveryAudit, ModelProviderOperationRecoveryAudit, T> | undefined>;
427
+ mget<T extends IModelGetOptions<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit>>(ids: TableIdentity[], options?: T): Promise<TypeModelRelationResult<EntityProviderOperationRecoveryAudit, ModelProviderOperationRecoveryAudit, T>[]>;
428
+ selectAndCount<T extends IModelSelectParams<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelSelectAndCount<EntityProviderOperationRecoveryAudit, ModelProviderOperationRecoveryAudit, T>>;
429
+ select<T extends IModelSelectParams<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelRelationResult<EntityProviderOperationRecoveryAudit, ModelProviderOperationRecoveryAudit, T>[]>;
430
+ insert<T extends IModelInsertOptions<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit>>(data?: TypeModelMutateRelationData<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit, T>, options?: T): Promise<TypeModelMutateRelationData<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit, T, true>>;
431
+ insertBulk<T extends IModelInsertOptions<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit>>(items: TypeModelMutateRelationData<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit, T>[], options?: T): Promise<TypeModelMutateRelationData<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit, T, true>[]>;
432
+ update<T extends IModelUpdateOptions<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit>>(data: TypeModelMutateRelationData<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit, T>, options?: T): Promise<TypeModelMutateRelationData<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit, T>>;
433
+ updateBulk<T extends IModelUpdateOptions<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit>>(items: TypeModelMutateRelationData<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit, T>[], options?: T): Promise<TypeModelMutateRelationData<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit, T>[]>;
434
+ delete<T extends IModelDeleteOptions<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit>>(where?: TypeModelWhere<EntityProviderOperationRecoveryAudit>, options?: T): Promise<void>;
435
+ deleteBulk<T extends IModelDeleteOptions<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit>>(ids: TableIdentity[], options?: T): Promise<void>;
436
+ mutate<T extends IModelMutateOptions<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit>>(data?: TypeModelMutateRelationData<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit, T>, options?: T): Promise<TypeModelMutateRelationData<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit, T>>;
437
+ mutateBulk<T extends IModelMutateOptions<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit>>(items: TypeModelMutateRelationData<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit, T>[], options?: T): Promise<TypeModelMutateRelationData<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit, T>[]>;
438
+ count<T extends IModelSelectCountParams<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<string | undefined>;
439
+ increment<T extends IModelIncrementParams<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<number>;
440
+ decrement<T extends IModelIncrementParams<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<number>;
441
+ aggregate<T extends IModelSelectAggrParams<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelAggrRelationResult<T>>;
442
+ group<T extends IModelSelectGroupParams<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelGroupRelationResult<EntityProviderOperationRecoveryAudit, T>[]>;
443
+ getById<T extends IModelGetOptions<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit>>(id: TableIdentity, options?: T): Promise<TypeModelRelationResult<EntityProviderOperationRecoveryAudit, ModelProviderOperationRecoveryAudit, T> | undefined>;
444
+ updateById<T extends IModelUpdateOptions<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit>>(id: TableIdentity, data: TypeModelMutateRelationData<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit, T>, options?: T): Promise<TypeModelMutateRelationData<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit, T>>;
445
+ deleteById<T extends IModelDeleteOptions<EntityProviderOperationRecoveryAudit,ModelProviderOperationRecoveryAudit>>(id: TableIdentity, options?: T): Promise<void>;
446
+ }
381
447
  export interface ModelRefundOperation {
382
448
  [SymbolKeyEntity]: EntityRefundOperation;
383
449
  [SymbolKeyEntityMeta]: EntityRefundOperationMeta;
@@ -459,6 +525,7 @@ declare module 'vona-module-a-orm' {
459
525
  'a-pay:paymentAudit': ModelPaymentAudit;
460
526
  'a-pay:paymentSession': ModelPaymentSession;
461
527
  'a-pay:providerOperation': ModelProviderOperation;
528
+ 'a-pay:providerOperationRecoveryAudit': ModelProviderOperationRecoveryAudit;
462
529
  'a-pay:refundOperation': ModelRefundOperation;
463
530
  'a-pay:webhookInbox': ModelWebhookInbox;
464
531
  }
@@ -35,6 +35,7 @@ export class BeanPayProvider extends BeanBase {
35
35
  {},
36
36
  options.base,
37
37
  clientOptions,
38
+ this.ctx?.state.payProviderClientOptions?.[`${String(providerName)}/${String(clientName)}`],
38
39
  ) as TypePayProviderClientOptionsByName<N>;
39
40
  if (resolvedOptions.environment !== 'sandbox' && resolvedOptions.environment !== 'live') {
40
41
  this.app.throw(
@@ -1,5 +1,6 @@
1
1
  import type { TableIdentity } from 'table-identity';
2
2
 
3
+ import { zodCustomError } from '@cabloy/utils';
3
4
  import { BeanBase } from 'vona';
4
5
  import { Bean } from 'vona-module-a-bean';
5
6
 
@@ -21,7 +22,7 @@ export class BeanPayScene extends BeanBase {
21
22
 
22
23
  getOptions<N extends keyof IPaySceneRecord>(paySceneName: N): IDecoratorPaySceneOptions {
23
24
  const onionSlice = this._getOnionSlice(paySceneName);
24
- return onionSlice.beanOptions.options as IDecoratorPaySceneOptions;
25
+ return onionSlice.beanOptions.options as unknown as IDecoratorPaySceneOptions;
25
26
  }
26
27
 
27
28
  async getAvailableProviderCandidates<N extends keyof IPaySceneRecord>(
@@ -58,7 +59,7 @@ export class BeanPayScene extends BeanBase {
58
59
  input.providerCandidateKey &&
59
60
  !allProviders.some(item => item.key === input.providerCandidateKey)
60
61
  ) {
61
- this.app.throw(422, 'payment provider candidate is unavailable');
62
+ throw zodCustomError(['providerCandidateKey'], 'payment provider candidate is unavailable');
62
63
  }
63
64
  const providers = await this._getAvailableProviderCandidates(options, {
64
65
  payScene: paySceneName,
@@ -69,7 +70,7 @@ export class BeanPayScene extends BeanBase {
69
70
  input.providerCandidateKey &&
70
71
  !providers.some(item => item.key === input.providerCandidateKey)
71
72
  ) {
72
- this.app.throw(422, 'payment provider candidate is unavailable');
73
+ throw zodCustomError(['providerCandidateKey'], 'payment provider candidate is unavailable');
73
74
  }
74
75
  const candidateKey = await this._resolveProviderCandidateKey(
75
76
  paySceneName,
@@ -146,7 +147,7 @@ export class BeanPayScene extends BeanBase {
146
147
  ) {
147
148
  if (input.providerCandidateKey) {
148
149
  if (!providers.some(item => item.key === input.providerCandidateKey)) {
149
- this.app.throw(422, 'payment provider candidate is unavailable');
150
+ throw zodCustomError(['providerCandidateKey'], 'payment provider candidate is unavailable');
150
151
  }
151
152
  return input.providerCandidateKey;
152
153
  }
@@ -7,6 +7,7 @@ import { $tableColumns } from 'vona-module-a-ormutils';
7
7
  @Meta<IMetaOptionsIndex>({
8
8
  indexes: {
9
9
  ...$tableColumns('payPaymentSession', 'businessReference'),
10
+ ...$tableColumns('payPaymentSession', 'providerCorrelationReference'),
10
11
  ...$tableColumns('payPaymentSession', 'state+expiresAt'),
11
12
  ...$tableColumns('payPaymentSession', 'providerPaymentId'),
12
13
  ...$tableColumns('payPaymentSession', 'providerOrderId'),
@@ -16,7 +17,14 @@ import { $tableColumns } from 'vona-module-a-ormutils';
16
17
  ...$tableColumns('payProviderOperation', 'state+nextAttemptAt'),
17
18
  ...$tableColumns('payProviderOperation', 'state+claimExpiresAt'),
18
19
  ...$tableColumns('payProviderOperation', 'idempotencyKey'),
20
+ ...$tableColumns(
21
+ 'payProviderOperationRecoveryAudit',
22
+ 'providerOperationId+actionIdempotencyKey',
23
+ ),
24
+ ...$tableColumns('payProviderOperationRecoveryAudit', 'providerOperationId+occurredAt'),
19
25
  ...$tableColumns('payRefundOperation', 'paymentSessionId'),
26
+ ...$tableColumns('payRefundOperation', 'providerCorrelationReference'),
27
+ ...$tableColumns('payRefundOperation', 'providerRefundId'),
20
28
  ...$tableColumns('payRefundOperation', 'state'),
21
29
  ...$tableColumns('payWebhookInbox', 'providerName+clientName'),
22
30
  ...$tableColumns('payWebhookInbox', 'providerEventId'),
@@ -14,6 +14,8 @@ export class MetaVersion extends BeanBase implements IMetaVersionUpdate {
14
14
  table.userId(paymentSession.userId);
15
15
  table.string(paymentSession.payScene, 100);
16
16
  table.string(paymentSession.businessReference, 100);
17
+ table.string(paymentSession.providerInvoiceReference, 100);
18
+ table.string(paymentSession.providerCorrelationReference, 100);
17
19
  table.string(paymentSession.providerName, 100);
18
20
  table.string(paymentSession.clientName, 100);
19
21
  table.string(paymentSession.environment, 16);
@@ -45,6 +47,7 @@ export class MetaVersion extends BeanBase implements IMetaVersionUpdate {
45
47
  table.string(providerOperation.claimToken, 100);
46
48
  table.dateTime(providerOperation.claimExpiresAt);
47
49
  table.dateTime(providerOperation.submittedAt);
50
+ table.dateTime(providerOperation.recoveryRetryGrantedAt);
48
51
  table.dateTime(providerOperation.nextAttemptAt);
49
52
  table.string(providerOperation.errorCode, 100);
50
53
  table.string(providerOperation.errorSummary, 255);
@@ -56,6 +59,8 @@ export class MetaVersion extends BeanBase implements IMetaVersionUpdate {
56
59
  table.basicFields();
57
60
  table.tableIdentity(refundOperation.paymentSessionId);
58
61
  table.string(refundOperation.businessReference, 100);
62
+ table.string(refundOperation.providerInvoiceReference, 100);
63
+ table.string(refundOperation.providerCorrelationReference, 100);
59
64
  table.integer(refundOperation.amountMinor);
60
65
  table.string(refundOperation.currency, 3);
61
66
  table.string(refundOperation.state, 32);
@@ -64,6 +69,23 @@ export class MetaVersion extends BeanBase implements IMetaVersionUpdate {
64
69
  table.dateTime(refundOperation.finalizedAt);
65
70
  });
66
71
 
72
+ const providerOperationRecoveryAudit = this.scope.entity.providerOperationRecoveryAudit;
73
+ await this.bean.model.createTable(providerOperationRecoveryAudit.$table, table => {
74
+ table.basicFields();
75
+ table.tableIdentity(providerOperationRecoveryAudit.providerOperationId);
76
+ table.tableIdentity(providerOperationRecoveryAudit.actorId);
77
+ table.string(providerOperationRecoveryAudit.action, 32);
78
+ table.string(providerOperationRecoveryAudit.actionIdempotencyKey, 100);
79
+ table.string(providerOperationRecoveryAudit.reason, 255);
80
+ table.string(providerOperationRecoveryAudit.beforeState, 32);
81
+ table.string(providerOperationRecoveryAudit.afterState, 32);
82
+ table.integer(providerOperationRecoveryAudit.beforeAttemptCount);
83
+ table.integer(providerOperationRecoveryAudit.afterAttemptCount);
84
+ table.string(providerOperationRecoveryAudit.resolution, 32);
85
+ table.string(providerOperationRecoveryAudit.providerRefundId, 255);
86
+ table.dateTime(providerOperationRecoveryAudit.occurredAt);
87
+ });
88
+
67
89
  const webhookInbox = this.scope.entity.webhookInbox;
68
90
  await this.bean.model.createTable(webhookInbox.$table, table => {
69
91
  table.basicFields();
@@ -3,7 +3,7 @@ import type { IScheduleExecute } from 'vona-module-a-schedule';
3
3
  import { BeanBase } from 'vona';
4
4
  import { Schedule } from 'vona-module-a-schedule';
5
5
 
6
- @Schedule({ repeat: { every: 60 * 1000 } })
6
+ @Schedule({ repeat: { every: 5 * 1000 } })
7
7
  export class ScheduleProviderOperationDispatch extends BeanBase implements IScheduleExecute {
8
8
  async execute() {
9
9
  await this.scope.service.providerOperation.queueDue();
@@ -20,6 +20,12 @@ export class EntityPaymentSession extends EntityBase {
20
20
  @Api.field(v.required(), v.min(1), v.max(100))
21
21
  businessReference: string;
22
22
 
23
+ @Api.field(v.required(), v.min(1), v.max(100))
24
+ providerInvoiceReference: string;
25
+
26
+ @Api.field(v.required(), v.min(1), v.max(100))
27
+ providerCorrelationReference: string;
28
+
23
29
  @Api.field(z.string())
24
30
  providerName: string;
25
31
 
@@ -52,6 +52,9 @@ export class EntityProviderOperation extends EntityBase {
52
52
  @Api.field(v.optional())
53
53
  submittedAt?: Date;
54
54
 
55
+ @Api.field(v.optional())
56
+ recoveryRetryGrantedAt?: Date;
57
+
55
58
  @Api.field(v.optional())
56
59
  nextAttemptAt?: Date;
57
60
 
@@ -0,0 +1,53 @@
1
+ import type { TableIdentity } from 'table-identity';
2
+ import type { IDecoratorEntityOptions } from 'vona-module-a-orm';
3
+
4
+ import { Api, v } from 'vona-module-a-openapiutils';
5
+ import { Entity, EntityBase } from 'vona-module-a-orm';
6
+ import { z } from 'zod';
7
+
8
+ import type { TypeProviderOperationState } from '../types/payment.ts';
9
+
10
+ export interface IEntityOptionsProviderOperationRecoveryAudit extends IDecoratorEntityOptions {}
11
+
12
+ @Entity<IEntityOptionsProviderOperationRecoveryAudit>('payProviderOperationRecoveryAudit')
13
+ export class EntityProviderOperationRecoveryAudit extends EntityBase {
14
+ @Api.field(v.tableIdentity())
15
+ providerOperationId: TableIdentity;
16
+
17
+ @Api.field(v.optional(), v.tableIdentity())
18
+ actorId?: TableIdentity;
19
+
20
+ @Api.field(z.enum(['reconcile', 'retry']))
21
+ action: 'reconcile' | 'retry';
22
+
23
+ @Api.field(v.required(), v.min(1), v.max(100))
24
+ actionIdempotencyKey: string;
25
+
26
+ @Api.field(v.required(), v.min(1), v.max(255))
27
+ reason: string;
28
+
29
+ @Api.field(
30
+ z.enum(['created', 'claimed', 'submitted', 'succeeded', 'failed', 'reconciliation_required']),
31
+ )
32
+ beforeState: TypeProviderOperationState;
33
+
34
+ @Api.field(
35
+ z.enum(['created', 'claimed', 'submitted', 'succeeded', 'failed', 'reconciliation_required']),
36
+ )
37
+ afterState: TypeProviderOperationState;
38
+
39
+ @Api.field(z.number().int().nonnegative())
40
+ beforeAttemptCount: number;
41
+
42
+ @Api.field(z.number().int().nonnegative())
43
+ afterAttemptCount: number;
44
+
45
+ @Api.field(z.enum(['reconciled', 'unresolved', 'retried']))
46
+ resolution: 'reconciled' | 'unresolved' | 'retried';
47
+
48
+ @Api.field(v.optional(), v.max(255))
49
+ providerRefundId?: string;
50
+
51
+ @Api.field(v.required())
52
+ occurredAt: Date;
53
+ }
@@ -17,6 +17,12 @@ export class EntityRefundOperation extends EntityBase {
17
17
  @Api.field(v.required(), v.min(1), v.max(100))
18
18
  businessReference: string;
19
19
 
20
+ @Api.field(v.required(), v.min(1), v.max(100))
21
+ providerInvoiceReference: string;
22
+
23
+ @Api.field(v.required(), v.min(1), v.max(100))
24
+ providerCorrelationReference: string;
25
+
20
26
  @Api.field(z.number().int().positive())
21
27
  amountMinor: number;
22
28
 
@@ -0,0 +1,12 @@
1
+ import type { IDecoratorModelOptions } from 'vona-module-a-orm';
2
+
3
+ import { BeanModelBase, Model } from 'vona-module-a-orm';
4
+
5
+ import { EntityProviderOperationRecoveryAudit } from '../entity/providerOperationRecoveryAudit.tsx';
6
+
7
+ export interface IModelOptionsProviderOperationRecoveryAudit extends IDecoratorModelOptions<EntityProviderOperationRecoveryAudit> {}
8
+
9
+ @Model<IModelOptionsProviderOperationRecoveryAudit>({
10
+ entity: EntityProviderOperationRecoveryAudit,
11
+ })
12
+ export class ModelProviderOperationRecoveryAudit extends BeanModelBase<EntityProviderOperationRecoveryAudit> {}
@@ -1,5 +1,7 @@
1
1
  import type { TableIdentity } from 'table-identity';
2
2
 
3
+ import { zodCustomError } from '@cabloy/utils';
4
+ import { randomUUID } from 'node:crypto';
3
5
  import { BeanBase } from 'vona';
4
6
  import { Service } from 'vona-module-a-bean';
5
7
  import { Core } from 'vona-module-a-core';
@@ -36,6 +38,8 @@ export class ServicePaymentSession extends BeanBase {
36
38
  }
37
39
  return await this.scope.model.paymentSession.insert({
38
40
  ...command,
41
+ providerInvoiceReference: randomUUID(),
42
+ providerCorrelationReference: randomUUID(),
39
43
  providerName: provider.providerName,
40
44
  clientName: provider.clientName,
41
45
  environment: provider.environment,
@@ -49,10 +53,10 @@ export class ServicePaymentSession extends BeanBase {
49
53
  sceneOptions: IDecoratorPaySceneOptions,
50
54
  ) {
51
55
  if (!Number.isSafeInteger(command.amountMinor) || command.amountMinor < 0) {
52
- this.app.throw(422, 'payment amount is invalid');
56
+ throw zodCustomError(['amountMinor'], 'payment amount is invalid');
53
57
  }
54
58
  if (sceneOptions.currencies && !sceneOptions.currencies.includes(command.currency)) {
55
- this.app.throw(422, 'payment currency is not allowed by the payment scene');
59
+ throw zodCustomError(['currency'], 'payment currency is not allowed by the payment scene');
56
60
  }
57
61
  }
58
62