@stackonward/cli 0.0.1 → 1.0.1
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/dist/index.js +4588 -205
- package/dist/index.js.map +1 -1
- package/dist/resources/apple/.claude/docs/architecture-template.md +54 -0
- package/dist/resources/apple/.claude/docs/architecture.md +52 -0
- package/dist/resources/apple/.claude/docs/index.md +13 -0
- package/dist/resources/apple/.claude/docs/security-lifecycle.md +57 -0
- package/dist/resources/apple/.claude/docs/stack.md +93 -0
- package/dist/resources/apple/.claude/docs/verification.md +63 -0
- package/dist/resources/apple/AGENTS.md +397 -0
- package/dist/resources/apple/CLAUDE.md +397 -0
- package/dist/resources/apple/Gemfile +2 -0
- package/dist/resources/apple/Gemfile.lock +365 -0
- package/dist/resources/apple/_gitignore +14 -0
- package/dist/resources/apple/fastlane/Fastfile +123 -0
- package/dist/resources/components/nuxt/site-source/app/app.vue +42 -0
- package/dist/resources/components/nuxt/site-source/app/assets/css/site-shell.css +1035 -0
- package/dist/resources/components/nuxt/site-source/app/assets/icons/brand/.gitkeep +0 -0
- package/dist/resources/components/nuxt/site-source/app/assets/icons/common/.gitkeep +0 -0
- package/dist/resources/components/nuxt/site-source/app/components/site/ApplicationHeader.vue +35 -0
- package/dist/resources/components/nuxt/site-source/app/components/site/ApplicationShell.vue +56 -0
- package/dist/resources/components/nuxt/site-source/app/components/site/ApplicationSidebar.vue +40 -0
- package/dist/resources/components/nuxt/site-source/app/components/site/BackToTop.vue +42 -0
- package/dist/resources/components/nuxt/site-source/app/components/site/ContentArticlePage.vue +40 -0
- package/dist/resources/components/nuxt/site-source/app/components/site/ContentListPage.vue +30 -0
- package/dist/resources/components/nuxt/site-source/app/components/site/CookieConsent.vue +18 -0
- package/dist/resources/components/nuxt/site-source/app/components/site/MarketingFooter.vue +52 -0
- package/dist/resources/components/nuxt/site-source/app/components/site/MarketingHeader.vue +106 -0
- package/dist/resources/components/nuxt/site-source/app/components/site/MarketingShell.vue +35 -0
- package/dist/resources/components/nuxt/site-source/app/components/site/SiteBrand.vue +10 -0
- package/dist/resources/components/nuxt/site-source/app/components/site/StaticPage.vue +21 -0
- package/dist/resources/components/nuxt/site-source/app/components/site/ToastViewport.vue +25 -0
- package/dist/resources/components/nuxt/site-source/app/components/ui/BaseButton.vue +86 -0
- package/dist/resources/components/nuxt/site-source/app/components/ui/BaseGradientBorder.vue +59 -0
- package/dist/resources/components/nuxt/site-source/app/components/ui/BaseModal.vue +131 -0
- package/dist/resources/components/nuxt/site-source/app/components/ui/BasePopover.vue +150 -0
- package/dist/resources/components/nuxt/site-source/app/components/ui/BaseText.vue +138 -0
- package/dist/resources/components/nuxt/site-source/app/components/ui/CheckoutStatus.vue +112 -0
- package/dist/resources/components/nuxt/site-source/app/components/ui/CheckoutSummary.vue +172 -0
- package/dist/resources/components/nuxt/site-source/app/components/ui/GoogleSignInButton.vue +113 -0
- package/dist/resources/components/nuxt/site-source/app/components/ui/InfiniteScroll.vue +123 -0
- package/dist/resources/components/nuxt/site-source/app/components/ui/YoutubeEmbed.vue +126 -0
- package/dist/resources/components/nuxt/site-source/app/composables/useAnalytics.ts +24 -0
- package/dist/resources/components/nuxt/site-source/app/composables/useCheckout.ts +121 -0
- package/dist/resources/components/nuxt/site-source/app/composables/useConsent.ts +31 -0
- package/dist/resources/components/nuxt/site-source/app/composables/useGoogleIdentity.ts +163 -0
- package/dist/resources/components/nuxt/site-source/app/composables/useNavigation.ts +11 -0
- package/dist/resources/components/nuxt/site-source/app/composables/useSeo.ts +33 -0
- package/dist/resources/components/nuxt/site-source/app/composables/useSiteShell.ts +58 -0
- package/dist/resources/components/nuxt/site-source/app/composables/useToasts.ts +48 -0
- package/dist/resources/components/nuxt/site-source/app/layouts/app.vue +5 -0
- package/dist/resources/components/nuxt/site-source/app/layouts/default.vue +5 -0
- package/dist/resources/components/nuxt/site-source/app/plugins/analytics.client.ts +121 -0
- package/dist/resources/components/nuxt/site-source/app/plugins/google-identity.client.ts +24 -0
- package/dist/resources/components/nuxt/site-source/app/theme/accordion.ts +9 -0
- package/dist/resources/components/nuxt/site-source/app/theme/breadcrumb.ts +8 -0
- package/dist/resources/components/nuxt/site-source/app/theme/button.ts +92 -0
- package/dist/resources/components/nuxt/site-source/app/theme/carousel.ts +11 -0
- package/dist/resources/components/nuxt/site-source/app/theme/checkbox.ts +12 -0
- package/dist/resources/components/nuxt/site-source/app/theme/index.ts +30 -0
- package/dist/resources/components/nuxt/site-source/app/theme/input.ts +47 -0
- package/dist/resources/components/nuxt/site-source/app/theme/modal.ts +9 -0
- package/dist/resources/components/nuxt/site-source/app/theme/pagination.ts +6 -0
- package/dist/resources/components/nuxt/site-source/app/theme/select.ts +23 -0
- package/dist/resources/components/nuxt/site-source/app/theme/stepper.ts +10 -0
- package/dist/resources/components/nuxt/site-source/app/theme/toast.ts +8 -0
- package/dist/resources/components/nuxt/site-source/app/theme/tooltip.ts +6 -0
- package/dist/resources/components/nuxt/site-source/app/types/site-shell.ts +85 -0
- package/dist/resources/components/react/ui/Button.tsx +73 -0
- package/dist/resources/components/react/ui/Input.tsx +44 -0
- package/dist/resources/components/registry.json +355 -0
- package/dist/resources/components/vue/feedback/Toast.vue +120 -0
- package/dist/resources/components/vue/feedback/useToast.ts +70 -0
- package/dist/resources/components/vue/media/FileUpload.vue +229 -0
- package/dist/resources/components/vue/media/VideoPlayer.vue +157 -0
- package/dist/resources/components/vue/ui/AppImage.vue +147 -0
- package/dist/resources/components/vue/ui/BottomSheet.vue +217 -0
- package/dist/resources/components/vue/ui/Button.vue +154 -0
- package/dist/resources/components/vue/ui/Card.vue +111 -0
- package/dist/resources/components/vue/ui/Input.vue +113 -0
- package/dist/resources/components/vue/ui/Modal.vue +193 -0
- package/dist/resources/components/vue/ui/ScrollArea.vue +163 -0
- package/dist/resources/components/vue/ui/Tooltip.vue +115 -0
- package/dist/resources/registry.json +158 -0
- package/dist/resources/snippets/node/cache.ts +116 -0
- package/dist/resources/snippets/node/date.ts +126 -0
- package/dist/resources/snippets/node/logger.ts +104 -0
- package/dist/resources/snippets/node/validation.ts +132 -0
- package/dist/resources/snippets/react/useDebounce.ts +90 -0
- package/dist/resources/snippets/registry.json +65 -0
- package/dist/resources/snippets/vue/useAsync.ts +96 -0
- package/dist/resources/snippets/vue/usePagination.ts +102 -0
- package/dist/resources/templates/base/.claude/docs/architecture-template.md +459 -0
- package/dist/resources/templates/base/.claude/docs/architecture.md +137 -0
- package/dist/resources/templates/base/.claude/docs/index.md +42 -0
- package/dist/resources/templates/base/.claude/docs/security-lifecycle.md +129 -0
- package/dist/resources/templates/base/.claude/docs/verification.md +121 -0
- package/dist/resources/templates/base/AGENTS.md +415 -0
- package/dist/resources/templates/base/CLAUDE.md +415 -0
- package/dist/resources/templates/go-backend/.claude/docs/api-design.md +486 -0
- package/dist/resources/templates/go-backend/.claude/docs/architecture-template.md +449 -0
- package/dist/resources/templates/go-backend/.claude/docs/check-list.md +155 -0
- package/dist/resources/templates/go-backend/.claude/docs/database.md +369 -0
- package/dist/resources/templates/go-backend/.claude/docs/e2e-standards.md +161 -0
- package/dist/resources/templates/go-backend/.claude/docs/error-handling.md +558 -0
- package/dist/resources/templates/go-backend/.claude/docs/event-runtime-boundary.md +124 -0
- package/dist/resources/templates/go-backend/.claude/docs/identifier-contract.md +195 -0
- package/dist/resources/templates/go-backend/.claude/docs/index.md +22 -0
- package/dist/resources/templates/go-backend/.claude/docs/logging.md +314 -0
- package/dist/resources/templates/go-backend/.claude/docs/mediagen-provider-onboarding-sop.md +917 -0
- package/dist/resources/templates/go-backend/.claude/docs/mediagen-provider-quick-reference.md +195 -0
- package/dist/resources/templates/go-backend/.claude/docs/module-standards.md +309 -0
- package/dist/resources/templates/go-backend/.claude/docs/openapi-contract.md +141 -0
- package/dist/resources/templates/go-backend/.claude/docs/payment-gateway-onboarding.md +283 -0
- package/dist/resources/templates/go-backend/.claude/docs/platform-boundary.md +191 -0
- package/dist/resources/templates/go-backend/.claude/docs/quality-gates.md +112 -0
- package/dist/resources/templates/go-backend/.dockerignore +6 -0
- package/dist/resources/templates/go-backend/.env.example +13 -0
- package/dist/resources/templates/go-backend/.gitattributes +2 -0
- package/dist/resources/templates/go-backend/AGENTS.md +1139 -0
- package/dist/resources/templates/go-backend/CLAUDE.md +1139 -0
- package/dist/resources/templates/go-backend/Dockerfile +14 -0
- package/dist/resources/templates/go-backend/Makefile +71 -0
- package/dist/resources/templates/go-backend/README.md +66 -0
- package/dist/resources/templates/go-backend/_gitignore +10 -0
- package/dist/resources/templates/go-backend/api/openapi/README.md +29 -0
- package/dist/resources/templates/go-backend/api/openapi/dist/artifact-manifest.json +19 -0
- package/dist/resources/templates/go-backend/api/openapi/dist/conformance-matrix.json +276 -0
- package/dist/resources/templates/go-backend/api/openapi/document.go +30 -0
- package/dist/resources/templates/go-backend/api/openapi/package.json +28 -0
- package/dist/resources/templates/go-backend/api/openapi/pnpm-lock.yaml +3052 -0
- package/dist/resources/templates/go-backend/api/openapi/redocly-source.yaml +18 -0
- package/dist/resources/templates/go-backend/api/openapi/redocly.yaml +8 -0
- package/dist/resources/templates/go-backend/api/openapi/sdk-generators.json +16 -0
- package/dist/resources/templates/go-backend/api/openapi/service-registry.json +39 -0
- package/dist/resources/templates/go-backend/api/openapi/services/product-api/conformance/runtime.arazzo.yaml +65 -0
- package/dist/resources/templates/go-backend/api/openapi/services/product-api/dist/internal.openapi.json +327 -0
- package/dist/resources/templates/go-backend/api/openapi/services/product-api/dist/runtime-contract.json +56 -0
- package/dist/resources/templates/go-backend/api/openapi/services/product-api/openapi.yaml +222 -0
- package/dist/resources/templates/go-backend/api/openapi/services/worker/conformance/runtime.arazzo.yaml +65 -0
- package/dist/resources/templates/go-backend/api/openapi/services/worker/dist/internal.openapi.json +327 -0
- package/dist/resources/templates/go-backend/api/openapi/services/worker/dist/runtime-contract.json +56 -0
- package/dist/resources/templates/go-backend/api/openapi/services/worker/openapi.yaml +222 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/breaking.mjs +416 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/build.mjs +103 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/conformance_coverage.mjs +111 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/contract_compiler.mjs +62 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/contract_policy.mjs +208 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/delegated_contract.mjs +302 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/deterministic_archive.mjs +69 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/documentation_example_privacy.mjs +93 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/documentation_projection.mjs +498 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/documentation_quality.mjs +346 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/git_artifact_history.mjs +188 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/manifest.mjs +170 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/overlay.mjs +98 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/project.mjs +549 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/route_contract.mjs +156 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/runtime_conformance.mjs +193 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/scalar_asset_localization.mjs +164 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/sdk_generator.mjs +229 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/semantic_version.mjs +64 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/service_contract_inputs.mjs +16 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/breaking.test.mjs +365 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/build.test.mjs +42 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/conformance_coverage.test.mjs +88 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/contract_policy.test.mjs +257 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/delegated_contract.test.mjs +205 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/documentation_example_privacy.test.mjs +51 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/documentation_projection.test.mjs +368 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/documentation_quality.test.mjs +151 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/git_artifact_history.test.mjs +60 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/head_policy.test.mjs +8 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/overlay.test.mjs +44 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/projection.test.mjs +270 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/redocly_documentation_rules.test.mjs +146 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/release_manifest.test.mjs +76 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/route_contract.test.mjs +119 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/runtime_conformance.test.mjs +75 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/scalar_asset_localization.test.mjs +50 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/sdk_generator.test.mjs +31 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/semantic_version.test.mjs +60 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/service_contract_inputs.test.mjs +27 -0
- package/dist/resources/templates/go-backend/cmd/internal/runtime/resources.go +125 -0
- package/dist/resources/templates/go-backend/cmd/internal/runtime/runtime.go +102 -0
- package/dist/resources/templates/go-backend/cmd/internal/runtime/runtime_test.go +70 -0
- package/dist/resources/templates/go-backend/cmd/product-api/lifecycle_test.go +58 -0
- package/dist/resources/templates/go-backend/cmd/product-api/main.go +32 -0
- package/dist/resources/templates/go-backend/cmd/product-api/wire.go +13 -0
- package/dist/resources/templates/go-backend/cmd/product-api/wire_gen.go +94 -0
- package/dist/resources/templates/go-backend/cmd/worker/main.go +47 -0
- package/dist/resources/templates/go-backend/cmd/worker/wire.go +14 -0
- package/dist/resources/templates/go-backend/cmd/worker/wire_gen.go +111 -0
- package/dist/resources/templates/go-backend/configs/config.yaml +37 -0
- package/dist/resources/templates/go-backend/deployments/compose.yaml +71 -0
- package/dist/resources/templates/go-backend/docs/openapi-provenance.json +489 -0
- package/dist/resources/templates/go-backend/docs/runtime-provenance.json +175 -0
- package/dist/resources/templates/go-backend/docs/source-provenance.json +3568 -0
- package/dist/resources/templates/go-backend/docs/standards-provenance.json +1624 -0
- package/dist/resources/templates/go-backend/go.mod +256 -0
- package/dist/resources/templates/go-backend/go.sum +805 -0
- package/dist/resources/templates/go-backend/internal/common/canonicaljson/canonical.go +370 -0
- package/dist/resources/templates/go-backend/internal/common/canonicaljson/canonical_test.go +223 -0
- package/dist/resources/templates/go-backend/internal/common/checkoutbff/contracts.go +125 -0
- package/dist/resources/templates/go-backend/internal/common/checkoutbff/platform_client.go +212 -0
- package/dist/resources/templates/go-backend/internal/common/checkoutbff/platform_client_test.go +319 -0
- package/dist/resources/templates/go-backend/internal/common/contentaccess/contentaccess.go +50 -0
- package/dist/resources/templates/go-backend/internal/common/contracts/contact.go +85 -0
- package/dist/resources/templates/go-backend/internal/common/ctxutil/identity.go +20 -0
- package/dist/resources/templates/go-backend/internal/common/ctxutil/product.go +53 -0
- package/dist/resources/templates/go-backend/internal/common/enumdomain/payment.go +12 -0
- package/dist/resources/templates/go-backend/internal/common/enums/dto_admin.go +9 -0
- package/dist/resources/templates/go-backend/internal/common/enums/enum.go +1247 -0
- package/dist/resources/templates/go-backend/internal/common/enums/handler_admin.go +66 -0
- package/dist/resources/templates/go-backend/internal/common/enums/module.go +46 -0
- package/dist/resources/templates/go-backend/internal/common/enums/provider.go +10 -0
- package/dist/resources/templates/go-backend/internal/common/enums/register.go +11 -0
- package/dist/resources/templates/go-backend/internal/common/enums/register_audit.go +274 -0
- package/dist/resources/templates/go-backend/internal/common/enums/register_command_replay.go +12 -0
- package/dist/resources/templates/go-backend/internal/common/enums/register_config.go +27 -0
- package/dist/resources/templates/go-backend/internal/common/enums/register_locale.go +37 -0
- package/dist/resources/templates/go-backend/internal/common/enums/register_ops.go +14 -0
- package/dist/resources/templates/go-backend/internal/common/enums/register_outbox.go +15 -0
- package/dist/resources/templates/go-backend/internal/common/enums/register_rule_expression.go +63 -0
- package/dist/resources/templates/go-backend/internal/common/enums/registry.go +77 -0
- package/dist/resources/templates/go-backend/internal/common/httporigin/origin.go +62 -0
- package/dist/resources/templates/go-backend/internal/common/httporigin/origin_test.go +38 -0
- package/dist/resources/templates/go-backend/internal/common/iamcredential/plaintext.go +35 -0
- package/dist/resources/templates/go-backend/internal/common/iamcredential/plaintext_test.go +29 -0
- package/dist/resources/templates/go-backend/internal/common/iamscope/scope.go +212 -0
- package/dist/resources/templates/go-backend/internal/common/iamscope/scope_binding.go +26 -0
- package/dist/resources/templates/go-backend/internal/common/iamscope/scope_filter.go +173 -0
- package/dist/resources/templates/go-backend/internal/common/iamscope/scope_filter_test.go +279 -0
- package/dist/resources/templates/go-backend/internal/common/internalapi/authorization_details.go +10 -0
- package/dist/resources/templates/go-backend/internal/common/internalapi/route_permission_policies.go +660 -0
- package/dist/resources/templates/go-backend/internal/common/internalapi/route_permission_policies_test.go +331 -0
- package/dist/resources/templates/go-backend/internal/common/internalservice/audience_token_source.go +166 -0
- package/dist/resources/templates/go-backend/internal/common/internalservice/bootstrap_token_exchanger.go +183 -0
- package/dist/resources/templates/go-backend/internal/common/internalservice/bound_service_token_signer.go +52 -0
- package/dist/resources/templates/go-backend/internal/common/internalservice/delegated_access_token_exchanger.go +189 -0
- package/dist/resources/templates/go-backend/internal/common/internalservice/delegated_access_token_exchanger_test.go +159 -0
- package/dist/resources/templates/go-backend/internal/common/internalservice/product_scoped_service_token_signer.go +92 -0
- package/dist/resources/templates/go-backend/internal/common/internalservice/provider.go +25 -0
- package/dist/resources/templates/go-backend/internal/common/internalservice/request_signer.go +86 -0
- package/dist/resources/templates/go-backend/internal/common/internalservice/resolver.go +69 -0
- package/dist/resources/templates/go-backend/internal/common/internalservice/resolver_test.go +42 -0
- package/dist/resources/templates/go-backend/internal/common/internalservice/route_scope.go +95 -0
- package/dist/resources/templates/go-backend/internal/common/internalservice/route_scope_test.go +78 -0
- package/dist/resources/templates/go-backend/internal/common/internalservice/service_identity_test.go +387 -0
- package/dist/resources/templates/go-backend/internal/common/jsonschema/compiler.go +100 -0
- package/dist/resources/templates/go-backend/internal/common/jsonschema/compiler_test.go +41 -0
- package/dist/resources/templates/go-backend/internal/common/jwksapi/handler.go +83 -0
- package/dist/resources/templates/go-backend/internal/common/jwksapi/handler_test.go +104 -0
- package/dist/resources/templates/go-backend/internal/common/locale/locale.go +145 -0
- package/dist/resources/templates/go-backend/internal/common/locale/locale_test.go +75 -0
- package/dist/resources/templates/go-backend/internal/common/mediaref/mediaref.go +54 -0
- package/dist/resources/templates/go-backend/internal/common/mediaref/mediaref_test.go +77 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/apikey_auth.go +320 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/apikey_throttle.go +158 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/auth.go +40 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/auth_test.go +50 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/client_context.go +86 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/cors.go +68 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/event_context.go +18 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/gateway_identity.go +279 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/helpers.go +159 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/iam_delegated_route_permission.go +171 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/iam_delegated_token_auth.go +151 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/iam_delegated_token_auth_test.go +99 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/iam_service_identity.go +138 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/iam_service_token_auth.go +74 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/idempotent.go +273 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/idempotent_test.go +83 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/internal_route_permission.go +45 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/internal_route_permission_test.go +186 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/logging.go +191 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/metrics.go +45 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/middleware_test.go +1516 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/principal_context.go +160 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/principal_context_test.go +355 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/product_context.go +100 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/recovery.go +40 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/referral_attribution.go +178 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/requestid.go +48 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/resource_permission.go +790 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/resource_permission_test.go +440 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/service_credential_auth.go +67 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/tenant.go +148 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/throttle.go +310 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/trusted_client_ip.go +23 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/trusted_client_ip_test.go +60 -0
- package/dist/resources/templates/go-backend/internal/common/money/currency.go +25 -0
- package/dist/resources/templates/go-backend/internal/common/money/errors.go +23 -0
- package/dist/resources/templates/go-backend/internal/common/money/format.go +123 -0
- package/dist/resources/templates/go-backend/internal/common/money/format_test.go +204 -0
- package/dist/resources/templates/go-backend/internal/common/money/gateway.go +144 -0
- package/dist/resources/templates/go-backend/internal/common/money/gateway_test.go +165 -0
- package/dist/resources/templates/go-backend/internal/common/money/rounding.go +56 -0
- package/dist/resources/templates/go-backend/internal/common/money/rounding_test.go +51 -0
- package/dist/resources/templates/go-backend/internal/common/principal/context.go +56 -0
- package/dist/resources/templates/go-backend/internal/common/principal/principal.go +49 -0
- package/dist/resources/templates/go-backend/internal/common/productcode/code.go +24 -0
- package/dist/resources/templates/go-backend/internal/common/productcode/code_test.go +35 -0
- package/dist/resources/templates/go-backend/internal/common/providerconfig/schema.go +577 -0
- package/dist/resources/templates/go-backend/internal/common/providerconfig/schema_test.go +47 -0
- package/dist/resources/templates/go-backend/internal/common/requestprivacy/request.go +246 -0
- package/dist/resources/templates/go-backend/internal/common/requestprivacy/request_test.go +170 -0
- package/dist/resources/templates/go-backend/internal/common/response/pagination.go +60 -0
- package/dist/resources/templates/go-backend/internal/common/response/response.go +110 -0
- package/dist/resources/templates/go-backend/internal/common/response/response_test.go +463 -0
- package/dist/resources/templates/go-backend/internal/common/ruleexpression/ast.go +141 -0
- package/dist/resources/templates/go-backend/internal/common/ruleexpression/ast_test.go +81 -0
- package/dist/resources/templates/go-backend/internal/common/ruleexpression/canonical.go +184 -0
- package/dist/resources/templates/go-backend/internal/common/ruleexpression/canonical_test.go +319 -0
- package/dist/resources/templates/go-backend/internal/common/ruleexpression/decoder.go +555 -0
- package/dist/resources/templates/go-backend/internal/common/ruleexpression/decoder_test.go +260 -0
- package/dist/resources/templates/go-backend/internal/common/ruleexpression/errors.go +55 -0
- package/dist/resources/templates/go-backend/internal/common/ruleexpression/evaluator.go +96 -0
- package/dist/resources/templates/go-backend/internal/common/ruleexpression/evaluator_test.go +220 -0
- package/dist/resources/templates/go-backend/internal/common/ruleexpression/fuzz_test.go +116 -0
- package/dist/resources/templates/go-backend/internal/common/ruleexpression/limits.go +331 -0
- package/dist/resources/templates/go-backend/internal/common/ruleexpression/schema.go +412 -0
- package/dist/resources/templates/go-backend/internal/common/ruleexpression/schema_test.go +164 -0
- package/dist/resources/templates/go-backend/internal/common/runtimeinput/runtime_input.go +627 -0
- package/dist/resources/templates/go-backend/internal/common/runtimeinput/runtime_input_test.go +245 -0
- package/dist/resources/templates/go-backend/internal/common/semver/errors.go +6 -0
- package/dist/resources/templates/go-backend/internal/common/semver/semver.go +125 -0
- package/dist/resources/templates/go-backend/internal/common/semver/semver_test.go +205 -0
- package/dist/resources/templates/go-backend/internal/common/serviceidentity/audience.go +48 -0
- package/dist/resources/templates/go-backend/internal/common/serviceidentity/audience_test.go +35 -0
- package/dist/resources/templates/go-backend/internal/common/serviceidentity/resource_identifier.go +33 -0
- package/dist/resources/templates/go-backend/internal/common/serviceidentity/resource_identifier_test.go +32 -0
- package/dist/resources/templates/go-backend/internal/common/tradeno/generator.go +99 -0
- package/dist/resources/templates/go-backend/internal/common/tradeno/generator_test.go +396 -0
- package/dist/resources/templates/go-backend/internal/common/tradeno/prefix.go +247 -0
- package/dist/resources/templates/go-backend/internal/common/types/asset_url.go +11 -0
- package/dist/resources/templates/go-backend/internal/common/types/billing.go +89 -0
- package/dist/resources/templates/go-backend/internal/common/types/billing_test.go +77 -0
- package/dist/resources/templates/go-backend/internal/common/types/country.go +74 -0
- package/dist/resources/templates/go-backend/internal/common/types/country_test.go +28 -0
- package/dist/resources/templates/go-backend/internal/common/types/currency.go +60 -0
- package/dist/resources/templates/go-backend/internal/common/types/identifiers.go +41 -0
- package/dist/resources/templates/go-backend/internal/common/types/operator.go +28 -0
- package/dist/resources/templates/go-backend/internal/common/types/subscription_entitlement.go +24 -0
- package/dist/resources/templates/go-backend/internal/common/types/subscription_entitlement_test.go +35 -0
- package/dist/resources/templates/go-backend/internal/common/types/tier.go +72 -0
- package/dist/resources/templates/go-backend/internal/common/types/types.go +411 -0
- package/dist/resources/templates/go-backend/internal/common/types/types_test.go +295 -0
- package/dist/resources/templates/go-backend/internal/common/utils/constants.go +100 -0
- package/dist/resources/templates/go-backend/internal/common/utils/crypto.go +158 -0
- package/dist/resources/templates/go-backend/internal/common/utils/crypto_test.go +345 -0
- package/dist/resources/templates/go-backend/internal/common/utils/duration.go +25 -0
- package/dist/resources/templates/go-backend/internal/common/utils/helpers.go +18 -0
- package/dist/resources/templates/go-backend/internal/common/utils/json.go +62 -0
- package/dist/resources/templates/go-backend/internal/common/utils/json_test.go +76 -0
- package/dist/resources/templates/go-backend/internal/common/utils/pagination.go +51 -0
- package/dist/resources/templates/go-backend/internal/common/utils/pagination_test.go +45 -0
- package/dist/resources/templates/go-backend/internal/common/utils/pointer.go +107 -0
- package/dist/resources/templates/go-backend/internal/common/utils/pointer_test.go +15 -0
- package/dist/resources/templates/go-backend/internal/common/utils/slice.go +24 -0
- package/dist/resources/templates/go-backend/internal/common/utils/snowflake.go +110 -0
- package/dist/resources/templates/go-backend/internal/common/utils/snowflake_test.go +316 -0
- package/dist/resources/templates/go-backend/internal/common/utils/string.go +16 -0
- package/dist/resources/templates/go-backend/internal/common/utils/timefmt.go +42 -0
- package/dist/resources/templates/go-backend/internal/common/validator/validator.go +136 -0
- package/dist/resources/templates/go-backend/internal/common/validator/validator_test.go +240 -0
- package/dist/resources/templates/go-backend/internal/common/youtubeapi/client.go +224 -0
- package/dist/resources/templates/go-backend/internal/core/apicontract/document.go +269 -0
- package/dist/resources/templates/go-backend/internal/core/apicontract/document_test.go +104 -0
- package/dist/resources/templates/go-backend/internal/core/apicontract/route_validator.go +78 -0
- package/dist/resources/templates/go-backend/internal/core/apicontract/route_validator_test.go +108 -0
- package/dist/resources/templates/go-backend/internal/core/apidocs/assets/scalar-api-reference.js +2385 -0
- package/dist/resources/templates/go-backend/internal/core/apidocs/assets/scalar-api-reference.metadata.json +10 -0
- package/dist/resources/templates/go-backend/internal/core/apidocs/route.go +107 -0
- package/dist/resources/templates/go-backend/internal/core/apidocs/route_test.go +200 -0
- package/dist/resources/templates/go-backend/internal/core/apidocs/scalar.go +117 -0
- package/dist/resources/templates/go-backend/internal/core/apidocs/scalar_test.go +99 -0
- package/dist/resources/templates/go-backend/internal/core/audit/access_log_policy.go +91 -0
- package/dist/resources/templates/go-backend/internal/core/audit/access_log_policy_test.go +51 -0
- package/dist/resources/templates/go-backend/internal/core/audit/actor_resolver.go +36 -0
- package/dist/resources/templates/go-backend/internal/core/audit/constants.go +30 -0
- package/dist/resources/templates/go-backend/internal/core/audit/context.go +119 -0
- package/dist/resources/templates/go-backend/internal/core/audit/context_test.go +310 -0
- package/dist/resources/templates/go-backend/internal/core/audit/dto.go +468 -0
- package/dist/resources/templates/go-backend/internal/core/audit/dto_admin.go +172 -0
- package/dist/resources/templates/go-backend/internal/core/audit/enum.go +460 -0
- package/dist/resources/templates/go-backend/internal/core/audit/enum_test.go +314 -0
- package/dist/resources/templates/go-backend/internal/core/audit/errors.go +9 -0
- package/dist/resources/templates/go-backend/internal/core/audit/handler.go +568 -0
- package/dist/resources/templates/go-backend/internal/core/audit/listener.go +319 -0
- package/dist/resources/templates/go-backend/internal/core/audit/listener_test.go +98 -0
- package/dist/resources/templates/go-backend/internal/core/audit/middleware.go +669 -0
- package/dist/resources/templates/go-backend/internal/core/audit/middleware_test.go +268 -0
- package/dist/resources/templates/go-backend/internal/core/audit/model.go +306 -0
- package/dist/resources/templates/go-backend/internal/core/audit/partition_job.go +316 -0
- package/dist/resources/templates/go-backend/internal/core/audit/ports.go +9 -0
- package/dist/resources/templates/go-backend/internal/core/audit/provider.go +30 -0
- package/dist/resources/templates/go-backend/internal/core/audit/repository.go +1007 -0
- package/dist/resources/templates/go-backend/internal/core/audit/repository_test.go +934 -0
- package/dist/resources/templates/go-backend/internal/core/audit/router.go +85 -0
- package/dist/resources/templates/go-backend/internal/core/audit/service.go +770 -0
- package/dist/resources/templates/go-backend/internal/core/audit/service_test.go +331 -0
- package/dist/resources/templates/go-backend/internal/core/audit/vo_admin.go +475 -0
- package/dist/resources/templates/go-backend/internal/core/cache/config.go +30 -0
- package/dist/resources/templates/go-backend/internal/core/cache/key.go +41 -0
- package/dist/resources/templates/go-backend/internal/core/cache/key_test.go +62 -0
- package/dist/resources/templates/go-backend/internal/core/cache/l1.go +153 -0
- package/dist/resources/templates/go-backend/internal/core/cache/l1_test.go +212 -0
- package/dist/resources/templates/go-backend/internal/core/cache/manager.go +278 -0
- package/dist/resources/templates/go-backend/internal/core/cache/manager_provider.go +24 -0
- package/dist/resources/templates/go-backend/internal/core/cache/metrics.go +126 -0
- package/dist/resources/templates/go-backend/internal/core/cache/namespace.go +46 -0
- package/dist/resources/templates/go-backend/internal/core/cache/namespace_test.go +90 -0
- package/dist/resources/templates/go-backend/internal/core/cache/options.go +39 -0
- package/dist/resources/templates/go-backend/internal/core/cache/options_test.go +96 -0
- package/dist/resources/templates/go-backend/internal/core/cache/redis.go +311 -0
- package/dist/resources/templates/go-backend/internal/core/cache/redis_test.go +51 -0
- package/dist/resources/templates/go-backend/internal/core/cache/serializer.go +31 -0
- package/dist/resources/templates/go-backend/internal/core/cache/serializer_test.go +139 -0
- package/dist/resources/templates/go-backend/internal/core/cache/singleflight.go +53 -0
- package/dist/resources/templates/go-backend/internal/core/cache/singleflight_test.go +211 -0
- package/dist/resources/templates/go-backend/internal/core/cache/warming.go +86 -0
- package/dist/resources/templates/go-backend/internal/core/clock/clock.go +66 -0
- package/dist/resources/templates/go-backend/internal/core/clock/clock_test.go +26 -0
- package/dist/resources/templates/go-backend/internal/core/clock/runtime_clock.go +283 -0
- package/dist/resources/templates/go-backend/internal/core/clock/runtime_clock_test.go +98 -0
- package/dist/resources/templates/go-backend/internal/core/commandreplay/errors.go +6 -0
- package/dist/resources/templates/go-backend/internal/core/commandreplay/model.go +90 -0
- package/dist/resources/templates/go-backend/internal/core/commandreplay/model_test.go +79 -0
- package/dist/resources/templates/go-backend/internal/core/commandreplay/namespace.go +7 -0
- package/dist/resources/templates/go-backend/internal/core/commandreplay/persistence.go +269 -0
- package/dist/resources/templates/go-backend/internal/core/commandreplay/persistence_test.go +185 -0
- package/dist/resources/templates/go-backend/internal/core/commandreplay/provider.go +9 -0
- package/dist/resources/templates/go-backend/internal/core/commandreplay/repository.go +22 -0
- package/dist/resources/templates/go-backend/internal/core/commandreplay/service.go +853 -0
- package/dist/resources/templates/go-backend/internal/core/commandreplay/service_persistence_test.go +432 -0
- package/dist/resources/templates/go-backend/internal/core/commandreplay/service_test.go +891 -0
- package/dist/resources/templates/go-backend/internal/core/commandreplay/types.go +121 -0
- package/dist/resources/templates/go-backend/internal/core/config/config.go +2069 -0
- package/dist/resources/templates/go-backend/internal/core/config/config_test.go +1122 -0
- package/dist/resources/templates/go-backend/internal/core/config/contract/contract_test.go +388 -0
- package/dist/resources/templates/go-backend/internal/core/config/contract/docs.go +198 -0
- package/dist/resources/templates/go-backend/internal/core/config/contract/verify.go +424 -0
- package/dist/resources/templates/go-backend/internal/core/config/enum.go +46 -0
- package/dist/resources/templates/go-backend/internal/core/config/metadata.go +717 -0
- package/dist/resources/templates/go-backend/internal/core/config/metadata_test.go +228 -0
- package/dist/resources/templates/go-backend/internal/core/config/product_admin_config_test.go +210 -0
- package/dist/resources/templates/go-backend/internal/core/crypto/aes_gcm.go +111 -0
- package/dist/resources/templates/go-backend/internal/core/crypto/aes_gcm_test.go +364 -0
- package/dist/resources/templates/go-backend/internal/core/crypto/encryptor.go +12 -0
- package/dist/resources/templates/go-backend/internal/core/crypto/envelope_encryptor.go +134 -0
- package/dist/resources/templates/go-backend/internal/core/crypto/envelope_encryptor_test.go +118 -0
- package/dist/resources/templates/go-backend/internal/core/crypto/pem.go +112 -0
- package/dist/resources/templates/go-backend/internal/core/crypto/pem_test.go +44 -0
- package/dist/resources/templates/go-backend/internal/core/crypto/provider.go +130 -0
- package/dist/resources/templates/go-backend/internal/core/crypto/provider_test.go +92 -0
- package/dist/resources/templates/go-backend/internal/core/database/base_model.go +24 -0
- package/dist/resources/templates/go-backend/internal/core/database/clickhouse.go +121 -0
- package/dist/resources/templates/go-backend/internal/core/database/database.go +112 -0
- package/dist/resources/templates/go-backend/internal/core/database/database_logger_test.go +95 -0
- package/dist/resources/templates/go-backend/internal/core/database/errors.go +25 -0
- package/dist/resources/templates/go-backend/internal/core/database/metrics_plugin.go +105 -0
- package/dist/resources/templates/go-backend/internal/core/database/pool_collector.go +71 -0
- package/dist/resources/templates/go-backend/internal/core/database/read_replica.go +520 -0
- package/dist/resources/templates/go-backend/internal/core/database/transaction.go +170 -0
- package/dist/resources/templates/go-backend/internal/core/database/transaction_test.go +282 -0
- package/dist/resources/templates/go-backend/internal/core/distlock/lock.go +353 -0
- package/dist/resources/templates/go-backend/internal/core/distlock/lock_test.go +106 -0
- package/dist/resources/templates/go-backend/internal/core/errors/handler.go +189 -0
- package/dist/resources/templates/go-backend/internal/core/errors/handler_test.go +515 -0
- package/dist/resources/templates/go-backend/internal/core/eventbus/eventbus.go +667 -0
- package/dist/resources/templates/go-backend/internal/core/eventbus/eventbus_test.go +792 -0
- package/dist/resources/templates/go-backend/internal/core/eventstream/noop.go +22 -0
- package/dist/resources/templates/go-backend/internal/core/eventstream/provider.go +20 -0
- package/dist/resources/templates/go-backend/internal/core/eventstream/publisher.go +38 -0
- package/dist/resources/templates/go-backend/internal/core/eventstream/redis.go +109 -0
- package/dist/resources/templates/go-backend/internal/core/eventstream/routing.go +104 -0
- package/dist/resources/templates/go-backend/internal/core/eventstream/routing_test.go +71 -0
- package/dist/resources/templates/go-backend/internal/core/geoip/model.go +19 -0
- package/dist/resources/templates/go-backend/internal/core/geoip/service.go +88 -0
- package/dist/resources/templates/go-backend/internal/core/health/health.go +333 -0
- package/dist/resources/templates/go-backend/internal/core/health/health_test.go +27 -0
- package/dist/resources/templates/go-backend/internal/core/httpclient/client.go +772 -0
- package/dist/resources/templates/go-backend/internal/core/httpclient/client_test.go +287 -0
- package/dist/resources/templates/go-backend/internal/core/httpclient/download.go +578 -0
- package/dist/resources/templates/go-backend/internal/core/httpclient/download_test.go +374 -0
- package/dist/resources/templates/go-backend/internal/core/jwtkeyring/jwk.go +38 -0
- package/dist/resources/templates/go-backend/internal/core/jwtkeyring/keyring.go +144 -0
- package/dist/resources/templates/go-backend/internal/core/jwtkeyring/keyring_test.go +128 -0
- package/dist/resources/templates/go-backend/internal/core/jwtkeyring/registry.go +60 -0
- package/dist/resources/templates/go-backend/internal/core/logger/logger.go +53 -0
- package/dist/resources/templates/go-backend/internal/core/logger/logger_test.go +194 -0
- package/dist/resources/templates/go-backend/internal/core/observability/metrics.go +358 -0
- package/dist/resources/templates/go-backend/internal/core/observability/sentry.go +445 -0
- package/dist/resources/templates/go-backend/internal/core/observability/sentry_privacy_test.go +175 -0
- package/dist/resources/templates/go-backend/internal/core/observability/tracing.go +187 -0
- package/dist/resources/templates/go-backend/internal/core/outbox/model.go +314 -0
- package/dist/resources/templates/go-backend/internal/core/outbox/model_test.go +77 -0
- package/dist/resources/templates/go-backend/internal/core/outbox/persistence.go +51 -0
- package/dist/resources/templates/go-backend/internal/core/outbox/provider.go +23 -0
- package/dist/resources/templates/go-backend/internal/core/outbox/relay.go +1138 -0
- package/dist/resources/templates/go-backend/internal/core/outbox/relay_postgres_test.go +257 -0
- package/dist/resources/templates/go-backend/internal/core/outbox/relay_test.go +690 -0
- package/dist/resources/templates/go-backend/internal/core/outbox/rescheduler.go +164 -0
- package/dist/resources/templates/go-backend/internal/core/outbox/rescheduler_test.go +209 -0
- package/dist/resources/templates/go-backend/internal/core/outbox/writer.go +249 -0
- package/dist/resources/templates/go-backend/internal/core/outbox/writer_postgres_test.go +170 -0
- package/dist/resources/templates/go-backend/internal/core/outbox/writer_test.go +123 -0
- package/dist/resources/templates/go-backend/internal/core/provider.go +198 -0
- package/dist/resources/templates/go-backend/internal/core/queue/metrics_middleware.go +38 -0
- package/dist/resources/templates/go-backend/internal/core/queue/metrics_middleware_test.go +12 -0
- package/dist/resources/templates/go-backend/internal/core/queue/queue.go +288 -0
- package/dist/resources/templates/go-backend/internal/core/queue/queue_test.go +159 -0
- package/dist/resources/templates/go-backend/internal/core/resilience/bulkhead.go +514 -0
- package/dist/resources/templates/go-backend/internal/core/resilience/bulkhead_test.go +984 -0
- package/dist/resources/templates/go-backend/internal/core/resilience/circuitbreaker.go +358 -0
- package/dist/resources/templates/go-backend/internal/core/resilience/circuitbreaker_test.go +788 -0
- package/dist/resources/templates/go-backend/internal/core/resilience/retry.go +318 -0
- package/dist/resources/templates/go-backend/internal/core/resilience/retry_test.go +735 -0
- package/dist/resources/templates/go-backend/internal/core/schedule/recorder.go +305 -0
- package/dist/resources/templates/go-backend/internal/core/schedule/run_context.go +124 -0
- package/dist/resources/templates/go-backend/internal/core/schedule/run_context_test.go +85 -0
- package/dist/resources/templates/go-backend/internal/core/schedule/scheduler.go +1589 -0
- package/dist/resources/templates/go-backend/internal/core/schedule/scheduler_control_test.go +808 -0
- package/dist/resources/templates/go-backend/internal/core/storage/oss_provider.go +398 -0
- package/dist/resources/templates/go-backend/internal/core/storage/oss_provider_test.go +89 -0
- package/dist/resources/templates/go-backend/internal/core/storage/path.go +110 -0
- package/dist/resources/templates/go-backend/internal/core/storage/path_test.go +301 -0
- package/dist/resources/templates/go-backend/internal/core/storage/s3_provider.go +489 -0
- package/dist/resources/templates/go-backend/internal/core/storage/s3_provider_test.go +60 -0
- package/dist/resources/templates/go-backend/internal/core/storage/storage.go +268 -0
- package/dist/resources/templates/go-backend/internal/core/storage/validation.go +225 -0
- package/dist/resources/templates/go-backend/internal/core/storage/validation_test.go +495 -0
- package/dist/resources/templates/go-backend/internal/core/temporal/logger.go +38 -0
- package/dist/resources/templates/go-backend/internal/core/temporal/provider.go +126 -0
- package/dist/resources/templates/go-backend/internal/core/temporal/provider_test.go +67 -0
- package/dist/resources/templates/go-backend/internal/core/websocket/client.go +282 -0
- package/dist/resources/templates/go-backend/internal/core/websocket/client_test.go +81 -0
- package/dist/resources/templates/go-backend/internal/core/websocket/config.go +58 -0
- package/dist/resources/templates/go-backend/internal/core/websocket/handler.go +53 -0
- package/dist/resources/templates/go-backend/internal/core/websocket/hub.go +269 -0
- package/dist/resources/templates/go-backend/internal/core/websocket/message.go +273 -0
- package/dist/resources/templates/go-backend/internal/core/websocket/notifier.go +92 -0
- package/dist/resources/templates/go-backend/internal/core/websocket/provider.go +33 -0
- package/dist/resources/templates/go-backend/internal/integrations/onex/iam/action.go +77 -0
- package/dist/resources/templates/go-backend/internal/integrations/onex/iam/action_test.go +238 -0
- package/dist/resources/templates/go-backend/internal/integrations/onex/iam/condition.go +107 -0
- package/dist/resources/templates/go-backend/internal/integrations/onex/iam/decision.go +256 -0
- package/dist/resources/templates/go-backend/internal/integrations/onex/iam/enum.go +643 -0
- package/dist/resources/templates/go-backend/internal/integrations/onex/iam/errors.go +102 -0
- package/dist/resources/templates/go-backend/internal/integrations/onex/iam/principal_record.go +21 -0
- package/dist/resources/templates/go-backend/internal/integrations/onex/iam/product_context.go +486 -0
- package/dist/resources/templates/go-backend/internal/integrations/onex/iam/resource.go +215 -0
- package/dist/resources/templates/go-backend/internal/integrations/onex/iam/resource_test.go +242 -0
- package/dist/resources/templates/go-backend/internal/products/README.md +5 -0
- package/dist/resources/templates/go-backend/internal/sharedevents/README.md +5 -0
- package/dist/resources/templates/go-backend/migrations/000001_infrastructure.down.sql +13 -0
- package/dist/resources/templates/go-backend/migrations/000001_infrastructure.up.sql +886 -0
- package/dist/resources/templates/go-backend/pkg/apierror/error.go +327 -0
- package/dist/resources/templates/go-backend/pkg/apierror/error_code.go +65 -0
- package/dist/resources/templates/go-backend/pkg/apierror/error_test.go +41 -0
- package/dist/resources/templates/go-backend/pkg/apierror/error_type.go +14 -0
- package/dist/resources/templates/go-backend/pkg/apierror/http_response.go +216 -0
- package/dist/resources/templates/go-backend/pkg/apierror/http_response_test.go +216 -0
- package/dist/resources/templates/go-backend/scripts/check-openapi-clean-deletion.sh +54 -0
- package/dist/resources/templates/go-backend/scripts/test-migrations.sh +32 -0
- package/dist/resources/templates/go-backend/tests/infrastructure.sql +69 -0
- package/dist/resources/templates/mcp-server/.claude/docs/stack.md +338 -0
- package/dist/resources/templates/mcp-server/.editorconfig +13 -0
- package/dist/resources/templates/mcp-server/.env.example +8 -0
- package/dist/resources/templates/mcp-server/.github/ISSUE_TEMPLATE/bug_report.yml +104 -0
- package/dist/resources/templates/mcp-server/.github/ISSUE_TEMPLATE/feature_request.yml +54 -0
- package/dist/resources/templates/mcp-server/.github/PULL_REQUEST_TEMPLATE.md +36 -0
- package/dist/resources/templates/mcp-server/.github/workflows/ci.yml +78 -0
- package/dist/resources/templates/mcp-server/.husky/commit-msg +1 -0
- package/dist/resources/templates/mcp-server/.husky/pre-commit +1 -0
- package/dist/resources/templates/mcp-server/.lintstagedrc.json +4 -0
- package/dist/resources/templates/mcp-server/.nvmrc +1 -0
- package/dist/resources/templates/mcp-server/.prettierrc +8 -0
- package/dist/resources/templates/mcp-server/CONTRIBUTING.md +184 -0
- package/dist/resources/templates/mcp-server/Dockerfile +23 -0
- package/dist/resources/templates/mcp-server/LICENSE +21 -0
- package/dist/resources/templates/mcp-server/README.md +123 -0
- package/dist/resources/templates/mcp-server/_gitignore +26 -0
- package/dist/resources/templates/mcp-server/commitlint.config.js +24 -0
- package/dist/resources/templates/mcp-server/eslint.config.js +30 -0
- package/dist/resources/templates/mcp-server/package.json +72 -0
- package/dist/resources/templates/mcp-server/src/index.ts +27 -0
- package/dist/resources/templates/mcp-server/src/resources.ts +33 -0
- package/dist/resources/templates/mcp-server/src/services/.gitkeep +0 -0
- package/dist/resources/templates/mcp-server/src/tools.ts +43 -0
- package/dist/resources/templates/mcp-server/src/types/index.ts +19 -0
- package/dist/resources/templates/mcp-server/src/utils/index.ts +31 -0
- package/dist/resources/templates/mcp-server/tsconfig.json +22 -0
- package/dist/resources/templates/mcp-server/tsup.config.ts +14 -0
- package/dist/resources/templates/mcp-server/vitest.config.ts +15 -0
- package/dist/resources/templates/nuxt/.claude/docs/stack.md +666 -0
- package/dist/resources/templates/nuxt/.editorconfig +15 -0
- package/dist/resources/templates/nuxt/.env.example +22 -0
- package/dist/resources/templates/nuxt/.github/workflows/ci.yml +34 -0
- package/dist/resources/templates/nuxt/.husky/commit-msg +1 -0
- package/dist/resources/templates/nuxt/.husky/pre-commit +1 -0
- package/dist/resources/templates/nuxt/.nvmrc +1 -0
- package/dist/resources/templates/nuxt/.prettierignore +9 -0
- package/dist/resources/templates/nuxt/.prettierrc +1 -0
- package/dist/resources/templates/nuxt/README.md +23 -0
- package/dist/resources/templates/nuxt/_gitignore +7 -0
- package/dist/resources/templates/nuxt/app/app.config.ts +105 -0
- package/dist/resources/templates/nuxt/app/i18n/locales/en.json +5 -0
- package/dist/resources/templates/nuxt/app/pages/app/index.vue +224 -0
- package/dist/resources/templates/nuxt/app/pages/authors/[slug].vue +37 -0
- package/dist/resources/templates/nuxt/app/pages/blog/[slug].vue +55 -0
- package/dist/resources/templates/nuxt/app/pages/blog/category/[category].vue +38 -0
- package/dist/resources/templates/nuxt/app/pages/blog/index.vue +46 -0
- package/dist/resources/templates/nuxt/app/pages/index.vue +626 -0
- package/dist/resources/templates/nuxt/app/pages/legal/privacy.vue +21 -0
- package/dist/resources/templates/nuxt/app/pages/legal/terms.vue +21 -0
- package/dist/resources/templates/nuxt/app/pages/ui/index.vue +397 -0
- package/dist/resources/templates/nuxt/commitlint.config.mjs +1 -0
- package/dist/resources/templates/nuxt/eslint.config.mjs +4 -0
- package/dist/resources/templates/nuxt/lint-staged.config.mjs +8 -0
- package/dist/resources/templates/nuxt/nuxt.config.ts +71 -0
- package/dist/resources/templates/nuxt/package.json +67 -0
- package/dist/resources/templates/nuxt/public/apple-touch-icon.png +0 -0
- package/dist/resources/templates/nuxt/public/favicon.ico +0 -0
- package/dist/resources/templates/nuxt/public/favicon.svg +5 -0
- package/dist/resources/templates/nuxt/public/icon-16x16.png +0 -0
- package/dist/resources/templates/nuxt/public/icon-192x192.png +0 -0
- package/dist/resources/templates/nuxt/public/icon-32x32.png +0 -0
- package/dist/resources/templates/nuxt/public/icon-512x512.png +0 -0
- package/dist/resources/templates/nuxt/public/logo.svg +6 -0
- package/dist/resources/templates/nuxt/public/media/hero-product-gallery.png +0 -0
- package/dist/resources/templates/nuxt/server/api/content/sitemap-urls.get.ts +12 -0
- package/dist/resources/templates/nuxt/server/api/preview.get.ts +9 -0
- package/dist/resources/templates/nuxt/stylelint.config.mjs +3 -0
- package/dist/resources/templates/nuxt/test/e2e/rendering.test.ts +13 -0
- package/dist/resources/templates/nuxt/tsconfig.json +3 -0
- package/dist/resources/templates/nuxt/vitest.config.ts +8 -0
- package/package.json +8 -5
|
@@ -0,0 +1,886 @@
|
|
|
1
|
+
BEGIN;
|
|
2
|
+
|
|
3
|
+
CREATE EXTENSION IF NOT EXISTS pgcrypto;
|
|
4
|
+
|
|
5
|
+
CREATE TABLE public.sys_access_logs (
|
|
6
|
+
id bigint NOT NULL,
|
|
7
|
+
trace_id character varying(64) DEFAULT ''::character varying NOT NULL,
|
|
8
|
+
request_id character varying(64) DEFAULT ''::character varying NOT NULL,
|
|
9
|
+
actor_type character varying(20) NOT NULL,
|
|
10
|
+
actor_id bigint DEFAULT 0 NOT NULL,
|
|
11
|
+
actor_ip character varying(45) DEFAULT ''::character varying NOT NULL,
|
|
12
|
+
actor_user_agent text DEFAULT ''::text NOT NULL,
|
|
13
|
+
http_method character varying(10) DEFAULT ''::character varying NOT NULL,
|
|
14
|
+
http_path character varying(500) DEFAULT ''::character varying NOT NULL,
|
|
15
|
+
http_status smallint DEFAULT 0 NOT NULL,
|
|
16
|
+
product_code character varying(50) DEFAULT ''::character varying NOT NULL,
|
|
17
|
+
resource_type character varying(50) DEFAULT ''::character varying NOT NULL,
|
|
18
|
+
resource_id character varying(100) DEFAULT ''::character varying NOT NULL,
|
|
19
|
+
is_success boolean DEFAULT true NOT NULL,
|
|
20
|
+
error_message character varying(500) DEFAULT ''::character varying NOT NULL,
|
|
21
|
+
duration_ms integer DEFAULT 0 NOT NULL,
|
|
22
|
+
created_at timestamp(3) with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
|
23
|
+
auth_subject_type character varying(32) DEFAULT ''::character varying NOT NULL,
|
|
24
|
+
iam_principal_id bigint DEFAULT 0 NOT NULL,
|
|
25
|
+
credential_public_id character varying(80) DEFAULT ''::character varying NOT NULL,
|
|
26
|
+
token_fingerprint character(64) DEFAULT ''::bpchar NOT NULL,
|
|
27
|
+
auth_mechanism character varying(32) DEFAULT ''::character varying NOT NULL
|
|
28
|
+
)
|
|
29
|
+
PARTITION BY RANGE (created_at);
|
|
30
|
+
|
|
31
|
+
CREATE SEQUENCE public.sys_access_logs_id_seq
|
|
32
|
+
START WITH 1
|
|
33
|
+
INCREMENT BY 1
|
|
34
|
+
NO MINVALUE
|
|
35
|
+
NO MAXVALUE
|
|
36
|
+
CACHE 1;
|
|
37
|
+
|
|
38
|
+
ALTER SEQUENCE public.sys_access_logs_id_seq OWNED BY public.sys_access_logs.id;
|
|
39
|
+
|
|
40
|
+
ALTER TABLE ONLY public.sys_access_logs ALTER COLUMN id SET DEFAULT nextval('public.sys_access_logs_id_seq'::regclass);
|
|
41
|
+
|
|
42
|
+
ALTER TABLE ONLY public.sys_access_logs
|
|
43
|
+
ADD CONSTRAINT sys_access_logs_pkey PRIMARY KEY (id, created_at);
|
|
44
|
+
|
|
45
|
+
CREATE INDEX idx_access_actor ON ONLY public.sys_access_logs USING btree (actor_id, created_at DESC);
|
|
46
|
+
|
|
47
|
+
CREATE INDEX idx_access_product ON ONLY public.sys_access_logs USING btree (product_code, created_at DESC) WHERE ((product_code)::text <> ''::text);
|
|
48
|
+
|
|
49
|
+
CREATE INDEX idx_access_request ON ONLY public.sys_access_logs USING btree (request_id) WHERE ((request_id)::text <> ''::text);
|
|
50
|
+
|
|
51
|
+
CREATE INDEX idx_access_status ON ONLY public.sys_access_logs USING btree (http_status, created_at DESC) WHERE (http_status >= 400);
|
|
52
|
+
|
|
53
|
+
CREATE INDEX idx_sys_access_logs_created_at_brin ON ONLY public.sys_access_logs USING brin (created_at) WITH (pages_per_range='128');
|
|
54
|
+
|
|
55
|
+
CREATE INDEX idx_sys_access_logs_failure_created_at ON ONLY public.sys_access_logs USING btree (created_at DESC) WHERE (is_success = false);
|
|
56
|
+
|
|
57
|
+
CREATE INDEX idx_sys_access_logs_http_method_created_at ON ONLY public.sys_access_logs USING btree (http_method, created_at DESC);
|
|
58
|
+
|
|
59
|
+
CREATE INDEX idx_sys_access_logs_iam_principal_time ON ONLY public.sys_access_logs USING btree (iam_principal_id, created_at DESC) WHERE (iam_principal_id > 0);
|
|
60
|
+
|
|
61
|
+
CREATE INDEX idx_sys_access_logs_trace_id ON ONLY public.sys_access_logs USING btree (trace_id) WHERE ((trace_id)::text <> ''::text);
|
|
62
|
+
|
|
63
|
+
COMMENT ON TABLE public.sys_access_logs IS '访问日志表(按周分区):记录全平台 HTTP 请求,30 天保留';
|
|
64
|
+
|
|
65
|
+
COMMENT ON COLUMN public.sys_access_logs.id IS '主键 ID,bigserial 自增';
|
|
66
|
+
|
|
67
|
+
COMMENT ON COLUMN public.sys_access_logs.trace_id IS '分布式追踪 ID,关联 OpenTelemetry Span';
|
|
68
|
+
|
|
69
|
+
COMMENT ON COLUMN public.sys_access_logs.request_id IS 'HTTP 请求唯一 ID,由 APISIX 或服务自动生成';
|
|
70
|
+
|
|
71
|
+
COMMENT ON COLUMN public.sys_access_logs.actor_type IS '操作者类型: user/admin/system/api_key/webhook';
|
|
72
|
+
|
|
73
|
+
COMMENT ON COLUMN public.sys_access_logs.actor_id IS '操作者业务 ID,0 表示匿名或系统触发';
|
|
74
|
+
|
|
75
|
+
COMMENT ON COLUMN public.sys_access_logs.actor_ip IS '客户端 IP 地址,支持 IPv6';
|
|
76
|
+
|
|
77
|
+
COMMENT ON COLUMN public.sys_access_logs.actor_user_agent IS '客户端 User-Agent 字符串';
|
|
78
|
+
|
|
79
|
+
COMMENT ON COLUMN public.sys_access_logs.http_method IS 'HTTP 方法: GET/POST/PUT/PATCH/DELETE';
|
|
80
|
+
|
|
81
|
+
COMMENT ON COLUMN public.sys_access_logs.http_path IS '请求路径,不含查询参数';
|
|
82
|
+
|
|
83
|
+
COMMENT ON COLUMN public.sys_access_logs.http_status IS 'HTTP 响应状态码';
|
|
84
|
+
|
|
85
|
+
COMMENT ON COLUMN public.sys_access_logs.product_code IS '所属产品标识(snake_case),空表示平台级操作';
|
|
86
|
+
|
|
87
|
+
COMMENT ON COLUMN public.sys_access_logs.resource_type IS '资源类型: identity/user/order/subscription 等';
|
|
88
|
+
|
|
89
|
+
COMMENT ON COLUMN public.sys_access_logs.resource_id IS '资源业务 ID,字符串格式兼容 bigint 和 UUID';
|
|
90
|
+
|
|
91
|
+
COMMENT ON COLUMN public.sys_access_logs.is_success IS '请求是否成功(HTTP 2xx/3xx 为 true)';
|
|
92
|
+
|
|
93
|
+
COMMENT ON COLUMN public.sys_access_logs.error_message IS '失败原因(英文),成功时为空字符串';
|
|
94
|
+
|
|
95
|
+
COMMENT ON COLUMN public.sys_access_logs.duration_ms IS '请求耗时(毫秒)';
|
|
96
|
+
|
|
97
|
+
COMMENT ON COLUMN public.sys_access_logs.created_at IS '日志写入时间,毫秒精度,用作分区键';
|
|
98
|
+
|
|
99
|
+
COMMENT ON COLUMN public.sys_access_logs.auth_subject_type IS '认证主体类型(user/service_account 等)';
|
|
100
|
+
|
|
101
|
+
COMMENT ON COLUMN public.sys_access_logs.iam_principal_id IS 'IAM 主体 ID(机器主体或可关联主体)';
|
|
102
|
+
|
|
103
|
+
COMMENT ON COLUMN public.sys_access_logs.credential_public_id IS '凭证公开 ID(非机密)';
|
|
104
|
+
|
|
105
|
+
COMMENT ON COLUMN public.sys_access_logs.token_fingerprint IS 'Token 指纹(SHA-256,不泄漏明文)';
|
|
106
|
+
|
|
107
|
+
COMMENT ON COLUMN public.sys_access_logs.auth_mechanism IS '认证机制(gateway_jwt/iam_credential 等)';
|
|
108
|
+
|
|
109
|
+
CREATE TABLE public.sys_access_logs_default PARTITION OF public.sys_access_logs DEFAULT;
|
|
110
|
+
|
|
111
|
+
CREATE TABLE public.sys_login_logs (
|
|
112
|
+
id bigint NOT NULL,
|
|
113
|
+
identity_id bigint DEFAULT 0 NOT NULL,
|
|
114
|
+
actor_type character varying(20) NOT NULL,
|
|
115
|
+
actor_ip character varying(45) DEFAULT ''::character varying NOT NULL,
|
|
116
|
+
actor_user_agent text DEFAULT ''::text NOT NULL,
|
|
117
|
+
login_action character varying(30) NOT NULL,
|
|
118
|
+
login_method character varying(30) DEFAULT ''::character varying NOT NULL,
|
|
119
|
+
is_success boolean DEFAULT true NOT NULL,
|
|
120
|
+
failure_reason character varying(500) DEFAULT ''::character varying NOT NULL,
|
|
121
|
+
product_code character varying(50) DEFAULT ''::character varying NOT NULL,
|
|
122
|
+
session_id character varying(100) DEFAULT ''::character varying NOT NULL,
|
|
123
|
+
request_id character varying(64) DEFAULT ''::character varying NOT NULL,
|
|
124
|
+
device_type character varying(30) DEFAULT ''::character varying NOT NULL,
|
|
125
|
+
device_fingerprint character varying(64) DEFAULT ''::character varying NOT NULL,
|
|
126
|
+
os_name character varying(50) DEFAULT ''::character varying NOT NULL,
|
|
127
|
+
browser_name character varying(50) DEFAULT ''::character varying NOT NULL,
|
|
128
|
+
geo_country character varying(10) DEFAULT ''::character varying NOT NULL,
|
|
129
|
+
geo_city character varying(100) DEFAULT ''::character varying NOT NULL,
|
|
130
|
+
created_at timestamp(3) with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL
|
|
131
|
+
)
|
|
132
|
+
PARTITION BY RANGE (created_at);
|
|
133
|
+
|
|
134
|
+
CREATE SEQUENCE public.sys_login_logs_id_seq
|
|
135
|
+
START WITH 1
|
|
136
|
+
INCREMENT BY 1
|
|
137
|
+
NO MINVALUE
|
|
138
|
+
NO MAXVALUE
|
|
139
|
+
CACHE 1;
|
|
140
|
+
|
|
141
|
+
ALTER SEQUENCE public.sys_login_logs_id_seq OWNED BY public.sys_login_logs.id;
|
|
142
|
+
|
|
143
|
+
ALTER TABLE ONLY public.sys_login_logs ALTER COLUMN id SET DEFAULT nextval('public.sys_login_logs_id_seq'::regclass);
|
|
144
|
+
|
|
145
|
+
ALTER TABLE ONLY public.sys_login_logs
|
|
146
|
+
ADD CONSTRAINT sys_login_logs_pkey PRIMARY KEY (id, created_at);
|
|
147
|
+
|
|
148
|
+
CREATE INDEX idx_login_action ON ONLY public.sys_login_logs USING btree (login_action, created_at DESC);
|
|
149
|
+
|
|
150
|
+
CREATE INDEX idx_login_failed ON ONLY public.sys_login_logs USING btree (actor_ip, identity_id, created_at DESC) WHERE (is_success = false);
|
|
151
|
+
|
|
152
|
+
CREATE INDEX idx_login_identity ON ONLY public.sys_login_logs USING btree (identity_id, created_at DESC);
|
|
153
|
+
|
|
154
|
+
CREATE INDEX idx_login_ip ON ONLY public.sys_login_logs USING btree (actor_ip, created_at DESC);
|
|
155
|
+
|
|
156
|
+
CREATE INDEX idx_login_product ON ONLY public.sys_login_logs USING btree (product_code, created_at DESC) WHERE ((product_code)::text <> ''::text);
|
|
157
|
+
|
|
158
|
+
CREATE INDEX idx_login_request ON ONLY public.sys_login_logs USING btree (request_id) WHERE ((request_id)::text <> ''::text);
|
|
159
|
+
|
|
160
|
+
CREATE INDEX idx_login_session ON ONLY public.sys_login_logs USING btree (session_id, created_at DESC) WHERE ((session_id)::text <> ''::text);
|
|
161
|
+
|
|
162
|
+
CREATE INDEX idx_sys_login_logs_created_at_brin ON ONLY public.sys_login_logs USING brin (created_at) WITH (pages_per_range='128');
|
|
163
|
+
|
|
164
|
+
CREATE INDEX idx_sys_login_logs_failure_created_at ON ONLY public.sys_login_logs USING btree (created_at DESC) WHERE (is_success = false);
|
|
165
|
+
|
|
166
|
+
COMMENT ON TABLE public.sys_login_logs IS '登录日志表(按月分区):记录认证安全事件,1 年保留';
|
|
167
|
+
|
|
168
|
+
COMMENT ON COLUMN public.sys_login_logs.id IS '主键 ID,bigserial 自增';
|
|
169
|
+
|
|
170
|
+
COMMENT ON COLUMN public.sys_login_logs.identity_id IS '认证身份 ID,0 表示未识别用户(如登录失败)';
|
|
171
|
+
|
|
172
|
+
COMMENT ON COLUMN public.sys_login_logs.actor_type IS '操作者类型: user/admin';
|
|
173
|
+
|
|
174
|
+
COMMENT ON COLUMN public.sys_login_logs.actor_ip IS '客户端 IP 地址,支持 IPv6';
|
|
175
|
+
|
|
176
|
+
COMMENT ON COLUMN public.sys_login_logs.actor_user_agent IS '客户端 User-Agent 字符串';
|
|
177
|
+
|
|
178
|
+
COMMENT ON COLUMN public.sys_login_logs.login_action IS '登录动作: login/logout/refresh/mfa_verify/password_reset';
|
|
179
|
+
|
|
180
|
+
COMMENT ON COLUMN public.sys_login_logs.login_method IS '认证方式: password/oauth_google/oauth_apple/magic_link/api_key';
|
|
181
|
+
|
|
182
|
+
COMMENT ON COLUMN public.sys_login_logs.is_success IS '操作是否成功';
|
|
183
|
+
|
|
184
|
+
COMMENT ON COLUMN public.sys_login_logs.failure_reason IS '失败原因(英文),成功时为空字符串';
|
|
185
|
+
|
|
186
|
+
COMMENT ON COLUMN public.sys_login_logs.product_code IS '所属产品标识(snake_case),空表示平台级操作';
|
|
187
|
+
|
|
188
|
+
COMMENT ON COLUMN public.sys_login_logs.session_id IS '会话 ID,用于追踪完整登录生命周期';
|
|
189
|
+
|
|
190
|
+
COMMENT ON COLUMN public.sys_login_logs.request_id IS 'HTTP 请求唯一 ID,关联 sys_access_logs';
|
|
191
|
+
|
|
192
|
+
COMMENT ON COLUMN public.sys_login_logs.device_type IS '设备类型: desktop/mobile/tablet/unknown';
|
|
193
|
+
|
|
194
|
+
COMMENT ON COLUMN public.sys_login_logs.device_fingerprint IS '设备指纹哈希值,用于异常登录检测';
|
|
195
|
+
|
|
196
|
+
COMMENT ON COLUMN public.sys_login_logs.os_name IS '操作系统名称: Windows/macOS/iOS/Android/Linux';
|
|
197
|
+
|
|
198
|
+
COMMENT ON COLUMN public.sys_login_logs.browser_name IS '浏览器名称: Chrome/Safari/Firefox/Edge';
|
|
199
|
+
|
|
200
|
+
COMMENT ON COLUMN public.sys_login_logs.geo_country IS '地理位置国家代码(ISO 3166-1 alpha-2)';
|
|
201
|
+
|
|
202
|
+
COMMENT ON COLUMN public.sys_login_logs.geo_city IS '地理位置城市名称';
|
|
203
|
+
|
|
204
|
+
COMMENT ON COLUMN public.sys_login_logs.created_at IS '日志写入时间,毫秒精度,用作分区键';
|
|
205
|
+
|
|
206
|
+
CREATE TABLE public.sys_login_logs_default PARTITION OF public.sys_login_logs DEFAULT;
|
|
207
|
+
|
|
208
|
+
CREATE TABLE public.sys_audit_logs (
|
|
209
|
+
id bigint NOT NULL,
|
|
210
|
+
trace_id character varying(64) DEFAULT ''::character varying NOT NULL,
|
|
211
|
+
request_id character varying(64) DEFAULT ''::character varying NOT NULL,
|
|
212
|
+
actor_type character varying(20) NOT NULL,
|
|
213
|
+
actor_id bigint DEFAULT 0 NOT NULL,
|
|
214
|
+
actor_ip character varying(45) DEFAULT ''::character varying NOT NULL,
|
|
215
|
+
actor_user_agent text DEFAULT ''::text NOT NULL,
|
|
216
|
+
action character varying(50) NOT NULL,
|
|
217
|
+
category character varying(30) NOT NULL,
|
|
218
|
+
risk_level character varying(10) DEFAULT 'medium'::character varying NOT NULL,
|
|
219
|
+
resource_type character varying(50) DEFAULT ''::character varying NOT NULL,
|
|
220
|
+
resource_id character varying(100) DEFAULT ''::character varying NOT NULL,
|
|
221
|
+
product_code character varying(50) DEFAULT ''::character varying NOT NULL,
|
|
222
|
+
tenant_id character varying(50) DEFAULT ''::character varying NOT NULL,
|
|
223
|
+
changes jsonb,
|
|
224
|
+
metadata jsonb,
|
|
225
|
+
is_success boolean DEFAULT true NOT NULL,
|
|
226
|
+
error_message character varying(500) DEFAULT ''::character varying NOT NULL,
|
|
227
|
+
created_at timestamp(3) with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
|
228
|
+
event_id character varying(64),
|
|
229
|
+
occurred_at timestamp(3) with time zone,
|
|
230
|
+
auth_subject_type character varying(32) DEFAULT ''::character varying NOT NULL,
|
|
231
|
+
iam_principal_id bigint DEFAULT 0 NOT NULL,
|
|
232
|
+
credential_public_id character varying(80) DEFAULT ''::character varying NOT NULL,
|
|
233
|
+
token_fingerprint character(64) DEFAULT ''::bpchar NOT NULL,
|
|
234
|
+
auth_mechanism character varying(32) DEFAULT ''::character varying NOT NULL
|
|
235
|
+
)
|
|
236
|
+
PARTITION BY RANGE (created_at);
|
|
237
|
+
|
|
238
|
+
CREATE SEQUENCE public.sys_audit_logs_id_seq
|
|
239
|
+
START WITH 1
|
|
240
|
+
INCREMENT BY 1
|
|
241
|
+
NO MINVALUE
|
|
242
|
+
NO MAXVALUE
|
|
243
|
+
CACHE 1;
|
|
244
|
+
|
|
245
|
+
ALTER SEQUENCE public.sys_audit_logs_id_seq OWNED BY public.sys_audit_logs.id;
|
|
246
|
+
|
|
247
|
+
ALTER TABLE ONLY public.sys_audit_logs ALTER COLUMN id SET DEFAULT nextval('public.sys_audit_logs_id_seq'::regclass);
|
|
248
|
+
|
|
249
|
+
ALTER TABLE ONLY public.sys_audit_logs
|
|
250
|
+
ADD CONSTRAINT sys_audit_logs_pkey PRIMARY KEY (id, created_at);
|
|
251
|
+
|
|
252
|
+
CREATE INDEX idx_audit_actor ON ONLY public.sys_audit_logs USING btree (actor_id, created_at DESC);
|
|
253
|
+
|
|
254
|
+
CREATE INDEX idx_audit_category ON ONLY public.sys_audit_logs USING btree (category, created_at DESC);
|
|
255
|
+
|
|
256
|
+
CREATE INDEX idx_audit_product ON ONLY public.sys_audit_logs USING btree (product_code, created_at DESC) WHERE ((product_code)::text <> ''::text);
|
|
257
|
+
|
|
258
|
+
CREATE INDEX idx_audit_request ON ONLY public.sys_audit_logs USING btree (request_id) WHERE ((request_id)::text <> ''::text);
|
|
259
|
+
|
|
260
|
+
CREATE INDEX idx_audit_resource ON ONLY public.sys_audit_logs USING btree (resource_type, resource_id, created_at DESC);
|
|
261
|
+
|
|
262
|
+
CREATE INDEX idx_audit_risk ON ONLY public.sys_audit_logs USING btree (risk_level, created_at DESC) WHERE ((risk_level)::text = ANY (ARRAY[('critical'::character varying)::text, ('high'::character varying)::text]));
|
|
263
|
+
|
|
264
|
+
CREATE INDEX idx_audit_trace ON ONLY public.sys_audit_logs USING btree (trace_id) WHERE ((trace_id)::text <> ''::text);
|
|
265
|
+
|
|
266
|
+
CREATE INDEX idx_sys_audit_logs_created_at_brin ON ONLY public.sys_audit_logs USING brin (created_at) WITH (pages_per_range='128');
|
|
267
|
+
|
|
268
|
+
CREATE INDEX idx_sys_audit_logs_effective_time ON ONLY public.sys_audit_logs USING btree (COALESCE(occurred_at, created_at) DESC);
|
|
269
|
+
|
|
270
|
+
CREATE INDEX idx_sys_audit_logs_event_id ON ONLY public.sys_audit_logs USING btree (event_id) WHERE (event_id IS NOT NULL);
|
|
271
|
+
|
|
272
|
+
CREATE INDEX idx_sys_audit_logs_iam_principal_time ON ONLY public.sys_audit_logs USING btree (iam_principal_id, created_at DESC) WHERE (iam_principal_id > 0);
|
|
273
|
+
|
|
274
|
+
COMMENT ON TABLE public.sys_audit_logs IS '审计日志表(按月分区):记录业务变更事件,7 年合规保留';
|
|
275
|
+
|
|
276
|
+
COMMENT ON COLUMN public.sys_audit_logs.id IS '主键 ID,bigserial 自增';
|
|
277
|
+
|
|
278
|
+
COMMENT ON COLUMN public.sys_audit_logs.trace_id IS '分布式追踪 ID,关联 OpenTelemetry Span';
|
|
279
|
+
|
|
280
|
+
COMMENT ON COLUMN public.sys_audit_logs.request_id IS 'HTTP 请求唯一 ID,关联 sys_access_logs 获取完整 HTTP 上下文';
|
|
281
|
+
|
|
282
|
+
COMMENT ON COLUMN public.sys_audit_logs.actor_type IS '操作者类型: user/admin/system/api_key/webhook';
|
|
283
|
+
|
|
284
|
+
COMMENT ON COLUMN public.sys_audit_logs.actor_id IS '操作者业务 ID,0 表示匿名或系统触发';
|
|
285
|
+
|
|
286
|
+
COMMENT ON COLUMN public.sys_audit_logs.actor_ip IS '客户端 IP 地址,支持 IPv6';
|
|
287
|
+
|
|
288
|
+
COMMENT ON COLUMN public.sys_audit_logs.actor_user_agent IS '客户端 User-Agent(access_logs 过期后保留取证依据)';
|
|
289
|
+
|
|
290
|
+
COMMENT ON COLUMN public.sys_audit_logs.action IS '操作动作: create/update/delete/login/logout/export/refund 等';
|
|
291
|
+
|
|
292
|
+
COMMENT ON COLUMN public.sys_audit_logs.category IS '业务分类: auth/identity/user/commerce/config/content/storage/system';
|
|
293
|
+
|
|
294
|
+
COMMENT ON COLUMN public.sys_audit_logs.risk_level IS '风险级别: critical/high/medium/low';
|
|
295
|
+
|
|
296
|
+
COMMENT ON COLUMN public.sys_audit_logs.resource_type IS '资源类型: identity/user/order/subscription/payment 等';
|
|
297
|
+
|
|
298
|
+
COMMENT ON COLUMN public.sys_audit_logs.resource_id IS '资源业务 ID,字符串格式兼容 bigint 和 UUID';
|
|
299
|
+
|
|
300
|
+
COMMENT ON COLUMN public.sys_audit_logs.product_code IS '所属产品标识(snake_case),空表示平台级操作';
|
|
301
|
+
|
|
302
|
+
COMMENT ON COLUMN public.sys_audit_logs.tenant_id IS '所属租户 ID,空表示非租户操作';
|
|
303
|
+
|
|
304
|
+
COMMENT ON COLUMN public.sys_audit_logs.changes IS '数据变更前后快照: {"before": {...}, "after": {...}}';
|
|
305
|
+
|
|
306
|
+
COMMENT ON COLUMN public.sys_audit_logs.metadata IS '扩展上下文信息(错误码、原因、session_id 等)';
|
|
307
|
+
|
|
308
|
+
COMMENT ON COLUMN public.sys_audit_logs.is_success IS '操作是否成功';
|
|
309
|
+
|
|
310
|
+
COMMENT ON COLUMN public.sys_audit_logs.error_message IS '失败原因(英文),成功时为空字符串';
|
|
311
|
+
|
|
312
|
+
COMMENT ON COLUMN public.sys_audit_logs.created_at IS '审计记录写入时间,毫秒精度,用作分区键';
|
|
313
|
+
|
|
314
|
+
COMMENT ON COLUMN public.sys_audit_logs.event_id IS '领域事件唯一标识;由 sys_audit_event_inbox 保证消费幂等';
|
|
315
|
+
|
|
316
|
+
COMMENT ON COLUMN public.sys_audit_logs.occurred_at IS '领域事件发生时间;非事件型审计为空';
|
|
317
|
+
|
|
318
|
+
COMMENT ON COLUMN public.sys_audit_logs.auth_subject_type IS '认证主体类型(user/service_account 等)';
|
|
319
|
+
|
|
320
|
+
COMMENT ON COLUMN public.sys_audit_logs.iam_principal_id IS 'IAM 主体 ID(机器主体或可关联主体)';
|
|
321
|
+
|
|
322
|
+
COMMENT ON COLUMN public.sys_audit_logs.credential_public_id IS '凭证公开 ID(非机密)';
|
|
323
|
+
|
|
324
|
+
COMMENT ON COLUMN public.sys_audit_logs.token_fingerprint IS 'Token 指纹(SHA-256,不泄漏明文)';
|
|
325
|
+
|
|
326
|
+
COMMENT ON COLUMN public.sys_audit_logs.auth_mechanism IS '认证机制(gateway_jwt/iam_credential 等)';
|
|
327
|
+
|
|
328
|
+
CREATE TABLE public.sys_audit_logs_default PARTITION OF public.sys_audit_logs DEFAULT;
|
|
329
|
+
|
|
330
|
+
CREATE TABLE public.sys_operation_logs (
|
|
331
|
+
id bigint NOT NULL,
|
|
332
|
+
trace_id character varying(64) DEFAULT ''::character varying NOT NULL,
|
|
333
|
+
request_id character varying(64) DEFAULT ''::character varying NOT NULL,
|
|
334
|
+
actor_type character varying(20) NOT NULL,
|
|
335
|
+
actor_id bigint DEFAULT 0 NOT NULL,
|
|
336
|
+
auth_subject_type character varying(32) DEFAULT ''::character varying NOT NULL,
|
|
337
|
+
iam_principal_id bigint DEFAULT 0 NOT NULL,
|
|
338
|
+
credential_public_id character varying(80) DEFAULT ''::character varying NOT NULL,
|
|
339
|
+
token_fingerprint character(64) DEFAULT ''::bpchar NOT NULL,
|
|
340
|
+
auth_mechanism character varying(32) DEFAULT ''::character varying NOT NULL,
|
|
341
|
+
actor_ip character varying(45) DEFAULT ''::character varying NOT NULL,
|
|
342
|
+
actor_user_agent text DEFAULT ''::text NOT NULL,
|
|
343
|
+
operation_action character varying(50) NOT NULL,
|
|
344
|
+
operation_category character varying(30) DEFAULT 'system'::character varying NOT NULL,
|
|
345
|
+
risk_level character varying(10) DEFAULT 'medium'::character varying NOT NULL,
|
|
346
|
+
source_module character varying(80) DEFAULT ''::character varying NOT NULL,
|
|
347
|
+
iam_action character varying(120) DEFAULT ''::character varying NOT NULL,
|
|
348
|
+
iam_resource character varying(300) DEFAULT ''::character varying NOT NULL,
|
|
349
|
+
decision_allowed boolean DEFAULT false NOT NULL,
|
|
350
|
+
decision_reason_code character varying(80) DEFAULT ''::character varying NOT NULL,
|
|
351
|
+
decision_reason_kind character varying(40) DEFAULT ''::character varying NOT NULL,
|
|
352
|
+
http_method character varying(10) DEFAULT ''::character varying NOT NULL,
|
|
353
|
+
http_path character varying(500) DEFAULT ''::character varying NOT NULL,
|
|
354
|
+
http_status smallint DEFAULT 0 NOT NULL,
|
|
355
|
+
duration_ms integer DEFAULT 0 NOT NULL,
|
|
356
|
+
product_code character varying(50) DEFAULT ''::character varying NOT NULL,
|
|
357
|
+
tenant_id character varying(50) DEFAULT ''::character varying NOT NULL,
|
|
358
|
+
resource_type character varying(50) DEFAULT ''::character varying NOT NULL,
|
|
359
|
+
resource_id character varying(100) DEFAULT ''::character varying NOT NULL,
|
|
360
|
+
is_success boolean DEFAULT true NOT NULL,
|
|
361
|
+
error_message character varying(500) DEFAULT ''::character varying NOT NULL,
|
|
362
|
+
request_context jsonb DEFAULT '{}'::jsonb NOT NULL,
|
|
363
|
+
response_context jsonb DEFAULT '{}'::jsonb NOT NULL,
|
|
364
|
+
operation_metadata jsonb DEFAULT '{}'::jsonb NOT NULL,
|
|
365
|
+
policy_violation jsonb DEFAULT '{}'::jsonb NOT NULL,
|
|
366
|
+
record_status character varying(20) DEFAULT 'started'::character varying NOT NULL,
|
|
367
|
+
completed_at timestamp(3) with time zone,
|
|
368
|
+
created_at timestamp(3) with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL
|
|
369
|
+
)
|
|
370
|
+
PARTITION BY RANGE (created_at);
|
|
371
|
+
|
|
372
|
+
CREATE SEQUENCE public.sys_operation_logs_id_seq
|
|
373
|
+
START WITH 1
|
|
374
|
+
INCREMENT BY 1
|
|
375
|
+
NO MINVALUE
|
|
376
|
+
NO MAXVALUE
|
|
377
|
+
CACHE 1;
|
|
378
|
+
|
|
379
|
+
ALTER SEQUENCE public.sys_operation_logs_id_seq OWNED BY public.sys_operation_logs.id;
|
|
380
|
+
|
|
381
|
+
ALTER TABLE ONLY public.sys_operation_logs ALTER COLUMN id SET DEFAULT nextval('public.sys_operation_logs_id_seq'::regclass);
|
|
382
|
+
|
|
383
|
+
ALTER TABLE ONLY public.sys_operation_logs
|
|
384
|
+
ADD CONSTRAINT sys_operation_logs_pkey PRIMARY KEY (id, created_at);
|
|
385
|
+
|
|
386
|
+
CREATE INDEX idx_operation_action_time ON ONLY public.sys_operation_logs USING btree (operation_action, created_at DESC);
|
|
387
|
+
|
|
388
|
+
CREATE INDEX idx_operation_created_at_brin ON ONLY public.sys_operation_logs USING brin (created_at) WITH (pages_per_range='128');
|
|
389
|
+
|
|
390
|
+
CREATE INDEX idx_operation_failure_time ON ONLY public.sys_operation_logs USING btree (created_at DESC) WHERE (is_success = false);
|
|
391
|
+
|
|
392
|
+
CREATE INDEX idx_operation_iam_action_time ON ONLY public.sys_operation_logs USING btree (iam_action, created_at DESC) WHERE ((iam_action)::text <> ''::text);
|
|
393
|
+
|
|
394
|
+
CREATE INDEX idx_operation_principal_time ON ONLY public.sys_operation_logs USING btree (iam_principal_id, created_at DESC) WHERE (iam_principal_id > 0);
|
|
395
|
+
|
|
396
|
+
CREATE INDEX idx_operation_product_time ON ONLY public.sys_operation_logs USING btree (product_code, created_at DESC) WHERE ((product_code)::text <> ''::text);
|
|
397
|
+
|
|
398
|
+
CREATE INDEX idx_operation_record_status_time ON ONLY public.sys_operation_logs USING btree (record_status, created_at DESC) WHERE ((record_status)::text <> 'completed'::text);
|
|
399
|
+
|
|
400
|
+
CREATE INDEX idx_operation_request ON ONLY public.sys_operation_logs USING btree (request_id) WHERE ((request_id)::text <> ''::text);
|
|
401
|
+
|
|
402
|
+
CREATE INDEX idx_operation_resource_time ON ONLY public.sys_operation_logs USING btree (resource_type, resource_id, created_at DESC) WHERE (((resource_type)::text <> ''::text) AND ((resource_id)::text <> ''::text));
|
|
403
|
+
|
|
404
|
+
CREATE INDEX idx_operation_time ON ONLY public.sys_operation_logs USING btree (created_at DESC, id DESC);
|
|
405
|
+
|
|
406
|
+
CREATE INDEX idx_operation_trace ON ONLY public.sys_operation_logs USING btree (trace_id) WHERE ((trace_id)::text <> ''::text);
|
|
407
|
+
|
|
408
|
+
COMMENT ON TABLE public.sys_operation_logs IS '操作日志表(按月分区):记录管理后台控制面请求、IAM 判定和执行结果';
|
|
409
|
+
|
|
410
|
+
COMMENT ON COLUMN public.sys_operation_logs.id IS '主键 ID,bigserial 自增';
|
|
411
|
+
|
|
412
|
+
COMMENT ON COLUMN public.sys_operation_logs.trace_id IS '分布式追踪 ID,与 OpenTelemetry Span 关联';
|
|
413
|
+
|
|
414
|
+
COMMENT ON COLUMN public.sys_operation_logs.request_id IS 'HTTP 请求唯一 ID';
|
|
415
|
+
|
|
416
|
+
COMMENT ON COLUMN public.sys_operation_logs.actor_type IS '操作者类型';
|
|
417
|
+
|
|
418
|
+
COMMENT ON COLUMN public.sys_operation_logs.actor_id IS '操作者业务 ID,0 表示匿名或系统触发';
|
|
419
|
+
|
|
420
|
+
COMMENT ON COLUMN public.sys_operation_logs.auth_subject_type IS '认证主体类型';
|
|
421
|
+
|
|
422
|
+
COMMENT ON COLUMN public.sys_operation_logs.iam_principal_id IS 'IAM 主体 ID';
|
|
423
|
+
|
|
424
|
+
COMMENT ON COLUMN public.sys_operation_logs.credential_public_id IS '凭证公开 ID(非机密)';
|
|
425
|
+
|
|
426
|
+
COMMENT ON COLUMN public.sys_operation_logs.token_fingerprint IS 'Token 指纹(SHA-256,不泄漏明文)';
|
|
427
|
+
|
|
428
|
+
COMMENT ON COLUMN public.sys_operation_logs.auth_mechanism IS '认证机制';
|
|
429
|
+
|
|
430
|
+
COMMENT ON COLUMN public.sys_operation_logs.actor_ip IS '客户端 IP 地址,支持 IPv6';
|
|
431
|
+
|
|
432
|
+
COMMENT ON COLUMN public.sys_operation_logs.actor_user_agent IS '客户端 User-Agent 字符串';
|
|
433
|
+
|
|
434
|
+
COMMENT ON COLUMN public.sys_operation_logs.operation_action IS '操作动作';
|
|
435
|
+
|
|
436
|
+
COMMENT ON COLUMN public.sys_operation_logs.operation_category IS '操作分类';
|
|
437
|
+
|
|
438
|
+
COMMENT ON COLUMN public.sys_operation_logs.risk_level IS '风险级别';
|
|
439
|
+
|
|
440
|
+
COMMENT ON COLUMN public.sys_operation_logs.source_module IS '来源模块';
|
|
441
|
+
|
|
442
|
+
COMMENT ON COLUMN public.sys_operation_logs.iam_action IS 'IAM 规范动作';
|
|
443
|
+
|
|
444
|
+
COMMENT ON COLUMN public.sys_operation_logs.iam_resource IS 'IAM 资源 ARN';
|
|
445
|
+
|
|
446
|
+
COMMENT ON COLUMN public.sys_operation_logs.decision_allowed IS 'IAM 判定是否允许';
|
|
447
|
+
|
|
448
|
+
COMMENT ON COLUMN public.sys_operation_logs.decision_reason_code IS 'IAM 判定原因码';
|
|
449
|
+
|
|
450
|
+
COMMENT ON COLUMN public.sys_operation_logs.decision_reason_kind IS 'IAM 判定原因类型';
|
|
451
|
+
|
|
452
|
+
COMMENT ON COLUMN public.sys_operation_logs.http_method IS 'HTTP 方法';
|
|
453
|
+
|
|
454
|
+
COMMENT ON COLUMN public.sys_operation_logs.http_path IS 'HTTP 路径或路由模板';
|
|
455
|
+
|
|
456
|
+
COMMENT ON COLUMN public.sys_operation_logs.http_status IS 'HTTP 响应状态码';
|
|
457
|
+
|
|
458
|
+
COMMENT ON COLUMN public.sys_operation_logs.duration_ms IS '操作耗时(毫秒)';
|
|
459
|
+
|
|
460
|
+
COMMENT ON COLUMN public.sys_operation_logs.product_code IS '所属产品标识(snake_case),空表示平台级操作';
|
|
461
|
+
|
|
462
|
+
COMMENT ON COLUMN public.sys_operation_logs.tenant_id IS '所属租户 ID,空表示非租户操作';
|
|
463
|
+
|
|
464
|
+
COMMENT ON COLUMN public.sys_operation_logs.resource_type IS '资源类型';
|
|
465
|
+
|
|
466
|
+
COMMENT ON COLUMN public.sys_operation_logs.resource_id IS '资源业务 ID';
|
|
467
|
+
|
|
468
|
+
COMMENT ON COLUMN public.sys_operation_logs.is_success IS '操作是否成功';
|
|
469
|
+
|
|
470
|
+
COMMENT ON COLUMN public.sys_operation_logs.error_message IS '失败原因(英文),成功时为空字符串';
|
|
471
|
+
|
|
472
|
+
COMMENT ON COLUMN public.sys_operation_logs.request_context IS '脱敏请求证据包';
|
|
473
|
+
|
|
474
|
+
COMMENT ON COLUMN public.sys_operation_logs.response_context IS '脱敏响应证据包';
|
|
475
|
+
|
|
476
|
+
COMMENT ON COLUMN public.sys_operation_logs.operation_metadata IS '操作路由和模块元数据';
|
|
477
|
+
|
|
478
|
+
COMMENT ON COLUMN public.sys_operation_logs.policy_violation IS '授权拒绝或范围裁剪证据';
|
|
479
|
+
|
|
480
|
+
COMMENT ON COLUMN public.sys_operation_logs.record_status IS '记录状态(started/completed 等)';
|
|
481
|
+
|
|
482
|
+
COMMENT ON COLUMN public.sys_operation_logs.completed_at IS '操作完成时间';
|
|
483
|
+
|
|
484
|
+
COMMENT ON COLUMN public.sys_operation_logs.created_at IS '日志写入时间,毫秒精度,用作分区键';
|
|
485
|
+
|
|
486
|
+
CREATE TABLE public.sys_operation_logs_default PARTITION OF public.sys_operation_logs DEFAULT;
|
|
487
|
+
|
|
488
|
+
CREATE TABLE public.sys_audit_event_inbox (
|
|
489
|
+
id bigint NOT NULL,
|
|
490
|
+
event_id character varying(64) NOT NULL,
|
|
491
|
+
occurred_at timestamp(3) with time zone NOT NULL,
|
|
492
|
+
processed_at timestamp(3) with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
|
493
|
+
created_at timestamp(3) with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
|
494
|
+
updated_at timestamp(3) with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL
|
|
495
|
+
);
|
|
496
|
+
|
|
497
|
+
CREATE SEQUENCE public.sys_audit_event_inbox_id_seq
|
|
498
|
+
START WITH 1
|
|
499
|
+
INCREMENT BY 1
|
|
500
|
+
NO MINVALUE
|
|
501
|
+
NO MAXVALUE
|
|
502
|
+
CACHE 1;
|
|
503
|
+
|
|
504
|
+
ALTER SEQUENCE public.sys_audit_event_inbox_id_seq OWNED BY public.sys_audit_event_inbox.id;
|
|
505
|
+
|
|
506
|
+
ALTER TABLE ONLY public.sys_audit_event_inbox ALTER COLUMN id SET DEFAULT nextval('public.sys_audit_event_inbox_id_seq'::regclass);
|
|
507
|
+
|
|
508
|
+
ALTER TABLE ONLY public.sys_audit_event_inbox
|
|
509
|
+
ADD CONSTRAINT pk_sys_audit_event_inbox PRIMARY KEY (id);
|
|
510
|
+
|
|
511
|
+
ALTER TABLE ONLY public.sys_audit_event_inbox
|
|
512
|
+
ADD CONSTRAINT uk_sys_audit_event_inbox_event_id UNIQUE (event_id);
|
|
513
|
+
|
|
514
|
+
COMMENT ON TABLE public.sys_audit_event_inbox IS '审计领域事件消费 inbox;event_id 唯一保证关键事件审计幂等';
|
|
515
|
+
|
|
516
|
+
COMMENT ON COLUMN public.sys_audit_event_inbox.id IS '主键 ID';
|
|
517
|
+
|
|
518
|
+
COMMENT ON COLUMN public.sys_audit_event_inbox.event_id IS '领域事件唯一标识';
|
|
519
|
+
|
|
520
|
+
COMMENT ON COLUMN public.sys_audit_event_inbox.occurred_at IS '领域事件发生时间';
|
|
521
|
+
|
|
522
|
+
COMMENT ON COLUMN public.sys_audit_event_inbox.processed_at IS '审计消费完成时间';
|
|
523
|
+
|
|
524
|
+
COMMENT ON COLUMN public.sys_audit_event_inbox.created_at IS '创建时间';
|
|
525
|
+
|
|
526
|
+
COMMENT ON COLUMN public.sys_audit_event_inbox.updated_at IS '更新时间';
|
|
527
|
+
|
|
528
|
+
CREATE TABLE public.sys_outbox_events (
|
|
529
|
+
id uuid DEFAULT public.gen_random_uuid() NOT NULL,
|
|
530
|
+
aggregate_type character varying(100) NOT NULL,
|
|
531
|
+
aggregate_id character varying(100) NOT NULL,
|
|
532
|
+
event_type character varying(200) NOT NULL,
|
|
533
|
+
payload jsonb NOT NULL,
|
|
534
|
+
metadata jsonb,
|
|
535
|
+
occurred_at timestamp(3) with time zone DEFAULT now() NOT NULL,
|
|
536
|
+
created_at timestamp(3) with time zone DEFAULT now() NOT NULL,
|
|
537
|
+
status character varying(20) DEFAULT 'pending'::character varying NOT NULL,
|
|
538
|
+
locked_at timestamp(3) with time zone,
|
|
539
|
+
locked_by character varying(100),
|
|
540
|
+
retry_count smallint DEFAULT 0 NOT NULL,
|
|
541
|
+
max_retries smallint DEFAULT 10 NOT NULL,
|
|
542
|
+
next_retry_at timestamp(3) with time zone,
|
|
543
|
+
last_error text,
|
|
544
|
+
audit_changes jsonb,
|
|
545
|
+
audit_meta jsonb,
|
|
546
|
+
schema_version character varying(40),
|
|
547
|
+
outbox_ref character varying(80) NOT NULL,
|
|
548
|
+
aggregate_version bigint,
|
|
549
|
+
product_code character varying(50),
|
|
550
|
+
CONSTRAINT chk_sys_outbox_events_aggregate_version CHECK ((aggregate_version > 0)),
|
|
551
|
+
CONSTRAINT chk_sys_outbox_events_outbox_ref CHECK (((outbox_ref)::text ~ '^obx_[A-Za-z0-9_-]{8,64}$'::text)),
|
|
552
|
+
CONSTRAINT chk_sys_outbox_events_product_code CHECK (((product_code IS NULL) OR ((product_code)::text ~ '^[a-z][a-z0-9_]{1,49}$'::text)))
|
|
553
|
+
);
|
|
554
|
+
|
|
555
|
+
ALTER TABLE ONLY public.sys_outbox_events
|
|
556
|
+
ADD CONSTRAINT sys_outbox_events_pkey PRIMARY KEY (id);
|
|
557
|
+
|
|
558
|
+
ALTER TABLE ONLY public.sys_outbox_events
|
|
559
|
+
ADD CONSTRAINT uk_sys_outbox_events_outbox_ref UNIQUE (outbox_ref);
|
|
560
|
+
|
|
561
|
+
CREATE INDEX idx_outbox_aggregate ON public.sys_outbox_events USING btree (aggregate_type, aggregate_id, created_at);
|
|
562
|
+
|
|
563
|
+
CREATE INDEX idx_outbox_event_type ON public.sys_outbox_events USING btree (event_type, created_at);
|
|
564
|
+
|
|
565
|
+
CREATE INDEX idx_outbox_locked ON public.sys_outbox_events USING btree (status, locked_at) WHERE ((status)::text = 'locked'::text);
|
|
566
|
+
|
|
567
|
+
CREATE INDEX idx_outbox_pending ON public.sys_outbox_events USING btree (status, created_at) WHERE ((status)::text = 'pending'::text);
|
|
568
|
+
|
|
569
|
+
CREATE INDEX idx_outbox_retry ON public.sys_outbox_events USING btree (status, next_retry_at) WHERE ((status)::text = 'retry_pending'::text);
|
|
570
|
+
|
|
571
|
+
CREATE INDEX idx_sys_outbox_events_product_created_at ON public.sys_outbox_events USING btree (product_code, created_at DESC) WHERE (product_code IS NOT NULL);
|
|
572
|
+
|
|
573
|
+
COMMENT ON TABLE public.sys_outbox_events IS 'Transactional Outbox: 事件与业务数据同事务写入,Relay 异步分发';
|
|
574
|
+
|
|
575
|
+
COMMENT ON COLUMN public.sys_outbox_events.id IS '事件唯一标识 (UUID v4)';
|
|
576
|
+
|
|
577
|
+
COMMENT ON COLUMN public.sys_outbox_events.aggregate_type IS '聚合根类型 (如 identity, order, payment)';
|
|
578
|
+
|
|
579
|
+
COMMENT ON COLUMN public.sys_outbox_events.aggregate_id IS '聚合根 ID';
|
|
580
|
+
|
|
581
|
+
COMMENT ON COLUMN public.sys_outbox_events.event_type IS '事件类型 (如 identity.created, order.paid)';
|
|
582
|
+
|
|
583
|
+
COMMENT ON COLUMN public.sys_outbox_events.payload IS '事件载荷 (JSON)';
|
|
584
|
+
|
|
585
|
+
COMMENT ON COLUMN public.sys_outbox_events.metadata IS '事件元数据 (trace_id, user_id 等)';
|
|
586
|
+
|
|
587
|
+
COMMENT ON COLUMN public.sys_outbox_events.occurred_at IS '事件发生时间(业务时间)';
|
|
588
|
+
|
|
589
|
+
COMMENT ON COLUMN public.sys_outbox_events.created_at IS '记录创建时间(数据库时间)';
|
|
590
|
+
|
|
591
|
+
COMMENT ON COLUMN public.sys_outbox_events.status IS '处理状态: pending → locked → dispatched / retry_pending → dead_letter';
|
|
592
|
+
|
|
593
|
+
COMMENT ON COLUMN public.sys_outbox_events.locked_at IS 'Relay 锁定时间';
|
|
594
|
+
|
|
595
|
+
COMMENT ON COLUMN public.sys_outbox_events.locked_by IS 'Relay 实例标识';
|
|
596
|
+
|
|
597
|
+
COMMENT ON COLUMN public.sys_outbox_events.retry_count IS '已重试次数';
|
|
598
|
+
|
|
599
|
+
COMMENT ON COLUMN public.sys_outbox_events.max_retries IS '最大重试次数';
|
|
600
|
+
|
|
601
|
+
COMMENT ON COLUMN public.sys_outbox_events.next_retry_at IS '下次重试时间(指数退避)';
|
|
602
|
+
|
|
603
|
+
COMMENT ON COLUMN public.sys_outbox_events.last_error IS '最后一次错误信息';
|
|
604
|
+
|
|
605
|
+
COMMENT ON COLUMN public.sys_outbox_events.audit_changes IS 'CloudTrail 审计变更信封(DomainEvent.AuditChanges:before/after 快照)';
|
|
606
|
+
|
|
607
|
+
COMMENT ON COLUMN public.sys_outbox_events.audit_meta IS 'CloudTrail 审计元信息信封(DomainEvent.AuditMeta:reason/related_resource 等)';
|
|
608
|
+
|
|
609
|
+
COMMENT ON COLUMN public.sys_outbox_events.schema_version IS '事件产生时绑定的 Integration Event schema 版本;写入后不可变';
|
|
610
|
+
|
|
611
|
+
COMMENT ON COLUMN public.sys_outbox_events.outbox_ref IS 'Outbox 记录稳定公共引用,与 CloudEvents event_id 语义隔离';
|
|
612
|
+
|
|
613
|
+
COMMENT ON COLUMN public.sys_outbox_events.aggregate_version IS '声明版本合同的事件生产者固化的正整数版本;其他事件为空';
|
|
614
|
+
|
|
615
|
+
COMMENT ON COLUMN public.sys_outbox_events.product_code IS '事件所属产品;平台全局事件为空';
|
|
616
|
+
|
|
617
|
+
CREATE TABLE public.sys_outbox_event_deliveries (
|
|
618
|
+
event_id uuid NOT NULL,
|
|
619
|
+
target character varying(40) NOT NULL,
|
|
620
|
+
status character varying(20) DEFAULT 'pending'::character varying NOT NULL,
|
|
621
|
+
retry_count smallint DEFAULT 0 NOT NULL,
|
|
622
|
+
max_retries smallint DEFAULT 10 NOT NULL,
|
|
623
|
+
next_retry_at timestamp(3) with time zone,
|
|
624
|
+
last_error text,
|
|
625
|
+
dispatched_at timestamp(3) with time zone,
|
|
626
|
+
locked_at timestamp(3) with time zone,
|
|
627
|
+
locked_by character varying(100),
|
|
628
|
+
created_at timestamp(3) with time zone DEFAULT now() NOT NULL,
|
|
629
|
+
updated_at timestamp(3) with time zone DEFAULT now() NOT NULL,
|
|
630
|
+
CONSTRAINT chk_sys_outbox_event_deliveries_max_retries CHECK ((max_retries > 0)),
|
|
631
|
+
CONSTRAINT chk_sys_outbox_event_deliveries_retry_count CHECK ((retry_count >= 0)),
|
|
632
|
+
CONSTRAINT chk_sys_outbox_event_deliveries_status CHECK (((status)::text = ANY (ARRAY[('pending'::character varying)::text, ('dispatched'::character varying)::text, ('retry_pending'::character varying)::text, ('dead_letter'::character varying)::text]))),
|
|
633
|
+
CONSTRAINT chk_sys_outbox_event_deliveries_target CHECK (((target)::text = ANY (ARRAY[('local_eventbus'::character varying)::text, ('asynq'::character varying)::text, ('redis_stream'::character varying)::text])))
|
|
634
|
+
);
|
|
635
|
+
|
|
636
|
+
ALTER TABLE ONLY public.sys_outbox_event_deliveries
|
|
637
|
+
ADD CONSTRAINT sys_outbox_event_deliveries_pkey PRIMARY KEY (event_id, target);
|
|
638
|
+
|
|
639
|
+
CREATE INDEX idx_sys_outbox_event_deliveries_event ON public.sys_outbox_event_deliveries USING btree (event_id);
|
|
640
|
+
|
|
641
|
+
CREATE INDEX idx_sys_outbox_event_deliveries_target_due ON public.sys_outbox_event_deliveries USING btree (target, status, next_retry_at, created_at) WHERE ((status)::text = ANY (ARRAY[('pending'::character varying)::text, ('retry_pending'::character varying)::text]));
|
|
642
|
+
|
|
643
|
+
COMMENT ON TABLE public.sys_outbox_event_deliveries IS 'Outbox 事件按投递目标拆分的状态账本';
|
|
644
|
+
|
|
645
|
+
COMMENT ON COLUMN public.sys_outbox_event_deliveries.event_id IS 'Outbox 事件唯一标识(逻辑引用 sys_outbox_events.id)';
|
|
646
|
+
|
|
647
|
+
COMMENT ON COLUMN public.sys_outbox_event_deliveries.target IS '投递目标:local_eventbus / asynq / redis_stream';
|
|
648
|
+
|
|
649
|
+
COMMENT ON COLUMN public.sys_outbox_event_deliveries.status IS '目标投递状态:pending / dispatched / retry_pending / dead_letter';
|
|
650
|
+
|
|
651
|
+
COMMENT ON COLUMN public.sys_outbox_event_deliveries.retry_count IS '目标已重试次数';
|
|
652
|
+
|
|
653
|
+
COMMENT ON COLUMN public.sys_outbox_event_deliveries.max_retries IS '目标最大重试次数';
|
|
654
|
+
|
|
655
|
+
COMMENT ON COLUMN public.sys_outbox_event_deliveries.next_retry_at IS '目标下次重试时间';
|
|
656
|
+
|
|
657
|
+
COMMENT ON COLUMN public.sys_outbox_event_deliveries.last_error IS '目标最后一次错误信息';
|
|
658
|
+
|
|
659
|
+
COMMENT ON COLUMN public.sys_outbox_event_deliveries.dispatched_at IS '目标投递完成时间';
|
|
660
|
+
|
|
661
|
+
COMMENT ON COLUMN public.sys_outbox_event_deliveries.locked_at IS 'Relay 锁定目标时间';
|
|
662
|
+
|
|
663
|
+
COMMENT ON COLUMN public.sys_outbox_event_deliveries.locked_by IS 'Relay 实例标识';
|
|
664
|
+
|
|
665
|
+
COMMENT ON COLUMN public.sys_outbox_event_deliveries.created_at IS '记录创建时间';
|
|
666
|
+
|
|
667
|
+
COMMENT ON COLUMN public.sys_outbox_event_deliveries.updated_at IS '记录更新时间';
|
|
668
|
+
|
|
669
|
+
CREATE FUNCTION public.reject_sys_outbox_event_delivery_identity_change() RETURNS trigger
|
|
670
|
+
LANGUAGE plpgsql
|
|
671
|
+
AS $$
|
|
672
|
+
BEGIN
|
|
673
|
+
IF NEW.outbox_ref IS DISTINCT FROM OLD.outbox_ref
|
|
674
|
+
OR NEW.aggregate_version IS DISTINCT FROM OLD.aggregate_version
|
|
675
|
+
OR NEW.product_code IS DISTINCT FROM OLD.product_code THEN
|
|
676
|
+
RAISE EXCEPTION 'sys_outbox_events delivery identity is immutable'
|
|
677
|
+
USING ERRCODE = '23514';
|
|
678
|
+
END IF;
|
|
679
|
+
RETURN NEW;
|
|
680
|
+
END;
|
|
681
|
+
$$;
|
|
682
|
+
|
|
683
|
+
CREATE TRIGGER trg_sys_outbox_events_delivery_identity_immutable BEFORE UPDATE OF outbox_ref, aggregate_version, product_code ON public.sys_outbox_events FOR EACH ROW EXECUTE FUNCTION public.reject_sys_outbox_event_delivery_identity_change();
|
|
684
|
+
|
|
685
|
+
CREATE FUNCTION public.reject_sys_outbox_event_schema_version_change() RETURNS trigger
|
|
686
|
+
LANGUAGE plpgsql
|
|
687
|
+
AS $$
|
|
688
|
+
BEGIN
|
|
689
|
+
IF NEW.schema_version IS DISTINCT FROM OLD.schema_version THEN
|
|
690
|
+
RAISE EXCEPTION 'sys_outbox_events.schema_version is immutable'
|
|
691
|
+
USING ERRCODE = '55000';
|
|
692
|
+
END IF;
|
|
693
|
+
RETURN NEW;
|
|
694
|
+
END
|
|
695
|
+
$$;
|
|
696
|
+
|
|
697
|
+
CREATE TRIGGER trg_sys_outbox_events_schema_version_immutable BEFORE UPDATE OF schema_version ON public.sys_outbox_events FOR EACH ROW EXECUTE FUNCTION public.reject_sys_outbox_event_schema_version_change();
|
|
698
|
+
|
|
699
|
+
CREATE FUNCTION public.sys_operation_logs_finalization_guard() RETURNS trigger
|
|
700
|
+
LANGUAGE plpgsql
|
|
701
|
+
AS $$
|
|
702
|
+
BEGIN
|
|
703
|
+
IF TG_OP = 'DELETE' THEN
|
|
704
|
+
RAISE EXCEPTION 'sys_operation_logs are append-only';
|
|
705
|
+
END IF;
|
|
706
|
+
|
|
707
|
+
IF OLD.record_status = 'started' AND NEW.record_status = 'completed' THEN
|
|
708
|
+
RETURN NEW;
|
|
709
|
+
END IF;
|
|
710
|
+
|
|
711
|
+
RAISE EXCEPTION 'sys_operation_logs only allow started to completed transition';
|
|
712
|
+
END;
|
|
713
|
+
$$;
|
|
714
|
+
|
|
715
|
+
CREATE TRIGGER trg_sys_operation_logs_finalization_guard BEFORE DELETE OR UPDATE ON public.sys_operation_logs FOR EACH ROW EXECUTE FUNCTION public.sys_operation_logs_finalization_guard();
|
|
716
|
+
|
|
717
|
+
CREATE TABLE sys_command_replay_records (
|
|
718
|
+
id bigserial PRIMARY KEY,
|
|
719
|
+
created_at timestamp(3) with time zone DEFAULT now() NOT NULL,
|
|
720
|
+
updated_at timestamp(3) with time zone DEFAULT now() NOT NULL,
|
|
721
|
+
command_scope character varying(128) NOT NULL,
|
|
722
|
+
idempotency_key character varying(191) NOT NULL,
|
|
723
|
+
request_hash character varying(64) NOT NULL,
|
|
724
|
+
principal_type character varying(32),
|
|
725
|
+
principal_ref character varying(64),
|
|
726
|
+
status character varying(20) DEFAULT 'started'::character varying NOT NULL,
|
|
727
|
+
response_payload jsonb DEFAULT '{}'::jsonb NOT NULL,
|
|
728
|
+
error_code character varying(120),
|
|
729
|
+
error_status integer,
|
|
730
|
+
expires_at timestamp(3) with time zone NOT NULL,
|
|
731
|
+
completed_at timestamp(3) with time zone,
|
|
732
|
+
metadata jsonb DEFAULT '{}'::jsonb NOT NULL,
|
|
733
|
+
namespace varchar(200) NOT NULL,
|
|
734
|
+
external_reference_type varchar(64),
|
|
735
|
+
external_reference_no varchar(191),
|
|
736
|
+
execution_token_hash char(64),
|
|
737
|
+
lease_expires_at timestamptz(3),
|
|
738
|
+
external_next_recovery_at timestamptz(3),
|
|
739
|
+
external_attempt_count integer NOT NULL DEFAULT 0,
|
|
740
|
+
external_last_error_code varchar(120)
|
|
741
|
+
);
|
|
742
|
+
|
|
743
|
+
ALTER TABLE sys_command_replay_records
|
|
744
|
+
ADD CONSTRAINT "uk_sys_command_replay_records_namespace_scope_key"
|
|
745
|
+
UNIQUE ("namespace", "command_scope", "idempotency_key"),
|
|
746
|
+
ADD CONSTRAINT "ck_sys_command_replay_records_namespace"
|
|
747
|
+
CHECK ("namespace" ~ '^[a-z][a-z0-9_-]*([.][a-z][a-z0-9_-]*){2,7}$'),
|
|
748
|
+
ADD CONSTRAINT "ck_sys_command_replay_records_scope"
|
|
749
|
+
CHECK (BTRIM("command_scope") <> '' AND BTRIM("idempotency_key") <> ''),
|
|
750
|
+
ADD CONSTRAINT "ck_sys_command_replay_records_request_hash"
|
|
751
|
+
CHECK ("request_hash" ~ '^[0-9a-f]{64}$'),
|
|
752
|
+
ADD CONSTRAINT "ck_sys_command_replay_records_status"
|
|
753
|
+
CHECK ("status" IN ('started', 'succeeded', 'failed')),
|
|
754
|
+
ADD CONSTRAINT "ck_sys_command_replay_records_principal"
|
|
755
|
+
CHECK (
|
|
756
|
+
(
|
|
757
|
+
"principal_type" IS NULL
|
|
758
|
+
AND "principal_ref" IS NULL
|
|
759
|
+
)
|
|
760
|
+
OR (
|
|
761
|
+
"principal_type" IS NOT NULL
|
|
762
|
+
AND BTRIM("principal_type") <> ''
|
|
763
|
+
AND "principal_ref" IS NOT NULL
|
|
764
|
+
AND BTRIM("principal_ref") <> ''
|
|
765
|
+
)
|
|
766
|
+
),
|
|
767
|
+
ADD CONSTRAINT "ck_sys_command_replay_records_error_state"
|
|
768
|
+
CHECK (
|
|
769
|
+
(
|
|
770
|
+
"status" = 'failed'
|
|
771
|
+
AND "error_code" IS NOT NULL
|
|
772
|
+
AND BTRIM("error_code") <> ''
|
|
773
|
+
AND "error_status" BETWEEN 400 AND 599
|
|
774
|
+
)
|
|
775
|
+
OR (
|
|
776
|
+
"status" <> 'failed'
|
|
777
|
+
AND "error_code" IS NULL
|
|
778
|
+
AND "error_status" IS NULL
|
|
779
|
+
)
|
|
780
|
+
),
|
|
781
|
+
ADD CONSTRAINT "ck_sys_command_replay_records_json"
|
|
782
|
+
CHECK (
|
|
783
|
+
jsonb_typeof("response_payload") = 'object'
|
|
784
|
+
AND jsonb_typeof("metadata") = 'object'
|
|
785
|
+
),
|
|
786
|
+
ADD CONSTRAINT "ck_sys_command_replay_records_completed_at"
|
|
787
|
+
CHECK (
|
|
788
|
+
(
|
|
789
|
+
"status" = 'started'
|
|
790
|
+
AND "completed_at" IS NULL
|
|
791
|
+
)
|
|
792
|
+
OR (
|
|
793
|
+
"status" IN ('succeeded', 'failed')
|
|
794
|
+
AND "completed_at" IS NOT NULL
|
|
795
|
+
AND "completed_at" >= "created_at"
|
|
796
|
+
)
|
|
797
|
+
),
|
|
798
|
+
ADD CONSTRAINT "ck_sys_command_replay_records_external_execution"
|
|
799
|
+
CHECK (
|
|
800
|
+
(
|
|
801
|
+
"external_reference_type" IS NULL
|
|
802
|
+
AND "external_reference_no" IS NULL
|
|
803
|
+
AND "execution_token_hash" IS NULL
|
|
804
|
+
AND "lease_expires_at" IS NULL
|
|
805
|
+
AND "external_next_recovery_at" IS NULL
|
|
806
|
+
AND "external_attempt_count" = 0
|
|
807
|
+
AND "external_last_error_code" IS NULL
|
|
808
|
+
)
|
|
809
|
+
OR (
|
|
810
|
+
"status" = 'started'
|
|
811
|
+
AND "external_reference_type" IS NOT NULL
|
|
812
|
+
AND BTRIM("external_reference_type") <> ''
|
|
813
|
+
AND "external_reference_no" IS NOT NULL
|
|
814
|
+
AND BTRIM("external_reference_no") <> ''
|
|
815
|
+
AND "external_next_recovery_at" IS NOT NULL
|
|
816
|
+
AND "external_attempt_count" > 0
|
|
817
|
+
AND (
|
|
818
|
+
(
|
|
819
|
+
"execution_token_hash" ~ '^[0-9a-f]{64}$'
|
|
820
|
+
AND "lease_expires_at" IS NOT NULL
|
|
821
|
+
AND "external_next_recovery_at" = "lease_expires_at"
|
|
822
|
+
AND "external_last_error_code" IS NULL
|
|
823
|
+
)
|
|
824
|
+
OR (
|
|
825
|
+
"execution_token_hash" IS NULL
|
|
826
|
+
AND "lease_expires_at" IS NULL
|
|
827
|
+
AND "external_last_error_code" IS NOT NULL
|
|
828
|
+
AND BTRIM("external_last_error_code") <> ''
|
|
829
|
+
)
|
|
830
|
+
)
|
|
831
|
+
)
|
|
832
|
+
);
|
|
833
|
+
|
|
834
|
+
CREATE INDEX "idx_sys_command_replay_records_external_recovery"
|
|
835
|
+
ON "sys_command_replay_records" ("external_reference_type", "external_next_recovery_at", "id")
|
|
836
|
+
WHERE "status" = 'started' AND "external_reference_no" IS NOT NULL;
|
|
837
|
+
|
|
838
|
+
COMMENT ON TABLE "sys_command_replay_records" IS '跨领域持久化命令回放与外部副作用恢复记录';
|
|
839
|
+
|
|
840
|
+
COMMENT ON COLUMN "sys_command_replay_records"."id" IS '主键 ID';
|
|
841
|
+
|
|
842
|
+
COMMENT ON COLUMN "sys_command_replay_records"."created_at" IS '创建时间';
|
|
843
|
+
|
|
844
|
+
COMMENT ON COLUMN "sys_command_replay_records"."updated_at" IS '更新时间';
|
|
845
|
+
|
|
846
|
+
COMMENT ON COLUMN "sys_command_replay_records"."namespace" IS '命令所有者全局命名空间';
|
|
847
|
+
|
|
848
|
+
COMMENT ON COLUMN "sys_command_replay_records"."command_scope" IS '命令幂等作用域';
|
|
849
|
+
|
|
850
|
+
COMMENT ON COLUMN "sys_command_replay_records"."idempotency_key" IS '调用方幂等键';
|
|
851
|
+
|
|
852
|
+
COMMENT ON COLUMN "sys_command_replay_records"."request_hash" IS '规范请求载荷 SHA-256 摘要';
|
|
853
|
+
|
|
854
|
+
COMMENT ON COLUMN "sys_command_replay_records"."principal_type" IS '调用主体类型';
|
|
855
|
+
|
|
856
|
+
COMMENT ON COLUMN "sys_command_replay_records"."principal_ref" IS '调用主体公开引用';
|
|
857
|
+
|
|
858
|
+
COMMENT ON COLUMN "sys_command_replay_records"."status" IS '命令执行状态';
|
|
859
|
+
|
|
860
|
+
COMMENT ON COLUMN "sys_command_replay_records"."response_payload" IS '可回放响应载荷';
|
|
861
|
+
|
|
862
|
+
COMMENT ON COLUMN "sys_command_replay_records"."error_code" IS '失败稳定错误码';
|
|
863
|
+
|
|
864
|
+
COMMENT ON COLUMN "sys_command_replay_records"."error_status" IS '失败 HTTP 状态码';
|
|
865
|
+
|
|
866
|
+
COMMENT ON COLUMN "sys_command_replay_records"."expires_at" IS '回放记录保留截止时间';
|
|
867
|
+
|
|
868
|
+
COMMENT ON COLUMN "sys_command_replay_records"."completed_at" IS '命令完成时间';
|
|
869
|
+
|
|
870
|
+
COMMENT ON COLUMN "sys_command_replay_records"."metadata" IS '非敏感扩展元数据';
|
|
871
|
+
|
|
872
|
+
COMMENT ON COLUMN "sys_command_replay_records"."external_reference_type" IS '外部执行恢复处理器类型';
|
|
873
|
+
|
|
874
|
+
COMMENT ON COLUMN "sys_command_replay_records"."external_reference_no" IS '外部执行业务引用';
|
|
875
|
+
|
|
876
|
+
COMMENT ON COLUMN "sys_command_replay_records"."execution_token_hash" IS '外部执行租约令牌摘要';
|
|
877
|
+
|
|
878
|
+
COMMENT ON COLUMN "sys_command_replay_records"."lease_expires_at" IS '外部执行租约截止时间';
|
|
879
|
+
|
|
880
|
+
COMMENT ON COLUMN "sys_command_replay_records"."external_next_recovery_at" IS '外部执行下次恢复时间';
|
|
881
|
+
|
|
882
|
+
COMMENT ON COLUMN "sys_command_replay_records"."external_attempt_count" IS '外部执行领取次数';
|
|
883
|
+
|
|
884
|
+
COMMENT ON COLUMN "sys_command_replay_records"."external_last_error_code" IS '最近一次规范化恢复错误码';
|
|
885
|
+
|
|
886
|
+
COMMIT;
|