spine-framework 0.1.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/.framework/README.md +129 -0
- package/.framework/cli/bin.cjs +14 -0
- package/.framework/cli/commands/agents.ts +153 -0
- package/.framework/cli/commands/auth.ts +94 -0
- package/.framework/cli/commands/create-app.ts +185 -0
- package/.framework/cli/commands/dev.ts +295 -0
- package/.framework/cli/commands/doctor.ts +442 -0
- package/.framework/cli/commands/generate.ts +332 -0
- package/.framework/cli/commands/init.ts +272 -0
- package/.framework/cli/commands/install-app.ts +391 -0
- package/.framework/cli/commands/items.ts +253 -0
- package/.framework/cli/commands/migrations.ts +141 -0
- package/.framework/cli/commands/pipelines.ts +166 -0
- package/.framework/cli/commands/status.ts +197 -0
- package/.framework/cli/commands/system.ts +184 -0
- package/.framework/cli/commands/test.ts +227 -0
- package/.framework/cli/commands/uninstall-app.ts +166 -0
- package/.framework/cli/context.ts +268 -0
- package/.framework/cli/env-loader.ts +36 -0
- package/.framework/cli/index.ts +106 -0
- package/.framework/cli/welcome.cjs +45 -0
- package/.framework/docs/API.md +384 -0
- package/.framework/docs/STABILITY.md +52 -0
- package/.framework/docs/admin-routes.md +76 -0
- package/.framework/docs/api-docs-progress.md +38 -0
- package/.framework/docs/api-governance.md +146 -0
- package/.framework/docs/api-testing-results.md +212 -0
- package/.framework/docs/apis/admin-configs.md +567 -0
- package/.framework/docs/apis/admin-data.md +272 -0
- package/.framework/docs/apis/index.md +231 -0
- package/.framework/docs/apis/internal.md +295 -0
- package/.framework/docs/apis/runtime.md +537 -0
- package/.framework/docs/assembly-launch-guide.md +138 -0
- package/.framework/docs/audit-results.md +590 -0
- package/.framework/docs/authorization-model.md +170 -0
- package/.framework/docs/db-api-inventory.md +95 -0
- package/.framework/docs/examples/custom-app/README.md +77 -0
- package/.framework/docs/examples/custom-function/README.md +27 -0
- package/.framework/docs/examples/custom-function/handler.ts +48 -0
- package/.framework/docs/examples/custom-webhook/README.md +68 -0
- package/.framework/docs/gap-remediation-backlog.md +103 -0
- package/.framework/docs/guides/cli-guide.md +224 -0
- package/.framework/docs/guides/getting-started.md +103 -0
- package/.framework/docs/guides/import-guide.md +193 -0
- package/.framework/docs/guides/testing-guide.md +229 -0
- package/.framework/docs/permission-examples.md +326 -0
- package/.framework/docs/ui-adoption-verification.md +111 -0
- package/.framework/docs/ui-api-coverage.md +84 -0
- package/.framework/docs/v2-compatibility-audit.md +228 -0
- package/.framework/functions/.gitkeep +1 -0
- package/.framework/functions/_shared/agent-runner.ts +1097 -0
- package/.framework/functions/_shared/app-manifest.ts +184 -0
- package/.framework/functions/_shared/audit.ts +150 -0
- package/.framework/functions/_shared/db.ts +174 -0
- package/.framework/functions/_shared/index.ts +382 -0
- package/.framework/functions/_shared/middleware.ts +490 -0
- package/.framework/functions/_shared/permissions.ts +1325 -0
- package/.framework/functions/_shared/pipeline-runner.ts +731 -0
- package/.framework/functions/_shared/principal.ts +760 -0
- package/.framework/functions/_shared/schema-utils.ts +967 -0
- package/.framework/functions/_shared/testing.ts +258 -0
- package/.framework/functions/_shared/trigger-engine.ts +425 -0
- package/.framework/functions/_shared/webhook-registration.ts +168 -0
- package/.framework/functions/_shared/webhook-registry.ts +129 -0
- package/.framework/functions/account-nodes.ts +111 -0
- package/.framework/functions/admin-data.ts +606 -0
- package/.framework/functions/ai-agents.ts +323 -0
- package/.framework/functions/api-keys.ts +376 -0
- package/.framework/functions/apps.ts +483 -0
- package/.framework/functions/auth.ts +196 -0
- package/.framework/functions/debug-auth.ts +107 -0
- package/.framework/functions/embeddings.ts +556 -0
- package/.framework/functions/integration-routes.ts +523 -0
- package/.framework/functions/integrations.ts +319 -0
- package/.framework/functions/item-progress.ts +272 -0
- package/.framework/functions/logs.ts +438 -0
- package/.framework/functions/observability.ts +275 -0
- package/.framework/functions/pipeline-executions.ts +494 -0
- package/.framework/functions/pipelines.ts +485 -0
- package/.framework/functions/prompt-configs.ts +339 -0
- package/.framework/functions/roles.ts +387 -0
- package/.framework/functions/system-cron.ts +742 -0
- package/.framework/functions/system.ts +323 -0
- package/.framework/functions/tests.ts +119 -0
- package/.framework/functions/timers.ts +357 -0
- package/.framework/functions/triggers.ts +563 -0
- package/.framework/functions/types.ts +604 -0
- package/.framework/migrations/000_foundation.sql +1256 -0
- package/.framework/migrations/001_seed.sql +92 -0
- package/.framework/migrations/002_seed_constraints.sql +13 -0
- package/.framework/migrations/003_auth_user_trigger.sql +59 -0
- package/.framework/src/App.tsx +126 -0
- package/.framework/src/apps/admin/index.tsx +173 -0
- package/.framework/src/components/AppWrapper.tsx +56 -0
- package/.framework/src/components/CustomAppLoader.tsx +116 -0
- package/.framework/src/components/admin/AdminListPage.tsx +151 -0
- package/.framework/src/components/admin/AdminSidebar.tsx +166 -0
- package/.framework/src/components/admin/AdminStatsCard.tsx +62 -0
- package/.framework/src/components/admin/SortableTableHeader.tsx +42 -0
- package/.framework/src/components/app-shell/GenericAppShell.tsx +181 -0
- package/.framework/src/components/app-shell/GenericDetailPage.tsx +200 -0
- package/.framework/src/components/app-shell/GenericListPage.tsx +116 -0
- package/.framework/src/components/app-sidebar.tsx +228 -0
- package/.framework/src/components/auth/ProtectedRoute.tsx +88 -0
- package/.framework/src/components/layout/AppShell.tsx +91 -0
- package/.framework/src/components/layout/Header.tsx +88 -0
- package/.framework/src/components/layout/Layout.tsx +95 -0
- package/.framework/src/components/layout/Sidebar.tsx +329 -0
- package/.framework/src/components/runtime/DataDetailHeader.tsx +77 -0
- package/.framework/src/components/runtime/DataDetailPage.tsx +171 -0
- package/.framework/src/components/runtime/DataFilters.tsx +91 -0
- package/.framework/src/components/runtime/DataHeader.tsx +68 -0
- package/.framework/src/components/runtime/DataListPage.tsx +124 -0
- package/.framework/src/components/runtime/DataStats.tsx +70 -0
- package/.framework/src/components/runtime/DataTable.tsx +174 -0
- package/.framework/src/components/runtime/SchemaDetailForm.tsx +134 -0
- package/.framework/src/components/runtime/index.ts +18 -0
- package/.framework/src/components/search-form.tsx +29 -0
- package/.framework/src/components/shared/AgentView.tsx +213 -0
- package/.framework/src/components/shared/FieldRenderer.tsx +478 -0
- package/.framework/src/components/shared/SchemaFields.tsx +226 -0
- package/.framework/src/components/ui/DataTable.tsx +343 -0
- package/.framework/src/components/ui/Form.tsx +281 -0
- package/.framework/src/components/ui/ItemCard.tsx +296 -0
- package/.framework/src/components/ui/ItemListView.tsx +308 -0
- package/.framework/src/components/ui/LoadingSpinner.tsx +52 -0
- package/.framework/src/components/ui/Modal.tsx +61 -0
- package/.framework/src/components/ui/RichTextEditor.tsx +210 -0
- package/.framework/src/components/ui/accordion.tsx +82 -0
- package/.framework/src/components/ui/alert-dialog.tsx +197 -0
- package/.framework/src/components/ui/alert.tsx +76 -0
- package/.framework/src/components/ui/aspect-ratio.tsx +11 -0
- package/.framework/src/components/ui/avatar.tsx +110 -0
- package/.framework/src/components/ui/badge.tsx +49 -0
- package/.framework/src/components/ui/breadcrumb.tsx +122 -0
- package/.framework/src/components/ui/button-group.tsx +83 -0
- package/.framework/src/components/ui/button.tsx +65 -0
- package/.framework/src/components/ui/calendar.tsx +222 -0
- package/.framework/src/components/ui/card.tsx +100 -0
- package/.framework/src/components/ui/carousel.tsx +240 -0
- package/.framework/src/components/ui/chart.tsx +373 -0
- package/.framework/src/components/ui/checkbox.tsx +31 -0
- package/.framework/src/components/ui/collapsible.tsx +33 -0
- package/.framework/src/components/ui/combobox.tsx +299 -0
- package/.framework/src/components/ui/command.tsx +193 -0
- package/.framework/src/components/ui/context-menu.tsx +261 -0
- package/.framework/src/components/ui/dialog.tsx +165 -0
- package/.framework/src/components/ui/direction.tsx +22 -0
- package/.framework/src/components/ui/drawer.tsx +132 -0
- package/.framework/src/components/ui/dropdown-menu.tsx +269 -0
- package/.framework/src/components/ui/empty.tsx +104 -0
- package/.framework/src/components/ui/field.tsx +238 -0
- package/.framework/src/components/ui/hover-card.tsx +42 -0
- package/.framework/src/components/ui/input-group.tsx +153 -0
- package/.framework/src/components/ui/input-otp.tsx +87 -0
- package/.framework/src/components/ui/input.tsx +19 -0
- package/.framework/src/components/ui/item.tsx +196 -0
- package/.framework/src/components/ui/kbd.tsx +26 -0
- package/.framework/src/components/ui/label.tsx +22 -0
- package/.framework/src/components/ui/menubar.tsx +277 -0
- package/.framework/src/components/ui/native-select.tsx +61 -0
- package/.framework/src/components/ui/navigation-menu.tsx +164 -0
- package/.framework/src/components/ui/pagination.tsx +129 -0
- package/.framework/src/components/ui/popover.tsx +87 -0
- package/.framework/src/components/ui/progress.tsx +31 -0
- package/.framework/src/components/ui/radio-group.tsx +42 -0
- package/.framework/src/components/ui/resizable.tsx +50 -0
- package/.framework/src/components/ui/scroll-area.tsx +53 -0
- package/.framework/src/components/ui/select.tsx +195 -0
- package/.framework/src/components/ui/separator.tsx +26 -0
- package/.framework/src/components/ui/sheet.tsx +145 -0
- package/.framework/src/components/ui/sidebar.tsx +706 -0
- package/.framework/src/components/ui/skeleton.tsx +13 -0
- package/.framework/src/components/ui/slider.tsx +59 -0
- package/.framework/src/components/ui/sonner.tsx +47 -0
- package/.framework/src/components/ui/spinner.tsx +10 -0
- package/.framework/src/components/ui/switch.tsx +33 -0
- package/.framework/src/components/ui/table-primitives.tsx +141 -0
- package/.framework/src/components/ui/table.tsx +114 -0
- package/.framework/src/components/ui/tabs.tsx +90 -0
- package/.framework/src/components/ui/textarea.tsx +18 -0
- package/.framework/src/components/ui/toggle-group.tsx +89 -0
- package/.framework/src/components/ui/toggle.tsx +45 -0
- package/.framework/src/components/ui/tooltip.tsx +57 -0
- package/.framework/src/contexts/AppContext.tsx +133 -0
- package/.framework/src/contexts/AuthContext.tsx +371 -0
- package/.framework/src/hooks/use-mobile.ts +19 -0
- package/.framework/src/hooks/useApi.ts +526 -0
- package/.framework/src/hooks/useApps.ts +114 -0
- package/.framework/src/hooks/useEntityList.ts +190 -0
- package/.framework/src/hooks/useEntityRecord.ts +308 -0
- package/.framework/src/hooks/useForm.ts +307 -0
- package/.framework/src/hooks/useListSchema.ts +264 -0
- package/.framework/src/hooks/useSchemaRecord.ts +223 -0
- package/.framework/src/index.css +128 -0
- package/.framework/src/lib/api.ts +156 -0
- package/.framework/src/lib/supabase.ts +94 -0
- package/.framework/src/lib/utils.ts +317 -0
- package/.framework/src/main.tsx +27 -0
- package/.framework/src/pages/DashboardPage.tsx +181 -0
- package/.framework/src/pages/NotFoundPage.tsx +39 -0
- package/.framework/src/pages/admin/AIAgentDetailPage.tsx +161 -0
- package/.framework/src/pages/admin/AIAgentsPage.tsx +318 -0
- package/.framework/src/pages/admin/APIKeyDetailPage.tsx +199 -0
- package/.framework/src/pages/admin/APIKeysPage.tsx +303 -0
- package/.framework/src/pages/admin/AlertsConfigPage.tsx +523 -0
- package/.framework/src/pages/admin/AppDetailPage.tsx +493 -0
- package/.framework/src/pages/admin/AppsPage.tsx +355 -0
- package/.framework/src/pages/admin/DesignedPage.tsx +491 -0
- package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +534 -0
- package/.framework/src/pages/admin/EmbeddingsPage.tsx +424 -0
- package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +176 -0
- package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +109 -0
- package/.framework/src/pages/admin/IntegratedDashboard.tsx +402 -0
- package/.framework/src/pages/admin/IntegrationDetailPage.tsx +187 -0
- package/.framework/src/pages/admin/IntegrationsPage.tsx +301 -0
- package/.framework/src/pages/admin/LogsPage.tsx +283 -0
- package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +85 -0
- package/.framework/src/pages/admin/ObservabilityDashboard.tsx +470 -0
- package/.framework/src/pages/admin/PipelineDetailPage.tsx +183 -0
- package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +279 -0
- package/.framework/src/pages/admin/PipelinesPage.tsx +390 -0
- package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +299 -0
- package/.framework/src/pages/admin/PromptConfigsPage.tsx +292 -0
- package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +434 -0
- package/.framework/src/pages/admin/RoleDetailPage.tsx +273 -0
- package/.framework/src/pages/admin/RolesPage.tsx +292 -0
- package/.framework/src/pages/admin/SelectTestPage.tsx +61 -0
- package/.framework/src/pages/admin/ShadcnTestPage.tsx +588 -0
- package/.framework/src/pages/admin/SimpleDashboard.tsx +387 -0
- package/.framework/src/pages/admin/TestRunDetailPage.tsx +172 -0
- package/.framework/src/pages/admin/TestingDashboard.tsx +257 -0
- package/.framework/src/pages/admin/TimerDetailPage.tsx +151 -0
- package/.framework/src/pages/admin/TimersPage.tsx +376 -0
- package/.framework/src/pages/admin/TriggerDetailPage.tsx +149 -0
- package/.framework/src/pages/admin/TriggersPage.tsx +381 -0
- package/.framework/src/pages/admin/TypeDetailPage.tsx +694 -0
- package/.framework/src/pages/admin/TypesPage.tsx +295 -0
- package/.framework/src/pages/auth/LoginPage.tsx +188 -0
- package/.framework/src/pages/auth/RegisterPage.tsx +163 -0
- package/.framework/src/pages/spine-framework/APIPage.tsx +17 -0
- package/.framework/src/pages/spine-framework/CLIPage.tsx +25 -0
- package/.framework/src/types/auth.ts +125 -0
- package/.framework/src/types/types.ts +407 -0
- package/STRUCTURE.md +150 -0
- package/config/components.json +25 -0
- package/config/deno.lock +108 -0
- package/config/package-lock.json +17183 -0
- package/config/postcss.config.cjs +10 -0
- package/config/tailwind.config.cjs +78 -0
- package/config/tsconfig.build.json +32 -0
- package/config/tsconfig.cli.json +18 -0
- package/config/tsconfig.json +41 -0
- package/config/tsconfig.node.json +17 -0
- package/config/tsconfig.node.tsbuildinfo +1 -0
- package/config/tsconfig.tsbuildinfo +1 -0
- package/config/typedoc.json +16 -0
- package/config/vite.config.d.ts +2 -0
- package/config/vite.config.ts +72 -0
- package/dist/cli/commands/agents.d.ts +39 -0
- package/dist/cli/commands/agents.d.ts.map +1 -0
- package/dist/cli/commands/auth.d.ts +36 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/create-app.d.ts +23 -0
- package/dist/cli/commands/create-app.d.ts.map +1 -0
- package/dist/cli/commands/dev.d.ts +39 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/doctor.d.ts +42 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/generate.d.ts +36 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/init.d.ts +30 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/install-app.d.ts +30 -0
- package/dist/cli/commands/install-app.d.ts.map +1 -0
- package/dist/cli/commands/items.d.ts +45 -0
- package/dist/cli/commands/items.d.ts.map +1 -0
- package/dist/cli/commands/migrations.d.ts +41 -0
- package/dist/cli/commands/migrations.d.ts.map +1 -0
- package/dist/cli/commands/pipelines.d.ts +40 -0
- package/dist/cli/commands/pipelines.d.ts.map +1 -0
- package/dist/cli/commands/status.d.ts +23 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/system.d.ts +29 -0
- package/dist/cli/commands/system.d.ts.map +1 -0
- package/dist/cli/commands/test.d.ts +46 -0
- package/dist/cli/commands/test.d.ts.map +1 -0
- package/dist/cli/commands/uninstall-app.d.ts +23 -0
- package/dist/cli/commands/uninstall-app.d.ts.map +1 -0
- package/dist/cli/context.d.ts +88 -0
- package/dist/cli/context.d.ts.map +1 -0
- package/dist/cli/env-loader.d.ts +14 -0
- package/dist/cli/env-loader.d.ts.map +1 -0
- package/dist/cli/index.d.ts +41 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/functions/_shared/agent-runner.d.ts +156 -0
- package/dist/functions/_shared/agent-runner.d.ts.map +1 -0
- package/dist/functions/_shared/app-manifest.d.ts +68 -0
- package/dist/functions/_shared/app-manifest.d.ts.map +1 -0
- package/dist/functions/_shared/audit.d.ts +91 -0
- package/dist/functions/_shared/audit.d.ts.map +1 -0
- package/dist/functions/_shared/db.d.ts +125 -0
- package/dist/functions/_shared/db.d.ts.map +1 -0
- package/dist/functions/_shared/index.d.ts +298 -0
- package/dist/functions/_shared/index.d.ts.map +1 -0
- package/dist/functions/_shared/middleware.d.ts +315 -0
- package/dist/functions/_shared/middleware.d.ts.map +1 -0
- package/dist/functions/_shared/permissions.d.ts +626 -0
- package/dist/functions/_shared/permissions.d.ts.map +1 -0
- package/dist/functions/_shared/pipeline-runner.d.ts +124 -0
- package/dist/functions/_shared/pipeline-runner.d.ts.map +1 -0
- package/dist/functions/_shared/principal.d.ts +284 -0
- package/dist/functions/_shared/principal.d.ts.map +1 -0
- package/dist/functions/_shared/schema-utils.d.ts +181 -0
- package/dist/functions/_shared/schema-utils.d.ts.map +1 -0
- package/dist/functions/_shared/testing.d.ts +172 -0
- package/dist/functions/_shared/testing.d.ts.map +1 -0
- package/dist/functions/_shared/trigger-engine.d.ts +140 -0
- package/dist/functions/_shared/trigger-engine.d.ts.map +1 -0
- package/dist/functions/_shared/webhook-registration.d.ts +81 -0
- package/dist/functions/_shared/webhook-registration.d.ts.map +1 -0
- package/dist/functions/_shared/webhook-registry.d.ts +57 -0
- package/dist/functions/_shared/webhook-registry.d.ts.map +1 -0
- package/dist/functions/account-nodes.d.ts +48 -0
- package/dist/functions/account-nodes.d.ts.map +1 -0
- package/dist/functions/admin-data.d.ts +178 -0
- package/dist/functions/admin-data.d.ts.map +1 -0
- package/dist/functions/ai-agents.d.ts +125 -0
- package/dist/functions/ai-agents.d.ts.map +1 -0
- package/dist/functions/api-keys.d.ts +140 -0
- package/dist/functions/api-keys.d.ts.map +1 -0
- package/dist/functions/apps.d.ts +163 -0
- package/dist/functions/apps.d.ts.map +1 -0
- package/dist/functions/auth.d.ts +74 -0
- package/dist/functions/auth.d.ts.map +1 -0
- package/dist/functions/debug-auth.d.ts +33 -0
- package/dist/functions/debug-auth.d.ts.map +1 -0
- package/dist/functions/embeddings.d.ts +205 -0
- package/dist/functions/embeddings.d.ts.map +1 -0
- package/dist/functions/integration-routes.d.ts +45 -0
- package/dist/functions/integration-routes.d.ts.map +1 -0
- package/dist/functions/integrations.d.ts +124 -0
- package/dist/functions/integrations.d.ts.map +1 -0
- package/dist/functions/item-progress.d.ts +41 -0
- package/dist/functions/item-progress.d.ts.map +1 -0
- package/dist/functions/logs.d.ts +162 -0
- package/dist/functions/logs.d.ts.map +1 -0
- package/dist/functions/observability.d.ts +123 -0
- package/dist/functions/observability.d.ts.map +1 -0
- package/dist/functions/pipeline-executions.d.ts +190 -0
- package/dist/functions/pipeline-executions.d.ts.map +1 -0
- package/dist/functions/pipelines.d.ts +171 -0
- package/dist/functions/pipelines.d.ts.map +1 -0
- package/dist/functions/prompt-configs.d.ts +125 -0
- package/dist/functions/prompt-configs.d.ts.map +1 -0
- package/dist/functions/roles.d.ts +118 -0
- package/dist/functions/roles.d.ts.map +1 -0
- package/dist/functions/system-cron.d.ts +65 -0
- package/dist/functions/system-cron.d.ts.map +1 -0
- package/dist/functions/system.d.ts +29 -0
- package/dist/functions/system.d.ts.map +1 -0
- package/dist/functions/tests.d.ts +28 -0
- package/dist/functions/tests.d.ts.map +1 -0
- package/dist/functions/timers.d.ts +139 -0
- package/dist/functions/timers.d.ts.map +1 -0
- package/dist/functions/triggers.d.ts +203 -0
- package/dist/functions/triggers.d.ts.map +1 -0
- package/dist/functions/types.d.ts +151 -0
- package/dist/functions/types.d.ts.map +1 -0
- package/dist/src/types/types.d.ts +364 -0
- package/dist/src/types/types.d.ts.map +1 -0
- package/package.json +192 -0
- package/scripts/app-install-cli.ts +286 -0
- package/scripts/assemble-frontend.sh +79 -0
- package/scripts/assemble-functions.sh +62 -0
- package/scripts/assemble.sh +35 -0
- package/scripts/boundary-check.sh +106 -0
- package/scripts/build-manifest.sh +80 -0
- package/scripts/check-core-integrity.sh +82 -0
- package/scripts/ingest-chunks.cjs +202 -0
- package/scripts/kb-chunk-parser.cjs +312 -0
- package/scripts/kb-chunk-parser.ts +330 -0
- package/scripts/load-test-app-install.ts +484 -0
- package/scripts/netlify-dev-wrapper.sh +22 -0
- package/scripts/verify-integrity.sh +69 -0
|
@@ -0,0 +1,485 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module pipelines
|
|
3
|
+
* @audience core-contributor
|
|
4
|
+
* @layer api-handler
|
|
5
|
+
* @stability stable
|
|
6
|
+
*
|
|
7
|
+
* CRUD API for the `pipelines` table, plus execution history access.
|
|
8
|
+
* Pipelines are named lists of stages that execute sequentially via `runPipeline`
|
|
9
|
+
* in `_shared/pipeline-runner.ts`.
|
|
10
|
+
*
|
|
11
|
+
* **Routed by:** `GET/POST/PATCH/DELETE /.netlify/functions/pipelines`
|
|
12
|
+
*
|
|
13
|
+
* **Actions:**
|
|
14
|
+
* | method | ?action | handler |
|
|
15
|
+
* |--------|--------------|-----------------|
|
|
16
|
+
* | GET | by-trigger | listByTrigger |
|
|
17
|
+
* | GET | executions | getExecutions |
|
|
18
|
+
* | POST | toggle | toggle |
|
|
19
|
+
* | GET | ?id | get |
|
|
20
|
+
* | GET | (default) | list |
|
|
21
|
+
* | POST | — | create |
|
|
22
|
+
* | PATCH | — | update |
|
|
23
|
+
* | DELETE | — | remove (hard) |
|
|
24
|
+
*
|
|
25
|
+
* **Authorization:** All operations use `ctx.db` (RLS-scoped). Authenticated
|
|
26
|
+
* principal required for writes.
|
|
27
|
+
*
|
|
28
|
+
* INVARIANT: `remove` is a hard delete (no soft delete for pipelines).
|
|
29
|
+
* INVARIANT: `toggle` is a dedicated POST action — use instead of PATCH for
|
|
30
|
+
* is_active changes to ensure proper audit logging.
|
|
31
|
+
*
|
|
32
|
+
* @seeAlso pipeline-runner.ts (runPipeline — actual execution engine)
|
|
33
|
+
* @seeAlso trigger-engine.ts (calls runPipeline when triggers fire)
|
|
34
|
+
* @seeAlso audit.ts (emitLog for pipeline.* events)
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
import { createHandler } from './_shared/middleware'
|
|
38
|
+
import { joins } from './_shared/db'
|
|
39
|
+
import { emitLog } from './_shared/audit'
|
|
40
|
+
import { sanitizeRecordData } from './_shared/permissions'
|
|
41
|
+
|
|
42
|
+
// ─── HANDLERS ─────────────────────────────────────────────────────────────────
|
|
43
|
+
|
|
44
|
+
// ─── CHUNK_START: PIPELINES_LIST_BY_TRIGGER ──────────────────────────────────────────────
|
|
45
|
+
/**
|
|
46
|
+
* @chunk-id PIPELINES_LIST_BY_TRIGGER_1_0_0
|
|
47
|
+
* @version 1.0.0
|
|
48
|
+
* @hash eb5df34b2c5f7b954260202a14cbfbd84967ab03db335bd94894bf66a956a49a
|
|
49
|
+
* @macro Pipelines by Trigger List Handler
|
|
50
|
+
* @micro Lists pipelines filtered by trigger type with sanitization
|
|
51
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
52
|
+
* @inputs _body: any — Request body (unused for GET)
|
|
53
|
+
* @outputs Array of sanitized pipeline records with app/createdBy joins
|
|
54
|
+
* @depends-on [createHandler, joins, sanitizeRecordData]
|
|
55
|
+
* @depended-by [Netlify function routing]
|
|
56
|
+
* @side-effects [DB queries, permission sanitization]
|
|
57
|
+
* @tags pipelines, list, trigger-type, crud
|
|
58
|
+
*/
|
|
59
|
+
export const listByTrigger = createHandler(async (ctx, _body) => {
|
|
60
|
+
const { trigger_type, app_id, include_inactive } = ctx.query || {}
|
|
61
|
+
|
|
62
|
+
if (!trigger_type) {
|
|
63
|
+
throw new Error('trigger_type is required')
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (!ctx.accountId) {
|
|
67
|
+
throw new Error('Account context required')
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
let query = ctx.db
|
|
71
|
+
.from('pipelines')
|
|
72
|
+
.select(`*, ${joins.app}, ${joins.createdBy}`)
|
|
73
|
+
.eq('trigger_type', trigger_type)
|
|
74
|
+
|
|
75
|
+
if (app_id) {
|
|
76
|
+
query = query.eq('app_id', app_id)
|
|
77
|
+
}
|
|
78
|
+
if (include_inactive !== 'true') {
|
|
79
|
+
query = query.eq('is_active', true)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const { data, error: err } = await query.order('name')
|
|
83
|
+
|
|
84
|
+
if (err) throw err
|
|
85
|
+
|
|
86
|
+
const sanitized = []
|
|
87
|
+
for (const pipeline of data || []) {
|
|
88
|
+
sanitized.push(await sanitizeRecordData(ctx, pipeline, 'pipeline'))
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return sanitized
|
|
92
|
+
})
|
|
93
|
+
// ─── CHUNK_END: PIPELINES_LIST_BY_TRIGGER ────────────────────────────────────────────────
|
|
94
|
+
|
|
95
|
+
// ─── CHUNK_START: PIPELINES_LIST ──────────────────────────────────────────────
|
|
96
|
+
/**
|
|
97
|
+
* @chunk-id PIPELINES_LIST_1_0_0
|
|
98
|
+
* @version 1.0.0
|
|
99
|
+
* @hash af2b426b38e99a1907d3113a5b0b776204be0e51a897974573fb5ebc63b85892
|
|
100
|
+
* @macro Pipelines List Handler
|
|
101
|
+
* @micro Lists all pipelines with optional filtering and sanitization
|
|
102
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
103
|
+
* @inputs body: any — Request body (unused for GET)
|
|
104
|
+
* @outputs Array of sanitized pipeline records with app/createdBy joins
|
|
105
|
+
* @depends-on [createHandler, joins, sanitizeRecordData]
|
|
106
|
+
* @depended-by [Netlify function routing]
|
|
107
|
+
* @side-effects [DB queries, permission sanitization]
|
|
108
|
+
* @tags pipelines, list, crud, pagination
|
|
109
|
+
*/
|
|
110
|
+
export const list = createHandler(async (ctx, body) => {
|
|
111
|
+
const { app_id, include_inactive } = ctx.query || {}
|
|
112
|
+
|
|
113
|
+
if (!ctx.accountId) {
|
|
114
|
+
throw new Error('Account context required')
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// RLS automatically filters to accessible accounts
|
|
118
|
+
let query = ctx.db
|
|
119
|
+
.from('pipelines')
|
|
120
|
+
.select(`*, ${joins.app}, ${joins.createdBy}`)
|
|
121
|
+
|
|
122
|
+
if (app_id) {
|
|
123
|
+
query = query.eq('app_id', app_id)
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const { data, error: err } = await query.order('name')
|
|
127
|
+
|
|
128
|
+
if (err) throw err
|
|
129
|
+
|
|
130
|
+
// Sanitize each record based on role permissions
|
|
131
|
+
const sanitized = []
|
|
132
|
+
for (const pipeline of data || []) {
|
|
133
|
+
sanitized.push(await sanitizeRecordData(ctx, pipeline, 'pipeline'))
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return sanitized
|
|
137
|
+
})
|
|
138
|
+
// ─── CHUNK_END: PIPELINES_LIST ────────────────────────────────────────────────
|
|
139
|
+
|
|
140
|
+
// ─── CHUNK_START: PIPELINES_GET ──────────────────────────────────────────────
|
|
141
|
+
/**
|
|
142
|
+
* @chunk-id PIPELINES_GET_1_0_0
|
|
143
|
+
* @version 1.0.0
|
|
144
|
+
* @hash 27a956f4dfe17b93c89170d8f3a9f3f792e4b264b48d13017a52d08014008033
|
|
145
|
+
* @macro Pipeline Get Handler
|
|
146
|
+
* @micro Returns single pipeline record with joins and sanitization
|
|
147
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
148
|
+
* @inputs body: any — Request body (unused for GET)
|
|
149
|
+
* @outputs Sanitized pipeline record with app/createdBy joins
|
|
150
|
+
* @depends-on [createHandler, joins, sanitizeRecordData]
|
|
151
|
+
* @depended-by [Netlify function routing]
|
|
152
|
+
* @side-effects [DB single row query, permission sanitization]
|
|
153
|
+
* @tags pipelines, get, crud, single-record
|
|
154
|
+
*/
|
|
155
|
+
export const get = createHandler(async (ctx, body) => {
|
|
156
|
+
const { id } = ctx.query || {}
|
|
157
|
+
|
|
158
|
+
if (!id) {
|
|
159
|
+
throw new Error('Pipeline ID is required')
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const { data, error: err } = await ctx.db
|
|
163
|
+
.from('pipelines')
|
|
164
|
+
.select(`*, ${joins.app}, ${joins.createdBy}`)
|
|
165
|
+
.eq('id', id)
|
|
166
|
+
.single()
|
|
167
|
+
|
|
168
|
+
if (err) throw err
|
|
169
|
+
|
|
170
|
+
// Sanitize based on role permissions
|
|
171
|
+
return await sanitizeRecordData(ctx, data, 'pipeline')
|
|
172
|
+
})
|
|
173
|
+
// ─── CHUNK_END: PIPELINES_GET ────────────────────────────────────────────────
|
|
174
|
+
|
|
175
|
+
// ─── CHUNK_START: PIPELINES_CREATE ──────────────────────────────────────────────
|
|
176
|
+
/**
|
|
177
|
+
* @chunk-id PIPELINES_CREATE_1_0_0
|
|
178
|
+
* @version 1.0.0
|
|
179
|
+
* @hash b39ec2f696a5d4a9589b7fce769eb0e174d5b0b17b7f4155dc10b5fe70c09252
|
|
180
|
+
* @macro Pipeline Create Handler
|
|
181
|
+
* @micro Creates pipeline record with validation and audit logging
|
|
182
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
183
|
+
* @inputs body: object — Pipeline data including name, trigger_type, stages
|
|
184
|
+
* @outputs Inserted pipeline record
|
|
185
|
+
* @depends-on [createHandler, emitLog]
|
|
186
|
+
* @depended-by [Netlify function routing]
|
|
187
|
+
* @side-effects [DB insert, audit logging]
|
|
188
|
+
* @tags pipelines, create, crud, audit
|
|
189
|
+
*/
|
|
190
|
+
export const create = createHandler(async (ctx, body) => {
|
|
191
|
+
const { app_id, name, description, trigger_type, config, stages, metadata } = body
|
|
192
|
+
|
|
193
|
+
if (!name || !trigger_type || !stages) {
|
|
194
|
+
throw new Error('name, trigger_type, and stages are required')
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
if (!ctx.principal || ctx.principal.id === 'anonymous' || !ctx.accountId) {
|
|
198
|
+
throw new Error('User context (person and account) required')
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
const { data, error: err } = await ctx.db
|
|
202
|
+
.from('pipelines')
|
|
203
|
+
.insert({
|
|
204
|
+
app_id: app_id || null,
|
|
205
|
+
account_id: ctx.accountId,
|
|
206
|
+
name,
|
|
207
|
+
description: description || null,
|
|
208
|
+
trigger_type,
|
|
209
|
+
config: config || {},
|
|
210
|
+
stages,
|
|
211
|
+
metadata: metadata || {},
|
|
212
|
+
created_by: ctx.principal.id
|
|
213
|
+
})
|
|
214
|
+
.select()
|
|
215
|
+
.single()
|
|
216
|
+
|
|
217
|
+
if (err) throw err
|
|
218
|
+
|
|
219
|
+
await emitLog(ctx, 'pipeline.created',
|
|
220
|
+
{ type: 'pipeline', id: data.id },
|
|
221
|
+
{ after: { name, trigger_type } }
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
return data
|
|
225
|
+
})
|
|
226
|
+
// ─── CHUNK_END: PIPELINES_CREATE ────────────────────────────────────────────────
|
|
227
|
+
|
|
228
|
+
// ─── CHUNK_START: PIPELINES_UPDATE ──────────────────────────────────────────────
|
|
229
|
+
/**
|
|
230
|
+
* @chunk-id PIPELINES_UPDATE_1_0_0
|
|
231
|
+
* @version 1.0.0
|
|
232
|
+
* @hash 309910d5389fffcdc6b97b33dfd76f2217bb89e26469f73e4e792f9c41977a8f
|
|
233
|
+
* @macro Pipeline Update Handler
|
|
234
|
+
* @micro Updates pipeline with field allowlist and audit logging
|
|
235
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
236
|
+
* @inputs body: object — Pipeline updates including id and updatable fields
|
|
237
|
+
* @outputs Updated pipeline record
|
|
238
|
+
* @depends-on [createHandler, emitLog]
|
|
239
|
+
* @depended-by [Netlify function routing]
|
|
240
|
+
* @side-effects [DB update, audit logging]
|
|
241
|
+
* @tags pipelines, update, crud, audit
|
|
242
|
+
*/
|
|
243
|
+
export const update = createHandler(async (ctx, body) => {
|
|
244
|
+
const id = body?.id || ctx.query?.id
|
|
245
|
+
const { id: _bodyId, name, description, config, stages, metadata } = body || {}
|
|
246
|
+
|
|
247
|
+
if (!id) {
|
|
248
|
+
throw new Error('Pipeline ID is required')
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
if (!ctx.principal || ctx.principal.id === 'anonymous' || !ctx.accountId) {
|
|
252
|
+
throw new Error('User context (person and account) required')
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// Get current state for audit - RLS will filter to accessible pipelines
|
|
256
|
+
const { data: current } = await ctx.db
|
|
257
|
+
.from('pipelines')
|
|
258
|
+
.select('*')
|
|
259
|
+
.eq('id', id)
|
|
260
|
+
.single()
|
|
261
|
+
|
|
262
|
+
if (!current) {
|
|
263
|
+
throw new Error('Pipeline not found')
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
const updateData: Record<string, any> = { updated_at: new Date().toISOString() }
|
|
267
|
+
if (name !== undefined) updateData.name = name
|
|
268
|
+
if (description !== undefined) updateData.description = description
|
|
269
|
+
if (config !== undefined) updateData.config = config
|
|
270
|
+
if (stages !== undefined) updateData.stages = stages
|
|
271
|
+
if (metadata !== undefined) updateData.metadata = metadata
|
|
272
|
+
|
|
273
|
+
const { data, error: err } = await ctx.db
|
|
274
|
+
.from('pipelines')
|
|
275
|
+
.update(updateData)
|
|
276
|
+
.eq('id', id)
|
|
277
|
+
.select()
|
|
278
|
+
.single()
|
|
279
|
+
|
|
280
|
+
if (err) throw err
|
|
281
|
+
|
|
282
|
+
await emitLog(ctx, 'pipeline.updated',
|
|
283
|
+
{ type: 'pipeline', id },
|
|
284
|
+
{ before: current, after: updateData }
|
|
285
|
+
)
|
|
286
|
+
|
|
287
|
+
return data
|
|
288
|
+
})
|
|
289
|
+
// ─── CHUNK_END: PIPELINES_UPDATE ────────────────────────────────────────────────
|
|
290
|
+
|
|
291
|
+
// ─── CHUNK_START: PIPELINES_TOGGLE ──────────────────────────────────────────────
|
|
292
|
+
/**
|
|
293
|
+
* @chunk-id PIPELINES_TOGGLE_1_0_0
|
|
294
|
+
* @version 1.0.0
|
|
295
|
+
* @hash 4167ca4a65e675a0e37d0237000acf0fe5fdb23699495ff9f46b39f1a4e93884
|
|
296
|
+
* @macro Pipeline Toggle Handler
|
|
297
|
+
* @micro Activates or deactivates pipeline with audit logging
|
|
298
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
299
|
+
* @inputs body: object — Pipeline id and is_active boolean
|
|
300
|
+
* @outputs Updated pipeline record
|
|
301
|
+
* @depends-on [createHandler, emitLog]
|
|
302
|
+
* @depended-by [Netlify function routing]
|
|
303
|
+
* @side-effects [DB update, audit logging]
|
|
304
|
+
* @tags pipelines, toggle, state-transition, audit
|
|
305
|
+
*/
|
|
306
|
+
export const toggle = createHandler(async (ctx, body) => {
|
|
307
|
+
const { id, is_active } = body
|
|
308
|
+
|
|
309
|
+
if (!id || is_active === undefined) {
|
|
310
|
+
throw new Error('Pipeline ID and is_active are required')
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
if (!ctx.principal || ctx.principal.id === 'anonymous' || !ctx.accountId) {
|
|
314
|
+
throw new Error('User context (person and account) required')
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// Get current state for audit - RLS will filter to accessible pipelines
|
|
318
|
+
const { data: current } = await ctx.db
|
|
319
|
+
.from('pipelines')
|
|
320
|
+
.select('*')
|
|
321
|
+
.eq('id', id)
|
|
322
|
+
.single()
|
|
323
|
+
|
|
324
|
+
if (!current) {
|
|
325
|
+
throw new Error('Pipeline not found')
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
const { data, error: err } = await ctx.db
|
|
329
|
+
.from('pipelines')
|
|
330
|
+
.update({ is_active, updated_at: new Date().toISOString() })
|
|
331
|
+
.eq('id', id)
|
|
332
|
+
.select()
|
|
333
|
+
.single()
|
|
334
|
+
|
|
335
|
+
if (err) throw err
|
|
336
|
+
|
|
337
|
+
await emitLog(ctx, 'pipeline.toggled',
|
|
338
|
+
{ type: 'pipeline', id },
|
|
339
|
+
{ before: { is_active: current.is_active }, after: { is_active } }
|
|
340
|
+
)
|
|
341
|
+
|
|
342
|
+
return data
|
|
343
|
+
})
|
|
344
|
+
// ─── CHUNK_END: PIPELINES_TOGGLE ────────────────────────────────────────────────
|
|
345
|
+
|
|
346
|
+
// ─── CHUNK_START: PIPELINES_GET_EXECUTIONS ──────────────────────────────────────────────
|
|
347
|
+
/**
|
|
348
|
+
* @chunk-id PIPELINES_GET_EXECUTIONS_1_0_0
|
|
349
|
+
* @version 1.0.0
|
|
350
|
+
* @hash 92b0d0a8f3c7ab12144950a0e1dd614a0d92fb6f5e3451542e396018bd5f783d
|
|
351
|
+
* @macro Pipeline Executions History Handler
|
|
352
|
+
* @micro Returns paginated execution history for a pipeline
|
|
353
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
354
|
+
* @inputs _body: any — Request body (unused for GET)
|
|
355
|
+
* @outputs Array of pipeline_executions rows ordered newest-first
|
|
356
|
+
* @depends-on [createHandler]
|
|
357
|
+
* @depended-by [Netlify function routing]
|
|
358
|
+
* @side-effects [DB query with pagination]
|
|
359
|
+
* @tags pipelines, executions, history, pagination
|
|
360
|
+
*/
|
|
361
|
+
export const getExecutions = createHandler(async (ctx, _body) => {
|
|
362
|
+
const { pipeline_id, limit = 50, offset = 0 } = ctx.query || {}
|
|
363
|
+
|
|
364
|
+
if (!pipeline_id) {
|
|
365
|
+
throw new Error('Pipeline ID is required')
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
const { data, error: err } = await ctx.db
|
|
369
|
+
.from('pipeline_executions')
|
|
370
|
+
.select('*')
|
|
371
|
+
.eq('pipeline_id', pipeline_id)
|
|
372
|
+
.order('created_at', { ascending: false })
|
|
373
|
+
.range(
|
|
374
|
+
parseInt(offset.toString()),
|
|
375
|
+
parseInt(offset.toString()) + parseInt(limit.toString()) - 1
|
|
376
|
+
)
|
|
377
|
+
|
|
378
|
+
if (err) throw err
|
|
379
|
+
|
|
380
|
+
return data
|
|
381
|
+
})
|
|
382
|
+
// ─── CHUNK_END: PIPELINES_GET_EXECUTIONS ────────────────────────────────────────────────
|
|
383
|
+
|
|
384
|
+
// ─── CHUNK_START: PIPELINES_REMOVE ──────────────────────────────────────────────
|
|
385
|
+
/**
|
|
386
|
+
* @chunk-id PIPELINES_REMOVE_1_0_0
|
|
387
|
+
* @version 1.0.0
|
|
388
|
+
* @hash 8d87b1d6e7613f6fbaa77eb100c72359456f4bc38d8c435ac412d414d71e21be
|
|
389
|
+
* @macro Pipeline Remove Handler
|
|
390
|
+
* @micro Hard-deletes pipeline with audit logging
|
|
391
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
392
|
+
* @inputs _body: any — Request body (unused for DELETE)
|
|
393
|
+
* @outputs {success: true} — Confirmation of successful deletion
|
|
394
|
+
* @depends-on [createHandler, emitLog]
|
|
395
|
+
* @depended-by [Netlify function routing]
|
|
396
|
+
* @side-effects [DB delete, audit logging]
|
|
397
|
+
* @tags pipelines, remove, delete, audit
|
|
398
|
+
*/
|
|
399
|
+
export const remove = createHandler(async (ctx, _body) => {
|
|
400
|
+
const id = ctx.query?.id
|
|
401
|
+
|
|
402
|
+
if (!id) {
|
|
403
|
+
throw new Error('Pipeline ID is required')
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
const { data: current } = await ctx.db
|
|
407
|
+
.from('pipelines')
|
|
408
|
+
.select('id, name')
|
|
409
|
+
.eq('id', id)
|
|
410
|
+
.single()
|
|
411
|
+
|
|
412
|
+
if (!current) throw new Error('Pipeline not found')
|
|
413
|
+
|
|
414
|
+
const { error: err } = await ctx.db
|
|
415
|
+
.from('pipelines')
|
|
416
|
+
.delete()
|
|
417
|
+
.eq('id', id)
|
|
418
|
+
|
|
419
|
+
if (err) throw err
|
|
420
|
+
|
|
421
|
+
await emitLog(ctx, 'pipeline.deleted',
|
|
422
|
+
{ type: 'pipeline', id },
|
|
423
|
+
{ before: current }
|
|
424
|
+
)
|
|
425
|
+
|
|
426
|
+
return { success: true }
|
|
427
|
+
})
|
|
428
|
+
// ─── CHUNK_END: PIPELINES_REMOVE ────────────────────────────────────────────────
|
|
429
|
+
|
|
430
|
+
// ─── MAIN HANDLER ────────────────────────────────────────────────────────────
|
|
431
|
+
|
|
432
|
+
// ─── CHUNK_START: PIPELINES_HANDLER ──────────────────────────────────────────────
|
|
433
|
+
/**
|
|
434
|
+
* @chunk-id PIPELINES_HANDLER_1_0_0
|
|
435
|
+
* @version 1.0.0
|
|
436
|
+
* @hash 6a2509eb1d183c23578cea419e1d53b579876dc8f8778a9b5577427365da7a68
|
|
437
|
+
* @macro Pipelines Router
|
|
438
|
+
* @micro Routes HTTP methods and actions to appropriate pipeline handlers
|
|
439
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
440
|
+
* @inputs body: any — Request body for POST/PATCH operations
|
|
441
|
+
* @outputs Varies — Depends on routed handler (listByTrigger/getExecutions/toggle/list/get/create/update/remove)
|
|
442
|
+
* @depends-on [createHandler, listByTrigger, getExecutions, toggle, list, get, create, update, remove]
|
|
443
|
+
* @depended-by [Netlify function routing]
|
|
444
|
+
* @side-effects [Delegates to appropriate handler]
|
|
445
|
+
* @tags pipelines, router, crud, netlify-function
|
|
446
|
+
*/
|
|
447
|
+
export const handler = createHandler(async (ctx, body) => {
|
|
448
|
+
const { action } = ctx.query || {}
|
|
449
|
+
const method = ctx.query?.method || 'GET'
|
|
450
|
+
|
|
451
|
+
switch (action) {
|
|
452
|
+
case 'by-trigger':
|
|
453
|
+
if (method === 'GET') {
|
|
454
|
+
return await listByTrigger(ctx, body)
|
|
455
|
+
}
|
|
456
|
+
break
|
|
457
|
+
case 'executions':
|
|
458
|
+
if (method === 'GET') {
|
|
459
|
+
return await getExecutions(ctx, body)
|
|
460
|
+
}
|
|
461
|
+
break
|
|
462
|
+
case 'toggle':
|
|
463
|
+
if (method === 'POST') {
|
|
464
|
+
return await toggle(ctx, body)
|
|
465
|
+
}
|
|
466
|
+
break
|
|
467
|
+
default:
|
|
468
|
+
if (method === 'GET') {
|
|
469
|
+
if (ctx.query?.id) {
|
|
470
|
+
return await get(ctx, body)
|
|
471
|
+
} else {
|
|
472
|
+
return await list(ctx, body)
|
|
473
|
+
}
|
|
474
|
+
} else if (method === 'POST') {
|
|
475
|
+
return await create(ctx, body)
|
|
476
|
+
} else if (method === 'PATCH') {
|
|
477
|
+
return await update(ctx, body)
|
|
478
|
+
} else if (method === 'DELETE') {
|
|
479
|
+
return await remove(ctx, body)
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
throw new Error('Invalid action or method')
|
|
484
|
+
})
|
|
485
|
+
// ─── CHUNK_END: PIPELINES_HANDLER ────────────────────────────────────────────────
|