@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,305 @@
|
|
|
1
|
+
package schedule
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"context"
|
|
5
|
+
"errors"
|
|
6
|
+
"time"
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
// RunTrigger 标识任务运行的触发来源。
|
|
10
|
+
type RunTrigger string
|
|
11
|
+
|
|
12
|
+
const (
|
|
13
|
+
// RunTriggerCron 表示由 worker cron 自动触发。
|
|
14
|
+
RunTriggerCron RunTrigger = "cron"
|
|
15
|
+
// RunTriggerManualRun 表示由后台调度中心手动触发。
|
|
16
|
+
RunTriggerManualRun RunTrigger = "manual_run"
|
|
17
|
+
// RunTriggerManualSweep 表示由后台手动执行生命周期 sweep 触发。
|
|
18
|
+
RunTriggerManualSweep RunTrigger = "manual_sweep"
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
// RunStatus 标识单次任务运行状态。
|
|
22
|
+
type RunStatus string
|
|
23
|
+
|
|
24
|
+
const (
|
|
25
|
+
// RunStatusRunning 表示任务正在运行。
|
|
26
|
+
RunStatusRunning RunStatus = "running"
|
|
27
|
+
// RunStatusSucceeded 表示任务运行成功。
|
|
28
|
+
RunStatusSucceeded RunStatus = "succeeded"
|
|
29
|
+
// RunStatusFailed 表示任务运行失败。
|
|
30
|
+
RunStatusFailed RunStatus = "failed"
|
|
31
|
+
// RunStatusSkipped 表示任务因调度策略未执行。
|
|
32
|
+
RunStatusSkipped RunStatus = "skipped"
|
|
33
|
+
// RunStatusCanceled 表示任务在控制面取消请求后停止。
|
|
34
|
+
RunStatusCanceled RunStatus = "canceled"
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
// RunEventType 标识运行事件时间线类型。
|
|
38
|
+
type RunEventType string
|
|
39
|
+
|
|
40
|
+
const (
|
|
41
|
+
// RunEventStarted 表示任务开始。
|
|
42
|
+
RunEventStarted RunEventType = "started"
|
|
43
|
+
// RunEventSucceeded 表示任务成功结束。
|
|
44
|
+
RunEventSucceeded RunEventType = "succeeded"
|
|
45
|
+
// RunEventFailed 表示任务失败结束。
|
|
46
|
+
RunEventFailed RunEventType = "failed"
|
|
47
|
+
// RunEventSkipped 表示任务被调度策略跳过。
|
|
48
|
+
RunEventSkipped RunEventType = "skipped"
|
|
49
|
+
// RunEventProgress 表示任务处理器上报的有界执行进度。
|
|
50
|
+
RunEventProgress RunEventType = "progress"
|
|
51
|
+
// RunEventPolicyEvaluated 表示本次触发已完成控制策略判定。
|
|
52
|
+
RunEventPolicyEvaluated RunEventType = "policy_evaluated"
|
|
53
|
+
// RunEventAttemptStarted 表示任务处理器单次尝试开始。
|
|
54
|
+
RunEventAttemptStarted RunEventType = "attempt_started"
|
|
55
|
+
// RunEventAttemptSucceeded 表示任务处理器单次尝试成功。
|
|
56
|
+
RunEventAttemptSucceeded RunEventType = "attempt_succeeded"
|
|
57
|
+
// RunEventAttemptFailed 表示任务处理器单次尝试失败。
|
|
58
|
+
RunEventAttemptFailed RunEventType = "attempt_failed"
|
|
59
|
+
// RunEventRetrying 表示任务失败后进入重试等待。
|
|
60
|
+
RunEventRetrying RunEventType = "retrying"
|
|
61
|
+
// RunEventRuntimeExceeded 表示任务耗时超过控制面阈值。
|
|
62
|
+
RunEventRuntimeExceeded RunEventType = "runtime_exceeded"
|
|
63
|
+
// RunEventCancelRequested 表示控制面请求取消本次执行。
|
|
64
|
+
RunEventCancelRequested RunEventType = "cancel_requested"
|
|
65
|
+
// RunEventCanceled 表示本次执行确认取消。
|
|
66
|
+
RunEventCanceled RunEventType = "canceled"
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
// ControlStatus 标识任务控制状态。
|
|
70
|
+
type ControlStatus string
|
|
71
|
+
|
|
72
|
+
const (
|
|
73
|
+
// ControlStatusActive 表示任务按计划运行。
|
|
74
|
+
ControlStatusActive ControlStatus = "active"
|
|
75
|
+
// ControlStatusPaused 表示任务被后台暂停。
|
|
76
|
+
ControlStatusPaused ControlStatus = "paused"
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
// ConcurrencyPolicy 标识同一任务实例并发策略。
|
|
80
|
+
type ConcurrencyPolicy string
|
|
81
|
+
|
|
82
|
+
const (
|
|
83
|
+
// ConcurrencyPolicyForbid 表示同一任务运行中时跳过新触发。
|
|
84
|
+
ConcurrencyPolicyForbid ConcurrencyPolicy = "forbid"
|
|
85
|
+
// ConcurrencyPolicyAllow 表示允许同一任务重叠执行。
|
|
86
|
+
ConcurrencyPolicyAllow ConcurrencyPolicy = "allow"
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
// DispatchStatus 标识后台手动调度命令状态。
|
|
90
|
+
type DispatchStatus string
|
|
91
|
+
|
|
92
|
+
const (
|
|
93
|
+
// DispatchStatusPending 表示命令等待 worker 认领。
|
|
94
|
+
DispatchStatusPending DispatchStatus = "pending"
|
|
95
|
+
// DispatchStatusClaimed 表示命令已被 worker 认领。
|
|
96
|
+
DispatchStatusClaimed DispatchStatus = "claimed"
|
|
97
|
+
// DispatchStatusSucceeded 表示命令执行成功。
|
|
98
|
+
DispatchStatusSucceeded DispatchStatus = "succeeded"
|
|
99
|
+
// DispatchStatusFailed 表示命令执行失败。
|
|
100
|
+
DispatchStatusFailed DispatchStatus = "failed"
|
|
101
|
+
// DispatchStatusSkipped 表示命令被策略跳过。
|
|
102
|
+
DispatchStatusSkipped DispatchStatus = "skipped"
|
|
103
|
+
// DispatchStatusCancelRequested 表示命令已收到取消请求。
|
|
104
|
+
DispatchStatusCancelRequested DispatchStatus = "cancel_requested"
|
|
105
|
+
// DispatchStatusCanceled 表示命令已确认取消。
|
|
106
|
+
DispatchStatusCanceled DispatchStatus = "canceled"
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
// ErrTaskAlreadyRunning 表示持久化层拒绝创建运行记录,因为同一任务仍有有效执行租约。
|
|
110
|
+
var ErrTaskAlreadyRunning = errors.New("scheduler task is already running")
|
|
111
|
+
|
|
112
|
+
// ErrTaskRuntimeExceeded 表示任务执行超过控制面配置的最大运行时间。
|
|
113
|
+
var ErrTaskRuntimeExceeded = errors.New("task runtime exceeded control threshold")
|
|
114
|
+
|
|
115
|
+
// TaskRunStart 是 recorder 持久化运行开始事件的输入契约。
|
|
116
|
+
type TaskRunStart struct {
|
|
117
|
+
TaskName string
|
|
118
|
+
TaskType TaskType
|
|
119
|
+
Pattern string
|
|
120
|
+
Trigger RunTrigger
|
|
121
|
+
DispatchID int64
|
|
122
|
+
CorrelationID string
|
|
123
|
+
OperatorUserID *int64
|
|
124
|
+
Reason string
|
|
125
|
+
Runtime string
|
|
126
|
+
StartedAt time.Time
|
|
127
|
+
Metadata map[string]any
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// TaskRunCompletion 是 recorder 持久化运行完成事件的输入契约。
|
|
131
|
+
type TaskRunCompletion struct {
|
|
132
|
+
RunID int64
|
|
133
|
+
TaskName string
|
|
134
|
+
TaskType TaskType
|
|
135
|
+
Pattern string
|
|
136
|
+
Trigger RunTrigger
|
|
137
|
+
DispatchID int64
|
|
138
|
+
CorrelationID string
|
|
139
|
+
OperatorUserID *int64
|
|
140
|
+
Reason string
|
|
141
|
+
Runtime string
|
|
142
|
+
StartedAt time.Time
|
|
143
|
+
FinishedAt time.Time
|
|
144
|
+
DurationMs int64
|
|
145
|
+
Status RunStatus
|
|
146
|
+
Error string
|
|
147
|
+
CancelRequestedAt *time.Time
|
|
148
|
+
Metadata map[string]any
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// TaskRunEventRecord 是 recorder 持久化运行事件的输入契约。
|
|
152
|
+
type TaskRunEventRecord struct {
|
|
153
|
+
RunID int64
|
|
154
|
+
EventType RunEventType
|
|
155
|
+
Level string
|
|
156
|
+
Stage string
|
|
157
|
+
Message string
|
|
158
|
+
Payload map[string]any
|
|
159
|
+
CreatedAt time.Time
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// RunRecorder 将调度器运行状态持久化到外部存储。
|
|
163
|
+
//
|
|
164
|
+
// 调度器只依赖该窄接口,避免 core/schedule 反向依赖具体业务模块或数据库实现。
|
|
165
|
+
type RunRecorder interface {
|
|
166
|
+
UpsertTask(ctx context.Context, task RegisteredTask) error
|
|
167
|
+
StartRun(ctx context.Context, start TaskRunStart) (int64, error)
|
|
168
|
+
RecordRunEvent(ctx context.Context, event TaskRunEventRecord) error
|
|
169
|
+
CompleteRun(ctx context.Context, completion TaskRunCompletion) error
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// RuntimeExceededRunExpirer 清理进程异常退出后遗留的超时运行记录。
|
|
173
|
+
type RuntimeExceededRunExpirer interface {
|
|
174
|
+
ExpireRuntimeExceededRuns(ctx context.Context, now time.Time) (int64, error)
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// TaskControlRegistration 是调度器向控制面登记任务定义的输入。
|
|
178
|
+
type TaskControlRegistration struct {
|
|
179
|
+
// TaskName 是代码层唯一任务名称。
|
|
180
|
+
TaskName string
|
|
181
|
+
// TaskType 是任务触发类型。
|
|
182
|
+
TaskType TaskType
|
|
183
|
+
// DisplayName 是首次登记时的后台展示名称。
|
|
184
|
+
DisplayName string
|
|
185
|
+
// Description 是首次登记时的任务职责说明。
|
|
186
|
+
Description string
|
|
187
|
+
// DefaultPattern 是代码发布的默认调度表达式。
|
|
188
|
+
DefaultPattern string
|
|
189
|
+
// Pattern 是本次注册请求使用的调度表达式。
|
|
190
|
+
Pattern string
|
|
191
|
+
// SourceRuntime 是注册任务的运行时名称。
|
|
192
|
+
SourceRuntime string
|
|
193
|
+
// ConcurrencyPolicy 是首次登记时的并发策略。
|
|
194
|
+
ConcurrencyPolicy ConcurrencyPolicy
|
|
195
|
+
// ManualRunEnabled 是首次登记时的手动执行开关。
|
|
196
|
+
ManualRunEnabled bool
|
|
197
|
+
// MaxRuntimeSeconds 是首次登记时的最大运行秒数。
|
|
198
|
+
MaxRuntimeSeconds int
|
|
199
|
+
// RetryMaxAttempts 是首次登记时的最大重试次数。
|
|
200
|
+
RetryMaxAttempts int
|
|
201
|
+
// RetryBackoffSeconds 是首次登记时的退避秒数。
|
|
202
|
+
RetryBackoffSeconds int
|
|
203
|
+
// RegisteredAt 是最近一次代码注册时间。
|
|
204
|
+
RegisteredAt time.Time
|
|
205
|
+
// NextRunAt 是当前运行时计算出的下次执行时间。
|
|
206
|
+
NextRunAt *time.Time
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// TaskRegistrationOptions 描述任务首次登记时写入控制面的默认策略。
|
|
210
|
+
type TaskRegistrationOptions struct {
|
|
211
|
+
// DisplayName 是调度中心展示名称。
|
|
212
|
+
DisplayName string
|
|
213
|
+
// Description 是调度任务职责说明。
|
|
214
|
+
Description string
|
|
215
|
+
// ConcurrencyPolicy 是同名任务的并发策略。
|
|
216
|
+
ConcurrencyPolicy ConcurrencyPolicy
|
|
217
|
+
// ManualRunEnabled 表示是否允许运营人员手动触发。
|
|
218
|
+
ManualRunEnabled bool
|
|
219
|
+
// MaxRuntimeSeconds 是单次执行的最大运行秒数。
|
|
220
|
+
MaxRuntimeSeconds int
|
|
221
|
+
// RetryMaxAttempts 是失败后的最大重试次数。
|
|
222
|
+
RetryMaxAttempts int
|
|
223
|
+
// RetryBackoffSeconds 是相邻重试之间的退避秒数。
|
|
224
|
+
RetryBackoffSeconds int
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// RunSkippedError 表示处理器有意跳过本次执行且不应重试。
|
|
228
|
+
type RunSkippedError struct {
|
|
229
|
+
// Reason 是写入运行时间线的规范化跳过原因。
|
|
230
|
+
Reason string
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Error 返回跳过原因。
|
|
234
|
+
func (e RunSkippedError) Error() string {
|
|
235
|
+
return e.Reason
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// TaskControl 是控制面返回给调度器的运行策略。
|
|
239
|
+
type TaskControl struct {
|
|
240
|
+
TaskName string
|
|
241
|
+
Pattern string
|
|
242
|
+
Timezone string
|
|
243
|
+
ControlStatus ControlStatus
|
|
244
|
+
ManualRunEnabled bool
|
|
245
|
+
ConcurrencyPolicy ConcurrencyPolicy
|
|
246
|
+
MaxRuntimeSeconds int
|
|
247
|
+
RetryMaxAttempts int
|
|
248
|
+
RetryBackoffSeconds int
|
|
249
|
+
DefinitionRevision int64
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// ControlStore 保存调度控制面状态。
|
|
253
|
+
type ControlStore interface {
|
|
254
|
+
RegisterTaskControl(ctx context.Context, registration TaskControlRegistration) (*TaskControl, error)
|
|
255
|
+
GetTaskControl(ctx context.Context, taskName string) (*TaskControl, error)
|
|
256
|
+
ListTaskControls(ctx context.Context) ([]TaskControl, error)
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// TaskDispatch 是后台调度中心写入、worker 认领执行的命令。
|
|
260
|
+
type TaskDispatch struct {
|
|
261
|
+
ID int64
|
|
262
|
+
TaskName string
|
|
263
|
+
DispatchType string
|
|
264
|
+
ClaimToken string
|
|
265
|
+
CorrelationID string
|
|
266
|
+
OperatorUserID *int64
|
|
267
|
+
Reason string
|
|
268
|
+
Payload map[string]any
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// DispatchLeaseState 是 worker 心跳续约后的控制面状态。
|
|
272
|
+
type DispatchLeaseState struct {
|
|
273
|
+
CancelRequested bool
|
|
274
|
+
CancelRequestedAt *time.Time
|
|
275
|
+
CancelReason string
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// TaskRunOptions 描述一次非 cron 执行的触发上下文。
|
|
279
|
+
type TaskRunOptions struct {
|
|
280
|
+
Trigger RunTrigger
|
|
281
|
+
DispatchID int64
|
|
282
|
+
CorrelationID string
|
|
283
|
+
OperatorUserID *int64
|
|
284
|
+
Reason string
|
|
285
|
+
Runtime string
|
|
286
|
+
Metadata map[string]any
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// TaskRunResult 是调度器执行后的控制面回执。
|
|
290
|
+
type TaskRunResult struct {
|
|
291
|
+
RunID int64
|
|
292
|
+
Status RunStatus
|
|
293
|
+
Error string
|
|
294
|
+
Skipped bool
|
|
295
|
+
SkipReason string
|
|
296
|
+
Canceled bool
|
|
297
|
+
CancelRequestedAt *time.Time
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// DispatchStore 保存后台手动调度命令。
|
|
301
|
+
type DispatchStore interface {
|
|
302
|
+
ClaimPendingDispatches(ctx context.Context, runtime string, limit int, now time.Time) ([]TaskDispatch, error)
|
|
303
|
+
HeartbeatDispatch(ctx context.Context, dispatchID int64, runID int64, runtime string, claimToken string, heartbeatAt time.Time) (*DispatchLeaseState, error)
|
|
304
|
+
CompleteDispatch(ctx context.Context, dispatchID int64, runID int64, claimToken string, result TaskRunResult, finishedAt time.Time) error
|
|
305
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
package schedule
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"context"
|
|
5
|
+
"encoding/json"
|
|
6
|
+
"fmt"
|
|
7
|
+
"strings"
|
|
8
|
+
"time"
|
|
9
|
+
"unicode/utf8"
|
|
10
|
+
|
|
11
|
+
"go.uber.org/zap"
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
const (
|
|
15
|
+
runEventStageMaxRunes = 80
|
|
16
|
+
runEventMessageMaxRunes = 500
|
|
17
|
+
runEventPayloadMaxKeys = 64
|
|
18
|
+
runEventPayloadMaxBytes = 16 * 1024
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
type runEventReporterContextKey struct{}
|
|
22
|
+
|
|
23
|
+
// TaskRunEvent 是任务处理器可写入当前运行时间线的事件。
|
|
24
|
+
type TaskRunEvent struct {
|
|
25
|
+
// EventType 是事件类型;处理器只能上报 progress。
|
|
26
|
+
EventType RunEventType
|
|
27
|
+
// Level 是 info、warning 或 error,空值按 info 处理。
|
|
28
|
+
Level string
|
|
29
|
+
// Stage 是当前运行阶段。
|
|
30
|
+
Stage string
|
|
31
|
+
// Message 是不含敏感信息的事件摘要。
|
|
32
|
+
Message string
|
|
33
|
+
// Payload 是有界的结构化进度数据。
|
|
34
|
+
Payload map[string]any
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// RunEventReporter 将处理器事件绑定到调度器创建的当前运行记录。
|
|
38
|
+
type RunEventReporter interface {
|
|
39
|
+
// ReportRunEvent 写入一条经过校验的运行事件。
|
|
40
|
+
ReportRunEvent(ctx context.Context, event TaskRunEvent) error
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
type recorderRunEventReporter struct {
|
|
44
|
+
runID int64
|
|
45
|
+
recorder RunRecorder
|
|
46
|
+
logger *zap.Logger
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// ReportRunEvent 向当前调度运行上报有界事件;未配置 recorder 时安全地忽略写入。
|
|
50
|
+
func ReportRunEvent(ctx context.Context, event TaskRunEvent) error {
|
|
51
|
+
normalized, err := normalizeTaskRunEvent(event)
|
|
52
|
+
if err != nil {
|
|
53
|
+
return err
|
|
54
|
+
}
|
|
55
|
+
reporter, _ := ctx.Value(runEventReporterContextKey{}).(RunEventReporter)
|
|
56
|
+
if reporter == nil {
|
|
57
|
+
return nil
|
|
58
|
+
}
|
|
59
|
+
return reporter.ReportRunEvent(ctx, normalized)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
func withRunEventReporter(ctx context.Context, runID int64, recorder RunRecorder, logger *zap.Logger) context.Context {
|
|
63
|
+
if runID <= 0 || recorder == nil {
|
|
64
|
+
return ctx
|
|
65
|
+
}
|
|
66
|
+
return context.WithValue(ctx, runEventReporterContextKey{}, &recorderRunEventReporter{
|
|
67
|
+
runID: runID,
|
|
68
|
+
recorder: recorder,
|
|
69
|
+
logger: logger,
|
|
70
|
+
})
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
func (r *recorderRunEventReporter) ReportRunEvent(ctx context.Context, event TaskRunEvent) error {
|
|
74
|
+
if err := r.recorder.RecordRunEvent(ctx, TaskRunEventRecord{
|
|
75
|
+
RunID: r.runID,
|
|
76
|
+
EventType: event.EventType,
|
|
77
|
+
Level: event.Level,
|
|
78
|
+
Stage: event.Stage,
|
|
79
|
+
Message: event.Message,
|
|
80
|
+
Payload: event.Payload,
|
|
81
|
+
CreatedAt: time.Now().UTC(),
|
|
82
|
+
}); err != nil {
|
|
83
|
+
r.logger.Error("record scheduler task progress failed",
|
|
84
|
+
zap.Int64("runID", r.runID),
|
|
85
|
+
zap.String("stage", event.Stage),
|
|
86
|
+
zap.Error(err),
|
|
87
|
+
)
|
|
88
|
+
}
|
|
89
|
+
return nil
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
func normalizeTaskRunEvent(event TaskRunEvent) (TaskRunEvent, error) {
|
|
93
|
+
if event.EventType != RunEventProgress {
|
|
94
|
+
return TaskRunEvent{}, fmt.Errorf("task run event type must be %q", RunEventProgress)
|
|
95
|
+
}
|
|
96
|
+
event.Level = strings.TrimSpace(event.Level)
|
|
97
|
+
if event.Level == "" {
|
|
98
|
+
event.Level = "info"
|
|
99
|
+
}
|
|
100
|
+
switch event.Level {
|
|
101
|
+
case "info", "warning", "error":
|
|
102
|
+
default:
|
|
103
|
+
return TaskRunEvent{}, fmt.Errorf("task run event level %q is invalid", event.Level)
|
|
104
|
+
}
|
|
105
|
+
event.Stage = strings.TrimSpace(event.Stage)
|
|
106
|
+
if event.Stage == "" || utf8.RuneCountInString(event.Stage) > runEventStageMaxRunes {
|
|
107
|
+
return TaskRunEvent{}, fmt.Errorf("task run event stage must contain 1-%d characters", runEventStageMaxRunes)
|
|
108
|
+
}
|
|
109
|
+
event.Message = strings.TrimSpace(event.Message)
|
|
110
|
+
if event.Message == "" || utf8.RuneCountInString(event.Message) > runEventMessageMaxRunes {
|
|
111
|
+
return TaskRunEvent{}, fmt.Errorf("task run event message must contain 1-%d characters", runEventMessageMaxRunes)
|
|
112
|
+
}
|
|
113
|
+
if len(event.Payload) > runEventPayloadMaxKeys {
|
|
114
|
+
return TaskRunEvent{}, fmt.Errorf("task run event payload exceeds %d top-level keys", runEventPayloadMaxKeys)
|
|
115
|
+
}
|
|
116
|
+
payload, err := json.Marshal(event.Payload)
|
|
117
|
+
if err != nil {
|
|
118
|
+
return TaskRunEvent{}, fmt.Errorf("marshal task run event payload: %w", err)
|
|
119
|
+
}
|
|
120
|
+
if len(payload) > runEventPayloadMaxBytes {
|
|
121
|
+
return TaskRunEvent{}, fmt.Errorf("task run event payload exceeds %d bytes", runEventPayloadMaxBytes)
|
|
122
|
+
}
|
|
123
|
+
return event, nil
|
|
124
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
package schedule
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"context"
|
|
5
|
+
"errors"
|
|
6
|
+
"strings"
|
|
7
|
+
"testing"
|
|
8
|
+
|
|
9
|
+
"go.uber.org/zap"
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
type failingRunEventRecorder struct {
|
|
13
|
+
fakeRunRecorder
|
|
14
|
+
err error
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
func (r *failingRunEventRecorder) RecordRunEvent(context.Context, TaskRunEventRecord) error {
|
|
18
|
+
return r.err
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
func TestReportRunEventBindsCurrentRun(t *testing.T) {
|
|
22
|
+
recorder := &fakeRunRecorder{}
|
|
23
|
+
ctx := withRunEventReporter(context.Background(), 42, recorder, zap.NewNop())
|
|
24
|
+
|
|
25
|
+
if err := ReportRunEvent(ctx, TaskRunEvent{
|
|
26
|
+
EventType: RunEventProgress,
|
|
27
|
+
Stage: "scan",
|
|
28
|
+
Message: "Scan completed",
|
|
29
|
+
Payload: map[string]any{"scanned": 7},
|
|
30
|
+
}); err != nil {
|
|
31
|
+
t.Fatalf("ReportRunEvent() error = %v", err)
|
|
32
|
+
}
|
|
33
|
+
if len(recorder.events) != 1 || recorder.events[0].RunID != 42 {
|
|
34
|
+
t.Fatalf("recorded events = %#v, want current run ID 42", recorder.events)
|
|
35
|
+
}
|
|
36
|
+
if recorder.events[0].Level != "info" || recorder.events[0].EventType != RunEventProgress {
|
|
37
|
+
t.Fatalf("recorded event = %#v, want normalized progress event", recorder.events[0])
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
func TestReportRunEventValidatesBoundariesWithoutRecorder(t *testing.T) {
|
|
42
|
+
if err := ReportRunEvent(context.Background(), TaskRunEvent{
|
|
43
|
+
EventType: RunEventSucceeded,
|
|
44
|
+
Stage: "scan",
|
|
45
|
+
Message: "invalid terminal event",
|
|
46
|
+
}); err == nil {
|
|
47
|
+
t.Fatal("ReportRunEvent() accepted a handler-owned terminal event")
|
|
48
|
+
}
|
|
49
|
+
if err := ReportRunEvent(context.Background(), TaskRunEvent{
|
|
50
|
+
EventType: RunEventProgress,
|
|
51
|
+
Stage: strings.Repeat("x", runEventStageMaxRunes+1),
|
|
52
|
+
Message: "invalid stage",
|
|
53
|
+
}); err == nil {
|
|
54
|
+
t.Fatal("ReportRunEvent() accepted an oversized stage")
|
|
55
|
+
}
|
|
56
|
+
if err := ReportRunEvent(context.Background(), TaskRunEvent{
|
|
57
|
+
EventType: RunEventProgress,
|
|
58
|
+
Stage: "scan",
|
|
59
|
+
Message: "invalid payload",
|
|
60
|
+
Payload: map[string]any{"unsupported": make(chan struct{})},
|
|
61
|
+
}); err == nil {
|
|
62
|
+
t.Fatal("ReportRunEvent() accepted a non-JSON payload")
|
|
63
|
+
}
|
|
64
|
+
if err := ReportRunEvent(context.Background(), TaskRunEvent{
|
|
65
|
+
EventType: RunEventProgress,
|
|
66
|
+
Stage: "scan",
|
|
67
|
+
Message: "valid without recorder",
|
|
68
|
+
}); err != nil {
|
|
69
|
+
t.Fatalf("ReportRunEvent() without recorder error = %v", err)
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
func TestReportRunEventRecorderFailureIsNonFatal(t *testing.T) {
|
|
74
|
+
recorder := &failingRunEventRecorder{err: errors.New("persistence unavailable")}
|
|
75
|
+
ctx := withRunEventReporter(context.Background(), 9, recorder, zap.NewNop())
|
|
76
|
+
|
|
77
|
+
if err := ReportRunEvent(ctx, TaskRunEvent{
|
|
78
|
+
EventType: RunEventProgress,
|
|
79
|
+
Stage: "recovery",
|
|
80
|
+
Message: "Recovery completed",
|
|
81
|
+
Payload: map[string]any{"completed": 1},
|
|
82
|
+
}); err != nil {
|
|
83
|
+
t.Fatalf("ReportRunEvent() exposed recorder failure = %v", err)
|
|
84
|
+
}
|
|
85
|
+
}
|