cabloy 5.1.111 → 5.1.112
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-backend-scaffold/SKILL.md +29 -1
- package/.claude/skills/cabloy-backend-scaffold/references/follow-up-checklist.md +12 -0
- package/.claude/skills/cabloy-frontend-scaffold/SKILL.md +3 -0
- package/.claude/skills/cabloy-frontend-scaffold/references/follow-up-checklist.md +4 -0
- package/.claude/skills/cabloy-master-detail/SKILL.md +13 -2
- package/.github/workflows/playwright-e2e.yml +45 -0
- package/.gitignore +1 -0
- package/CHANGELOG.md +17 -0
- package/CLAUDE.md +4 -1
- package/README.md +8 -8
- package/cabloy-docs/backend/crud-workflow.md +10 -0
- package/cabloy-docs/backend/foundation.md +29 -4
- package/cabloy-docs/backend/introduction.md +1 -1
- package/cabloy-docs/backend/model-guide.md +9 -11
- package/cabloy-docs/backend/multi-instance-and-instance-resolution.md +18 -0
- package/cabloy-docs/backend/service-guide.md +1 -1
- package/cabloy-docs/frontend/a-router-guide.md +1 -1
- package/cabloy-docs/frontend/introduction.md +1 -1
- package/cabloy-docs/frontend/navigation-guards-guide.md +20 -11
- package/cabloy-docs/frontend/route-alias-guide.md +24 -0
- package/cabloy-docs/frontend/scripts.md +71 -24
- package/cabloy-docs/frontend/ssr-init-data.md +25 -0
- package/cabloy-docs/frontend/ssr-review-checklist.md +17 -7
- package/cabloy-docs/frontend/use-state-data-best-practices.md +4 -0
- package/cabloy-docs/frontend/zova-router-under-the-hood.md +4 -1
- package/cabloy-docs/fullstack/comparison-with-other-frameworks.md +19 -13
- package/cabloy-docs/fullstack/introduction.md +10 -10
- package/cabloy-docs/fullstack/quickstart.md +23 -1
- package/cabloy-docs/index.md +14 -14
- package/cabloy-docs/reference/package-map.md +11 -7
- package/cabloy-docs/reference/repo-scripts.md +108 -23
- package/e2e/scripts/e2e.ts +1 -1
- package/e2e/specs/a-commerce/commerce.spec.ts +124 -1
- package/package.json +2 -1
- package/scripts/init.ts +6 -12
- package/scripts/upgrade.ts +3 -1
- package/vona/packages-vona/vona/package.json +1 -1
- package/vona/pnpm-lock.yaml +39 -108
- package/vona/src/backend/config/config/config.ts +11 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/package.json +4 -2
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/.metadata/index.ts +732 -2
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/.metadata/locales.ts +18 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/bean/meta.index.ts +14 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/bean/meta.version.ts +52 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/bean/ssrMenu.category.ts +30 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/bean/ssrMenu.product.ts +30 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/bean/ssrMenu.sku.ts +30 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/config/locale/en-us.ts +19 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/config/locale/zh-cn.ts +19 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/controller/category.ts +65 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/controller/product.ts +86 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/controller/sku.ts +65 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/categoryCreate.tsx +28 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/categorySelectReq.tsx +25 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/categorySelectRes.tsx +11 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/categorySelectResItem.tsx +39 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/categoryUpdate.tsx +28 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/categoryView.tsx +25 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/productCreate.tsx +28 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/productPublic.tsx +38 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/productPublicSelectReq.tsx +23 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/productPublicSelectRes.tsx +11 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/productPublicSku.tsx +25 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/productSelectReq.tsx +25 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/productSelectRes.tsx +11 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/productSelectResItem.tsx +39 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/productUpdate.tsx +28 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/productView.tsx +25 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/skuCreate.tsx +28 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/skuSelectReq.tsx +25 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/skuSelectRes.tsx +11 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/skuSelectResItem.tsx +39 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/skuUpdate.tsx +28 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/skuView.tsx +25 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/entity/category.tsx +53 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/entity/product.tsx +48 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/entity/sku.tsx +66 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/index.ts +1 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/model/category.ts +15 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/model/product.ts +46 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/model/sku.ts +18 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/service/category.ts +47 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/service/product.ts +162 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/service/sku.ts +76 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/test/catalog.test.ts +358 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/test/category.test.ts +91 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/test/product.test.ts +154 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/test/sku.test.ts +190 -0
- package/vona/src/suite/a-commerce/modules/commerce-member/package.json +2 -1
- package/vona/src/suite/a-commerce/modules/commerce-member/src/.metadata/index.ts +342 -5
- package/vona/src/suite/a-commerce/modules/commerce-member/src/.metadata/locales.ts +18 -0
- package/vona/src/suite/a-commerce/modules/commerce-member/src/bean/meta.index.ts +12 -0
- package/vona/src/suite/a-commerce/modules/commerce-member/src/bean/meta.version.ts +31 -0
- package/vona/src/suite/a-commerce/modules/commerce-member/src/config/locale/en-us.ts +12 -0
- package/vona/src/suite/a-commerce/modules/commerce-member/src/config/locale/zh-cn.ts +12 -0
- package/vona/src/suite/a-commerce/modules/commerce-member/src/controller/address.ts +59 -0
- package/vona/src/suite/a-commerce/modules/commerce-member/src/dto/addressCreate.tsx +39 -0
- package/vona/src/suite/a-commerce/modules/commerce-member/src/dto/addressSelectReq.tsx +30 -0
- package/vona/src/suite/a-commerce/modules/commerce-member/src/dto/addressSelectRes.tsx +11 -0
- package/vona/src/suite/a-commerce/modules/commerce-member/src/dto/addressSelectResItem.tsx +53 -0
- package/vona/src/suite/a-commerce/modules/commerce-member/src/dto/addressUpdate.tsx +39 -0
- package/vona/src/suite/a-commerce/modules/commerce-member/src/dto/addressView.tsx +39 -0
- package/vona/src/suite/a-commerce/modules/commerce-member/src/entity/address.tsx +76 -0
- package/vona/src/suite/a-commerce/modules/commerce-member/src/index.ts +1 -0
- package/vona/src/suite/a-commerce/modules/commerce-member/src/model/address.ts +10 -0
- package/vona/src/suite/a-commerce/modules/commerce-member/src/service/address.ts +84 -0
- package/vona/src/suite/a-commerce/modules/commerce-member/test/addressOwnership.test.ts +203 -0
- package/vona/src/suite/a-commerce/modules/commerce-seed/package.json +52 -0
- package/vona/src/suite/a-commerce/modules/commerce-seed/src/.metadata/index.ts +55 -0
- package/vona/src/suite/a-commerce/modules/commerce-seed/src/.metadata/this.ts +2 -0
- package/vona/src/suite/a-commerce/modules/commerce-seed/src/bean/meta.version.ts +80 -0
- package/vona/src/suite/a-commerce/modules/commerce-seed/src/index.ts +1 -0
- package/vona/src/suite/a-commerce/modules/commerce-seed/tsconfig.build.json +11 -0
- package/vona/src/suite/a-commerce/modules/commerce-seed/tsconfig.json +7 -0
- package/vona/src/suite/a-commerce/modules/commerce-siteadmin/package.json +4 -2
- package/vona/src/suite/a-commerce/modules/commerce-siteadmin/src/.metadata/index.ts +192 -2
- package/vona/src/suite/a-commerce/modules/commerce-siteadmin/src/.metadata/locales.ts +18 -0
- package/vona/src/suite/a-commerce/modules/commerce-siteadmin/src/bean/meta.version.ts +32 -0
- package/vona/src/suite/a-commerce/modules/commerce-siteadmin/src/bean/ssrMenu.home.ts +3 -1
- package/vona/src/suite/a-commerce/modules/commerce-siteadmin/src/bean/ssrMenuGroup.catalog.ts +21 -0
- package/vona/src/suite/a-commerce/modules/commerce-siteadmin/src/bean/ssrMenuGroup.inventory.ts +21 -0
- package/vona/src/suite/a-commerce/modules/commerce-siteadmin/src/config/locale/en-us.ts +5 -0
- package/vona/src/suite/a-commerce/modules/commerce-siteadmin/src/config/locale/zh-cn.ts +5 -0
- package/vona/src/suite/a-commerce/modules/commerce-siteadmin/src/controller/operator.ts +21 -0
- package/vona/src/suite/a-commerce/modules/commerce-siteadmin/src/dto/operatorContext.ts +21 -0
- package/vona/src/suite/a-commerce/modules/commerce-siteadmin/src/index.ts +1 -0
- package/vona/src/suite/a-commerce/modules/commerce-siteadmin/src/service/operator.ts +18 -0
- package/vona/src/suite/a-commerce/modules/commerce-siteadmin/test/meta.version.test.ts +44 -0
- package/vona/src/suite/a-commerce/modules/commerce-siteadmin/test/operatorAccess.test.ts +55 -0
- package/vona/src/suite/a-commerce/modules/commerce-siteadmin/test/ssrMenu.test.ts +77 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/package.json +2 -1
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/.metadata/index.ts +773 -2
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/.metadata/locales.ts +18 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/bean/meta.index.ts +23 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/bean/meta.version.ts +79 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/bean/ssrMenu.stockAudit.ts +30 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/bean/ssrMenu.stockBalance.ts +30 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/config/locale/en-us.ts +25 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/config/locale/zh-cn.ts +25 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/controller/cart.ts +48 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/controller/stockAudit.ts +38 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/controller/stockBalance.ts +49 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/cartAddItem.tsx +19 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/cartItem.tsx +34 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/cartUpdateItem.tsx +15 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/cartView.tsx +18 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockAdjust.tsx +32 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockAuditCreate.tsx +28 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockAuditSelectReq.tsx +28 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockAuditSelectRes.tsx +11 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockAuditSelectResItem.tsx +33 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockAuditUpdate.tsx +28 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockAuditView.tsx +25 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockBalanceCreate.tsx +28 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockBalanceSelectReq.tsx +28 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockBalanceSelectRes.tsx +11 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockBalanceSelectResItem.tsx +33 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockBalanceUpdate.tsx +28 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockBalanceView.tsx +25 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/entity/cart.tsx +24 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/entity/cartItem.tsx +30 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/entity/stockAudit.tsx +86 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/entity/stockBalance.tsx +53 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/entity/stockReservation.tsx +63 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/index.ts +1 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/model/cart.ts +17 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/model/cartItem.ts +10 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/model/stockAudit.ts +10 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/model/stockBalance.ts +15 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/model/stockReservation.ts +10 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/service/cart.ts +152 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/service/stockAudit.ts +20 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/service/stockBalance.ts +305 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/test/cartOwnership.test.ts +174 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/test/stockAudit.test.ts +37 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/test/stockBalance.test.ts +186 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/test/stockReservation.test.ts +262 -0
- package/vona/src/suite/a-commerce/package.json +1 -0
- package/vona/src/suite/a-commerce/tsconfig.json +3 -0
- package/vona/src/suite/a-home/modules/home-user/src/.metadata/index.ts +7 -1
- package/vona/src/suite/a-home/modules/home-user/test/role.test.ts +14 -23
- package/vona/src/suite/a-training/modules/training-record/src/.metadata/index.ts +10 -8
- package/vona/src/suite/a-training/modules/training-recordsubject/src/.metadata/index.ts +2 -0
- package/vona/src/suite/a-training/modules/training-student/src/.metadata/index.ts +3 -1
- package/vona/src/suite-vendor/a-auth/modules/a-auth/package.json +1 -1
- package/vona/src/suite-vendor/a-auth/modules/a-auth/src/.metadata/index.ts +7 -3
- package/vona/src/suite-vendor/a-auth/modules/auth-simple/package.json +1 -1
- package/vona/src/suite-vendor/a-auth/modules/auth-simple/src/.metadata/index.ts +2 -0
- package/vona/src/suite-vendor/a-auth/package.json +1 -1
- package/vona/src/suite-vendor/a-cabloy/modules/a-datasharding/package.json +1 -1
- package/vona/src/suite-vendor/a-cabloy/modules/a-datasharding/src/.metadata/index.ts +1 -1
- package/vona/src/suite-vendor/a-cabloy/modules/a-datasource/package.json +1 -1
- package/vona/src/suite-vendor/a-cabloy/modules/a-datasource/src/.metadata/index.ts +3 -1
- package/vona/src/suite-vendor/a-cabloy/modules/a-socket/package.json +1 -1
- package/vona/src/suite-vendor/a-cabloy/modules/a-socket/src/.metadata/index.ts +1 -1
- 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/.metadata/index.ts +47 -47
- package/vona/src/suite-vendor/a-cabloy/modules/a-ssrhmr/package.json +1 -1
- package/vona/src/suite-vendor/a-cabloy/modules/a-ssrhmr/src/.metadata/index.ts +1 -1
- package/vona/src/suite-vendor/a-cabloy/modules/a-status/package.json +1 -1
- package/vona/src/suite-vendor/a-cabloy/modules/a-status/src/.metadata/index.ts +2 -0
- package/vona/src/suite-vendor/a-cabloy/package.json +1 -1
- package/vona/src/suite-vendor/a-captcha/modules/a-captcha/package.json +1 -1
- package/vona/src/suite-vendor/a-captcha/modules/a-captcha/src/.metadata/index.ts +1 -1
- package/vona/src/suite-vendor/a-captcha/package.json +1 -1
- package/vona/src/suite-vendor/a-file/modules/a-file/package.json +1 -1
- package/vona/src/suite-vendor/a-file/modules/a-file/src/.metadata/index.ts +42 -38
- package/vona/src/suite-vendor/a-file/package.json +2 -2
- package/vona/src/suite-vendor/a-image/modules/a-image/package.json +1 -1
- package/vona/src/suite-vendor/a-image/modules/a-image/src/.metadata/index.ts +42 -38
- package/vona/src/suite-vendor/a-image/modules/image-cloudflare/package.json +1 -1
- package/vona/src/suite-vendor/a-image/modules/image-cloudflare/src/.metadata/index.ts +42 -27
- package/vona/src/suite-vendor/a-image/package.json +1 -1
- package/vona/src/suite-vendor/a-paypal/modules/a-paypal/package.json +1 -1
- package/vona/src/suite-vendor/a-paypal/modules/a-paypal/src/.metadata/index.ts +3 -1
- package/vona/src/suite-vendor/a-paypal/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-beanmutate/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-beanmutate/src/.metadata/index.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-body/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-body/src/.metadata/index.ts +2 -2
- package/vona/src/suite-vendor/a-vona/modules/a-cache/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-cache/src/.metadata/index.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-core/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-core/src/.metadata/index.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-error/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-error/src/.metadata/index.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-event/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-event/src/.metadata/index.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-executor/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-executor/src/.metadata/index.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-hmr/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-hmr/src/.metadata/index.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-instance/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-instance/src/.metadata/index.ts +3 -1
- package/vona/src/suite-vendor/a-vona/modules/a-jwt/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-jwt/src/.metadata/index.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-logger/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-logger/src/.metadata/index.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-mail/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-mail/src/.metadata/index.ts +3 -1
- package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/.metadata/index.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-onion/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-onion/src/.metadata/index.ts +1 -1
- 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/.metadata/index.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/cli/model/metadata/generate.ts +5 -11
- 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/bean.model/bean.model_cache.ts +52 -0
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/dto/dtoGet.ts +4 -10
- package/vona/src/suite-vendor/a-vona/modules/a-redis/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-redis/src/.metadata/index.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-security/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-security/src/.metadata/index.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-serialization/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-serialization/src/.metadata/index.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-summer/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-summer/src/.metadata/index.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-user/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-user/src/.metadata/index.ts +4 -5
- 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/.metadata/index.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-version/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-version/src/.metadata/index.ts +6 -0
- 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/.metadata/index.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-worker/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-worker/src/.metadata/index.ts +1 -1
- package/vona/src/suite-vendor/a-vona/package.json +1 -1
- package/zova/packages-cli/cli/package.json +2 -2
- package/zova/packages-cli/cli-set-front/package.json +1 -1
- package/zova/packages-cli/cli-set-front/src/lib/bean/toolsMetadata/generateScope.ts +1 -1
- package/zova/packages-zova/zova/package.json +2 -2
- package/zova/pnpm-lock.yaml +9 -9
- package/zova/src/front/config/config/config.cabloyCommerce.ts +5 -1
- package/zova/src/front/config/config/config.cabloyCommerceAdmin.ts +2 -1
- package/zova/src/suite/a-commerce/modules/commerce-catalog/cli/openapi.config.ts +9 -0
- package/zova/src/suite/a-commerce/modules/commerce-catalog/package.json +2 -1
- package/zova/src/suite/a-commerce/modules/commerce-catalog/src/.metadata/index.ts +202 -3
- package/zova/src/suite/a-commerce/modules/commerce-catalog/src/.metadata/locales.ts +7 -0
- package/zova/src/suite/a-commerce/modules/commerce-catalog/src/.metadata/page/catalogue.ts +23 -0
- package/zova/src/suite/a-commerce/modules/commerce-catalog/src/.metadata/page/product.ts +19 -0
- package/zova/src/suite/a-commerce/modules/commerce-catalog/src/api/commerceCatalogProduct.ts +52 -0
- package/zova/src/suite/a-commerce/modules/commerce-catalog/src/api/openapi/baseURL.ts +5 -0
- package/zova/src/suite/a-commerce/modules/commerce-catalog/src/api/openapi/index.ts +3 -0
- package/zova/src/suite/a-commerce/modules/commerce-catalog/src/api/openapi/schemas.ts +412 -0
- package/zova/src/suite/a-commerce/modules/commerce-catalog/src/api/openapi/types.ts +7159 -0
- package/zova/src/suite/a-commerce/modules/commerce-catalog/src/apiSchema/commerceCatalogProduct.ts +20 -0
- package/zova/src/suite/a-commerce/modules/commerce-catalog/src/config/locale/en-us.ts +8 -0
- package/zova/src/suite/a-commerce/modules/commerce-catalog/src/config/locale/zh-cn.ts +8 -0
- package/zova/src/suite/a-commerce/modules/commerce-catalog/src/index.ts +1 -0
- package/zova/src/suite/a-commerce/modules/commerce-catalog/src/model/catalogue.ts +38 -0
- package/zova/src/suite/a-commerce/modules/commerce-catalog/src/page/catalogue/controller.tsx +71 -0
- package/zova/src/suite/a-commerce/modules/commerce-catalog/src/page/product/controller.tsx +108 -0
- package/zova/src/suite/a-commerce/modules/commerce-catalog/src/routes.ts +19 -0
- package/zova/src/suite/a-commerce/modules/commerce-member/cli/openapi.config.ts +9 -0
- package/zova/src/suite/a-commerce/modules/commerce-member/package.json +2 -1
- package/zova/src/suite/a-commerce/modules/commerce-member/src/.metadata/index.ts +182 -3
- package/zova/src/suite/a-commerce/modules/commerce-member/src/.metadata/locales.ts +7 -0
- package/zova/src/suite/a-commerce/modules/commerce-member/src/.metadata/page/address.ts +19 -0
- package/zova/src/suite/a-commerce/modules/commerce-member/src/api/commerceMemberAddress.ts +111 -0
- package/zova/src/suite/a-commerce/modules/commerce-member/src/api/openapi/baseURL.ts +5 -0
- package/zova/src/suite/a-commerce/modules/commerce-member/src/api/openapi/index.ts +3 -0
- package/zova/src/suite/a-commerce/modules/commerce-member/src/api/openapi/schemas.ts +432 -0
- package/zova/src/suite/a-commerce/modules/commerce-member/src/api/openapi/types.ts +7445 -0
- package/zova/src/suite/a-commerce/modules/commerce-member/src/apiSchema/commerceMemberAddress.ts +35 -0
- package/zova/src/suite/a-commerce/modules/commerce-member/src/config/locale/en-us.ts +17 -0
- package/zova/src/suite/a-commerce/modules/commerce-member/src/config/locale/zh-cn.ts +17 -0
- package/zova/src/suite/a-commerce/modules/commerce-member/src/index.ts +1 -0
- package/zova/src/suite/a-commerce/modules/commerce-member/src/model/address.ts +38 -0
- package/zova/src/suite/a-commerce/modules/commerce-member/src/page/address/controller.tsx +194 -0
- package/zova/src/suite/a-commerce/modules/commerce-member/src/routes.ts +12 -0
- package/zova/src/suite/a-commerce/modules/commerce-siteadmin/cli/openapi.config.ts +9 -0
- package/zova/src/suite/a-commerce/modules/commerce-siteadmin/package.json +2 -1
- package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/.metadata/index.ts +175 -3
- package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/.metadata/locales.ts +7 -0
- package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/.metadata/page/dashboard.ts +9 -0
- package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/api/commerceSiteadminOperator.ts +25 -0
- package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/api/openapi/baseURL.ts +5 -0
- package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/api/openapi/index.ts +3 -0
- package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/api/openapi/schemas.ts +304 -0
- package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/api/openapi/types.ts +5710 -0
- package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/apiSchema/commerceSiteadminOperator.ts +13 -0
- package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/config/locale/en-us.ts +5 -0
- package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/config/locale/zh-cn.ts +5 -0
- package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/index.ts +1 -0
- package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/model/operator.ts +17 -0
- package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/page/dashboard/controller.tsx +34 -0
- package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/routes.ts +5 -0
- package/zova/src/suite/a-commerce/modules/commerce-trade/cli/openapi.config.ts +15 -0
- package/zova/src/suite/a-commerce/modules/commerce-trade/package.json +2 -1
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/.metadata/index.ts +182 -3
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/.metadata/locales.ts +7 -0
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/.metadata/page/cart.ts +19 -0
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/api/commerceTradeCart.ts +99 -0
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/api/openapi/baseURL.ts +5 -0
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/api/openapi/index.ts +3 -0
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/api/openapi/schemas.ts +446 -0
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/api/openapi/types.ts +7651 -0
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/apiSchema/commerceTradeCart.ts +35 -0
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/config/locale/en-us.ts +8 -0
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/config/locale/zh-cn.ts +8 -0
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/index.ts +1 -0
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/model/cart.ts +77 -0
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/page/cart/controller.tsx +108 -0
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/routes.ts +12 -0
- package/zova/src/suite/a-demo/modules/demo-basic/src/.metadata/index.ts +5 -5
- package/zova/src/suite/a-demo/modules/demo-todo/src/.metadata/index.ts +2 -2
- package/zova/src/suite/a-home/modules/home-base/src/service/routerGuards.ts +18 -10
- package/zova/src/suite/a-home/modules/home-indexweb/src/.metadata/index.ts +2 -2
- 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/.metadata/index.ts +4 -4
- package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/model/resource.ts +1 -0
- package/zova/src/suite-vendor/a-cabloy/package.json +2 -2
- package/zova/src/suite-vendor/a-zova/modules/a-bean/cli/controller/metadata/generateMetaPage.ts +3 -1
- package/zova/src/suite-vendor/a-zova/modules/a-bean/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-fetch/package.json +2 -2
- 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 +3 -1
- package/zova/src/suite-vendor/a-zova/modules/a-router/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-router/src/bean/sys.router.ts +35 -8
- package/zova/src/suite-vendor/a-zova/modules/a-router/src/monkeySys.ts +28 -12
- package/zova/src/suite-vendor/a-zova/modules/a-router/src/service/routerGuards.ts +6 -8
- package/zova/src/suite-vendor/a-zova/modules/a-router/src/types/router.ts +14 -2
- package/zova/src/suite-vendor/a-zova/modules/a-router/src/types/utils.ts +4 -1
- package/zova/src/suite-vendor/a-zova/package.json +5 -5
- package/CLAUDE.local.md +0 -4
- /package/e2e/specs/{a-basic → cabloy-basic}/basic.spec.ts +0 -0
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import type { EntityStockReservation } from 'vona-module-commerce-trade';
|
|
2
|
+
|
|
3
|
+
import { catchError } from '@cabloy/utils';
|
|
4
|
+
import assert from 'node:assert';
|
|
5
|
+
import { describe, it } from 'node:test';
|
|
6
|
+
import { app } from 'vona-mock';
|
|
7
|
+
|
|
8
|
+
async function createSku(suffix: string): Promise<number> {
|
|
9
|
+
const categoryId = await app.bean.executor.performAction('post', '/commerce/catalog/category', {
|
|
10
|
+
body: { name: `reservation-category-${suffix}`, published: true },
|
|
11
|
+
});
|
|
12
|
+
const productId = await app.bean.executor.performAction('post', '/commerce/catalog/product', {
|
|
13
|
+
body: { categoryId, title: `reservation-product-${suffix}`, published: true },
|
|
14
|
+
});
|
|
15
|
+
return await app.bean.executor.performAction('post', '/commerce/catalog/sku', {
|
|
16
|
+
body: {
|
|
17
|
+
productId,
|
|
18
|
+
code: `reservation-sku-${suffix}`,
|
|
19
|
+
priceCents: 100,
|
|
20
|
+
lifecycle: 'active',
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async function prepareStock(suffix: string, quantity = 3): Promise<number> {
|
|
26
|
+
const skuId = await createSku(suffix);
|
|
27
|
+
await app.scope('commerce-trade').service.stockBalance.adjustStock({
|
|
28
|
+
skuId,
|
|
29
|
+
delta: quantity,
|
|
30
|
+
reason: 'reservation test setup',
|
|
31
|
+
correlationId: `reservation-setup-${suffix}`,
|
|
32
|
+
});
|
|
33
|
+
return skuId;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async function reserve(
|
|
37
|
+
skuId: number,
|
|
38
|
+
suffix: string,
|
|
39
|
+
quantity = 2,
|
|
40
|
+
): Promise<EntityStockReservation> {
|
|
41
|
+
return await app.scope('commerce-trade').service.stockBalance.reserve({
|
|
42
|
+
skuId,
|
|
43
|
+
quantity,
|
|
44
|
+
reason: 'reservation test',
|
|
45
|
+
correlationId: `reservation-${suffix}`,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async function assertReservationRejected(skuId: number, suffix: string, expectedCode: number) {
|
|
50
|
+
const [_, err] = await catchError(() => reserve(skuId, suffix));
|
|
51
|
+
assert.equal(err?.code, expectedCode);
|
|
52
|
+
const balance = await app.scope('commerce-trade').model.stockBalance.get({ skuId });
|
|
53
|
+
assert.deepEqual([balance?.onHand, balance?.reserved, balance?.available], [3, 0, 3]);
|
|
54
|
+
assert.equal(await app.scope('commerce-trade').model.stockReservation.get({ skuId }), undefined);
|
|
55
|
+
const audits = await app.scope('commerce-trade').model.stockAudit.select({ where: { skuId } });
|
|
56
|
+
assert.deepEqual(
|
|
57
|
+
audits.map(audit => audit.operation),
|
|
58
|
+
['adjust'],
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
describe('stockReservation.test.ts', () => {
|
|
63
|
+
it('reserves and consumes stock exactly once with traceable audits', async () => {
|
|
64
|
+
await app.bean.executor.mockCtx(async () => {
|
|
65
|
+
const suffix = `${Date.now()}`;
|
|
66
|
+
await app.bean.passport.signinMock();
|
|
67
|
+
try {
|
|
68
|
+
const skuId = await prepareStock(suffix);
|
|
69
|
+
const reservation = await reserve(skuId, suffix);
|
|
70
|
+
const balanceAfterReserve = await app
|
|
71
|
+
.scope('commerce-trade')
|
|
72
|
+
.model.stockBalance.get({ skuId });
|
|
73
|
+
assert.deepEqual(
|
|
74
|
+
[
|
|
75
|
+
balanceAfterReserve?.onHand,
|
|
76
|
+
balanceAfterReserve?.reserved,
|
|
77
|
+
balanceAfterReserve?.available,
|
|
78
|
+
],
|
|
79
|
+
[3, 2, 1],
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
const duplicate = await reserve(skuId, suffix);
|
|
83
|
+
assert.equal(duplicate.id, reservation.id);
|
|
84
|
+
const consumed = await app.scope('commerce-trade').service.stockBalance.consume({
|
|
85
|
+
reservationId: reservation.id,
|
|
86
|
+
reason: 'payment success',
|
|
87
|
+
});
|
|
88
|
+
assert.equal(consumed.state, 'consumed');
|
|
89
|
+
const duplicateConsume = await app.scope('commerce-trade').service.stockBalance.consume({
|
|
90
|
+
reservationId: reservation.id,
|
|
91
|
+
reason: 'payment success retry',
|
|
92
|
+
});
|
|
93
|
+
assert.equal(duplicateConsume.state, 'consumed');
|
|
94
|
+
|
|
95
|
+
const balanceAfterConsume = await app
|
|
96
|
+
.scope('commerce-trade')
|
|
97
|
+
.model.stockBalance.get({ skuId });
|
|
98
|
+
assert.deepEqual(
|
|
99
|
+
[
|
|
100
|
+
balanceAfterConsume?.onHand,
|
|
101
|
+
balanceAfterConsume?.reserved,
|
|
102
|
+
balanceAfterConsume?.available,
|
|
103
|
+
],
|
|
104
|
+
[1, 0, 1],
|
|
105
|
+
);
|
|
106
|
+
const audits = await app
|
|
107
|
+
.scope('commerce-trade')
|
|
108
|
+
.model.stockAudit.select({ where: { skuId } });
|
|
109
|
+
assert.deepEqual(
|
|
110
|
+
audits.map(audit => audit.operation),
|
|
111
|
+
['adjust', 'reserve', 'consume'],
|
|
112
|
+
);
|
|
113
|
+
assert.equal(audits[1].stockReservationId, reservation.id);
|
|
114
|
+
} finally {
|
|
115
|
+
await app.bean.passport.signout();
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it('rejects reservations for inactive or unpublished catalog data without writes', async () => {
|
|
121
|
+
await app.bean.executor.mockCtx(async () => {
|
|
122
|
+
const suffix = `${Date.now()}`;
|
|
123
|
+
await app.bean.passport.signinMock();
|
|
124
|
+
try {
|
|
125
|
+
const inactiveSkuId = await prepareStock(`${suffix}-inactive`);
|
|
126
|
+
await app.scope('commerce-catalog').model.sku.updateById(inactiveSkuId, {
|
|
127
|
+
lifecycle: 'inactive',
|
|
128
|
+
});
|
|
129
|
+
await assertReservationRejected(inactiveSkuId, `${suffix}-inactive`, 404);
|
|
130
|
+
|
|
131
|
+
const unpublishedProductSkuId = await prepareStock(`${suffix}-product`);
|
|
132
|
+
const unpublishedProductSku = await app
|
|
133
|
+
.scope('commerce-catalog')
|
|
134
|
+
.model.sku.getById(unpublishedProductSkuId);
|
|
135
|
+
await app
|
|
136
|
+
.scope('commerce-catalog')
|
|
137
|
+
.model.product.updateById(unpublishedProductSku!.productId, { published: false });
|
|
138
|
+
await assertReservationRejected(unpublishedProductSkuId, `${suffix}-product`, 409);
|
|
139
|
+
|
|
140
|
+
const unpublishedCategorySkuId = await prepareStock(`${suffix}-category`);
|
|
141
|
+
const unpublishedCategorySku = await app
|
|
142
|
+
.scope('commerce-catalog')
|
|
143
|
+
.model.sku.getById(unpublishedCategorySkuId);
|
|
144
|
+
const unpublishedCategoryProduct = await app
|
|
145
|
+
.scope('commerce-catalog')
|
|
146
|
+
.model.product.getById(unpublishedCategorySku!.productId);
|
|
147
|
+
await app
|
|
148
|
+
.scope('commerce-catalog')
|
|
149
|
+
.model.category.updateById(unpublishedCategoryProduct!.categoryId, { published: false });
|
|
150
|
+
await assertReservationRejected(unpublishedCategorySkuId, `${suffix}-category`, 409);
|
|
151
|
+
} finally {
|
|
152
|
+
await app.bean.passport.signout();
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
it('releases and restores stock only from legal reservation states', async () => {
|
|
158
|
+
await app.bean.executor.mockCtx(async () => {
|
|
159
|
+
const suffix = `${Date.now()}`;
|
|
160
|
+
await app.bean.passport.signinMock();
|
|
161
|
+
try {
|
|
162
|
+
const skuId = await prepareStock(suffix);
|
|
163
|
+
const releasedReservation = await reserve(skuId, `${suffix}-release`);
|
|
164
|
+
const released = await app.scope('commerce-trade').service.stockBalance.release({
|
|
165
|
+
reservationId: releasedReservation.id,
|
|
166
|
+
reason: 'payment failed',
|
|
167
|
+
});
|
|
168
|
+
assert.equal(released.state, 'released');
|
|
169
|
+
const duplicateRelease = await app.scope('commerce-trade').service.stockBalance.release({
|
|
170
|
+
reservationId: releasedReservation.id,
|
|
171
|
+
reason: 'payment failed retry',
|
|
172
|
+
});
|
|
173
|
+
assert.equal(duplicateRelease.state, 'released');
|
|
174
|
+
|
|
175
|
+
const consumedReservation = await reserve(skuId, `${suffix}-restore`, 1);
|
|
176
|
+
await app.scope('commerce-trade').service.stockBalance.consume({
|
|
177
|
+
reservationId: consumedReservation.id,
|
|
178
|
+
reason: 'payment success',
|
|
179
|
+
});
|
|
180
|
+
const restored = await app.scope('commerce-trade').service.stockBalance.restore({
|
|
181
|
+
reservationId: consumedReservation.id,
|
|
182
|
+
reason: 'refund success',
|
|
183
|
+
});
|
|
184
|
+
assert.equal(restored.state, 'restored');
|
|
185
|
+
|
|
186
|
+
const [_, err] = await catchError(() =>
|
|
187
|
+
app.scope('commerce-trade').service.stockBalance.consume({
|
|
188
|
+
reservationId: releasedReservation.id,
|
|
189
|
+
reason: 'invalid replay',
|
|
190
|
+
}),
|
|
191
|
+
);
|
|
192
|
+
assert.equal(err?.code, 409);
|
|
193
|
+
const balance = await app.scope('commerce-trade').model.stockBalance.get({ skuId });
|
|
194
|
+
assert.deepEqual([balance?.onHand, balance?.reserved, balance?.available], [3, 0, 3]);
|
|
195
|
+
} finally {
|
|
196
|
+
await app.bean.passport.signout();
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
it('allows exactly one competing reservation for the final unit', async () => {
|
|
202
|
+
await app.bean.executor.mockCtx(async () => {
|
|
203
|
+
const suffix = `${Date.now()}`;
|
|
204
|
+
await app.bean.passport.signinMock();
|
|
205
|
+
try {
|
|
206
|
+
const skuId = await prepareStock(suffix, 1);
|
|
207
|
+
const results = await Promise.allSettled([
|
|
208
|
+
reserve(skuId, `${suffix}-first`, 1),
|
|
209
|
+
reserve(skuId, `${suffix}-second`, 1),
|
|
210
|
+
]);
|
|
211
|
+
assert.equal(results.filter(result => result.status === 'fulfilled').length, 1);
|
|
212
|
+
assert.equal(results.filter(result => result.status === 'rejected').length, 1);
|
|
213
|
+
|
|
214
|
+
const balance = await app.scope('commerce-trade').model.stockBalance.get({ skuId });
|
|
215
|
+
assert.deepEqual([balance?.onHand, balance?.reserved, balance?.available], [1, 1, 0]);
|
|
216
|
+
const reservations = await app.scope('commerce-trade').model.stockReservation.select({
|
|
217
|
+
where: { skuId },
|
|
218
|
+
});
|
|
219
|
+
const audits = await app
|
|
220
|
+
.scope('commerce-trade')
|
|
221
|
+
.model.stockAudit.select({ where: { skuId } });
|
|
222
|
+
assert.equal(reservations.length, 1);
|
|
223
|
+
assert.deepEqual(
|
|
224
|
+
audits.map(audit => audit.operation),
|
|
225
|
+
['adjust', 'reserve'],
|
|
226
|
+
);
|
|
227
|
+
} finally {
|
|
228
|
+
await app.bean.passport.signout();
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
it('rolls back reservation and balance when audit persistence fails', async () => {
|
|
234
|
+
await app.bean.executor.mockCtx(async () => {
|
|
235
|
+
const suffix = `${Date.now()}`;
|
|
236
|
+
await app.bean.passport.signinMock();
|
|
237
|
+
try {
|
|
238
|
+
const skuId = await prepareStock(suffix);
|
|
239
|
+
const modelStockAudit = app.scope('commerce-trade').model.stockAudit;
|
|
240
|
+
const insert = modelStockAudit.insert.bind(modelStockAudit);
|
|
241
|
+
(modelStockAudit as any).insert = async () => {
|
|
242
|
+
throw new Error('reservation audit insert failure');
|
|
243
|
+
};
|
|
244
|
+
try {
|
|
245
|
+
const [_, err] = await catchError(() => reserve(skuId, suffix));
|
|
246
|
+
assert.match(err?.message ?? '', /reservation audit insert failure/);
|
|
247
|
+
} finally {
|
|
248
|
+
(modelStockAudit as any).insert = insert;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
const balance = await app.scope('commerce-trade').model.stockBalance.get({ skuId });
|
|
252
|
+
assert.deepEqual([balance?.onHand, balance?.reserved, balance?.available], [3, 0, 3]);
|
|
253
|
+
assert.equal(
|
|
254
|
+
await app.scope('commerce-trade').model.stockReservation.get({ skuId }),
|
|
255
|
+
undefined,
|
|
256
|
+
);
|
|
257
|
+
} finally {
|
|
258
|
+
await app.bean.passport.signout();
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
});
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
"vona-module-commerce-member": "^5.0.0",
|
|
11
11
|
"vona-module-commerce-payment": "^5.0.0",
|
|
12
12
|
"vona-module-commerce-promotion": "^5.0.0",
|
|
13
|
+
"vona-module-commerce-seed": "^5.0.0",
|
|
13
14
|
"vona-module-commerce-siteadmin": "^5.0.0",
|
|
14
15
|
"vona-module-commerce-siteweb": "^5.0.0",
|
|
15
16
|
"vona-module-commerce-trade": "^5.0.0"
|
|
@@ -144,7 +144,7 @@ import { SymbolKeyEntity, SymbolKeyEntityMeta, SymbolKeyModelOptions } from 'von
|
|
|
144
144
|
declare module 'vona-module-home-user' {
|
|
145
145
|
export interface IModelOptionsUser {
|
|
146
146
|
relations: {
|
|
147
|
-
roles: IModelRelationBelongsToMany<'home-user:roleUser', 'home-user:role', false,
|
|
147
|
+
roles: IModelRelationBelongsToMany<'home-user:roleUser', 'home-user:role', false, '*',undefined,undefined,undefined>;
|
|
148
148
|
};
|
|
149
149
|
}
|
|
150
150
|
export interface ModelRole {
|
|
@@ -152,6 +152,8 @@ declare module 'vona-module-home-user' {
|
|
|
152
152
|
[SymbolKeyEntityMeta]: EntityRoleMeta;
|
|
153
153
|
[SymbolKeyModelOptions]: IModelOptionsRole;
|
|
154
154
|
get<T extends IModelGetOptions<EntityRole,ModelRole>>(where: TypeModelWhere<EntityRole>, options?: T): Promise<TypeModelRelationResult<EntityRole, ModelRole, T> | undefined>;
|
|
155
|
+
getForUpdate<T extends IModelGetOptions<EntityRole,ModelRole>>(where: TypeModelWhere<EntityRole>, options?: T): Promise<TypeModelRelationResult<EntityRole, ModelRole, T> | undefined>;
|
|
156
|
+
getByIdForUpdate<T extends IModelGetOptions<EntityRole,ModelRole>>(id: TableIdentity, options?: T): Promise<TypeModelRelationResult<EntityRole, ModelRole, T> | undefined>;
|
|
155
157
|
mget<T extends IModelGetOptions<EntityRole,ModelRole>>(ids: TableIdentity[], options?: T): Promise<TypeModelRelationResult<EntityRole, ModelRole, T>[]>;
|
|
156
158
|
selectAndCount<T extends IModelSelectParams<EntityRole,ModelRole,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelSelectAndCount<EntityRole, ModelRole, T>>;
|
|
157
159
|
select<T extends IModelSelectParams<EntityRole,ModelRole,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelRelationResult<EntityRole, ModelRole, T>[]>;
|
|
@@ -181,6 +183,8 @@ export interface ModelRoleUser {
|
|
|
181
183
|
[SymbolKeyEntityMeta]: EntityRoleUserMeta;
|
|
182
184
|
[SymbolKeyModelOptions]: IModelOptionsRoleUser;
|
|
183
185
|
get<T extends IModelGetOptions<EntityRoleUser,ModelRoleUser>>(where: TypeModelWhere<EntityRoleUser>, options?: T): Promise<TypeModelRelationResult<EntityRoleUser, ModelRoleUser, T> | undefined>;
|
|
186
|
+
getForUpdate<T extends IModelGetOptions<EntityRoleUser,ModelRoleUser>>(where: TypeModelWhere<EntityRoleUser>, options?: T): Promise<TypeModelRelationResult<EntityRoleUser, ModelRoleUser, T> | undefined>;
|
|
187
|
+
getByIdForUpdate<T extends IModelGetOptions<EntityRoleUser,ModelRoleUser>>(id: TableIdentity, options?: T): Promise<TypeModelRelationResult<EntityRoleUser, ModelRoleUser, T> | undefined>;
|
|
184
188
|
mget<T extends IModelGetOptions<EntityRoleUser,ModelRoleUser>>(ids: TableIdentity[], options?: T): Promise<TypeModelRelationResult<EntityRoleUser, ModelRoleUser, T>[]>;
|
|
185
189
|
selectAndCount<T extends IModelSelectParams<EntityRoleUser,ModelRoleUser,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelSelectAndCount<EntityRoleUser, ModelRoleUser, T>>;
|
|
186
190
|
select<T extends IModelSelectParams<EntityRoleUser,ModelRoleUser,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelRelationResult<EntityRoleUser, ModelRoleUser, T>[]>;
|
|
@@ -206,6 +210,8 @@ export interface ModelUser {
|
|
|
206
210
|
[SymbolKeyEntityMeta]: EntityUserMeta;
|
|
207
211
|
[SymbolKeyModelOptions]: IModelOptionsUser;
|
|
208
212
|
get<T extends IModelGetOptions<EntityUser,ModelUser>>(where: TypeModelWhere<EntityUser>, options?: T): Promise<TypeModelRelationResult<EntityUser, ModelUser, T> | undefined>;
|
|
213
|
+
getForUpdate<T extends IModelGetOptions<EntityUser,ModelUser>>(where: TypeModelWhere<EntityUser>, options?: T): Promise<TypeModelRelationResult<EntityUser, ModelUser, T> | undefined>;
|
|
214
|
+
getByIdForUpdate<T extends IModelGetOptions<EntityUser,ModelUser>>(id: TableIdentity, options?: T): Promise<TypeModelRelationResult<EntityUser, ModelUser, T> | undefined>;
|
|
209
215
|
mget<T extends IModelGetOptions<EntityUser,ModelUser>>(ids: TableIdentity[], options?: T): Promise<TypeModelRelationResult<EntityUser, ModelUser, T>[]>;
|
|
210
216
|
selectAndCount<T extends IModelSelectParams<EntityUser,ModelUser,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelSelectAndCount<EntityUser, ModelUser, T>>;
|
|
211
217
|
select<T extends IModelSelectParams<EntityUser,ModelUser,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelRelationResult<EntityUser, ModelUser, T>[]>;
|
|
@@ -9,37 +9,28 @@ describe('role.test.ts', () => {
|
|
|
9
9
|
const roleRegisteredUser = await scope.model.role.getByName('registeredUser');
|
|
10
10
|
assert.equal(roleRegisteredUser?.title, 'Registered User');
|
|
11
11
|
assert.deepEqual(roleRegisteredUser?.locales, { 'zh-cn': '注册用户' });
|
|
12
|
-
assert.
|
|
12
|
+
assert.ok(roleRegisteredUser?.siteIds.includes('web'));
|
|
13
13
|
|
|
14
14
|
const roleSystemAdmin = await scope.model.role.getByName('systemAdmin');
|
|
15
15
|
assert.equal(roleSystemAdmin?.title, 'System Administrator');
|
|
16
16
|
assert.deepEqual(roleSystemAdmin?.locales, { 'zh-cn': '系统管理员' });
|
|
17
|
-
assert.
|
|
17
|
+
assert.ok(roleSystemAdmin?.siteIds.includes('web'));
|
|
18
|
+
assert.ok(roleSystemAdmin?.siteIds.includes('admin'));
|
|
18
19
|
|
|
19
20
|
await app.bean.passport.signinMock();
|
|
20
21
|
const passport = await app.bean.executor.performAction('get', '/home/user/passport/current');
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
name: role.name,
|
|
24
|
-
title: role.title,
|
|
25
|
-
locales: role.locales,
|
|
26
|
-
siteIds: role.siteIds,
|
|
27
|
-
})),
|
|
28
|
-
[
|
|
29
|
-
{
|
|
30
|
-
name: 'registeredUser',
|
|
31
|
-
title: 'Registered User',
|
|
32
|
-
locales: { 'zh-cn': '注册用户' },
|
|
33
|
-
siteIds: ['web'],
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
name: 'systemAdmin',
|
|
37
|
-
title: 'System Administrator',
|
|
38
|
-
locales: { 'zh-cn': '系统管理员' },
|
|
39
|
-
siteIds: ['web', 'admin'],
|
|
40
|
-
},
|
|
41
|
-
],
|
|
22
|
+
const passportRegisteredUser = passport.roles.find(
|
|
23
|
+
(role: any) => role.name === 'registeredUser',
|
|
42
24
|
);
|
|
25
|
+
assert.equal(passportRegisteredUser?.title, 'Registered User');
|
|
26
|
+
assert.deepEqual(passportRegisteredUser?.locales, { 'zh-cn': '注册用户' });
|
|
27
|
+
assert.ok(passportRegisteredUser?.siteIds.includes('web'));
|
|
28
|
+
|
|
29
|
+
const passportSystemAdmin = passport.roles.find((role: any) => role.name === 'systemAdmin');
|
|
30
|
+
assert.equal(passportSystemAdmin?.title, 'System Administrator');
|
|
31
|
+
assert.deepEqual(passportSystemAdmin?.locales, { 'zh-cn': '系统管理员' });
|
|
32
|
+
assert.ok(passportSystemAdmin?.siteIds.includes('web'));
|
|
33
|
+
assert.ok(passportSystemAdmin?.siteIds.includes('admin'));
|
|
43
34
|
});
|
|
44
35
|
});
|
|
45
36
|
});
|
|
@@ -95,6 +95,8 @@ trainingRecordSubjects: IModelRelationHasMany<'training-recordsubject:subject',
|
|
|
95
95
|
[SymbolKeyEntityMeta]: EntityRecordMeta;
|
|
96
96
|
[SymbolKeyModelOptions]: IModelOptionsRecord;
|
|
97
97
|
get<T extends IModelGetOptions<EntityRecord,ModelRecord>>(where: TypeModelWhere<EntityRecord>, options?: T): Promise<TypeModelRelationResult<EntityRecord, ModelRecord, T> | undefined>;
|
|
98
|
+
getForUpdate<T extends IModelGetOptions<EntityRecord,ModelRecord>>(where: TypeModelWhere<EntityRecord>, options?: T): Promise<TypeModelRelationResult<EntityRecord, ModelRecord, T> | undefined>;
|
|
99
|
+
getByIdForUpdate<T extends IModelGetOptions<EntityRecord,ModelRecord>>(id: TableIdentity, options?: T): Promise<TypeModelRelationResult<EntityRecord, ModelRecord, T> | undefined>;
|
|
98
100
|
mget<T extends IModelGetOptions<EntityRecord,ModelRecord>>(ids: TableIdentity[], options?: T): Promise<TypeModelRelationResult<EntityRecord, ModelRecord, T>[]>;
|
|
99
101
|
selectAndCount<T extends IModelSelectParams<EntityRecord,ModelRecord,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelSelectAndCount<EntityRecord, ModelRecord, T>>;
|
|
100
102
|
select<T extends IModelSelectParams<EntityRecord,ModelRecord,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelRelationResult<EntityRecord, ModelRecord, T>[]>;
|
|
@@ -393,15 +395,15 @@ export * from '../bean/fileScene.dossierFile.ts';
|
|
|
393
395
|
|
|
394
396
|
import { type IDecoratorFileSceneOptions } from 'vona-module-a-file';
|
|
395
397
|
declare module 'vona-module-a-file' {
|
|
396
|
-
|
|
398
|
+
|
|
397
399
|
export interface IFileSceneRecord {
|
|
398
400
|
'training-record:dossierFile': IDecoratorFileSceneOptions;
|
|
399
401
|
}
|
|
400
402
|
|
|
401
|
-
|
|
403
|
+
|
|
402
404
|
}
|
|
403
405
|
declare module 'vona-module-training-record' {
|
|
404
|
-
|
|
406
|
+
|
|
405
407
|
export interface FileSceneDossierFile {
|
|
406
408
|
/** @internal */
|
|
407
409
|
get scope(): ScopeModuleTrainingRecord;
|
|
@@ -411,7 +413,7 @@ declare module 'vona-module-training-record' {
|
|
|
411
413
|
get $beanFullName(): 'training-record.fileScene.dossierFile';
|
|
412
414
|
get $onionName(): 'training-record:dossierFile';
|
|
413
415
|
get $onionOptions(): IDecoratorFileSceneOptions;
|
|
414
|
-
}
|
|
416
|
+
}
|
|
415
417
|
}
|
|
416
418
|
/** fileScene: end */
|
|
417
419
|
/** imageScene: begin */
|
|
@@ -419,15 +421,15 @@ export * from '../bean/imageScene.sceneImage.ts';
|
|
|
419
421
|
|
|
420
422
|
import { type IDecoratorImageSceneOptions } from 'vona-module-a-image';
|
|
421
423
|
declare module 'vona-module-a-image' {
|
|
422
|
-
|
|
424
|
+
|
|
423
425
|
export interface IImageSceneRecord {
|
|
424
426
|
'training-record:sceneImage': IDecoratorImageSceneOptions;
|
|
425
427
|
}
|
|
426
428
|
|
|
427
|
-
|
|
429
|
+
|
|
428
430
|
}
|
|
429
431
|
declare module 'vona-module-training-record' {
|
|
430
|
-
|
|
432
|
+
|
|
431
433
|
export interface ImageSceneSceneImage {
|
|
432
434
|
/** @internal */
|
|
433
435
|
get scope(): ScopeModuleTrainingRecord;
|
|
@@ -437,7 +439,7 @@ declare module 'vona-module-training-record' {
|
|
|
437
439
|
get $beanFullName(): 'training-record.imageScene.sceneImage';
|
|
438
440
|
get $onionName(): 'training-record:sceneImage';
|
|
439
441
|
get $onionOptions(): IDecoratorImageSceneOptions;
|
|
440
|
-
}
|
|
442
|
+
}
|
|
441
443
|
}
|
|
442
444
|
/** imageScene: end */
|
|
443
445
|
/** locale: begin */
|
|
@@ -90,6 +90,8 @@ declare module 'vona-module-training-recordsubject' {
|
|
|
90
90
|
[SymbolKeyEntityMeta]: EntitySubjectMeta;
|
|
91
91
|
[SymbolKeyModelOptions]: IModelOptionsSubject;
|
|
92
92
|
get<T extends IModelGetOptions<EntitySubject,ModelSubject>>(where: TypeModelWhere<EntitySubject>, options?: T): Promise<TypeModelRelationResult<EntitySubject, ModelSubject, T> | undefined>;
|
|
93
|
+
getForUpdate<T extends IModelGetOptions<EntitySubject,ModelSubject>>(where: TypeModelWhere<EntitySubject>, options?: T): Promise<TypeModelRelationResult<EntitySubject, ModelSubject, T> | undefined>;
|
|
94
|
+
getByIdForUpdate<T extends IModelGetOptions<EntitySubject,ModelSubject>>(id: TableIdentity, options?: T): Promise<TypeModelRelationResult<EntitySubject, ModelSubject, T> | undefined>;
|
|
93
95
|
mget<T extends IModelGetOptions<EntitySubject,ModelSubject>>(ids: TableIdentity[], options?: T): Promise<TypeModelRelationResult<EntitySubject, ModelSubject, T>[]>;
|
|
94
96
|
selectAndCount<T extends IModelSelectParams<EntitySubject,ModelSubject,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelSelectAndCount<EntitySubject, ModelSubject, T>>;
|
|
95
97
|
select<T extends IModelSelectParams<EntitySubject,ModelSubject,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelRelationResult<EntitySubject, ModelSubject, T>[]>;
|
|
@@ -86,7 +86,7 @@ import { SymbolKeyEntity, SymbolKeyEntityMeta, SymbolKeyModelOptions } from 'von
|
|
|
86
86
|
declare module 'vona-module-training-student' {
|
|
87
87
|
export interface IModelOptionsStudent {
|
|
88
88
|
relations: {
|
|
89
|
-
trainingRecords: IModelRelationHasMany<'training-record:record', 'studentId', false, 'id'|'name'|'subjectCount'|'totalScore'|'averageScore'|'trainingTime'|'sceneImageIds'|'description', undefined, undefined, undefined>;
|
|
89
|
+
trainingRecords: IModelRelationHasMany<'training-record:record', 'studentId', false, 'id'|'name'|'subjectCount'|'totalScore'|'averageScore'|'trainingTime'|'sceneImageIds'|'dossierFileIds'|'description', undefined, undefined, undefined>;
|
|
90
90
|
};
|
|
91
91
|
}
|
|
92
92
|
export interface ModelStudent {
|
|
@@ -94,6 +94,8 @@ declare module 'vona-module-training-student' {
|
|
|
94
94
|
[SymbolKeyEntityMeta]: EntityStudentMeta;
|
|
95
95
|
[SymbolKeyModelOptions]: IModelOptionsStudent;
|
|
96
96
|
get<T extends IModelGetOptions<EntityStudent,ModelStudent>>(where: TypeModelWhere<EntityStudent>, options?: T): Promise<TypeModelRelationResult<EntityStudent, ModelStudent, T> | undefined>;
|
|
97
|
+
getForUpdate<T extends IModelGetOptions<EntityStudent,ModelStudent>>(where: TypeModelWhere<EntityStudent>, options?: T): Promise<TypeModelRelationResult<EntityStudent, ModelStudent, T> | undefined>;
|
|
98
|
+
getByIdForUpdate<T extends IModelGetOptions<EntityStudent,ModelStudent>>(id: TableIdentity, options?: T): Promise<TypeModelRelationResult<EntityStudent, ModelStudent, T> | undefined>;
|
|
97
99
|
mget<T extends IModelGetOptions<EntityStudent,ModelStudent>>(ids: TableIdentity[], options?: T): Promise<TypeModelRelationResult<EntityStudent, ModelStudent, T>[]>;
|
|
98
100
|
selectAndCount<T extends IModelSelectParams<EntityStudent,ModelStudent,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelSelectAndCount<EntityStudent, ModelStudent, T>>;
|
|
99
101
|
select<T extends IModelSelectParams<EntityStudent,ModelStudent,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelRelationResult<EntityStudent, ModelStudent, T>[]>;
|
|
@@ -115,7 +115,7 @@ import { SymbolKeyEntity, SymbolKeyEntityMeta, SymbolKeyModelOptions } from 'von
|
|
|
115
115
|
declare module 'vona-module-a-auth' {
|
|
116
116
|
export interface IModelOptionsAuth {
|
|
117
117
|
relations: {
|
|
118
|
-
authProvider: IModelRelationBelongsTo<
|
|
118
|
+
authProvider: IModelRelationBelongsTo<'a-auth:auth', 'a-auth:authProvider', false, 'id'|'providerName'|'clientName'>;
|
|
119
119
|
};
|
|
120
120
|
}
|
|
121
121
|
export interface ModelAuth {
|
|
@@ -123,6 +123,8 @@ declare module 'vona-module-a-auth' {
|
|
|
123
123
|
[SymbolKeyEntityMeta]: EntityAuthMeta;
|
|
124
124
|
[SymbolKeyModelOptions]: IModelOptionsAuth;
|
|
125
125
|
get<T extends IModelGetOptions<EntityAuth,ModelAuth>>(where: TypeModelWhere<EntityAuth>, options?: T): Promise<TypeModelRelationResult<EntityAuth, ModelAuth, T> | undefined>;
|
|
126
|
+
getForUpdate<T extends IModelGetOptions<EntityAuth,ModelAuth>>(where: TypeModelWhere<EntityAuth>, options?: T): Promise<TypeModelRelationResult<EntityAuth, ModelAuth, T> | undefined>;
|
|
127
|
+
getByIdForUpdate<T extends IModelGetOptions<EntityAuth,ModelAuth>>(id: TableIdentity, options?: T): Promise<TypeModelRelationResult<EntityAuth, ModelAuth, T> | undefined>;
|
|
126
128
|
mget<T extends IModelGetOptions<EntityAuth,ModelAuth>>(ids: TableIdentity[], options?: T): Promise<TypeModelRelationResult<EntityAuth, ModelAuth, T>[]>;
|
|
127
129
|
selectAndCount<T extends IModelSelectParams<EntityAuth,ModelAuth,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelSelectAndCount<EntityAuth, ModelAuth, T>>;
|
|
128
130
|
select<T extends IModelSelectParams<EntityAuth,ModelAuth,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelRelationResult<EntityAuth, ModelAuth, T>[]>;
|
|
@@ -148,6 +150,8 @@ export interface ModelAuthProvider {
|
|
|
148
150
|
[SymbolKeyEntityMeta]: EntityAuthProviderMeta;
|
|
149
151
|
[SymbolKeyModelOptions]: IModelOptionsAuthProvider;
|
|
150
152
|
get<T extends IModelGetOptions<EntityAuthProvider,ModelAuthProvider>>(where: TypeModelWhere<EntityAuthProvider>, options?: T): Promise<TypeModelRelationResult<EntityAuthProvider, ModelAuthProvider, T> | undefined>;
|
|
153
|
+
getForUpdate<T extends IModelGetOptions<EntityAuthProvider,ModelAuthProvider>>(where: TypeModelWhere<EntityAuthProvider>, options?: T): Promise<TypeModelRelationResult<EntityAuthProvider, ModelAuthProvider, T> | undefined>;
|
|
154
|
+
getByIdForUpdate<T extends IModelGetOptions<EntityAuthProvider,ModelAuthProvider>>(id: TableIdentity, options?: T): Promise<TypeModelRelationResult<EntityAuthProvider, ModelAuthProvider, T> | undefined>;
|
|
151
155
|
mget<T extends IModelGetOptions<EntityAuthProvider,ModelAuthProvider>>(ids: TableIdentity[], options?: T): Promise<TypeModelRelationResult<EntityAuthProvider, ModelAuthProvider, T>[]>;
|
|
152
156
|
selectAndCount<T extends IModelSelectParams<EntityAuthProvider,ModelAuthProvider,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelSelectAndCount<EntityAuthProvider, ModelAuthProvider, T>>;
|
|
153
157
|
select<T extends IModelSelectParams<EntityAuthProvider,ModelAuthProvider,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelRelationResult<EntityAuthProvider, ModelAuthProvider, T>[]>;
|
|
@@ -203,11 +207,11 @@ declare module 'vona-module-a-auth' {
|
|
|
203
207
|
/** bean: begin */
|
|
204
208
|
import type { BeanAuth } from '../bean/bean.auth.ts';
|
|
205
209
|
import type { BeanAuthProvider } from '../bean/bean.authProvider.ts';
|
|
206
|
-
import 'vona';
|
|
210
|
+
import 'vona';
|
|
207
211
|
declare module 'vona' {
|
|
208
212
|
export interface IBeanRecordGlobal {
|
|
209
213
|
'auth': BeanAuth;
|
|
210
|
-
'authProvider': BeanAuthProvider;
|
|
214
|
+
'authProvider': BeanAuthProvider;
|
|
211
215
|
}
|
|
212
216
|
}
|
|
213
217
|
/** bean: end */
|
|
@@ -90,6 +90,8 @@ declare module 'vona-module-auth-simple' {
|
|
|
90
90
|
[SymbolKeyEntityMeta]: EntityAuthSimpleMeta;
|
|
91
91
|
[SymbolKeyModelOptions]: IModelOptionsAuthSimple;
|
|
92
92
|
get<T extends IModelGetOptions<EntityAuthSimple,ModelAuthSimple>>(where: TypeModelWhere<EntityAuthSimple>, options?: T): Promise<TypeModelRelationResult<EntityAuthSimple, ModelAuthSimple, T> | undefined>;
|
|
93
|
+
getForUpdate<T extends IModelGetOptions<EntityAuthSimple,ModelAuthSimple>>(where: TypeModelWhere<EntityAuthSimple>, options?: T): Promise<TypeModelRelationResult<EntityAuthSimple, ModelAuthSimple, T> | undefined>;
|
|
94
|
+
getByIdForUpdate<T extends IModelGetOptions<EntityAuthSimple,ModelAuthSimple>>(id: TableIdentity, options?: T): Promise<TypeModelRelationResult<EntityAuthSimple, ModelAuthSimple, T> | undefined>;
|
|
93
95
|
mget<T extends IModelGetOptions<EntityAuthSimple,ModelAuthSimple>>(ids: TableIdentity[], options?: T): Promise<TypeModelRelationResult<EntityAuthSimple, ModelAuthSimple, T>[]>;
|
|
94
96
|
selectAndCount<T extends IModelSelectParams<EntityAuthSimple,ModelAuthSimple,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelSelectAndCount<EntityAuthSimple, ModelAuthSimple, T>>;
|
|
95
97
|
select<T extends IModelSelectParams<EntityAuthSimple,ModelAuthSimple,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelRelationResult<EntityAuthSimple, ModelAuthSimple, T>[]>;
|
|
@@ -43,7 +43,7 @@ declare module 'vona-module-a-datasharding' {
|
|
|
43
43
|
/** bean: end */
|
|
44
44
|
/** bean: begin */
|
|
45
45
|
import type { BeanDatasharding } from '../bean/bean.datasharding.ts';
|
|
46
|
-
import 'vona';
|
|
46
|
+
import 'vona';
|
|
47
47
|
declare module 'vona' {
|
|
48
48
|
export interface IBeanRecordGlobal {
|
|
49
49
|
'datasharding': BeanDatasharding;
|
|
@@ -90,6 +90,8 @@ declare module 'vona-module-a-datasource' {
|
|
|
90
90
|
[SymbolKeyEntityMeta]: EntityDatasourceMeta;
|
|
91
91
|
[SymbolKeyModelOptions]: IModelOptionsDatasource;
|
|
92
92
|
get<T extends IModelGetOptions<EntityDatasource,ModelDatasource>>(where: TypeModelWhere<EntityDatasource>, options?: T): Promise<TypeModelRelationResult<EntityDatasource, ModelDatasource, T> | undefined>;
|
|
93
|
+
getForUpdate<T extends IModelGetOptions<EntityDatasource,ModelDatasource>>(where: TypeModelWhere<EntityDatasource>, options?: T): Promise<TypeModelRelationResult<EntityDatasource, ModelDatasource, T> | undefined>;
|
|
94
|
+
getByIdForUpdate<T extends IModelGetOptions<EntityDatasource,ModelDatasource>>(id: TableIdentity, options?: T): Promise<TypeModelRelationResult<EntityDatasource, ModelDatasource, T> | undefined>;
|
|
93
95
|
mget<T extends IModelGetOptions<EntityDatasource,ModelDatasource>>(ids: TableIdentity[], options?: T): Promise<TypeModelRelationResult<EntityDatasource, ModelDatasource, T>[]>;
|
|
94
96
|
selectAndCount<T extends IModelSelectParams<EntityDatasource,ModelDatasource,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelSelectAndCount<EntityDatasource, ModelDatasource, T>>;
|
|
95
97
|
select<T extends IModelSelectParams<EntityDatasource,ModelDatasource,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelRelationResult<EntityDatasource, ModelDatasource, T>[]>;
|
|
@@ -139,7 +141,7 @@ declare module 'vona-module-a-datasource' {
|
|
|
139
141
|
/** bean: end */
|
|
140
142
|
/** bean: begin */
|
|
141
143
|
import type { BeanDatasource } from '../bean/bean.datasource.ts';
|
|
142
|
-
import 'vona';
|
|
144
|
+
import 'vona';
|
|
143
145
|
declare module 'vona' {
|
|
144
146
|
export interface IBeanRecordGlobal {
|
|
145
147
|
'datasource': BeanDatasource;
|
|
@@ -17,7 +17,7 @@ declare module 'vona-module-a-socket' {
|
|
|
17
17
|
/** bean: end */
|
|
18
18
|
/** bean: begin */
|
|
19
19
|
import type { BeanSocket } from '../bean/bean.socket.ts';
|
|
20
|
-
import 'vona';
|
|
20
|
+
import 'vona';
|
|
21
21
|
declare module 'vona' {
|
|
22
22
|
export interface IBeanRecordGlobal {
|
|
23
23
|
'socket': BeanSocket;
|