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.
- package/.cabloy-version +1 -1
- package/.claude/skills/cabloy-worktree-environment/SKILL.md +6 -6
- package/.claude/skills/cabloy-worktree-environment/evals/evals.json +2 -2
- package/.github/workflows/vona-test-pg.yml +1 -1
- package/.github/workflows/vona-test-sqlite3.yml +1 -1
- package/CHANGELOG.md +28 -0
- package/cabloy-docs/backend/dto-guide.md +39 -4
- package/cabloy-docs/backend/dto-infer-generation.md +29 -0
- package/cabloy-docs/backend/openapi-guide.md +16 -0
- package/cabloy-docs/backend/validation-guide.md +45 -0
- package/cabloy-docs/frontend/environment-config-guide.md +8 -15
- package/cabloy-docs/frontend/navigation-guards-guide.md +3 -3
- package/cabloy-docs/frontend/page-route-guide.md +4 -4
- package/cabloy-docs/frontend/ssr-env.md +22 -29
- package/cabloy-docs/frontend/theme-guide.md +4 -4
- package/cabloy-docs/frontend/zova-router-under-the-hood.md +1 -1
- package/cabloy-docs/fullstack/deploy-cloudflare-docker.md +6 -6
- package/cabloy-docs/fullstack/parallel-worktree-environment.md +2 -2
- package/e2e/specs/a-commerce/commerce.spec.ts +479 -17
- package/e2e/specs/cabloy-basic/basic.spec.ts +30 -5
- package/package.json +7 -7
- package/vona/.claude/skills/detect-ssr-leak/SKILL.md +1 -1
- package/vona/packages-vona/vona/package.json +1 -1
- package/vona/pnpm-lock.yaml +120 -10
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/skuCreate.tsx +3 -1
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/skuSelectResItem.tsx +13 -1
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/skuUpdate.tsx +3 -1
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/skuView.tsx +13 -1
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/entity/sku.tsx +6 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/test/skuPresentation.test.ts +227 -0
- package/vona/src/suite/a-commerce/modules/commerce-member/src/.metadata/index.ts +46 -36
- package/vona/src/suite/a-commerce/modules/commerce-member/src/dto/addressSelectResItem.tsx +5 -13
- package/vona/src/suite/a-commerce/modules/commerce-member/src/service/address.ts +16 -1
- package/vona/src/suite/a-commerce/modules/commerce-member/test/addressPresentation.test.ts +210 -0
- package/vona/src/suite/a-commerce/modules/commerce-payment/src/service/commercePayScene.ts +13 -2
- package/vona/src/suite/a-commerce/modules/commerce-payment/test/paymentAttempt.test.ts +12 -0
- package/vona/src/suite/a-commerce/modules/commerce-promotion/src/service/coupon.ts +7 -1
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/.metadata/index.ts +45 -2
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/config/locale/en-us.ts +23 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/config/locale/zh-cn.ts +23 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/controller/order.ts +31 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/orderAdminLineBase.tsx +56 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/orderAdminLineResItem.tsx +17 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/orderAdminLineView.tsx +13 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/orderSelectResItem.tsx +26 -2
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/orderView.tsx +197 -3
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/refundRecoveryAction.tsx +19 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/refundRecoveryView.tsx +70 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockAuditSelectResItem.tsx +7 -1
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockAuditView.tsx +21 -1
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockBalanceSelectResItem.tsx +7 -1
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockBalanceView.tsx +3 -1
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/entity/order.tsx +12 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/model/order.ts +15 -2
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/service/order.ts +215 -3
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/service/stockAudit.ts +25 -2
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/service/stockBalance.ts +14 -3
- package/vona/src/suite/a-commerce/modules/commerce-trade/test/checkoutReservation.test.ts +4 -4
- package/vona/src/suite/a-commerce/modules/commerce-trade/test/orderPresentation.test.ts +358 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/test/orderSnapshot.test.ts +8 -8
- package/vona/src/suite/a-commerce/modules/commerce-trade/test/paymentOutcome.test.ts +5 -1
- package/vona/src/suite/a-commerce/modules/commerce-trade/test/refundLifecycle.test.ts +50 -1
- package/vona/src/suite/a-commerce/modules/commerce-trade/test/stockPresentation.test.ts +324 -0
- package/vona/src/suite/a-home/modules/home-base/package.json +3 -2
- package/vona/src/suite/a-home/modules/home-base/src/.metadata/index.ts +93 -16
- package/vona/src/suite/a-home/modules/home-base/src/controller/siteCatalog.ts +21 -0
- package/vona/src/suite/a-home/modules/home-base/src/dto/siteCatalogSelectRes.ts +11 -0
- package/vona/src/suite/a-home/modules/home-base/src/dto/siteCatalogSelectResItem.ts +15 -0
- package/vona/src/suite/a-home/modules/home-base/src/service/siteCatalog.ts +29 -0
- package/vona/src/suite/cabloy-basic/modules/basic-siteadmin/src/bean/ssrSite.admin.ts +3 -0
- package/vona/src/suite/cabloy-basic/modules/basic-siteadmin/src/config/locale/en-us.ts +1 -0
- package/vona/src/suite/cabloy-basic/modules/basic-siteadmin/src/config/locale/zh-cn.ts +1 -0
- package/vona/src/suite/cabloy-basic/modules/basic-siteweb/src/bean/ssrSite.web.ts +3 -0
- package/vona/src/suite/cabloy-basic/modules/basic-siteweb/src/config/locale/en-us.ts +1 -0
- package/vona/src/suite/cabloy-basic/modules/basic-siteweb/src/config/locale/zh-cn.ts +1 -0
- package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/cli/ssrSite/boilerplate/{{sceneName}}.{{beanName}}.ts_ +1 -0
- package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/package.json +1 -1
- package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/src/types/env.ts +1 -3
- package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/src/types/ssrSite.ts +2 -1
- package/vona/src/suite-vendor/a-cabloy/package.json +1 -1
- package/vona/src/suite-vendor/a-pay/modules/a-pay/package.json +1 -1
- package/vona/src/suite-vendor/a-pay/modules/a-pay/src/.metadata/index.ts +67 -0
- package/vona/src/suite-vendor/a-pay/modules/a-pay/src/bean/bean.payProvider.ts +1 -0
- package/vona/src/suite-vendor/a-pay/modules/a-pay/src/bean/bean.payScene.ts +5 -4
- package/vona/src/suite-vendor/a-pay/modules/a-pay/src/bean/meta.index.ts +8 -0
- package/vona/src/suite-vendor/a-pay/modules/a-pay/src/bean/meta.version.ts +22 -0
- package/vona/src/suite-vendor/a-pay/modules/a-pay/src/bean/schedule.providerOperationDispatch.ts +1 -1
- package/vona/src/suite-vendor/a-pay/modules/a-pay/src/entity/paymentSession.tsx +6 -0
- package/vona/src/suite-vendor/a-pay/modules/a-pay/src/entity/providerOperation.tsx +3 -0
- package/vona/src/suite-vendor/a-pay/modules/a-pay/src/entity/providerOperationRecoveryAudit.tsx +53 -0
- package/vona/src/suite-vendor/a-pay/modules/a-pay/src/entity/refundOperation.tsx +6 -0
- package/vona/src/suite-vendor/a-pay/modules/a-pay/src/model/providerOperationRecoveryAudit.ts +12 -0
- package/vona/src/suite-vendor/a-pay/modules/a-pay/src/service/paymentSession.ts +6 -2
- package/vona/src/suite-vendor/a-pay/modules/a-pay/src/service/providerOperation.ts +236 -30
- package/vona/src/suite-vendor/a-pay/modules/a-pay/src/service/refundOperation.ts +8 -5
- package/vona/src/suite-vendor/a-pay/modules/a-pay/src/service/webhook.ts +34 -0
- package/vona/src/suite-vendor/a-pay/modules/a-pay/src/types/payProvider.ts +4 -0
- package/vona/src/suite-vendor/a-pay/modules/a-pay/src/types/payment.ts +6 -0
- package/vona/src/suite-vendor/a-pay/modules/pay-mock/package.json +1 -1
- package/vona/src/suite-vendor/a-pay/modules/pay-mock/src/bean/payProvider.mock.ts +15 -7
- package/vona/src/suite-vendor/a-pay/modules/pay-mock/src/service/payMock.ts +9 -5
- package/vona/src/suite-vendor/a-pay/modules/pay-paypal/package.json +1 -1
- package/vona/src/suite-vendor/a-pay/modules/pay-paypal/src/bean/payProvider.paypal.ts +289 -86
- package/vona/src/suite-vendor/a-pay/modules/pay-paypal/src/lib/paypalGateway.ts +9 -1
- package/vona/src/suite-vendor/a-pay/modules/pay-stripe/package.json +1 -1
- package/vona/src/suite-vendor/a-pay/package.json +5 -5
- package/vona/src/suite-vendor/a-vona/modules/a-openapi/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-openapi/src/types/rest.ts +1 -0
- package/vona/src/suite-vendor/a-vona/modules/a-openapiutils/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-openapiutils/src/lib/utils.ts +12 -0
- package/vona/src/suite-vendor/a-vona/modules/a-orm/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/dto/dtoCreate.ts +5 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/dto/dtoUpdate.ts +5 -1
- package/vona/src/suite-vendor/a-vona/modules/a-validation/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-validation/src/bean/bean.validator.ts +60 -1
- package/vona/src/suite-vendor/a-vona/modules/a-web/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-web/src/lib/decorator/bean.ts +7 -4
- package/vona/src/suite-vendor/a-vona/modules/a-web/src/types/dto.ts +2 -1
- package/vona/src/suite-vendor/a-vona/package.json +1 -1
- package/zova/env/.env +3 -5
- package/zova/env/.env.cabloyBasicAdmin +1 -4
- package/zova/env/.env.cabloyBasicWeb +1 -5
- package/zova/env/.env.cabloyCommerce +1 -5
- package/zova/env/.env.cabloyCommerceAdmin +1 -4
- package/zova/env/.env.ssr.admin +1 -4
- package/zova/env/.env.ssr.web +1 -5
- package/zova/package.original.json +1 -1
- package/zova/packages-utils/zova-jsx/package.json +2 -2
- package/zova/packages-zova/zova/package.json +3 -3
- package/zova/packages-zova/zova-core/package.json +2 -1
- package/zova/packages-zova/zova-core/src/core/component/locale.ts +10 -4
- package/zova/packages-zova/zova-core/src/core/sys/config.ts +14 -6
- package/zova/packages-zova/zova-core/src/types/utils/env.ts +4 -2
- package/zova/pnpm-lock.yaml +24 -21
- package/zova/src/front/config/config/config.ts +22 -7
- package/zova/src/suite/a-commerce/modules/commerce-catalog/src/routes.ts +2 -2
- package/zova/src/suite/a-commerce/modules/commerce-member/src/api/openapi/schemas.ts +16 -8
- package/zova/src/suite/a-commerce/modules/commerce-member/src/api/openapi/types.ts +150 -216
- package/zova/src/suite/a-commerce/modules/commerce-member/src/model/addressMine.ts +1 -2
- package/zova/src/suite/a-commerce/modules/commerce-member/src/page/address/controller.tsx +5 -8
- package/zova/src/suite/a-commerce/modules/commerce-member/src/routes.ts +1 -1
- package/zova/src/suite/a-commerce/modules/commerce-promotion/src/model/coupon.ts +1 -2
- package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/routes.ts +3 -1
- package/zova/src/suite/a-commerce/modules/commerce-trade/cli/openapi.config.ts +3 -0
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/api/commerceTradeOrder.ts +72 -0
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/api/openapi/schemas.ts +8 -0
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/api/openapi/types.ts +226 -16
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/apiSchema/commerceTradeOrder.ts +15 -0
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/component/tableCellActionRefund/controller.tsx +155 -36
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/config/locale/en-us.ts +7 -0
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/config/locale/zh-cn.ts +7 -0
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/model/cart.ts +3 -4
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/model/order.ts +42 -0
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/model/orderMine.ts +2 -4
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/page/cart/controller.tsx +5 -1
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/page/checkout/controller.tsx +14 -10
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/page/order/controller.tsx +5 -8
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/page/orders/controller.tsx +5 -8
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/page/payment/controller.tsx +151 -24
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/routes.ts +5 -5
- package/zova/src/suite/a-demo/modules/demo-basic/src/routes.ts +26 -7
- package/zova/src/suite/a-demo/modules/demo-todo/src/routes.ts +2 -2
- package/zova/src/suite/a-devui/modules/devui-adapter/src/bean/meta.themeHandler.ts +1 -1
- package/zova/src/suite/a-home/modules/home-base/package.json +1 -0
- package/zova/src/suite/a-home/modules/home-base/src/routes.ts +5 -0
- package/zova/src/suite/a-home/modules/home-base/src/service/routerGuards.ts +1 -1
- package/zova/src/suite/a-home/modules/home-base/src/service/ssrLayout.ts +18 -14
- package/zova/src/suite/a-home/modules/home-indexadmin/src/routes.ts +1 -1
- package/zova/src/suite/a-home/modules/home-indexweb/src/routes.ts +1 -0
- package/zova/src/suite/a-home/modules/home-layoutadmin/src/component/layoutAdmin/controller.tsx +12 -4
- package/zova/src/suite/a-home/modules/home-layoutadmin/src/config/config.ts +8 -0
- package/zova/src/suite/a-home/modules/home-layoutadmin/src/model/layout.ts +5 -8
- package/zova/src/suite/a-home/modules/home-layoutempty/src/.metadata/index.ts +10 -3
- package/zova/src/suite/a-home/modules/home-layoutempty/src/component/layoutEmpty/controller.tsx +9 -3
- package/zova/src/suite/a-home/modules/home-layoutempty/src/config/config.ts +12 -0
- package/zova/src/suite/a-home/modules/home-layoutweb/src/component/layoutWeb/controller.tsx +13 -8
- package/zova/src/suite/a-home/modules/home-layoutweb/src/component/layoutWeb/render.header.tsx +1 -1
- package/zova/src/suite/a-home/modules/home-layoutweb/src/config/config.ts +4 -0
- package/zova/src/suite/a-home/modules/home-layoutweb/src/model/layout.ts +5 -8
- package/zova/src/suite/a-home/modules/home-login/src/routes.ts +1 -0
- package/zova/src/suite/a-home/modules/home-passport/src/model/passport.ts +2 -3
- package/zova/src/suite/cabloy-basic/modules/basic-metrics/src/routes.ts +3 -1
- package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/package.json +1 -1
- package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/model/resource.ts +1 -1
- package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/routes.ts +3 -0
- package/zova/src/suite-vendor/a-cabloy/package.json +2 -2
- package/zova/src/suite-vendor/a-pay/modules/a-pay/package.json +1 -1
- package/zova/src/suite-vendor/a-pay/modules/a-pay/src/model/paymentSession.ts +2 -2
- package/zova/src/suite-vendor/a-pay/package.json +2 -2
- package/zova/src/suite-vendor/a-zova/modules/a-interceptor/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-interceptor/src/bean/interceptor.jwt.ts +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-openapi/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-openapi/src/model/sdk.ts +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/rest.ts +1 -0
- package/zova/src/suite-vendor/a-zova/modules/a-ssr/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/config/config.ts +1 -17
- package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/lib/bodyReadyObserver.ts +27 -0
- package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/lib/index.ts +2 -0
- package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/lib/ssr.ts +33 -0
- package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/lib/ssrMetaStore.ts +3 -35
- package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/lib/ssrProfile.ts +38 -0
- package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/monkey.ts +10 -0
- package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/types/config.ts +3 -10
- package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/types/ssr.ts +17 -8
- package/zova/src/suite-vendor/a-zova/modules/a-ssrserver/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-ssrserver/src/service/ssrHandler.ts +33 -18
- package/zova/src/suite-vendor/a-zova/modules/a-style/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-style/src/bean/bean.theme.ts +2 -2
- package/zova/src/suite-vendor/a-zova/modules/a-zova/package.json +2 -2
- package/zova/src/suite-vendor/a-zova/package.json +7 -7
|
@@ -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;
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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();
|
package/vona/src/suite-vendor/a-pay/modules/a-pay/src/bean/schedule.providerOperationDispatch.ts
CHANGED
|
@@ -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:
|
|
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
|
|
package/vona/src/suite-vendor/a-pay/modules/a-pay/src/entity/providerOperationRecoveryAudit.tsx
ADDED
|
@@ -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
|
-
|
|
56
|
+
throw zodCustomError(['amountMinor'], 'payment amount is invalid');
|
|
53
57
|
}
|
|
54
58
|
if (sceneOptions.currencies && !sceneOptions.currencies.includes(command.currency)) {
|
|
55
|
-
|
|
59
|
+
throw zodCustomError(['currency'], 'payment currency is not allowed by the payment scene');
|
|
56
60
|
}
|
|
57
61
|
}
|
|
58
62
|
|