@stackonward/cli 0.0.1 → 1.0.0
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 +16 -12
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
# Database Reference
|
|
2
|
+
|
|
3
|
+
> Templates and examples. Rules in `CLAUDE.md`.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Column Type Mapping
|
|
8
|
+
|
|
9
|
+
| Data Type | PostgreSQL Type | Go Type | Notes |
|
|
10
|
+
|-----------|-----------------|---------|-------|
|
|
11
|
+
| Primary Key | `bigserial` | `int64` | Auto-increment primary key |
|
|
12
|
+
| Foreign Key | `bigint` | `int64` | Logical foreign-key reference only |
|
|
13
|
+
| Product Code | `varchar(50)` | `string` | Product code in `snake_case`, referencing `p_products.code` |
|
|
14
|
+
| Status | `varchar(20)` | `string` | String enum constant |
|
|
15
|
+
| Boolean | `boolean` | `bool` | Prefer `is_xxx` naming |
|
|
16
|
+
| JSON | `jsonb` | `datatypes.JSON` or a custom struct | Supports indexing |
|
|
17
|
+
| Text | `text` | `string` | Unlimited length |
|
|
18
|
+
| Varchar | `varchar(n)` | `string` | Explicit max length |
|
|
19
|
+
| Timestamp | `timestamptz(3)` | `time.Time` | Millisecond precision |
|
|
20
|
+
| Money | `decimal(19,4)` | `string` | Keep string semantics in code |
|
|
21
|
+
| Nullable | any + `NULL` | `*T` or `sql.NullXxx` | Use pointer or nullable wrapper |
|
|
22
|
+
|
|
23
|
+
## Identifier Classes
|
|
24
|
+
|
|
25
|
+
Before designing table columns, classify identifier fields using [identifier-contract.md](./identifier-contract.md):
|
|
26
|
+
|
|
27
|
+
- Public business numbers: `order_no`, `payment_no`, `member_no`
|
|
28
|
+
- Cross-module business reference keys: `source_ref`, `reference_id`
|
|
29
|
+
- Request idempotency keys: `idempotency_key`
|
|
30
|
+
- Third-party or protocol object IDs: `provider_*_id`, `external_*_id`, `message_id`
|
|
31
|
+
|
|
32
|
+
It is forbidden to mix these four semantics into one field.
|
|
33
|
+
|
|
34
|
+
### Migration Compliance Rule
|
|
35
|
+
|
|
36
|
+
For migration-owned tables, verify them in two clearly separated scopes:
|
|
37
|
+
|
|
38
|
+
1. current importer truth: clean database -> `migrate-up` -> latest import tool
|
|
39
|
+
2. retained imported databases, if they must continue to exist, via an explicit repair path or clean reimport procedure
|
|
40
|
+
|
|
41
|
+
Do not mix stale pre-rerun data into the statement about whether the latest importer contract is correct.
|
|
42
|
+
|
|
43
|
+
### Product Code Convention
|
|
44
|
+
|
|
45
|
+
Every table that carries product scope **must** use the following unified column definition:
|
|
46
|
+
|
|
47
|
+
```go
|
|
48
|
+
// Go struct tag
|
|
49
|
+
ProductCode string `gorm:"column:product_code;type:varchar(50);not null;index;comment:产品编码" json:"product_code"`
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
```sql
|
|
53
|
+
-- SQL column
|
|
54
|
+
product_code VARCHAR(50) NOT NULL
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
| Rule | Detail |
|
|
58
|
+
|------|--------|
|
|
59
|
+
| Field name | `product_code` (NEVER: `product_id`, `app_id`) |
|
|
60
|
+
| Column type | `VARCHAR(50)` (NEVER: `varchar(20)`, `varchar(32)`, `varchar(64)`) |
|
|
61
|
+
| Value format | `snake_case`, for example `ai_chat`, `ai_assistant` |
|
|
62
|
+
| Value constraint | `^[a-z][a-z0-9_]{1,49}$` |
|
|
63
|
+
| Enum source | `internal/common/types.Product` (single source of truth) |
|
|
64
|
+
| Logical base reference | `p_products.code` (logical foreign key, no physical FK constraint) |
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## FORBIDDEN: Foreign Key Constraints (CRITICAL)
|
|
69
|
+
|
|
70
|
+
**Do not create FOREIGN KEY constraints on application tables.** The industry-standard pattern used by large platforms such as Alibaba, Meituan, Google, and Stripe is to enforce referential integrity in the application layer and keep the database focused on storage and indexing.
|
|
71
|
+
|
|
72
|
+
| Problem | Impact |
|
|
73
|
+
|---------|--------|
|
|
74
|
+
| Cascading locks | Parent-row DELETE or UPDATE locks child rows and increases deadlock risk under concurrency |
|
|
75
|
+
| DDL blocking | `ALTER TABLE` must lock all FK-related tables |
|
|
76
|
+
| Sharding limits | Cross-database foreign keys are not available |
|
|
77
|
+
| Write overhead | Every INSERT or UPDATE needs FK existence checks |
|
|
78
|
+
|
|
79
|
+
**Preferred alternatives**:
|
|
80
|
+
- Service-layer existence checks before writing (`SELECT 1 WHERE id = ?`)
|
|
81
|
+
- Soft delete via `deleted_at` instead of `CASCADE DELETE`
|
|
82
|
+
- Asynchronous consistency scans for orphaned references
|
|
83
|
+
|
|
84
|
+
```sql
|
|
85
|
+
-- FORBIDDEN
|
|
86
|
+
ALTER TABLE orders ADD CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES users(id);
|
|
87
|
+
|
|
88
|
+
-- CORRECT: index the column, do not create a foreign key
|
|
89
|
+
CREATE INDEX idx_orders_user_id ON orders (user_id);
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Index Design Standards
|
|
95
|
+
|
|
96
|
+
Indexes must be justified by a query path, uniqueness contract, or operational investigation path.
|
|
97
|
+
|
|
98
|
+
| Scenario | Required index shape |
|
|
99
|
+
| --- | --- |
|
|
100
|
+
| Product-scoped table | `product_code` as the left prefix of the hot-path composite index |
|
|
101
|
+
| User list within product | `(product_code, user_id, created_at DESC)` or the exact equality filters followed by the sort column |
|
|
102
|
+
| Status work queue | Partial index over the active state set, for example `WHERE status IN ('pending', 'running')` |
|
|
103
|
+
| Soft-delete uniqueness | Partial unique index with `WHERE deleted_at IS NULL` |
|
|
104
|
+
| Provider callback idempotency | Unique index on provider code plus provider event/object ID and owning scope |
|
|
105
|
+
| Large append-only time-series table | Partition by time plus BRIN index on the timestamp column |
|
|
106
|
+
| Failure investigation | Partial index on failed rows, for example `WHERE is_success = false` |
|
|
107
|
+
| Trace or request lookup | Partial index on `trace_id` or `request_id` with non-empty predicate |
|
|
108
|
+
|
|
109
|
+
Rules:
|
|
110
|
+
|
|
111
|
+
1. Do not create a single-column low-cardinality index unless the query path proves it is selective enough.
|
|
112
|
+
2. Do not create overlapping duplicate indexes. If two indexes share table, columns, uniqueness, and predicate, keep one owner index.
|
|
113
|
+
3. Do not add an index only because a column exists. The owning repository query must be able to use it.
|
|
114
|
+
4. Every runtime exact-match deduplication scope must have a matching unique database constraint.
|
|
115
|
+
5. Index names use `idx_<table>_<columns>` for normal indexes and `uk_<table>_<scope>` for unique indexes.
|
|
116
|
+
6. Every new `CREATE INDEX` migration must include `查询路径:` and `索引理由:` comments immediately above the statement.
|
|
117
|
+
|
|
118
|
+
Index evidence comment format:
|
|
119
|
+
|
|
120
|
+
```sql
|
|
121
|
+
-- 查询路径:internal/platform/order/infrastructure/persistence.go ListByUser
|
|
122
|
+
-- 索引理由:product_code/user_id 等值过滤后按 created_at 倒序分页。
|
|
123
|
+
CREATE INDEX IF NOT EXISTS idx_p_order_orders_product_user_created
|
|
124
|
+
ON p_order_orders (product_code, user_id, created_at DESC);
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
The evidence must point to a real repository or service query. A migration that only makes an audit report count go down is not a valid index design.
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Log And Audit Table Storage Standards
|
|
132
|
+
|
|
133
|
+
Audit and access tables are operational infrastructure, not ordinary CRUD tables.
|
|
134
|
+
|
|
135
|
+
| Table | Required storage contract |
|
|
136
|
+
| --- | --- |
|
|
137
|
+
| `sys_access_logs` | Weekly range partitions, default partition, short retention, BRIN on `created_at`, partial indexes for failure and trace lookup |
|
|
138
|
+
| `sys_audit_logs` | Monthly range partitions, default partition, long compliance retention, BRIN on `created_at`, actor/resource/category/risk indexes |
|
|
139
|
+
| `sys_login_logs` | Monthly range partitions, default partition, security retention, failed-login partial index, IP and identity lookup indexes |
|
|
140
|
+
|
|
141
|
+
Rules:
|
|
142
|
+
|
|
143
|
+
1. Partition maintenance must create future partitions before data arrives.
|
|
144
|
+
2. Default partitions are mandatory for log tables so writes do not fail when a future partition is missing.
|
|
145
|
+
3. Dropping old access-log partitions is allowed by retention policy; sampling business audit records is not allowed.
|
|
146
|
+
4. High-volume successful read traffic should be controlled before database write, not cleaned up after unbounded insertion.
|
|
147
|
+
5. Migrations that touch these tables must preserve the default partition, BRIN time index, and failure investigation indexes.
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Base Model
|
|
152
|
+
|
|
153
|
+
```go
|
|
154
|
+
// internal/core/database/base_model.go
|
|
155
|
+
|
|
156
|
+
// BaseModel 基础模型,所有实体嵌入
|
|
157
|
+
type BaseModel struct {
|
|
158
|
+
// 主键 ID
|
|
159
|
+
ID int64 `gorm:"column:id;primaryKey;autoIncrement;comment:主键 ID" json:"id"`
|
|
160
|
+
// 创建时间
|
|
161
|
+
CreatedAt time.Time `gorm:"column:created_at;autoCreateTime:milli;comment:创建时间" json:"created_at"`
|
|
162
|
+
// 更新时间
|
|
163
|
+
UpdatedAt time.Time `gorm:"column:updated_at;autoUpdateTime:milli;comment:更新时间" json:"updated_at"`
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// SoftDeleteModel 支持软删除的基础模型
|
|
167
|
+
type SoftDeleteModel struct {
|
|
168
|
+
BaseModel
|
|
169
|
+
// 删除时间
|
|
170
|
+
DeletedAt gorm.DeletedAt `gorm:"column:deleted_at;index;comment:删除时间" json:"-"`
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Entity Example
|
|
177
|
+
|
|
178
|
+
```go
|
|
179
|
+
// internal/platform/user/domain/model.go
|
|
180
|
+
|
|
181
|
+
// User 用户实体
|
|
182
|
+
type User struct {
|
|
183
|
+
database.SoftDeleteModel
|
|
184
|
+
// 用户名
|
|
185
|
+
Name string `gorm:"column:name;type:varchar(100);not null;comment:用户名"`
|
|
186
|
+
// 邮箱
|
|
187
|
+
Email string `gorm:"column:email;type:varchar(255);not null;uniqueIndex;comment:邮箱"`
|
|
188
|
+
// 用户角色
|
|
189
|
+
Role string `gorm:"column:role;type:varchar(20);not null;default:user;comment:用户角色"`
|
|
190
|
+
// 用户状态
|
|
191
|
+
Status string `gorm:"column:status;type:varchar(20);not null;default:active;index;comment:用户状态"`
|
|
192
|
+
// 头像 URL
|
|
193
|
+
AvatarURL *string `gorm:"column:avatar_url;type:varchar(500);comment:头像 URL"`
|
|
194
|
+
// 扩展元数据
|
|
195
|
+
Metadata datatypes.JSON `gorm:"column:metadata;type:jsonb;comment:扩展元数据"`
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// TableName 指定表名
|
|
199
|
+
func (User) TableName() string {
|
|
200
|
+
return "p_user_users"
|
|
201
|
+
}
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## Migration Template (golang-migrate)
|
|
207
|
+
|
|
208
|
+
```sql
|
|
209
|
+
-- migrations/000001_create_users.up.sql
|
|
210
|
+
|
|
211
|
+
CREATE TABLE "p_user_users" (
|
|
212
|
+
"id" BIGSERIAL PRIMARY KEY,
|
|
213
|
+
"name" VARCHAR(100) NOT NULL,
|
|
214
|
+
"email" VARCHAR(255) NOT NULL,
|
|
215
|
+
"role" VARCHAR(20) NOT NULL DEFAULT 'user',
|
|
216
|
+
"status" VARCHAR(20) NOT NULL DEFAULT 'active',
|
|
217
|
+
"avatar_url" VARCHAR(500),
|
|
218
|
+
"metadata" JSONB,
|
|
219
|
+
"created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
220
|
+
"updated_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
221
|
+
"deleted_at" TIMESTAMPTZ(3)
|
|
222
|
+
);
|
|
223
|
+
|
|
224
|
+
CREATE UNIQUE INDEX "uk_users_email" ON "p_user_users" ("email");
|
|
225
|
+
CREATE INDEX "idx_users_status" ON "p_user_users" ("status");
|
|
226
|
+
CREATE INDEX "idx_users_deleted_at" ON "p_user_users" ("deleted_at");
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
```sql
|
|
230
|
+
-- migrations/000001_create_users.down.sql
|
|
231
|
+
|
|
232
|
+
DROP TABLE IF EXISTS "p_user_users";
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
## GORM Database Connection
|
|
238
|
+
|
|
239
|
+
```go
|
|
240
|
+
// internal/core/database/database.go
|
|
241
|
+
|
|
242
|
+
// NewDB 创建 GORM 数据库连接
|
|
243
|
+
func NewDB(cfg *config.DatabaseConfig, logger *zap.Logger) (*gorm.DB, error) {
|
|
244
|
+
dsn := fmt.Sprintf(
|
|
245
|
+
"host=%s port=%d user=%s password=%s dbname=%s sslmode=disable TimeZone=Asia/Shanghai",
|
|
246
|
+
cfg.Host, cfg.Port, cfg.User, cfg.Password, cfg.Name,
|
|
247
|
+
)
|
|
248
|
+
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{
|
|
249
|
+
Logger: zapgorm2.New(logger),
|
|
250
|
+
NamingStrategy: schema.NamingStrategy{SingularTable: true},
|
|
251
|
+
DisableForeignKeyConstraintWhenMigrating: true,
|
|
252
|
+
})
|
|
253
|
+
if err != nil {
|
|
254
|
+
return nil, fmt.Errorf("connect database: %w", err)
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
sqlDB, err := db.DB()
|
|
258
|
+
if err != nil {
|
|
259
|
+
return nil, fmt.Errorf("get sql.DB: %w", err)
|
|
260
|
+
}
|
|
261
|
+
sqlDB.SetMaxOpenConns(cfg.MaxOpenConns)
|
|
262
|
+
sqlDB.SetMaxIdleConns(cfg.MaxIdleConns)
|
|
263
|
+
sqlDB.SetConnMaxLifetime(cfg.ConnMaxLifetime)
|
|
264
|
+
|
|
265
|
+
return db, nil
|
|
266
|
+
}
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
## Query Patterns
|
|
272
|
+
|
|
273
|
+
```go
|
|
274
|
+
// 指定字段查询
|
|
275
|
+
var users []domain.User
|
|
276
|
+
db.Select("id", "name", "email").
|
|
277
|
+
Where("status = ?", "active").
|
|
278
|
+
Find(&users)
|
|
279
|
+
|
|
280
|
+
// 分页查询
|
|
281
|
+
var users []domain.User
|
|
282
|
+
var total int64
|
|
283
|
+
db.Model(&domain.User{}).
|
|
284
|
+
Select("id", "name", "status", "created_at").
|
|
285
|
+
Where("status = ?", "active").
|
|
286
|
+
Count(&total).
|
|
287
|
+
Offset(types.CalcOffset(page, pageSize)).
|
|
288
|
+
Limit(pageSize).
|
|
289
|
+
Order("created_at DESC").
|
|
290
|
+
Find(&users)
|
|
291
|
+
|
|
292
|
+
// 预加载关联(避免 N+1)
|
|
293
|
+
var conversations []domain.Conversation
|
|
294
|
+
db.Preload("Messages").
|
|
295
|
+
Where("user_id = ?", userID).
|
|
296
|
+
Find(&conversations)
|
|
297
|
+
|
|
298
|
+
// Join 查询
|
|
299
|
+
db.Select("conversations.id, COUNT(messages.id) as message_count").
|
|
300
|
+
Joins("LEFT JOIN messages ON messages.conversation_id = conversations.id").
|
|
301
|
+
Group("conversations.id").
|
|
302
|
+
Find(&conversations)
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
|
|
307
|
+
## Repository Pattern
|
|
308
|
+
|
|
309
|
+
```go
|
|
310
|
+
// internal/platform/user/domain/repository.go
|
|
311
|
+
|
|
312
|
+
// UserRepository 用户仓储接口
|
|
313
|
+
type UserRepository interface {
|
|
314
|
+
Create(ctx context.Context, user *User) error
|
|
315
|
+
FindByID(ctx context.Context, id int64) (*User, error)
|
|
316
|
+
FindByEmail(ctx context.Context, email string) (*User, error)
|
|
317
|
+
FindAll(ctx context.Context, filter UserFilter, page, pageSize int) ([]User, int64, error)
|
|
318
|
+
Update(ctx context.Context, user *User) error
|
|
319
|
+
SoftDelete(ctx context.Context, id int64) error
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
// UserFilter 查询筛选条件
|
|
323
|
+
type UserFilter struct {
|
|
324
|
+
Status *string
|
|
325
|
+
Role *string
|
|
326
|
+
}
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
```go
|
|
330
|
+
// internal/platform/user/infrastructure/persistence.go
|
|
331
|
+
|
|
332
|
+
type userRepository struct {
|
|
333
|
+
db *gorm.DB
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
// NewUserRepository 创建 UserRepository 实现
|
|
337
|
+
func NewUserRepository(db *gorm.DB) domain.UserRepository {
|
|
338
|
+
return &userRepository{db: db}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
func (r *userRepository) FindAll(ctx context.Context, filter domain.UserFilter, page, pageSize int) ([]domain.User, int64, error) {
|
|
342
|
+
var users []domain.User
|
|
343
|
+
var total int64
|
|
344
|
+
|
|
345
|
+
query := database.GetDB(ctx, r.db).Model(&domain.User{})
|
|
346
|
+
if filter.Status != nil {
|
|
347
|
+
query = query.Where("status = ?", *filter.Status)
|
|
348
|
+
}
|
|
349
|
+
if filter.Role != nil {
|
|
350
|
+
query = query.Where("role = ?", *filter.Role)
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
if err := query.Count(&total).Error; err != nil {
|
|
354
|
+
return nil, 0, fmt.Errorf("count users: %w", err)
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
err := query.
|
|
358
|
+
Select("id", "name", "email", "role", "status", "created_at").
|
|
359
|
+
Offset(types.CalcOffset(page, pageSize)).
|
|
360
|
+
Limit(pageSize).
|
|
361
|
+
Order("created_at DESC").
|
|
362
|
+
Find(&users).Error
|
|
363
|
+
if err != nil {
|
|
364
|
+
return nil, 0, fmt.Errorf("find users: %w", err)
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
return users, total, nil
|
|
368
|
+
}
|
|
369
|
+
```
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
# E2E Standards
|
|
2
|
+
|
|
3
|
+
This document defines the binding design and execution rules for backend full-chain E2E tests.
|
|
4
|
+
|
|
5
|
+
It is a rules document, not a sample implementation guide.
|
|
6
|
+
|
|
7
|
+
## Final Goal
|
|
8
|
+
|
|
9
|
+
E2E tests prove that an externally visible workflow remains correct across:
|
|
10
|
+
|
|
11
|
+
- HTTP entrypoints
|
|
12
|
+
- database state transitions
|
|
13
|
+
- outbox relay delivery
|
|
14
|
+
- worker side effects
|
|
15
|
+
- final access behavior
|
|
16
|
+
|
|
17
|
+
If a workflow crosses runtime boundaries and can break user-facing truth, it needs an E2E contract test.
|
|
18
|
+
|
|
19
|
+
## Industry Alignment
|
|
20
|
+
|
|
21
|
+
| Decision Point | Industry Pattern | Used By | Our Choice | Rationale |
|
|
22
|
+
| --- | --- | --- | --- | --- |
|
|
23
|
+
| Test isolation | Fresh fixture data per test | Playwright, Cypress, GitHub integration suites | Unique fixture identities and business rows | Prevents cross-test state bleed and makes failures reproducible. |
|
|
24
|
+
| System contract tests | Black-box entrypoint + durable state assertions | Stripe API tests, GitHub integration tests | Public API action + DB/side-effect verification | Cross-runtime workflows must be proven from outside the service boundary. |
|
|
25
|
+
| Background verification | Poll durable terminal state, not transient logs | AWS async workflow testing | Bounded polling on DB/API terminal state | Logs are hints; durable state is the contract. |
|
|
26
|
+
| Async architecture regression guard | Exact event contract tests beside E2E | Stripe-style explicit event typing | Relay whitelist unit tests + E2E | One catches config drift; the other catches runtime drift. |
|
|
27
|
+
| Fixture setup | Direct seed only for prerequisites outside the behavior under test | Large platform integration suites | Seed prerequisites via DB, execute target action via public API | Keeps setup fast without bypassing the workflow under test. |
|
|
28
|
+
|
|
29
|
+
## When E2E Is Mandatory
|
|
30
|
+
|
|
31
|
+
Add or update an E2E when the change touches any of these:
|
|
32
|
+
|
|
33
|
+
- auth / session lifecycle
|
|
34
|
+
- account deletion / irreversible state machines
|
|
35
|
+
- outbox relay routing
|
|
36
|
+
- worker-driven cleanup or notifications
|
|
37
|
+
- billing, subscription, quota, entitlement, or credit side effects
|
|
38
|
+
- product bootstrap or projection repair
|
|
39
|
+
|
|
40
|
+
## Binding Rules
|
|
41
|
+
|
|
42
|
+
### 1. Enter Through the Real Public Interface
|
|
43
|
+
|
|
44
|
+
Rules:
|
|
45
|
+
|
|
46
|
+
- The action under test must enter through HTTP, gateway, queue, or another real public trigger.
|
|
47
|
+
- The workflow under test must not be executed by direct repository or SQL mutation.
|
|
48
|
+
|
|
49
|
+
Allowed:
|
|
50
|
+
|
|
51
|
+
- seed prerequisites directly in DB
|
|
52
|
+
- call the real public endpoint for the behavior under test
|
|
53
|
+
|
|
54
|
+
Forbidden:
|
|
55
|
+
|
|
56
|
+
- inserting the main state transition directly with SQL
|
|
57
|
+
- calling an internal service method instead of the public entrypoint when testing API behavior
|
|
58
|
+
|
|
59
|
+
### 2. Seed Only Prerequisites
|
|
60
|
+
|
|
61
|
+
Direct DB seed is allowed only for data that is not the subject of the test itself.
|
|
62
|
+
|
|
63
|
+
Examples:
|
|
64
|
+
|
|
65
|
+
- catalog plan rows
|
|
66
|
+
- template rows
|
|
67
|
+
- API key rows needed to verify revocation
|
|
68
|
+
- product-scoped dependent rows needed to verify cleanup
|
|
69
|
+
|
|
70
|
+
Forbidden:
|
|
71
|
+
|
|
72
|
+
- seeding the deletion request row when testing account deletion
|
|
73
|
+
- seeding final identity/user deleted state and then calling the endpoint
|
|
74
|
+
|
|
75
|
+
### 3. Assert Three Layers of Truth
|
|
76
|
+
|
|
77
|
+
Every full-chain E2E must assert all three:
|
|
78
|
+
|
|
79
|
+
- authoritative database state
|
|
80
|
+
- externally visible access behavior
|
|
81
|
+
- downstream side effects
|
|
82
|
+
|
|
83
|
+
For account closure, this means:
|
|
84
|
+
|
|
85
|
+
- identity / user / product_user terminal rows
|
|
86
|
+
- viewer / refresh / login denial
|
|
87
|
+
- subscription, API key, setting, and product-data cleanup
|
|
88
|
+
|
|
89
|
+
### 4. Poll Durable State, Never Logs
|
|
90
|
+
|
|
91
|
+
Rules:
|
|
92
|
+
|
|
93
|
+
- Use bounded polling against DB rows or public APIs.
|
|
94
|
+
- Wait for terminal conditions only.
|
|
95
|
+
- Fail with an explicit timeout tied to the missing contract.
|
|
96
|
+
|
|
97
|
+
Forbidden:
|
|
98
|
+
|
|
99
|
+
- sleeping a fixed duration and hoping the worker finished
|
|
100
|
+
- asserting on log text as the primary contract
|
|
101
|
+
|
|
102
|
+
### 5. Pair E2E with Relay Whitelist Tests
|
|
103
|
+
|
|
104
|
+
If the E2E depends on cross-process events:
|
|
105
|
+
|
|
106
|
+
- add a unit test for `ProvideRelayConfig()`
|
|
107
|
+
- assert the exact event whitelist and reject dangerous wildcards
|
|
108
|
+
|
|
109
|
+
Reason:
|
|
110
|
+
|
|
111
|
+
- the unit test catches config drift such as `user.deleted` becoming `user.*`
|
|
112
|
+
- the E2E catches runtime drift such as listener duplication or missing cleanup
|
|
113
|
+
|
|
114
|
+
### 6. Design for Reuse
|
|
115
|
+
|
|
116
|
+
Reusable E2E helpers must:
|
|
117
|
+
|
|
118
|
+
- create unique fixture identifiers
|
|
119
|
+
- expose small helper steps, not one giant opaque setup
|
|
120
|
+
- use the same base clients and DB helpers as other suites
|
|
121
|
+
- avoid hardcoded business defaults that can drift from runtime config
|
|
122
|
+
|
|
123
|
+
## Canonical Structure
|
|
124
|
+
|
|
125
|
+
Recommended shape:
|
|
126
|
+
|
|
127
|
+
1. register fixture account through public auth API
|
|
128
|
+
2. wait for required projections
|
|
129
|
+
3. seed prerequisite business rows directly in DB
|
|
130
|
+
4. execute the public action under test
|
|
131
|
+
5. wait for durable terminal state
|
|
132
|
+
6. assert final access behavior
|
|
133
|
+
7. assert downstream cleanup
|
|
134
|
+
|
|
135
|
+
## Commands
|
|
136
|
+
|
|
137
|
+
Run the stack first:
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
make docker-dev
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Run one focused suite:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
go test -tags e2e -count=1 -v ./tests/e2e/accountclosure/...
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Run all E2E suites only when the environment is stable enough for the broader blast radius:
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
make test-e2e
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## Review Checklist
|
|
156
|
+
|
|
157
|
+
- Did the test enter through the real public interface?
|
|
158
|
+
- Did it seed only prerequisites, not the behavior under test?
|
|
159
|
+
- Did it assert DB state, access contract, and side effects?
|
|
160
|
+
- Did it avoid fixed sleeps and use bounded polling?
|
|
161
|
+
- Did it add or update the relay whitelist regression test in the same change?
|