insforge 1.2.10 → 1.3.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/.claude-plugin/marketplace.json +20 -20
- package/.dockerignore +60 -60
- package/.env.example +83 -77
- package/.github/ISSUE_TEMPLATE/bug_report.yml +36 -36
- package/.github/ISSUE_TEMPLATE/config.yml +11 -11
- package/.github/ISSUE_TEMPLATE/feature_request.yml +26 -26
- package/.github/PULL_REQUEST_TEMPLATE.md +7 -7
- package/.github/copilot-instructions.md +146 -146
- package/.github/workflows/build-image.yml +65 -65
- package/.github/workflows/ci-premerge-check.yml +23 -23
- package/.github/workflows/e2e.yml +63 -63
- package/.github/workflows/lint-and-format.yml +32 -32
- package/.prettierignore +64 -64
- package/CHANGELOG.md +44 -44
- package/CLAUDE_PLUGIN.md +104 -104
- package/CODE_OF_CONDUCT.md +128 -128
- package/CONTRIBUTING.md +125 -125
- package/Dockerfile +30 -30
- package/GITHUB_OAUTH_SETUP.md +49 -49
- package/GOOGLE_OAUTH_SETUP.md +148 -148
- package/LICENSE +201 -201
- package/README.md +182 -182
- package/assets/Dark.svg +23 -23
- package/auth/package.json +28 -28
- package/auth/src/lib/broadcastService.ts +117 -115
- package/auth/src/pages/SignInPage.tsx +60 -57
- package/auth/src/pages/SignUpPage.tsx +60 -57
- package/auth/tsconfig.json +32 -32
- package/auth/tsconfig.node.json +11 -11
- package/backend/package.json +78 -75
- package/backend/src/api/routes/ai/index.routes.ts +3 -3
- package/backend/src/api/routes/auth/index.routes.ts +667 -570
- package/backend/src/api/routes/auth/oauth.routes.ts +473 -448
- package/backend/src/api/routes/database/advance.routes.ts +37 -16
- package/backend/src/api/routes/database/index.routes.ts +78 -1
- package/backend/src/api/routes/database/records.routes.ts +10 -10
- package/backend/src/api/routes/database/tables.routes.ts +0 -14
- package/backend/src/api/routes/docs/index.routes.ts +75 -76
- package/backend/src/api/routes/email/index.routes.ts +35 -0
- package/backend/src/api/routes/functions/index.routes.ts +18 -12
- package/backend/src/api/routes/metadata/index.routes.ts +12 -0
- package/backend/src/api/routes/realtime/channels.routes.ts +81 -0
- package/backend/src/api/routes/realtime/index.routes.ts +12 -0
- package/backend/src/api/routes/realtime/messages.routes.ts +48 -0
- package/backend/src/api/routes/realtime/permissions.routes.ts +19 -0
- package/backend/src/api/routes/storage/index.routes.ts +18 -12
- package/backend/src/api/routes/usage/index.routes.ts +6 -4
- package/backend/src/infra/database/database.manager.ts +14 -1
- package/backend/src/infra/database/migrations/000_create-base-tables.sql +141 -141
- package/backend/src/infra/database/migrations/001_create-helper-functions.sql +40 -40
- package/backend/src/infra/database/migrations/002_rename-auth-tables.sql +29 -29
- package/backend/src/infra/database/migrations/003_create-users-table.sql +55 -55
- package/backend/src/infra/database/migrations/004_add-reload-postgrest-func.sql +23 -23
- package/backend/src/infra/database/migrations/005_enable-project-admin-modify-users.sql +29 -29
- package/backend/src/infra/database/migrations/006_modify-ai-usage-table.sql +24 -24
- package/backend/src/infra/database/migrations/007_drop-metadata-table.sql +1 -1
- package/backend/src/infra/database/migrations/008_add-system-tables.sql +76 -76
- package/backend/src/infra/database/migrations/009_add-function-secrets.sql +23 -23
- package/backend/src/infra/database/migrations/010_modify-ai-config-modalities.sql +93 -93
- package/backend/src/infra/database/migrations/011_refactor-secrets-table.sql +15 -15
- package/backend/src/infra/database/migrations/012_add-storage-uploaded-by.sql +7 -7
- package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -44
- package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +7 -7
- package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +59 -59
- package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -24
- package/backend/src/infra/database/migrations/017_create-realtime-schema.sql +233 -0
- package/backend/src/infra/realtime/realtime.manager.ts +246 -0
- package/backend/src/infra/realtime/webhook-sender.ts +82 -0
- package/backend/src/infra/security/token.manager.ts +219 -125
- package/backend/src/infra/socket/socket.manager.ts +198 -64
- package/backend/src/providers/ai/openrouter.provider.ts +12 -9
- package/backend/src/providers/email/base.provider.ts +4 -7
- package/backend/src/providers/email/cloud.provider.ts +84 -0
- package/backend/src/providers/oauth/apple.provider.ts +266 -0
- package/backend/src/providers/oauth/index.ts +1 -0
- package/backend/src/server.ts +317 -284
- package/backend/src/services/ai/ai-model.service.ts +5 -5
- package/backend/src/services/ai/chat-completion.service.ts +4 -4
- package/backend/src/services/ai/image-generation.service.ts +3 -3
- package/backend/src/services/auth/auth.service.ts +14 -0
- package/backend/src/services/database/database-table.service.ts +0 -9
- package/backend/src/services/database/database.service.ts +127 -0
- package/backend/src/services/email/email.service.ts +5 -7
- package/backend/src/services/realtime/index.ts +3 -0
- package/backend/src/services/realtime/realtime-auth.service.ts +104 -0
- package/backend/src/services/realtime/realtime-channel.service.ts +237 -0
- package/backend/src/services/realtime/realtime-message.service.ts +260 -0
- package/backend/src/types/auth.ts +11 -0
- package/backend/src/types/realtime.ts +18 -0
- package/backend/src/types/socket.ts +7 -31
- package/backend/src/utils/cookies.ts +35 -0
- package/backend/src/utils/s3-config-loader.ts +64 -0
- package/backend/src/utils/seed.ts +301 -298
- package/backend/src/utils/sql-parser.ts +90 -0
- package/backend/tests/README.md +133 -133
- package/backend/tests/cleanup-all-test-data.sh +230 -230
- package/backend/tests/cloud/test-s3-multitenant.sh +131 -131
- package/backend/tests/local/comprehensive-curl-tests.sh +155 -155
- package/backend/tests/local/test-ai-config.sh +129 -129
- package/backend/tests/local/test-ai-usage.sh +80 -80
- package/backend/tests/local/test-auth-router.sh +143 -143
- package/backend/tests/local/test-database-router.sh +222 -222
- package/backend/tests/local/test-e2e.sh +240 -240
- package/backend/tests/local/test-fk-errors.sh +96 -96
- package/backend/tests/local/test-functions.sh +123 -123
- package/backend/tests/local/test-id-field.sh +200 -200
- package/backend/tests/local/test-logs.sh +132 -132
- package/backend/tests/local/test-public-bucket.sh +264 -264
- package/backend/tests/local/test-secrets.sh +249 -249
- package/backend/tests/local/test-serverless-functions.sh.disabled +325 -325
- package/backend/tests/local/test-traditional-rest.sh +208 -208
- package/backend/tests/manual/README.md +50 -50
- package/backend/tests/manual/create-large-table-simple.sql +10 -10
- package/backend/tests/manual/seed-large-table.sql +100 -100
- package/backend/tests/manual/setup-large-table-extras.sql +33 -33
- package/backend/tests/manual/test-bulk-upsert.sh +409 -409
- package/backend/tests/manual/test-database-advance.sh +296 -296
- package/backend/tests/manual/test-postgrest-stability.sh +191 -191
- package/backend/tests/manual/test-rawsql-export-import.sh +411 -411
- package/backend/tests/manual/test-rawsql-modes.sh +244 -244
- package/backend/tests/manual/test-universal-storage.sh +263 -263
- package/backend/tests/manual/test-users.sql +17 -17
- package/backend/tests/run-all-tests.sh +139 -139
- package/backend/tests/setup.ts +0 -0
- package/backend/tests/test-config.sh +338 -338
- package/backend/tests/unit/analyze-query.test.ts +697 -0
- package/backend/tsconfig.json +22 -22
- package/claude-plugin/.claude-plugin/plugin.json +24 -24
- package/claude-plugin/README.md +133 -133
- package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +270 -270
- package/docker-compose.prod.yml +204 -200
- package/docker-compose.yml +232 -228
- package/docker-init/db/db-init.sql +97 -97
- package/docker-init/db/jwt.sql +5 -5
- package/docker-init/db/postgresql.conf +16 -16
- package/docker-init/logs/vector.yml +236 -236
- package/docs/README.md +44 -44
- package/docs/agent-docs/real-time.md +269 -0
- package/docs/changelog.mdx +119 -67
- package/docs/core-concepts/ai/architecture.mdx +372 -372
- package/docs/core-concepts/ai/sdk.mdx +213 -213
- package/docs/core-concepts/authentication/architecture.mdx +278 -278
- package/docs/core-concepts/authentication/sdk.mdx +414 -414
- package/docs/core-concepts/authentication/ui-components/customization.mdx +529 -529
- package/docs/core-concepts/authentication/ui-components/nextjs.mdx +221 -221
- package/docs/core-concepts/authentication/ui-components/react-router.mdx +184 -184
- package/docs/core-concepts/authentication/ui-components/react.mdx +129 -129
- package/docs/core-concepts/database/architecture.mdx +255 -255
- package/docs/core-concepts/database/sdk.mdx +382 -382
- package/docs/core-concepts/email/architecture.mdx +101 -0
- package/docs/core-concepts/email/sdk.mdx +53 -0
- package/docs/core-concepts/functions/architecture.mdx +105 -105
- package/docs/core-concepts/functions/sdk.mdx +184 -184
- package/docs/core-concepts/realtime/architecture.mdx +446 -0
- package/docs/core-concepts/realtime/sdk.mdx +409 -0
- package/docs/core-concepts/storage/architecture.mdx +243 -243
- package/docs/core-concepts/storage/sdk.mdx +253 -253
- package/docs/deployment/README.md +94 -94
- package/docs/deployment/deploy-to-aws-ec2.md +564 -564
- package/docs/deployment/deploy-to-azure-virtual-machines.md +312 -312
- package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -613
- package/docs/deployment/deploy-to-render.md +441 -441
- package/docs/deprecated/insforge-auth-api.md +214 -214
- package/docs/deprecated/insforge-auth-sdk.md +99 -99
- package/docs/deprecated/insforge-db-api.md +358 -358
- package/docs/deprecated/insforge-db-sdk.md +139 -139
- package/docs/deprecated/insforge-debug-sdk.md +156 -156
- package/docs/deprecated/insforge-debug.md +64 -64
- package/docs/deprecated/insforge-instructions.md +123 -123
- package/docs/deprecated/insforge-project.md +117 -117
- package/docs/deprecated/insforge-storage-api.md +278 -278
- package/docs/deprecated/insforge-storage-sdk.md +158 -158
- package/docs/docs.json +232 -210
- package/docs/examples/framework-guides/nextjs.mdx +131 -131
- package/docs/examples/framework-guides/nuxt.mdx +165 -165
- package/docs/examples/framework-guides/react.mdx +165 -165
- package/docs/examples/framework-guides/svelte.mdx +153 -153
- package/docs/examples/framework-guides/vue.mdx +159 -159
- package/docs/examples/overview.mdx +67 -67
- package/docs/favicon.svg +19 -19
- package/docs/images/changelog/dec-2025/ai-integration.png +0 -0
- package/docs/images/changelog/dec-2025/ai-models.webp +0 -0
- package/docs/images/changelog/dec-2025/alipay-payment.webp +0 -0
- package/docs/images/changelog/dec-2025/apple-login.jpg +0 -0
- package/docs/images/changelog/dec-2025/mcp-installer.png +0 -0
- package/docs/images/changelog/dec-2025/realtime-module.jpg +0 -0
- package/docs/images/icons/ai.svg +4 -4
- package/docs/images/logos/nextjs.svg +4 -4
- package/docs/images/logos/nuxt.svg +4 -4
- package/docs/images/logos/react.svg +5 -5
- package/docs/images/logos/svelte.svg +4 -4
- package/docs/images/logos/vue.svg +5 -5
- package/docs/insforge-instructions-sdk.md +89 -88
- package/docs/introduction.mdx +45 -45
- package/docs/logo/dark.svg +22 -22
- package/docs/logo/light.svg +20 -20
- package/docs/partnership.mdx +651 -646
- package/docs/quickstart.mdx +82 -82
- package/docs/showcase.mdx +52 -52
- package/docs/snippets/sdk-installation.mdx +21 -21
- package/docs/snippets/service-icons.mdx +27 -27
- package/examples/oauth/frontend-oauth-example.html +250 -250
- package/examples/response-examples.md +443 -443
- package/frontend/components.json +17 -17
- package/frontend/package.json +69 -69
- package/frontend/src/assets/icons/checkbox_checked.svg +6 -6
- package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -6
- package/frontend/src/assets/icons/checked.svg +3 -3
- package/frontend/src/assets/icons/connected.svg +3 -3
- package/frontend/src/assets/icons/error.svg +3 -3
- package/frontend/src/assets/icons/loader.svg +9 -9
- package/frontend/src/assets/icons/pencil.svg +4 -4
- package/frontend/src/assets/icons/refresh.svg +4 -4
- package/frontend/src/assets/icons/step_active.svg +3 -3
- package/frontend/src/assets/icons/step_inactive.svg +11 -11
- package/frontend/src/assets/icons/warning.svg +3 -3
- package/frontend/src/assets/logos/apple.svg +3 -3
- package/frontend/src/assets/logos/claude_code.svg +3 -3
- package/frontend/src/assets/logos/cline.svg +6 -6
- package/frontend/src/assets/logos/cursor.svg +20 -20
- package/frontend/src/assets/logos/discord.svg +8 -8
- package/frontend/src/assets/logos/facebook.svg +3 -3
- package/frontend/src/assets/logos/gemini.svg +19 -19
- package/frontend/src/assets/logos/github.svg +5 -5
- package/frontend/src/assets/logos/google.svg +13 -13
- package/frontend/src/assets/logos/grok.svg +10 -10
- package/frontend/src/assets/logos/insforge_dark.svg +15 -15
- package/frontend/src/assets/logos/insforge_light.svg +15 -15
- package/frontend/src/assets/logos/instagram.svg +1 -1
- package/frontend/src/assets/logos/linkedin.svg +3 -3
- package/frontend/src/assets/logos/openai.svg +10 -10
- package/frontend/src/assets/logos/roo_code.svg +9 -9
- package/frontend/src/assets/logos/spotify.svg +16 -16
- package/frontend/src/assets/logos/tiktok.svg +5 -5
- package/frontend/src/assets/logos/trae.svg +3 -3
- package/frontend/src/assets/logos/windsurf.svg +10 -10
- package/frontend/src/assets/logos/x.svg +3 -3
- package/frontend/src/components/layout/AppHeader.tsx +9 -10
- package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +1 -0
- package/frontend/src/features/auth/components/UsersDataGrid.tsx +6 -0
- package/frontend/src/features/auth/helpers.tsx +8 -0
- package/frontend/src/features/auth/{page → pages}/UsersPage.tsx +0 -28
- package/frontend/src/features/database/components/SQLModal.tsx +75 -0
- package/frontend/src/features/database/components/TableForm.tsx +0 -4
- package/frontend/src/features/database/hooks/useDatabase.ts +66 -0
- package/frontend/src/features/database/hooks/useTables.ts +32 -28
- package/frontend/src/features/database/index.ts +1 -0
- package/frontend/src/features/database/{page → pages}/FunctionsPage.tsx +29 -37
- package/frontend/src/features/database/{page → pages}/IndexesPage.tsx +35 -47
- package/frontend/src/features/database/{page → pages}/PoliciesPage.tsx +43 -54
- package/frontend/src/features/database/{page → pages}/TablesPage.tsx +0 -42
- package/frontend/src/features/database/{page → pages}/TriggersPage.tsx +35 -47
- package/frontend/src/features/database/services/advance.service.ts +0 -26
- package/frontend/src/features/database/services/database.service.ts +55 -0
- package/frontend/src/features/database/services/table.service.ts +0 -6
- package/frontend/src/features/functions/{page → pages}/FunctionsPage.tsx +21 -44
- package/frontend/src/features/functions/{page → pages}/SecretsPage.tsx +11 -9
- package/frontend/src/features/logs/hooks/useMcpUsage.ts +13 -66
- package/frontend/src/features/realtime/components/ChannelRow.tsx +83 -0
- package/frontend/src/features/realtime/components/EditChannelModal.tsx +246 -0
- package/frontend/src/features/realtime/components/MessageRow.tsx +85 -0
- package/frontend/src/features/realtime/components/RealtimeEmptyState.tsx +30 -0
- package/frontend/src/features/realtime/hooks/useRealtime.ts +218 -0
- package/frontend/src/features/realtime/index.ts +11 -0
- package/frontend/src/features/realtime/pages/RealtimeChannelsPage.tsx +172 -0
- package/frontend/src/features/realtime/pages/RealtimeMessagesPage.tsx +211 -0
- package/frontend/src/features/realtime/pages/RealtimePermissionsPage.tsx +191 -0
- package/frontend/src/features/realtime/services/realtime.service.ts +107 -0
- package/frontend/src/features/storage/{page → pages}/StoragePage.tsx +1 -29
- package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +3 -3
- package/frontend/src/features/visualizer/{page → pages}/VisualizerPage.tsx +1 -35
- package/frontend/src/lib/contexts/SocketContext.tsx +119 -75
- package/frontend/src/lib/routing/AppRoutes.tsx +35 -20
- package/frontend/src/lib/utils/cloudMessaging.ts +1 -1
- package/frontend/src/lib/utils/menuItems.ts +24 -0
- package/frontend/src/lib/utils/utils.ts +14 -1
- package/frontend/tsconfig.json +25 -25
- package/frontend/tsconfig.node.json +9 -9
- package/functions/deno.json +24 -24
- package/functions/server.ts +315 -315
- package/i18n/README.ar.md +130 -130
- package/i18n/README.de.md +130 -130
- package/i18n/README.es.md +154 -154
- package/i18n/README.fr.md +134 -134
- package/i18n/README.hi.md +129 -129
- package/i18n/README.ja.md +174 -174
- package/i18n/README.ko.md +136 -136
- package/i18n/README.pt-BR.md +131 -131
- package/i18n/README.ru.md +129 -129
- package/i18n/README.zh-CN.md +133 -133
- package/openapi/ai.yaml +715 -715
- package/openapi/auth.yaml +1244 -1244
- package/openapi/email.yaml +158 -0
- package/openapi/functions.yaml +475 -475
- package/openapi/health.yaml +29 -29
- package/openapi/logs.yaml +223 -223
- package/openapi/metadata.yaml +177 -177
- package/openapi/realtime.yaml +699 -0
- package/openapi/records.yaml +381 -381
- package/openapi/secrets.yaml +370 -370
- package/openapi/storage.yaml +875 -875
- package/openapi/tables.yaml +463 -463
- package/package.json +97 -97
- package/shared-schemas/package.json +31 -31
- package/shared-schemas/src/ai.schema.ts +63 -59
- package/shared-schemas/src/auth-api.schema.ts +352 -339
- package/shared-schemas/src/auth.schema.ts +1 -1
- package/shared-schemas/src/database-api.schema.ts +32 -1
- package/shared-schemas/src/database.schema.ts +39 -0
- package/shared-schemas/src/docs.schema.ts +26 -0
- package/shared-schemas/src/email-api.schema.ts +30 -0
- package/shared-schemas/src/index.ts +4 -0
- package/shared-schemas/src/metadata.schema.ts +9 -0
- package/shared-schemas/src/realtime-api.schema.ts +111 -0
- package/shared-schemas/src/realtime.schema.ts +143 -0
- package/shared-schemas/tsconfig.json +21 -21
- package/tsconfig.json +7 -7
- package/zeabur/README.md +13 -13
- package/zeabur/template.yml +1032 -1032
- package/.cursor/rules/cursor-rules.mdc +0 -94
- package/frontend/src/features/database/hooks/useFullMetadata.ts +0 -18
- package/test-gemini.sh +0 -35
- package/test-usage-admin.sh +0 -57
- package/test-usage.sh +0 -50
- /package/frontend/src/features/ai/{page → pages}/AIPage.tsx +0 -0
- /package/frontend/src/features/auth/{page → pages}/AuthMethodsPage.tsx +0 -0
- /package/frontend/src/features/auth/{page → pages}/ConfigurationPage.tsx +0 -0
- /package/frontend/src/features/dashboard/{page → pages}/DashboardPage.tsx +0 -0
- /package/frontend/src/features/database/{page → pages}/SQLEditorPage.tsx +0 -0
- /package/frontend/src/features/database/{page → pages}/TemplatesPage.tsx +0 -0
- /package/frontend/src/features/login/{page → pages}/CloudLoginPage.tsx +0 -0
- /package/frontend/src/features/login/{page → pages}/LoginPage.tsx +0 -0
- /package/frontend/src/features/logs/{page → pages}/AuditsPage.tsx +0 -0
- /package/frontend/src/features/logs/{page → pages}/LogsPage.tsx +0 -0
- /package/frontend/src/features/logs/{page → pages}/MCPLogsPage.tsx +0 -0
package/openapi/functions.yaml
CHANGED
|
@@ -1,476 +1,476 @@
|
|
|
1
|
-
openapi: 3.0.3
|
|
2
|
-
info:
|
|
3
|
-
title: Insforge Functions API
|
|
4
|
-
version: 1.0.0
|
|
5
|
-
description: Serverless functions running in Deno runtime
|
|
6
|
-
|
|
7
|
-
paths:
|
|
8
|
-
/api/functions:
|
|
9
|
-
get:
|
|
10
|
-
summary: List all functions
|
|
11
|
-
description: Get all functions with their metadata
|
|
12
|
-
tags:
|
|
13
|
-
- Admin
|
|
14
|
-
security:
|
|
15
|
-
- bearerAuth: []
|
|
16
|
-
responses:
|
|
17
|
-
'200':
|
|
18
|
-
description: List of functions
|
|
19
|
-
content:
|
|
20
|
-
application/json:
|
|
21
|
-
schema:
|
|
22
|
-
type: array
|
|
23
|
-
items:
|
|
24
|
-
$ref: '#/components/schemas/FunctionMetadata'
|
|
25
|
-
example:
|
|
26
|
-
- id: "123e4567-e89b-12d3-a456-426614174000"
|
|
27
|
-
slug: "hello-world"
|
|
28
|
-
name: "Hello World Function"
|
|
29
|
-
description: "Returns a greeting message"
|
|
30
|
-
status: "active"
|
|
31
|
-
created_at: "2024-01-21T10:30:00Z"
|
|
32
|
-
updated_at: "2024-01-21T10:35:00Z"
|
|
33
|
-
deployed_at: "2024-01-21T10:35:00Z"
|
|
34
|
-
- id: "223e4567-e89b-12d3-a456-426614174001"
|
|
35
|
-
slug: "process-webhook"
|
|
36
|
-
name: "Webhook Processor"
|
|
37
|
-
description: "Processes incoming webhooks"
|
|
38
|
-
status: "draft"
|
|
39
|
-
created_at: "2024-01-22T14:20:00Z"
|
|
40
|
-
updated_at: "2024-01-22T14:20:00Z"
|
|
41
|
-
deployed_at: null
|
|
42
|
-
'401':
|
|
43
|
-
description: Unauthorized
|
|
44
|
-
'403':
|
|
45
|
-
description: Forbidden - Admin only
|
|
46
|
-
'500':
|
|
47
|
-
description: Failed to list functions
|
|
48
|
-
content:
|
|
49
|
-
application/json:
|
|
50
|
-
schema:
|
|
51
|
-
$ref: '#/components/schemas/ErrorResponse'
|
|
52
|
-
|
|
53
|
-
post:
|
|
54
|
-
summary: Create new function
|
|
55
|
-
description: Create a new function with code that runs in Deno runtime
|
|
56
|
-
tags:
|
|
57
|
-
- Admin
|
|
58
|
-
security:
|
|
59
|
-
- bearerAuth: []
|
|
60
|
-
requestBody:
|
|
61
|
-
required: true
|
|
62
|
-
content:
|
|
63
|
-
application/json:
|
|
64
|
-
schema:
|
|
65
|
-
type: object
|
|
66
|
-
required:
|
|
67
|
-
- name
|
|
68
|
-
- code
|
|
69
|
-
properties:
|
|
70
|
-
name:
|
|
71
|
-
type: string
|
|
72
|
-
minLength: 1
|
|
73
|
-
description: Display name for the function
|
|
74
|
-
example: "Hello World Function"
|
|
75
|
-
slug:
|
|
76
|
-
type: string
|
|
77
|
-
pattern: '^[a-zA-Z0-9_-]+$'
|
|
78
|
-
description: URL-friendly identifier (auto-generated from name if not provided)
|
|
79
|
-
example: "hello-world"
|
|
80
|
-
code:
|
|
81
|
-
type: string
|
|
82
|
-
minLength: 1
|
|
83
|
-
description: JavaScript/TypeScript code that exports an async function
|
|
84
|
-
example: |
|
|
85
|
-
export default async function(request) {
|
|
86
|
-
const { name = 'World' } = await request.json();
|
|
87
|
-
return new Response(
|
|
88
|
-
JSON.stringify({ message: `Hello, ${name}!` }),
|
|
89
|
-
{ headers: { 'Content-Type': 'application/json' } }
|
|
90
|
-
);
|
|
91
|
-
}
|
|
92
|
-
description:
|
|
93
|
-
type: string
|
|
94
|
-
description: Description of what the function does
|
|
95
|
-
example: "Returns a personalized greeting message"
|
|
96
|
-
status:
|
|
97
|
-
type: string
|
|
98
|
-
enum: ["draft", "active"]
|
|
99
|
-
default: "active"
|
|
100
|
-
description: Initial status (draft or active/deployed)
|
|
101
|
-
responses:
|
|
102
|
-
'201':
|
|
103
|
-
description: Function created successfully
|
|
104
|
-
content:
|
|
105
|
-
application/json:
|
|
106
|
-
schema:
|
|
107
|
-
type: object
|
|
108
|
-
properties:
|
|
109
|
-
success:
|
|
110
|
-
type: boolean
|
|
111
|
-
function:
|
|
112
|
-
$ref: '#/components/schemas/FunctionMetadata'
|
|
113
|
-
example:
|
|
114
|
-
success: true
|
|
115
|
-
function:
|
|
116
|
-
id: "123e4567-e89b-12d3-a456-426614174000"
|
|
117
|
-
slug: "hello-world"
|
|
118
|
-
name: "Hello World Function"
|
|
119
|
-
description: "Returns a greeting message"
|
|
120
|
-
status: "active"
|
|
121
|
-
created_at: "2024-01-21T10:30:00Z"
|
|
122
|
-
'400':
|
|
123
|
-
description: Invalid request
|
|
124
|
-
content:
|
|
125
|
-
application/json:
|
|
126
|
-
schema:
|
|
127
|
-
$ref: '#/components/schemas/ErrorResponse'
|
|
128
|
-
examples:
|
|
129
|
-
validation:
|
|
130
|
-
value:
|
|
131
|
-
error: "Invalid request"
|
|
132
|
-
details:
|
|
133
|
-
- code: "too_small"
|
|
134
|
-
minimum: 1
|
|
135
|
-
path: ["name"]
|
|
136
|
-
message: "Name is required"
|
|
137
|
-
dangerousCode:
|
|
138
|
-
value:
|
|
139
|
-
error: "Code contains potentially dangerous patterns"
|
|
140
|
-
pattern: "/Deno\\.run/i"
|
|
141
|
-
'409':
|
|
142
|
-
description: Function slug already exists
|
|
143
|
-
content:
|
|
144
|
-
application/json:
|
|
145
|
-
schema:
|
|
146
|
-
$ref: '#/components/schemas/ErrorResponse'
|
|
147
|
-
example:
|
|
148
|
-
error: "Function with this slug already exists"
|
|
149
|
-
details: "duplicate key value violates unique constraint"
|
|
150
|
-
'500':
|
|
151
|
-
description: Failed to create function
|
|
152
|
-
content:
|
|
153
|
-
application/json:
|
|
154
|
-
schema:
|
|
155
|
-
$ref: '#/components/schemas/ErrorResponse'
|
|
156
|
-
|
|
157
|
-
/api/functions/{slug}:
|
|
158
|
-
get:
|
|
159
|
-
summary: Get function details
|
|
160
|
-
description: Get a specific function including its code
|
|
161
|
-
tags:
|
|
162
|
-
- Admin
|
|
163
|
-
security:
|
|
164
|
-
- bearerAuth: []
|
|
165
|
-
parameters:
|
|
166
|
-
- name: slug
|
|
167
|
-
in: path
|
|
168
|
-
required: true
|
|
169
|
-
schema:
|
|
170
|
-
type: string
|
|
171
|
-
pattern: '^[a-zA-Z0-9_-]+$'
|
|
172
|
-
description: Function slug identifier
|
|
173
|
-
example: "hello-world"
|
|
174
|
-
responses:
|
|
175
|
-
'200':
|
|
176
|
-
description: Function details with code
|
|
177
|
-
content:
|
|
178
|
-
application/json:
|
|
179
|
-
schema:
|
|
180
|
-
$ref: '#/components/schemas/FunctionDetails'
|
|
181
|
-
example:
|
|
182
|
-
id: "123e4567-e89b-12d3-a456-426614174000"
|
|
183
|
-
slug: "hello-world"
|
|
184
|
-
name: "Hello World Function"
|
|
185
|
-
description: "Returns a greeting message"
|
|
186
|
-
code: |
|
|
187
|
-
export default async function(request) {
|
|
188
|
-
const { name = 'World' } = await request.json();
|
|
189
|
-
return new Response(
|
|
190
|
-
JSON.stringify({ message: `Hello, ${name}!` }),
|
|
191
|
-
{ headers: { 'Content-Type': 'application/json' } }
|
|
192
|
-
);
|
|
193
|
-
}
|
|
194
|
-
status: "active"
|
|
195
|
-
created_at: "2024-01-21T10:30:00Z"
|
|
196
|
-
updated_at: "2024-01-21T10:35:00Z"
|
|
197
|
-
deployed_at: "2024-01-21T10:35:00Z"
|
|
198
|
-
'404':
|
|
199
|
-
description: Function not found
|
|
200
|
-
content:
|
|
201
|
-
application/json:
|
|
202
|
-
schema:
|
|
203
|
-
$ref: '#/components/schemas/ErrorResponse'
|
|
204
|
-
example:
|
|
205
|
-
error: "Function not found"
|
|
206
|
-
'401':
|
|
207
|
-
description: Unauthorized
|
|
208
|
-
'403':
|
|
209
|
-
description: Forbidden - Admin only
|
|
210
|
-
'500':
|
|
211
|
-
description: Failed to get function
|
|
212
|
-
content:
|
|
213
|
-
application/json:
|
|
214
|
-
schema:
|
|
215
|
-
$ref: '#/components/schemas/ErrorResponse'
|
|
216
|
-
|
|
217
|
-
put:
|
|
218
|
-
summary: Update function
|
|
219
|
-
description: Update an existing function's code or metadata
|
|
220
|
-
tags:
|
|
221
|
-
- Admin
|
|
222
|
-
security:
|
|
223
|
-
- bearerAuth: []
|
|
224
|
-
parameters:
|
|
225
|
-
- name: slug
|
|
226
|
-
in: path
|
|
227
|
-
required: true
|
|
228
|
-
schema:
|
|
229
|
-
type: string
|
|
230
|
-
pattern: '^[a-zA-Z0-9_-]+$'
|
|
231
|
-
description: Function slug identifier
|
|
232
|
-
example: "hello-world"
|
|
233
|
-
requestBody:
|
|
234
|
-
required: true
|
|
235
|
-
content:
|
|
236
|
-
application/json:
|
|
237
|
-
schema:
|
|
238
|
-
type: object
|
|
239
|
-
properties:
|
|
240
|
-
name:
|
|
241
|
-
type: string
|
|
242
|
-
description: New display name
|
|
243
|
-
code:
|
|
244
|
-
type: string
|
|
245
|
-
description: Updated function code
|
|
246
|
-
description:
|
|
247
|
-
type: string
|
|
248
|
-
description: Updated description
|
|
249
|
-
status:
|
|
250
|
-
type: string
|
|
251
|
-
enum: ["draft", "active", "error"]
|
|
252
|
-
description: Function status
|
|
253
|
-
responses:
|
|
254
|
-
'200':
|
|
255
|
-
description: Function updated successfully
|
|
256
|
-
content:
|
|
257
|
-
application/json:
|
|
258
|
-
schema:
|
|
259
|
-
type: object
|
|
260
|
-
properties:
|
|
261
|
-
success:
|
|
262
|
-
type: boolean
|
|
263
|
-
function:
|
|
264
|
-
$ref: '#/components/schemas/FunctionMetadata'
|
|
265
|
-
example:
|
|
266
|
-
success: true
|
|
267
|
-
function:
|
|
268
|
-
id: "123e4567-e89b-12d3-a456-426614174000"
|
|
269
|
-
slug: "hello-world"
|
|
270
|
-
name: "Hello World Function v2"
|
|
271
|
-
description: "Returns a greeting message"
|
|
272
|
-
status: "active"
|
|
273
|
-
updated_at: "2024-01-21T11:00:00Z"
|
|
274
|
-
'400':
|
|
275
|
-
description: Invalid request
|
|
276
|
-
content:
|
|
277
|
-
application/json:
|
|
278
|
-
schema:
|
|
279
|
-
$ref: '#/components/schemas/ErrorResponse'
|
|
280
|
-
'404':
|
|
281
|
-
description: Function not found
|
|
282
|
-
content:
|
|
283
|
-
application/json:
|
|
284
|
-
schema:
|
|
285
|
-
$ref: '#/components/schemas/ErrorResponse'
|
|
286
|
-
example:
|
|
287
|
-
error: "Function not found"
|
|
288
|
-
'500':
|
|
289
|
-
description: Failed to update function
|
|
290
|
-
content:
|
|
291
|
-
application/json:
|
|
292
|
-
schema:
|
|
293
|
-
$ref: '#/components/schemas/ErrorResponse'
|
|
294
|
-
|
|
295
|
-
delete:
|
|
296
|
-
summary: Delete function
|
|
297
|
-
description: Permanently delete a function
|
|
298
|
-
tags:
|
|
299
|
-
- Admin
|
|
300
|
-
security:
|
|
301
|
-
- bearerAuth: []
|
|
302
|
-
parameters:
|
|
303
|
-
- name: slug
|
|
304
|
-
in: path
|
|
305
|
-
required: true
|
|
306
|
-
schema:
|
|
307
|
-
type: string
|
|
308
|
-
pattern: '^[a-zA-Z0-9_-]+$'
|
|
309
|
-
description: Function slug identifier
|
|
310
|
-
example: "hello-world"
|
|
311
|
-
responses:
|
|
312
|
-
'200':
|
|
313
|
-
description: Function deleted successfully
|
|
314
|
-
content:
|
|
315
|
-
application/json:
|
|
316
|
-
schema:
|
|
317
|
-
type: object
|
|
318
|
-
properties:
|
|
319
|
-
success:
|
|
320
|
-
type: boolean
|
|
321
|
-
message:
|
|
322
|
-
type: string
|
|
323
|
-
example:
|
|
324
|
-
success: true
|
|
325
|
-
message: "Function hello-world deleted successfully"
|
|
326
|
-
'404':
|
|
327
|
-
description: Function not found
|
|
328
|
-
content:
|
|
329
|
-
application/json:
|
|
330
|
-
schema:
|
|
331
|
-
$ref: '#/components/schemas/ErrorResponse'
|
|
332
|
-
example:
|
|
333
|
-
error: "Function not found"
|
|
334
|
-
'500':
|
|
335
|
-
description: Failed to delete function
|
|
336
|
-
content:
|
|
337
|
-
application/json:
|
|
338
|
-
schema:
|
|
339
|
-
$ref: '#/components/schemas/ErrorResponse'
|
|
340
|
-
|
|
341
|
-
/functions/{slug}:
|
|
342
|
-
post:
|
|
343
|
-
summary: Execute function
|
|
344
|
-
description: Execute a function with the provided request
|
|
345
|
-
tags:
|
|
346
|
-
- Client
|
|
347
|
-
parameters:
|
|
348
|
-
- name: slug
|
|
349
|
-
in: path
|
|
350
|
-
required: true
|
|
351
|
-
schema:
|
|
352
|
-
type: string
|
|
353
|
-
pattern: '^[a-zA-Z0-9_-]+$'
|
|
354
|
-
description: Function slug identifier
|
|
355
|
-
example: "hello-world"
|
|
356
|
-
requestBody:
|
|
357
|
-
required: false
|
|
358
|
-
content:
|
|
359
|
-
application/json:
|
|
360
|
-
schema:
|
|
361
|
-
type: object
|
|
362
|
-
additionalProperties: true
|
|
363
|
-
example:
|
|
364
|
-
name: "John"
|
|
365
|
-
age: 30
|
|
366
|
-
responses:
|
|
367
|
-
'200':
|
|
368
|
-
description: Function executed successfully
|
|
369
|
-
content:
|
|
370
|
-
'*/*':
|
|
371
|
-
schema:
|
|
372
|
-
type: object
|
|
373
|
-
additionalProperties: true
|
|
374
|
-
example:
|
|
375
|
-
message: "Hello, John!"
|
|
376
|
-
'404':
|
|
377
|
-
description: Function not found or not active
|
|
378
|
-
content:
|
|
379
|
-
application/json:
|
|
380
|
-
schema:
|
|
381
|
-
$ref: '#/components/schemas/ErrorResponse'
|
|
382
|
-
example:
|
|
383
|
-
error: "Function not found or not active"
|
|
384
|
-
'500':
|
|
385
|
-
description: Function execution error
|
|
386
|
-
content:
|
|
387
|
-
application/json:
|
|
388
|
-
schema:
|
|
389
|
-
$ref: '#/components/schemas/ErrorResponse'
|
|
390
|
-
example:
|
|
391
|
-
error: "Function execution failed"
|
|
392
|
-
message: "TypeError: Cannot read property 'name' of undefined"
|
|
393
|
-
|
|
394
|
-
components:
|
|
395
|
-
securitySchemes:
|
|
396
|
-
bearerAuth:
|
|
397
|
-
type: http
|
|
398
|
-
scheme: bearer
|
|
399
|
-
bearerFormat: JWT
|
|
400
|
-
|
|
401
|
-
schemas:
|
|
402
|
-
FunctionMetadata:
|
|
403
|
-
type: object
|
|
404
|
-
properties:
|
|
405
|
-
id:
|
|
406
|
-
type: string
|
|
407
|
-
format: uuid
|
|
408
|
-
description: Unique identifier for the function
|
|
409
|
-
slug:
|
|
410
|
-
type: string
|
|
411
|
-
description: URL-friendly identifier
|
|
412
|
-
example: "hello-world"
|
|
413
|
-
name:
|
|
414
|
-
type: string
|
|
415
|
-
description: Display name for the function
|
|
416
|
-
example: "Hello World Function"
|
|
417
|
-
description:
|
|
418
|
-
type: string
|
|
419
|
-
nullable: true
|
|
420
|
-
description: Description of what the function does
|
|
421
|
-
status:
|
|
422
|
-
type: string
|
|
423
|
-
enum: ["draft", "active", "error"]
|
|
424
|
-
description: Current status of the function
|
|
425
|
-
created_at:
|
|
426
|
-
type: string
|
|
427
|
-
format: date-time
|
|
428
|
-
description: When the function was created
|
|
429
|
-
updated_at:
|
|
430
|
-
type: string
|
|
431
|
-
format: date-time
|
|
432
|
-
description: When the function was last updated
|
|
433
|
-
deployed_at:
|
|
434
|
-
type: string
|
|
435
|
-
format: date-time
|
|
436
|
-
nullable: true
|
|
437
|
-
description: When the function was last deployed (null if never deployed)
|
|
438
|
-
required:
|
|
439
|
-
- id
|
|
440
|
-
- slug
|
|
441
|
-
- name
|
|
442
|
-
- status
|
|
443
|
-
- created_at
|
|
444
|
-
- updated_at
|
|
445
|
-
|
|
446
|
-
FunctionDetails:
|
|
447
|
-
allOf:
|
|
448
|
-
- $ref: '#/components/schemas/FunctionMetadata'
|
|
449
|
-
- type: object
|
|
450
|
-
properties:
|
|
451
|
-
code:
|
|
452
|
-
type: string
|
|
453
|
-
description: The function's JavaScript/TypeScript code
|
|
454
|
-
required:
|
|
455
|
-
- code
|
|
456
|
-
|
|
457
|
-
ErrorResponse:
|
|
458
|
-
type: object
|
|
459
|
-
properties:
|
|
460
|
-
error:
|
|
461
|
-
type: string
|
|
462
|
-
description: Error message
|
|
463
|
-
details:
|
|
464
|
-
oneOf:
|
|
465
|
-
- type: string
|
|
466
|
-
- type: array
|
|
467
|
-
items:
|
|
468
|
-
type: object
|
|
469
|
-
- type: object
|
|
470
|
-
description: Additional error details
|
|
471
|
-
message:
|
|
472
|
-
type: string
|
|
473
|
-
description: Detailed error message
|
|
474
|
-
pattern:
|
|
475
|
-
type: string
|
|
1
|
+
openapi: 3.0.3
|
|
2
|
+
info:
|
|
3
|
+
title: Insforge Functions API
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
description: Serverless functions running in Deno runtime
|
|
6
|
+
|
|
7
|
+
paths:
|
|
8
|
+
/api/functions:
|
|
9
|
+
get:
|
|
10
|
+
summary: List all functions
|
|
11
|
+
description: Get all functions with their metadata
|
|
12
|
+
tags:
|
|
13
|
+
- Admin
|
|
14
|
+
security:
|
|
15
|
+
- bearerAuth: []
|
|
16
|
+
responses:
|
|
17
|
+
'200':
|
|
18
|
+
description: List of functions
|
|
19
|
+
content:
|
|
20
|
+
application/json:
|
|
21
|
+
schema:
|
|
22
|
+
type: array
|
|
23
|
+
items:
|
|
24
|
+
$ref: '#/components/schemas/FunctionMetadata'
|
|
25
|
+
example:
|
|
26
|
+
- id: "123e4567-e89b-12d3-a456-426614174000"
|
|
27
|
+
slug: "hello-world"
|
|
28
|
+
name: "Hello World Function"
|
|
29
|
+
description: "Returns a greeting message"
|
|
30
|
+
status: "active"
|
|
31
|
+
created_at: "2024-01-21T10:30:00Z"
|
|
32
|
+
updated_at: "2024-01-21T10:35:00Z"
|
|
33
|
+
deployed_at: "2024-01-21T10:35:00Z"
|
|
34
|
+
- id: "223e4567-e89b-12d3-a456-426614174001"
|
|
35
|
+
slug: "process-webhook"
|
|
36
|
+
name: "Webhook Processor"
|
|
37
|
+
description: "Processes incoming webhooks"
|
|
38
|
+
status: "draft"
|
|
39
|
+
created_at: "2024-01-22T14:20:00Z"
|
|
40
|
+
updated_at: "2024-01-22T14:20:00Z"
|
|
41
|
+
deployed_at: null
|
|
42
|
+
'401':
|
|
43
|
+
description: Unauthorized
|
|
44
|
+
'403':
|
|
45
|
+
description: Forbidden - Admin only
|
|
46
|
+
'500':
|
|
47
|
+
description: Failed to list functions
|
|
48
|
+
content:
|
|
49
|
+
application/json:
|
|
50
|
+
schema:
|
|
51
|
+
$ref: '#/components/schemas/ErrorResponse'
|
|
52
|
+
|
|
53
|
+
post:
|
|
54
|
+
summary: Create new function
|
|
55
|
+
description: Create a new function with code that runs in Deno runtime
|
|
56
|
+
tags:
|
|
57
|
+
- Admin
|
|
58
|
+
security:
|
|
59
|
+
- bearerAuth: []
|
|
60
|
+
requestBody:
|
|
61
|
+
required: true
|
|
62
|
+
content:
|
|
63
|
+
application/json:
|
|
64
|
+
schema:
|
|
65
|
+
type: object
|
|
66
|
+
required:
|
|
67
|
+
- name
|
|
68
|
+
- code
|
|
69
|
+
properties:
|
|
70
|
+
name:
|
|
71
|
+
type: string
|
|
72
|
+
minLength: 1
|
|
73
|
+
description: Display name for the function
|
|
74
|
+
example: "Hello World Function"
|
|
75
|
+
slug:
|
|
76
|
+
type: string
|
|
77
|
+
pattern: '^[a-zA-Z0-9_-]+$'
|
|
78
|
+
description: URL-friendly identifier (auto-generated from name if not provided)
|
|
79
|
+
example: "hello-world"
|
|
80
|
+
code:
|
|
81
|
+
type: string
|
|
82
|
+
minLength: 1
|
|
83
|
+
description: JavaScript/TypeScript code that exports an async function
|
|
84
|
+
example: |
|
|
85
|
+
export default async function(request) {
|
|
86
|
+
const { name = 'World' } = await request.json();
|
|
87
|
+
return new Response(
|
|
88
|
+
JSON.stringify({ message: `Hello, ${name}!` }),
|
|
89
|
+
{ headers: { 'Content-Type': 'application/json' } }
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
description:
|
|
93
|
+
type: string
|
|
94
|
+
description: Description of what the function does
|
|
95
|
+
example: "Returns a personalized greeting message"
|
|
96
|
+
status:
|
|
97
|
+
type: string
|
|
98
|
+
enum: ["draft", "active"]
|
|
99
|
+
default: "active"
|
|
100
|
+
description: Initial status (draft or active/deployed)
|
|
101
|
+
responses:
|
|
102
|
+
'201':
|
|
103
|
+
description: Function created successfully
|
|
104
|
+
content:
|
|
105
|
+
application/json:
|
|
106
|
+
schema:
|
|
107
|
+
type: object
|
|
108
|
+
properties:
|
|
109
|
+
success:
|
|
110
|
+
type: boolean
|
|
111
|
+
function:
|
|
112
|
+
$ref: '#/components/schemas/FunctionMetadata'
|
|
113
|
+
example:
|
|
114
|
+
success: true
|
|
115
|
+
function:
|
|
116
|
+
id: "123e4567-e89b-12d3-a456-426614174000"
|
|
117
|
+
slug: "hello-world"
|
|
118
|
+
name: "Hello World Function"
|
|
119
|
+
description: "Returns a greeting message"
|
|
120
|
+
status: "active"
|
|
121
|
+
created_at: "2024-01-21T10:30:00Z"
|
|
122
|
+
'400':
|
|
123
|
+
description: Invalid request
|
|
124
|
+
content:
|
|
125
|
+
application/json:
|
|
126
|
+
schema:
|
|
127
|
+
$ref: '#/components/schemas/ErrorResponse'
|
|
128
|
+
examples:
|
|
129
|
+
validation:
|
|
130
|
+
value:
|
|
131
|
+
error: "Invalid request"
|
|
132
|
+
details:
|
|
133
|
+
- code: "too_small"
|
|
134
|
+
minimum: 1
|
|
135
|
+
path: ["name"]
|
|
136
|
+
message: "Name is required"
|
|
137
|
+
dangerousCode:
|
|
138
|
+
value:
|
|
139
|
+
error: "Code contains potentially dangerous patterns"
|
|
140
|
+
pattern: "/Deno\\.run/i"
|
|
141
|
+
'409':
|
|
142
|
+
description: Function slug already exists
|
|
143
|
+
content:
|
|
144
|
+
application/json:
|
|
145
|
+
schema:
|
|
146
|
+
$ref: '#/components/schemas/ErrorResponse'
|
|
147
|
+
example:
|
|
148
|
+
error: "Function with this slug already exists"
|
|
149
|
+
details: "duplicate key value violates unique constraint"
|
|
150
|
+
'500':
|
|
151
|
+
description: Failed to create function
|
|
152
|
+
content:
|
|
153
|
+
application/json:
|
|
154
|
+
schema:
|
|
155
|
+
$ref: '#/components/schemas/ErrorResponse'
|
|
156
|
+
|
|
157
|
+
/api/functions/{slug}:
|
|
158
|
+
get:
|
|
159
|
+
summary: Get function details
|
|
160
|
+
description: Get a specific function including its code
|
|
161
|
+
tags:
|
|
162
|
+
- Admin
|
|
163
|
+
security:
|
|
164
|
+
- bearerAuth: []
|
|
165
|
+
parameters:
|
|
166
|
+
- name: slug
|
|
167
|
+
in: path
|
|
168
|
+
required: true
|
|
169
|
+
schema:
|
|
170
|
+
type: string
|
|
171
|
+
pattern: '^[a-zA-Z0-9_-]+$'
|
|
172
|
+
description: Function slug identifier
|
|
173
|
+
example: "hello-world"
|
|
174
|
+
responses:
|
|
175
|
+
'200':
|
|
176
|
+
description: Function details with code
|
|
177
|
+
content:
|
|
178
|
+
application/json:
|
|
179
|
+
schema:
|
|
180
|
+
$ref: '#/components/schemas/FunctionDetails'
|
|
181
|
+
example:
|
|
182
|
+
id: "123e4567-e89b-12d3-a456-426614174000"
|
|
183
|
+
slug: "hello-world"
|
|
184
|
+
name: "Hello World Function"
|
|
185
|
+
description: "Returns a greeting message"
|
|
186
|
+
code: |
|
|
187
|
+
export default async function(request) {
|
|
188
|
+
const { name = 'World' } = await request.json();
|
|
189
|
+
return new Response(
|
|
190
|
+
JSON.stringify({ message: `Hello, ${name}!` }),
|
|
191
|
+
{ headers: { 'Content-Type': 'application/json' } }
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
status: "active"
|
|
195
|
+
created_at: "2024-01-21T10:30:00Z"
|
|
196
|
+
updated_at: "2024-01-21T10:35:00Z"
|
|
197
|
+
deployed_at: "2024-01-21T10:35:00Z"
|
|
198
|
+
'404':
|
|
199
|
+
description: Function not found
|
|
200
|
+
content:
|
|
201
|
+
application/json:
|
|
202
|
+
schema:
|
|
203
|
+
$ref: '#/components/schemas/ErrorResponse'
|
|
204
|
+
example:
|
|
205
|
+
error: "Function not found"
|
|
206
|
+
'401':
|
|
207
|
+
description: Unauthorized
|
|
208
|
+
'403':
|
|
209
|
+
description: Forbidden - Admin only
|
|
210
|
+
'500':
|
|
211
|
+
description: Failed to get function
|
|
212
|
+
content:
|
|
213
|
+
application/json:
|
|
214
|
+
schema:
|
|
215
|
+
$ref: '#/components/schemas/ErrorResponse'
|
|
216
|
+
|
|
217
|
+
put:
|
|
218
|
+
summary: Update function
|
|
219
|
+
description: Update an existing function's code or metadata
|
|
220
|
+
tags:
|
|
221
|
+
- Admin
|
|
222
|
+
security:
|
|
223
|
+
- bearerAuth: []
|
|
224
|
+
parameters:
|
|
225
|
+
- name: slug
|
|
226
|
+
in: path
|
|
227
|
+
required: true
|
|
228
|
+
schema:
|
|
229
|
+
type: string
|
|
230
|
+
pattern: '^[a-zA-Z0-9_-]+$'
|
|
231
|
+
description: Function slug identifier
|
|
232
|
+
example: "hello-world"
|
|
233
|
+
requestBody:
|
|
234
|
+
required: true
|
|
235
|
+
content:
|
|
236
|
+
application/json:
|
|
237
|
+
schema:
|
|
238
|
+
type: object
|
|
239
|
+
properties:
|
|
240
|
+
name:
|
|
241
|
+
type: string
|
|
242
|
+
description: New display name
|
|
243
|
+
code:
|
|
244
|
+
type: string
|
|
245
|
+
description: Updated function code
|
|
246
|
+
description:
|
|
247
|
+
type: string
|
|
248
|
+
description: Updated description
|
|
249
|
+
status:
|
|
250
|
+
type: string
|
|
251
|
+
enum: ["draft", "active", "error"]
|
|
252
|
+
description: Function status
|
|
253
|
+
responses:
|
|
254
|
+
'200':
|
|
255
|
+
description: Function updated successfully
|
|
256
|
+
content:
|
|
257
|
+
application/json:
|
|
258
|
+
schema:
|
|
259
|
+
type: object
|
|
260
|
+
properties:
|
|
261
|
+
success:
|
|
262
|
+
type: boolean
|
|
263
|
+
function:
|
|
264
|
+
$ref: '#/components/schemas/FunctionMetadata'
|
|
265
|
+
example:
|
|
266
|
+
success: true
|
|
267
|
+
function:
|
|
268
|
+
id: "123e4567-e89b-12d3-a456-426614174000"
|
|
269
|
+
slug: "hello-world"
|
|
270
|
+
name: "Hello World Function v2"
|
|
271
|
+
description: "Returns a greeting message"
|
|
272
|
+
status: "active"
|
|
273
|
+
updated_at: "2024-01-21T11:00:00Z"
|
|
274
|
+
'400':
|
|
275
|
+
description: Invalid request
|
|
276
|
+
content:
|
|
277
|
+
application/json:
|
|
278
|
+
schema:
|
|
279
|
+
$ref: '#/components/schemas/ErrorResponse'
|
|
280
|
+
'404':
|
|
281
|
+
description: Function not found
|
|
282
|
+
content:
|
|
283
|
+
application/json:
|
|
284
|
+
schema:
|
|
285
|
+
$ref: '#/components/schemas/ErrorResponse'
|
|
286
|
+
example:
|
|
287
|
+
error: "Function not found"
|
|
288
|
+
'500':
|
|
289
|
+
description: Failed to update function
|
|
290
|
+
content:
|
|
291
|
+
application/json:
|
|
292
|
+
schema:
|
|
293
|
+
$ref: '#/components/schemas/ErrorResponse'
|
|
294
|
+
|
|
295
|
+
delete:
|
|
296
|
+
summary: Delete function
|
|
297
|
+
description: Permanently delete a function
|
|
298
|
+
tags:
|
|
299
|
+
- Admin
|
|
300
|
+
security:
|
|
301
|
+
- bearerAuth: []
|
|
302
|
+
parameters:
|
|
303
|
+
- name: slug
|
|
304
|
+
in: path
|
|
305
|
+
required: true
|
|
306
|
+
schema:
|
|
307
|
+
type: string
|
|
308
|
+
pattern: '^[a-zA-Z0-9_-]+$'
|
|
309
|
+
description: Function slug identifier
|
|
310
|
+
example: "hello-world"
|
|
311
|
+
responses:
|
|
312
|
+
'200':
|
|
313
|
+
description: Function deleted successfully
|
|
314
|
+
content:
|
|
315
|
+
application/json:
|
|
316
|
+
schema:
|
|
317
|
+
type: object
|
|
318
|
+
properties:
|
|
319
|
+
success:
|
|
320
|
+
type: boolean
|
|
321
|
+
message:
|
|
322
|
+
type: string
|
|
323
|
+
example:
|
|
324
|
+
success: true
|
|
325
|
+
message: "Function hello-world deleted successfully"
|
|
326
|
+
'404':
|
|
327
|
+
description: Function not found
|
|
328
|
+
content:
|
|
329
|
+
application/json:
|
|
330
|
+
schema:
|
|
331
|
+
$ref: '#/components/schemas/ErrorResponse'
|
|
332
|
+
example:
|
|
333
|
+
error: "Function not found"
|
|
334
|
+
'500':
|
|
335
|
+
description: Failed to delete function
|
|
336
|
+
content:
|
|
337
|
+
application/json:
|
|
338
|
+
schema:
|
|
339
|
+
$ref: '#/components/schemas/ErrorResponse'
|
|
340
|
+
|
|
341
|
+
/functions/{slug}:
|
|
342
|
+
post:
|
|
343
|
+
summary: Execute function
|
|
344
|
+
description: Execute a function with the provided request
|
|
345
|
+
tags:
|
|
346
|
+
- Client
|
|
347
|
+
parameters:
|
|
348
|
+
- name: slug
|
|
349
|
+
in: path
|
|
350
|
+
required: true
|
|
351
|
+
schema:
|
|
352
|
+
type: string
|
|
353
|
+
pattern: '^[a-zA-Z0-9_-]+$'
|
|
354
|
+
description: Function slug identifier
|
|
355
|
+
example: "hello-world"
|
|
356
|
+
requestBody:
|
|
357
|
+
required: false
|
|
358
|
+
content:
|
|
359
|
+
application/json:
|
|
360
|
+
schema:
|
|
361
|
+
type: object
|
|
362
|
+
additionalProperties: true
|
|
363
|
+
example:
|
|
364
|
+
name: "John"
|
|
365
|
+
age: 30
|
|
366
|
+
responses:
|
|
367
|
+
'200':
|
|
368
|
+
description: Function executed successfully
|
|
369
|
+
content:
|
|
370
|
+
'*/*':
|
|
371
|
+
schema:
|
|
372
|
+
type: object
|
|
373
|
+
additionalProperties: true
|
|
374
|
+
example:
|
|
375
|
+
message: "Hello, John!"
|
|
376
|
+
'404':
|
|
377
|
+
description: Function not found or not active
|
|
378
|
+
content:
|
|
379
|
+
application/json:
|
|
380
|
+
schema:
|
|
381
|
+
$ref: '#/components/schemas/ErrorResponse'
|
|
382
|
+
example:
|
|
383
|
+
error: "Function not found or not active"
|
|
384
|
+
'500':
|
|
385
|
+
description: Function execution error
|
|
386
|
+
content:
|
|
387
|
+
application/json:
|
|
388
|
+
schema:
|
|
389
|
+
$ref: '#/components/schemas/ErrorResponse'
|
|
390
|
+
example:
|
|
391
|
+
error: "Function execution failed"
|
|
392
|
+
message: "TypeError: Cannot read property 'name' of undefined"
|
|
393
|
+
|
|
394
|
+
components:
|
|
395
|
+
securitySchemes:
|
|
396
|
+
bearerAuth:
|
|
397
|
+
type: http
|
|
398
|
+
scheme: bearer
|
|
399
|
+
bearerFormat: JWT
|
|
400
|
+
|
|
401
|
+
schemas:
|
|
402
|
+
FunctionMetadata:
|
|
403
|
+
type: object
|
|
404
|
+
properties:
|
|
405
|
+
id:
|
|
406
|
+
type: string
|
|
407
|
+
format: uuid
|
|
408
|
+
description: Unique identifier for the function
|
|
409
|
+
slug:
|
|
410
|
+
type: string
|
|
411
|
+
description: URL-friendly identifier
|
|
412
|
+
example: "hello-world"
|
|
413
|
+
name:
|
|
414
|
+
type: string
|
|
415
|
+
description: Display name for the function
|
|
416
|
+
example: "Hello World Function"
|
|
417
|
+
description:
|
|
418
|
+
type: string
|
|
419
|
+
nullable: true
|
|
420
|
+
description: Description of what the function does
|
|
421
|
+
status:
|
|
422
|
+
type: string
|
|
423
|
+
enum: ["draft", "active", "error"]
|
|
424
|
+
description: Current status of the function
|
|
425
|
+
created_at:
|
|
426
|
+
type: string
|
|
427
|
+
format: date-time
|
|
428
|
+
description: When the function was created
|
|
429
|
+
updated_at:
|
|
430
|
+
type: string
|
|
431
|
+
format: date-time
|
|
432
|
+
description: When the function was last updated
|
|
433
|
+
deployed_at:
|
|
434
|
+
type: string
|
|
435
|
+
format: date-time
|
|
436
|
+
nullable: true
|
|
437
|
+
description: When the function was last deployed (null if never deployed)
|
|
438
|
+
required:
|
|
439
|
+
- id
|
|
440
|
+
- slug
|
|
441
|
+
- name
|
|
442
|
+
- status
|
|
443
|
+
- created_at
|
|
444
|
+
- updated_at
|
|
445
|
+
|
|
446
|
+
FunctionDetails:
|
|
447
|
+
allOf:
|
|
448
|
+
- $ref: '#/components/schemas/FunctionMetadata'
|
|
449
|
+
- type: object
|
|
450
|
+
properties:
|
|
451
|
+
code:
|
|
452
|
+
type: string
|
|
453
|
+
description: The function's JavaScript/TypeScript code
|
|
454
|
+
required:
|
|
455
|
+
- code
|
|
456
|
+
|
|
457
|
+
ErrorResponse:
|
|
458
|
+
type: object
|
|
459
|
+
properties:
|
|
460
|
+
error:
|
|
461
|
+
type: string
|
|
462
|
+
description: Error message
|
|
463
|
+
details:
|
|
464
|
+
oneOf:
|
|
465
|
+
- type: string
|
|
466
|
+
- type: array
|
|
467
|
+
items:
|
|
468
|
+
type: object
|
|
469
|
+
- type: object
|
|
470
|
+
description: Additional error details
|
|
471
|
+
message:
|
|
472
|
+
type: string
|
|
473
|
+
description: Detailed error message
|
|
474
|
+
pattern:
|
|
475
|
+
type: string
|
|
476
476
|
description: Pattern that caused validation failure (for dangerous code detection)
|