insforge 1.2.10 → 1.4.8
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 +46 -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 +30 -28
- package/auth/src/lib/broadcastService.ts +4 -4
- package/auth/src/lib/insforge.ts +8 -0
- package/auth/src/main.tsx +2 -4
- package/auth/src/pages/SignInPage.tsx +5 -2
- package/auth/src/pages/SignUpPage.tsx +5 -2
- package/auth/src/pages/VerifyEmailPage.tsx +18 -0
- package/auth/tsconfig.json +33 -32
- package/auth/tsconfig.node.json +11 -11
- package/backend/package.json +82 -75
- package/backend/src/api/middlewares/rate-limiters.ts +127 -127
- package/backend/src/api/routes/ai/index.routes.ts +475 -468
- package/backend/src/api/routes/auth/index.routes.ts +720 -570
- package/backend/src/api/routes/auth/oauth.routes.ts +478 -448
- package/backend/src/api/routes/database/advance.routes.ts +37 -16
- package/backend/src/api/routes/database/index.routes.ts +80 -1
- package/backend/src/api/routes/database/records.routes.ts +48 -184
- package/backend/src/api/routes/database/rpc.routes.ts +69 -0
- package/backend/src/api/routes/database/tables.routes.ts +0 -14
- package/backend/src/api/routes/deployments/index.routes.ts +192 -0
- package/backend/src/api/routes/docs/index.routes.ts +76 -76
- package/backend/src/api/routes/email/index.routes.ts +35 -0
- package/backend/src/api/routes/functions/index.routes.ts +21 -15
- package/backend/src/api/routes/metadata/index.routes.ts +38 -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/api/routes/webhooks/index.routes.ts +109 -0
- package/backend/src/infra/database/database.manager.ts +14 -11
- 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/database/migrations/018_schema-rework.sql +441 -0
- package/backend/src/infra/database/migrations/019_create-deployments-table.sql +36 -0
- package/backend/src/infra/database/migrations/020_add-audio-modality.sql +11 -0
- package/backend/src/infra/database/migrations/bootstrap/bootstrap-migrations.js +103 -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 +216 -125
- package/backend/src/infra/socket/socket.manager.ts +198 -64
- package/backend/src/providers/ai/openrouter.provider.ts +24 -12
- package/backend/src/providers/database/base.provider.ts +39 -0
- package/backend/src/providers/database/cloud.provider.ts +159 -0
- package/backend/src/providers/deployments/vercel.provider.ts +516 -0
- 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 +329 -284
- package/backend/src/services/ai/ai-config.service.ts +6 -6
- package/backend/src/services/ai/ai-model.service.ts +60 -60
- package/backend/src/services/ai/ai-usage.service.ts +7 -7
- package/backend/src/services/ai/chat-completion.service.ts +415 -220
- package/backend/src/services/ai/helpers.ts +64 -64
- package/backend/src/services/ai/image-generation.service.ts +3 -3
- package/backend/src/services/ai/index.ts +13 -13
- package/backend/src/services/auth/auth-config.service.ts +4 -4
- package/backend/src/services/auth/auth-otp.service.ts +6 -6
- package/backend/src/services/auth/auth.service.ts +148 -74
- package/backend/src/services/auth/index.ts +4 -4
- package/backend/src/services/auth/oauth-config.service.ts +12 -12
- package/backend/src/services/database/database-advance.service.ts +19 -55
- package/backend/src/services/database/database-table.service.ts +38 -94
- package/backend/src/services/database/database.service.ts +127 -0
- package/backend/src/services/database/postgrest-proxy.service.ts +165 -0
- package/backend/src/services/deployments/deployment.service.ts +693 -0
- package/backend/src/services/email/email.service.ts +5 -7
- package/backend/src/services/functions/function.service.ts +61 -41
- package/backend/src/services/logs/audit.service.ts +10 -10
- 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/services/secrets/secret.service.ts +101 -27
- package/backend/src/services/storage/storage.service.ts +30 -30
- package/backend/src/services/usage/usage.service.ts +6 -6
- package/backend/src/types/ai.ts +8 -0
- package/backend/src/types/auth.ts +16 -1
- package/backend/src/types/database.ts +2 -0
- package/backend/src/types/deployments.ts +33 -0
- package/backend/src/types/realtime.ts +18 -0
- package/backend/src/types/socket.ts +7 -31
- package/backend/src/types/storage.ts +1 -1
- package/backend/src/types/webhooks.ts +45 -0
- package/backend/src/utils/cookies.ts +34 -0
- package/backend/src/utils/environment.ts +0 -14
- package/backend/src/utils/s3-config-loader.ts +64 -0
- package/backend/src/utils/seed.ts +79 -43
- package/backend/src/utils/sql-parser.ts +216 -0
- package/backend/src/utils/utils.ts +114 -114
- package/backend/src/utils/validations.ts +10 -10
- 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-rpc.sh +141 -0
- 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-ai-model-plugins.sh +258 -0
- 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/tests/unit/database-advance.test.ts +326 -0
- package/backend/tests/unit/helpers.test.ts +2 -2
- 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 +273 -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/deployment.md +79 -0
- package/docs/agent-docs/real-time.md +269 -0
- package/docs/changelog.mdx +212 -67
- package/docs/core-concepts/ai/architecture.mdx +350 -372
- package/docs/core-concepts/ai/sdk.mdx +238 -213
- package/docs/core-concepts/authentication/architecture.mdx +276 -278
- package/docs/core-concepts/authentication/sdk.mdx +710 -414
- package/docs/core-concepts/authentication/ui-components/customization.mdx +733 -529
- package/docs/core-concepts/authentication/ui-components/nextjs.mdx +247 -221
- package/docs/core-concepts/authentication/ui-components/react-router.mdx +183 -184
- package/docs/core-concepts/authentication/ui-components/react.mdx +136 -129
- package/docs/core-concepts/database/architecture.mdx +292 -255
- package/docs/core-concepts/database/pgvector.mdx +138 -0
- package/docs/core-concepts/database/sdk.mdx +382 -382
- package/docs/core-concepts/deployments/architecture.mdx +152 -0
- package/docs/core-concepts/email/architecture.mdx +103 -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 +183 -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 +240 -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.png +0 -0
- package/docs/favicon.svg +4 -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/apple-oauth.mp4 +0 -0
- package/docs/images/changelog/dec-2025/mcp-installer.png +0 -0
- package/docs/images/changelog/dec-2025/moreModels.png +0 -0
- package/docs/images/changelog/dec-2025/multi-region.webp +0 -0
- package/docs/images/changelog/dec-2025/postgres-connection.webp +0 -0
- package/docs/images/changelog/dec-2025/realtime-module.jpg +0 -0
- package/docs/images/changelog/dec-2025/realtime2.png +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/images/mcp-setup/CC-MCP-1.mp4 +0 -0
- package/docs/images/mcp-setup/CC-MCP-2.mp4 +0 -0
- package/docs/images/mcp-setup/Cursor-MCP-1.mp4 +0 -0
- package/docs/images/mcp-setup/Cursor-MCP-2.mp4 +0 -0
- package/docs/images/mcp-setup/Cursor-MCP-3.mp4 +0 -0
- package/docs/images/mcp-setup/claude-code-connect.png +0 -0
- package/docs/images/mcp-setup/cline-1.png +0 -0
- package/docs/images/mcp-setup/cline-2.png +0 -0
- package/docs/images/mcp-setup/cline-3.png +0 -0
- package/docs/images/mcp-setup/connect-project.png +0 -0
- package/docs/images/mcp-setup/copilot-1.png +0 -0
- package/docs/images/mcp-setup/copilot-2.png +0 -0
- package/docs/images/mcp-setup/copilot-3.png +0 -0
- package/docs/images/mcp-setup/mcp-json-1.png +0 -0
- package/docs/images/mcp-setup/mcp-json-2.png +0 -0
- package/docs/images/mcp-setup/qoder-1.png +0 -0
- package/docs/images/mcp-setup/qoder-2.png +0 -0
- package/docs/images/mcp-setup/roocode-1.png +0 -0
- package/docs/images/mcp-setup/roocode-2.png +0 -0
- package/docs/images/mcp-setup/trae-1.png +0 -0
- package/docs/images/mcp-setup/trae-2.png +0 -0
- package/docs/images/mcp-setup/trae-3.png +0 -0
- package/docs/images/mcp-setup/trae-4.png +0 -0
- package/docs/images/mcp-setup/trae-5.png +0 -0
- package/docs/images/mcp-setup/windsurf-1.png +0 -0
- package/docs/images/mcp-setup/windsurf-2.png +0 -0
- package/docs/insforge-instructions-sdk.md +93 -88
- package/docs/introduction.mdx +46 -45
- package/docs/logo/dark.svg +22 -22
- package/docs/logo/light.svg +20 -20
- package/docs/mcp-setup.mdx +332 -0
- package/docs/oauth-server.mdx +563 -0
- package/docs/partnership.mdx +720 -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/docs/vscode-extension.mdx +74 -0
- package/eslint.config.js +1 -0
- 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/App.tsx +8 -3
- 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/antigravity.svg +1 -0
- 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/copilot.svg +10 -0
- package/frontend/src/assets/logos/cursor.svg +20 -20
- package/frontend/src/assets/logos/deepseek.svg +139 -0
- 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/kiro.svg +9 -0
- package/frontend/src/assets/logos/linkedin.svg +3 -3
- package/frontend/src/assets/logos/openai.svg +10 -10
- package/frontend/src/assets/logos/qoder.svg +4 -0
- package/frontend/src/assets/logos/qwen.svg +15 -0
- 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/CodeBlock.tsx +2 -2
- package/frontend/src/components/ConnectCTA.tsx +3 -2
- package/frontend/src/components/datagrid/DataGrid.tsx +90 -62
- package/frontend/src/components/datagrid/datagridTypes.tsx +2 -1
- package/frontend/src/components/datagrid/index.ts +1 -1
- package/frontend/src/components/index.ts +0 -1
- package/frontend/src/components/layout/AppHeader.tsx +13 -37
- package/frontend/src/components/layout/AppSidebar.tsx +85 -100
- package/frontend/src/components/layout/Layout.tsx +34 -32
- package/frontend/src/components/layout/PrimaryMenu.tsx +12 -4
- package/frontend/src/components/radix/Select.tsx +151 -151
- package/frontend/src/features/ai/components/AIConfigCard.tsx +200 -200
- package/frontend/src/features/ai/components/AIEmptyState.tsx +23 -23
- package/frontend/src/features/ai/components/ModalityFilterSidebar.tsx +102 -101
- package/frontend/src/features/ai/components/ModelSelectionDialog.tsx +135 -135
- package/frontend/src/features/ai/components/ModelSelectionGrid.tsx +51 -51
- package/frontend/src/features/ai/components/SystemPromptDialog.tsx +118 -118
- package/frontend/src/features/ai/components/index.ts +6 -6
- package/frontend/src/features/ai/helpers.ts +147 -141
- package/frontend/src/features/ai/{page → pages}/AIPage.tsx +166 -166
- package/frontend/src/features/auth/components/AuthPreview.tsx +96 -96
- package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +1 -0
- package/frontend/src/features/auth/components/UsersDataGrid.tsx +61 -31
- package/frontend/src/features/auth/components/index.ts +5 -5
- package/frontend/src/features/auth/helpers.tsx +8 -0
- package/frontend/src/features/auth/{page → pages}/AuthMethodsPage.tsx +275 -275
- package/frontend/src/features/auth/{page → pages}/UsersPage.tsx +0 -28
- package/frontend/src/features/dashboard/{page → pages}/DashboardPage.tsx +1 -1
- package/frontend/src/features/database/components/DatabaseDataGrid.tsx +0 -2
- package/frontend/src/features/database/components/ForeignKeyCell.tsx +38 -11
- package/frontend/src/features/database/components/ForeignKeyPopover.tsx +18 -8
- package/frontend/src/features/database/components/LinkRecordModal.tsx +61 -13
- package/frontend/src/features/database/components/RecordFormField.tsx +1 -1
- 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/components/TableSidebar.tsx +0 -3
- package/frontend/src/features/database/components/TablesEmptyState.tsx +1 -1
- package/frontend/src/features/database/components/TemplatePreview.tsx +1 -2
- package/frontend/src/features/database/constants.ts +16 -28
- package/frontend/src/features/database/hooks/useCSVImport.ts +3 -2
- package/frontend/src/features/database/hooks/useDatabase.ts +66 -0
- package/frontend/src/features/database/hooks/useRawSQL.ts +3 -2
- package/frontend/src/features/database/hooks/useTables.ts +30 -28
- package/frontend/src/features/database/index.ts +1 -0
- package/frontend/src/features/database/{page → pages}/FunctionsPage.tsx +29 -42
- package/frontend/src/features/database/{page → pages}/IndexesPage.tsx +34 -51
- package/frontend/src/features/database/{page → pages}/PoliciesPage.tsx +42 -58
- package/frontend/src/features/database/{page → pages}/SQLEditorPage.tsx +2 -2
- package/frontend/src/features/database/{page → pages}/TablesPage.tsx +0 -42
- package/frontend/src/features/database/{page → pages}/TriggersPage.tsx +34 -51
- package/frontend/src/features/database/services/advance.service.ts +1 -41
- package/frontend/src/features/database/services/database.service.ts +55 -0
- package/frontend/src/features/database/services/record.service.ts +4 -20
- package/frontend/src/features/database/services/table.service.ts +1 -10
- package/frontend/src/features/database/templates/ai-chatbot.ts +6 -6
- package/frontend/src/features/database/templates/ecommerce-platform.ts +2 -2
- package/frontend/src/features/database/templates/instagram-clone.ts +10 -10
- package/frontend/src/features/database/templates/notion-clone.ts +8 -8
- package/frontend/src/features/database/templates/reddit-clone.ts +10 -10
- package/frontend/src/features/deployments/components/DeploymentRow.tsx +93 -0
- package/frontend/src/features/deployments/components/DeploymentsEmptyState.tsx +15 -0
- package/frontend/src/features/deployments/hooks/useDeployments.ts +157 -0
- package/frontend/src/features/deployments/pages/DeploymentsPage.tsx +318 -0
- package/frontend/src/features/deployments/services/deployments.service.ts +63 -0
- package/frontend/src/features/functions/components/FunctionRow.tsx +72 -72
- package/frontend/src/features/functions/components/FunctionsSidebar.tsx +56 -56
- package/frontend/src/features/functions/components/SecretRow.tsx +3 -3
- package/frontend/src/features/functions/components/index.ts +5 -5
- package/frontend/src/features/functions/hooks/useFunctions.ts +5 -4
- package/frontend/src/features/functions/hooks/useSecrets.ts +6 -9
- package/frontend/src/features/functions/{page → pages}/FunctionsPage.tsx +21 -44
- package/frontend/src/features/functions/{page → pages}/SecretsPage.tsx +118 -116
- package/frontend/src/features/functions/services/function.service.ts +8 -25
- package/frontend/src/features/functions/services/secret.service.ts +23 -41
- package/frontend/src/features/login/{page → pages}/CloudLoginPage.tsx +125 -118
- package/frontend/src/features/logs/components/LogDetailPanel.tsx +41 -0
- package/frontend/src/features/logs/components/LogsDataGrid.tsx +32 -1
- package/frontend/src/features/logs/components/index.ts +1 -0
- package/frontend/src/features/logs/hooks/useMcpUsage.ts +13 -66
- package/frontend/src/features/logs/{page → pages}/LogsPage.tsx +36 -6
- package/frontend/src/features/onboard/components/ApiCredentialsSection.tsx +59 -0
- package/frontend/src/features/onboard/components/ConnectionStringSection.tsx +180 -0
- package/frontend/src/features/onboard/components/McpConnectionSection.tsx +159 -0
- package/frontend/src/features/onboard/components/OnboardingController.tsx +68 -0
- package/frontend/src/features/onboard/components/OnboardingModal.tsx +121 -267
- package/frontend/src/features/onboard/components/ShowPasswordButton.tsx +21 -0
- package/frontend/src/features/onboard/components/index.ts +9 -4
- package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +1 -1
- package/frontend/src/features/onboard/components/mcp/QoderDeeplinkGenerator.tsx +36 -0
- package/frontend/src/features/onboard/components/mcp/helpers.tsx +123 -98
- package/frontend/src/features/onboard/components/mcp/index.ts +4 -3
- package/frontend/src/features/onboard/index.ts +17 -13
- 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/settings/pages/SettingsPage.tsx +349 -0
- package/frontend/src/features/storage/{page → pages}/StoragePage.tsx +1 -29
- package/frontend/src/features/visualizer/components/AuthNode.tsx +4 -4
- package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +24 -11
- package/frontend/src/features/visualizer/{page → pages}/VisualizerPage.tsx +11 -36
- package/frontend/src/index.css +249 -249
- package/frontend/src/lib/contexts/ModalContext.tsx +35 -0
- package/frontend/src/lib/contexts/SocketContext.tsx +119 -75
- package/frontend/src/lib/hooks/useMetadata.ts +45 -1
- package/frontend/src/lib/hooks/useModal.tsx +2 -0
- package/frontend/src/lib/routing/AppRoutes.tsx +103 -84
- package/frontend/src/lib/services/metadata.service.ts +20 -3
- package/frontend/src/lib/utils/cloudMessaging.ts +1 -1
- package/frontend/src/lib/utils/menuItems.ts +223 -183
- package/frontend/src/lib/utils/utils.ts +196 -183
- package/frontend/tsconfig.json +25 -25
- package/frontend/tsconfig.node.json +9 -9
- package/functions/deno.json +24 -24
- package/functions/server.ts +6 -6
- package/functions/worker-template.js +1 -1
- 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 +825 -715
- package/openapi/auth.yaml +1324 -1244
- package/openapi/email.yaml +158 -0
- package/openapi/functions.yaml +475 -475
- package/openapi/health.yaml +29 -29
- package/openapi/logs.yaml +221 -223
- package/openapi/metadata.yaml +175 -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 +462 -463
- package/package.json +97 -97
- package/shared-schemas/package.json +31 -31
- package/shared-schemas/src/ai-api.schema.ts +251 -143
- package/shared-schemas/src/ai.schema.ts +8 -4
- package/shared-schemas/src/auth-api.schema.ts +380 -339
- package/shared-schemas/src/auth.schema.ts +18 -11
- package/shared-schemas/src/cloud-events.schema.ts +26 -0
- package/shared-schemas/src/database-api.schema.ts +32 -1
- package/shared-schemas/src/database.schema.ts +39 -0
- package/shared-schemas/src/deployments-api.schema.ts +55 -0
- package/shared-schemas/src/deployments.schema.ts +30 -0
- package/shared-schemas/src/docs.schema.ts +32 -0
- package/shared-schemas/src/email-api.schema.ts +30 -0
- package/shared-schemas/src/functions-api.schema.ts +13 -4
- package/shared-schemas/src/functions.schema.ts +1 -1
- package/shared-schemas/src/index.ts +22 -14
- package/shared-schemas/src/metadata.schema.ts +39 -4
- package/shared-schemas/src/realtime-api.schema.ts +111 -0
- package/shared-schemas/src/realtime.schema.ts +143 -0
- package/shared-schemas/src/secrets-api.schema.ts +44 -0
- package/shared-schemas/src/secrets.schema.ts +15 -0
- package/shared-schemas/tsconfig.json +21 -21
- package/tsconfig.json +7 -7
- package/zeabur/README.md +26 -13
- package/zeabur/template.yml +1001 -1032
- package/.cursor/rules/cursor-rules.mdc +0 -94
- package/backend/src/types/profile.ts +0 -55
- package/frontend/src/components/ProjectInfoModal.tsx +0 -128
- 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/auth/{page → pages}/ConfigurationPage.tsx +0 -0
- /package/frontend/src/features/database/{page → pages}/TemplatesPage.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}/MCPLogsPage.tsx +0 -0
|
@@ -1,279 +1,279 @@
|
|
|
1
|
-
# Insforge OSS Storage API Documentation
|
|
2
|
-
|
|
3
|
-
## API Basics
|
|
4
|
-
|
|
5
|
-
**Base URL:** `http://localhost:7130`
|
|
6
|
-
**Authentication:**
|
|
7
|
-
- **Upload operations (PUT/POST/DELETE):** Requires `Authorization: Bearer <token>` header
|
|
8
|
-
- **Download from public buckets:** No authentication required
|
|
9
|
-
- **List/manage buckets:** Requires authentication
|
|
10
|
-
- **API keys are for MCP testing** (use tokens for production)
|
|
11
|
-
**System:** Bucket-based storage with public/private access control
|
|
12
|
-
|
|
13
|
-
### 🔴 CRITICAL: URL Format
|
|
14
|
-
**Storage returns ABSOLUTE URLs** that are ready to use directly:
|
|
15
|
-
- Response `url` field contains complete URL: `http://localhost:7130/api/storage/buckets/{bucket}/objects/{filename}`
|
|
16
|
-
- **DO NOT prepend host or modify the URL** - use it exactly as returned
|
|
17
|
-
- URLs work directly in `<img src>`, `<video src>`, or fetch requests
|
|
18
|
-
- Example: `"url": "http://localhost:7130/api/storage/buckets/avatars/objects/user123.jpg"`
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
## Bucket Operations (Use MCP Tools)
|
|
22
|
-
|
|
23
|
-
### Available MCP Tools
|
|
24
|
-
1. **create-bucket** - Create bucket (`bucketName`, `isPublic`: true by default)
|
|
25
|
-
2. **list-buckets** - List all buckets
|
|
26
|
-
3. **delete-bucket** - Delete bucket
|
|
27
|
-
|
|
28
|
-
## Object Operations (Use REST API)
|
|
29
|
-
|
|
30
|
-
### Base URL
|
|
31
|
-
`/api/storage/buckets/:bucketName/objects/:objectKey`
|
|
32
|
-
|
|
33
|
-
### Upload Object with Specific Key
|
|
34
|
-
**PUT** `/api/storage/buckets/:bucketName/objects/:objectKey`
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
Send object as multipart/form-data:
|
|
38
|
-
```javascript
|
|
39
|
-
const formData = new FormData();
|
|
40
|
-
formData.append('file', fileObject);
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
Returns:
|
|
44
|
-
```json
|
|
45
|
-
{
|
|
46
|
-
"bucket": "test-images",
|
|
47
|
-
"key": "test.txt",
|
|
48
|
-
"size": 30,
|
|
49
|
-
"mimeType": "text/plain",
|
|
50
|
-
"uploadedAt": "2025-07-18T04:32:13.801Z",
|
|
51
|
-
"url": "http://localhost:7130/api/storage/buckets/test-images/objects/test.txt"
|
|
52
|
-
}
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
Example curl:
|
|
56
|
-
```bash
|
|
57
|
-
# Windows PowerShell: use curl.exe
|
|
58
|
-
curl -X PUT http://localhost:7130/api/storage/buckets/avatars/objects/user123.jpg \
|
|
59
|
-
-H "Authorization: Bearer YOUR_SESSION_TOKEN" \
|
|
60
|
-
-F "file=@/path/to/image.jpg"
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
### Upload Object with Auto-Generated Key
|
|
64
|
-
**POST** `/api/storage/buckets/:bucketName/objects`
|
|
65
|
-
|
|
66
|
-
Request:
|
|
67
|
-
```bash
|
|
68
|
-
# Windows PowerShell: use curl.exe
|
|
69
|
-
curl -X POST http://localhost:7130/api/storage/buckets/posts/objects \
|
|
70
|
-
-H "Authorization: Bearer YOUR_SESSION_TOKEN" \
|
|
71
|
-
-F "file=@/path/to/image.jpg"
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
Response:
|
|
75
|
-
```json
|
|
76
|
-
{
|
|
77
|
-
"bucket": "avatars",
|
|
78
|
-
"key": "image-1737546841234-a3f2b1.jpg",
|
|
79
|
-
"size": 15234,
|
|
80
|
-
"mimeType": "image/jpeg",
|
|
81
|
-
"uploadedAt": "2025-07-18T04:32:13.801Z",
|
|
82
|
-
"url": "http://localhost:7130/api/storage/buckets/avatars/objects/image-1737546841234-a3f2b1.jpg"
|
|
83
|
-
}
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
### Download Object
|
|
87
|
-
**GET** `/api/storage/buckets/:bucketName/objects/:objectKey`
|
|
88
|
-
|
|
89
|
-
Returns the actual object content with appropriate content-type headers.
|
|
90
|
-
**Note:** Public buckets allow downloads without authentication.
|
|
91
|
-
|
|
92
|
-
Example response: Raw object content (not JSON wrapped)
|
|
93
|
-
|
|
94
|
-
### List Objects
|
|
95
|
-
**GET** `/api/storage/buckets/:bucketName/objects`
|
|
96
|
-
|
|
97
|
-
Query parameters:
|
|
98
|
-
- `prefix` - Filter by key prefix
|
|
99
|
-
- `limit` - Max results (default: 100)
|
|
100
|
-
- `offset` - Pagination offset
|
|
101
|
-
|
|
102
|
-
Returns:
|
|
103
|
-
```json
|
|
104
|
-
{
|
|
105
|
-
"bucketName": "test-images",
|
|
106
|
-
"prefix": null,
|
|
107
|
-
"objects": [
|
|
108
|
-
{
|
|
109
|
-
"bucket": "test-images",
|
|
110
|
-
"key": "test.txt",
|
|
111
|
-
"size": 30,
|
|
112
|
-
"mimeType": "text/plain",
|
|
113
|
-
"uploadedAt": "2025-07-18T04:32:13.801Z",
|
|
114
|
-
"url": "http://localhost:7130/api/storage/buckets/test-images/objects/test.txt"
|
|
115
|
-
}
|
|
116
|
-
],
|
|
117
|
-
"pagination": {
|
|
118
|
-
"limit": 100,
|
|
119
|
-
"offset": 0,
|
|
120
|
-
"total": 1
|
|
121
|
-
},
|
|
122
|
-
"nextActions": "You can use PUT /api/storage/buckets/:bucketName/objects/:objectKey to upload with a specific key, or POST /api/storage/buckets/:bucketName/objects to upload with auto-generated key, and GET /api/storage/buckets/:bucketName/objects/:objectKey to download an object."
|
|
123
|
-
}
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
Pagination headers:
|
|
127
|
-
- `X-Total-Count`: Total number of objects
|
|
128
|
-
- `X-Page`: Current page number
|
|
129
|
-
- `X-Page-Size`: Number of items per page
|
|
130
|
-
|
|
131
|
-
Example curl:
|
|
132
|
-
```bash
|
|
133
|
-
# Windows PowerShell: use curl.exe
|
|
134
|
-
curl -X GET "http://localhost:7130/api/storage/buckets/avatars/objects?limit=10&prefix=users/" \
|
|
135
|
-
-H "Authorization: Bearer <token>"
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
### Delete Object
|
|
139
|
-
**DELETE** `/api/storage/buckets/:bucketName/objects/:objectKey`
|
|
140
|
-
|
|
141
|
-
Returns:
|
|
142
|
-
```json
|
|
143
|
-
{
|
|
144
|
-
"message": "Object deleted successfully"
|
|
145
|
-
}
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
Example curl:
|
|
149
|
-
```bash
|
|
150
|
-
# Windows PowerShell: use curl.exe
|
|
151
|
-
curl -X DELETE http://localhost:7130/api/storage/buckets/avatars/objects/user123.jpg \
|
|
152
|
-
-H "Authorization: Bearer <token>"
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
### Update Bucket
|
|
156
|
-
**PATCH** `/api/storage/buckets/:bucketName`
|
|
157
|
-
|
|
158
|
-
Request body:
|
|
159
|
-
```json
|
|
160
|
-
{ "isPublic": true }
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
Returns:
|
|
164
|
-
```json
|
|
165
|
-
{
|
|
166
|
-
"message": "Bucket visibility updated",
|
|
167
|
-
"bucket": "test-images",
|
|
168
|
-
"isPublic": false,
|
|
169
|
-
"nextActions": "Bucket is now PRIVATE - authentication is required to access objects."
|
|
170
|
-
}
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
Example curl:
|
|
174
|
-
```bash
|
|
175
|
-
# Mac/Linux
|
|
176
|
-
curl -X PATCH http://localhost:7130/api/storage/buckets/avatars \
|
|
177
|
-
-H 'Authorization: Bearer <token>' \
|
|
178
|
-
-H 'Content-Type: application/json' \
|
|
179
|
-
-d '{"isPublic": true}'
|
|
180
|
-
|
|
181
|
-
# Windows PowerShell (use curl.exe) - different quotes needed for nested JSON
|
|
182
|
-
curl.exe -X PATCH http://localhost:7130/api/storage/buckets/avatars \
|
|
183
|
-
-H "Authorization: Bearer <token>" \
|
|
184
|
-
-H "Content-Type: application/json" \
|
|
185
|
-
-d '{\"isPublic\": true}'
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
## Database Integration
|
|
189
|
-
|
|
190
|
-
### Option 1: Upload with Specific Key (PUT)
|
|
191
|
-
```javascript
|
|
192
|
-
// Step 1: Upload object with known key
|
|
193
|
-
const formData = new FormData();
|
|
194
|
-
formData.append('file', file);
|
|
195
|
-
const upload = await fetch('/api/storage/buckets/images/objects/avatar.jpg', {
|
|
196
|
-
method: 'PUT',
|
|
197
|
-
headers: { 'Authorization': `Bearer ${token}` },
|
|
198
|
-
body: formData
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
// Step 2: Store metadata
|
|
202
|
-
const records = [{
|
|
203
|
-
userId: 'user123',
|
|
204
|
-
image: await upload.json() // Store object metadata
|
|
205
|
-
}];
|
|
206
|
-
await fetch('/api/database/profiles', {
|
|
207
|
-
method: 'POST',
|
|
208
|
-
headers: {
|
|
209
|
-
'Authorization': `Bearer ${token}`,
|
|
210
|
-
'Content-Type': 'application/json'
|
|
211
|
-
},
|
|
212
|
-
body: JSON.stringify(records)
|
|
213
|
-
});
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
### Option 2: Upload with Auto-Generated Key (POST)
|
|
217
|
-
```javascript
|
|
218
|
-
// Step 1: Upload object with auto-generated key
|
|
219
|
-
const formData = new FormData();
|
|
220
|
-
formData.append('file', file);
|
|
221
|
-
const upload = await fetch('/api/storage/buckets/images/objects', {
|
|
222
|
-
method: 'POST',
|
|
223
|
-
headers: { 'Authorization': `Bearer ${token}` },
|
|
224
|
-
body: formData
|
|
225
|
-
});
|
|
226
|
-
const fileData = await upload.json();
|
|
227
|
-
|
|
228
|
-
// Step 2: Store metadata with generated key
|
|
229
|
-
const records = [{
|
|
230
|
-
userId: 'user123',
|
|
231
|
-
image: fileData // Contains auto-generated key
|
|
232
|
-
}];
|
|
233
|
-
await fetch('/api/database/profiles', {
|
|
234
|
-
method: 'POST',
|
|
235
|
-
headers: {
|
|
236
|
-
'Authorization': `Bearer ${token}`,
|
|
237
|
-
'Content-Type': 'application/json'
|
|
238
|
-
},
|
|
239
|
-
body: JSON.stringify(records)
|
|
240
|
-
});
|
|
241
|
-
```
|
|
242
|
-
|
|
243
|
-
## Error Response Format
|
|
244
|
-
|
|
245
|
-
All error responses follow this format:
|
|
246
|
-
```json
|
|
247
|
-
{
|
|
248
|
-
"error": "ERROR_CODE",
|
|
249
|
-
"message": "Human-readable error message",
|
|
250
|
-
"statusCode": 400,
|
|
251
|
-
"nextActions": "Suggested action to resolve the error"
|
|
252
|
-
}
|
|
253
|
-
```
|
|
254
|
-
|
|
255
|
-
Example error:
|
|
256
|
-
```json
|
|
257
|
-
{
|
|
258
|
-
"error": "BUCKET_NOT_FOUND",
|
|
259
|
-
"message": "Bucket 'nonexistent' does not exist",
|
|
260
|
-
"statusCode": 404,
|
|
261
|
-
"nextActions": "Create the bucket first"
|
|
262
|
-
}
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
## Important Rules
|
|
266
|
-
|
|
267
|
-
1. **Object Operations**
|
|
268
|
-
- Upload uses multipart/form-data
|
|
269
|
-
- Database stores metadata only
|
|
270
|
-
- Use `json` column type for object metadata
|
|
271
|
-
|
|
272
|
-
2. **Bucket Names**
|
|
273
|
-
- Must be valid identifiers
|
|
274
|
-
- Cannot start with underscore
|
|
275
|
-
|
|
276
|
-
3. **Remember**
|
|
277
|
-
- Bucket management uses MCP tools
|
|
278
|
-
- Object operations use REST API
|
|
1
|
+
# Insforge OSS Storage API Documentation
|
|
2
|
+
|
|
3
|
+
## API Basics
|
|
4
|
+
|
|
5
|
+
**Base URL:** `http://localhost:7130`
|
|
6
|
+
**Authentication:**
|
|
7
|
+
- **Upload operations (PUT/POST/DELETE):** Requires `Authorization: Bearer <token>` header
|
|
8
|
+
- **Download from public buckets:** No authentication required
|
|
9
|
+
- **List/manage buckets:** Requires authentication
|
|
10
|
+
- **API keys are for MCP testing** (use tokens for production)
|
|
11
|
+
**System:** Bucket-based storage with public/private access control
|
|
12
|
+
|
|
13
|
+
### 🔴 CRITICAL: URL Format
|
|
14
|
+
**Storage returns ABSOLUTE URLs** that are ready to use directly:
|
|
15
|
+
- Response `url` field contains complete URL: `http://localhost:7130/api/storage/buckets/{bucket}/objects/{filename}`
|
|
16
|
+
- **DO NOT prepend host or modify the URL** - use it exactly as returned
|
|
17
|
+
- URLs work directly in `<img src>`, `<video src>`, or fetch requests
|
|
18
|
+
- Example: `"url": "http://localhost:7130/api/storage/buckets/avatars/objects/user123.jpg"`
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
## Bucket Operations (Use MCP Tools)
|
|
22
|
+
|
|
23
|
+
### Available MCP Tools
|
|
24
|
+
1. **create-bucket** - Create bucket (`bucketName`, `isPublic`: true by default)
|
|
25
|
+
2. **list-buckets** - List all buckets
|
|
26
|
+
3. **delete-bucket** - Delete bucket
|
|
27
|
+
|
|
28
|
+
## Object Operations (Use REST API)
|
|
29
|
+
|
|
30
|
+
### Base URL
|
|
31
|
+
`/api/storage/buckets/:bucketName/objects/:objectKey`
|
|
32
|
+
|
|
33
|
+
### Upload Object with Specific Key
|
|
34
|
+
**PUT** `/api/storage/buckets/:bucketName/objects/:objectKey`
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
Send object as multipart/form-data:
|
|
38
|
+
```javascript
|
|
39
|
+
const formData = new FormData();
|
|
40
|
+
formData.append('file', fileObject);
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Returns:
|
|
44
|
+
```json
|
|
45
|
+
{
|
|
46
|
+
"bucket": "test-images",
|
|
47
|
+
"key": "test.txt",
|
|
48
|
+
"size": 30,
|
|
49
|
+
"mimeType": "text/plain",
|
|
50
|
+
"uploadedAt": "2025-07-18T04:32:13.801Z",
|
|
51
|
+
"url": "http://localhost:7130/api/storage/buckets/test-images/objects/test.txt"
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Example curl:
|
|
56
|
+
```bash
|
|
57
|
+
# Windows PowerShell: use curl.exe
|
|
58
|
+
curl -X PUT http://localhost:7130/api/storage/buckets/avatars/objects/user123.jpg \
|
|
59
|
+
-H "Authorization: Bearer YOUR_SESSION_TOKEN" \
|
|
60
|
+
-F "file=@/path/to/image.jpg"
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Upload Object with Auto-Generated Key
|
|
64
|
+
**POST** `/api/storage/buckets/:bucketName/objects`
|
|
65
|
+
|
|
66
|
+
Request:
|
|
67
|
+
```bash
|
|
68
|
+
# Windows PowerShell: use curl.exe
|
|
69
|
+
curl -X POST http://localhost:7130/api/storage/buckets/posts/objects \
|
|
70
|
+
-H "Authorization: Bearer YOUR_SESSION_TOKEN" \
|
|
71
|
+
-F "file=@/path/to/image.jpg"
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Response:
|
|
75
|
+
```json
|
|
76
|
+
{
|
|
77
|
+
"bucket": "avatars",
|
|
78
|
+
"key": "image-1737546841234-a3f2b1.jpg",
|
|
79
|
+
"size": 15234,
|
|
80
|
+
"mimeType": "image/jpeg",
|
|
81
|
+
"uploadedAt": "2025-07-18T04:32:13.801Z",
|
|
82
|
+
"url": "http://localhost:7130/api/storage/buckets/avatars/objects/image-1737546841234-a3f2b1.jpg"
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Download Object
|
|
87
|
+
**GET** `/api/storage/buckets/:bucketName/objects/:objectKey`
|
|
88
|
+
|
|
89
|
+
Returns the actual object content with appropriate content-type headers.
|
|
90
|
+
**Note:** Public buckets allow downloads without authentication.
|
|
91
|
+
|
|
92
|
+
Example response: Raw object content (not JSON wrapped)
|
|
93
|
+
|
|
94
|
+
### List Objects
|
|
95
|
+
**GET** `/api/storage/buckets/:bucketName/objects`
|
|
96
|
+
|
|
97
|
+
Query parameters:
|
|
98
|
+
- `prefix` - Filter by key prefix
|
|
99
|
+
- `limit` - Max results (default: 100)
|
|
100
|
+
- `offset` - Pagination offset
|
|
101
|
+
|
|
102
|
+
Returns:
|
|
103
|
+
```json
|
|
104
|
+
{
|
|
105
|
+
"bucketName": "test-images",
|
|
106
|
+
"prefix": null,
|
|
107
|
+
"objects": [
|
|
108
|
+
{
|
|
109
|
+
"bucket": "test-images",
|
|
110
|
+
"key": "test.txt",
|
|
111
|
+
"size": 30,
|
|
112
|
+
"mimeType": "text/plain",
|
|
113
|
+
"uploadedAt": "2025-07-18T04:32:13.801Z",
|
|
114
|
+
"url": "http://localhost:7130/api/storage/buckets/test-images/objects/test.txt"
|
|
115
|
+
}
|
|
116
|
+
],
|
|
117
|
+
"pagination": {
|
|
118
|
+
"limit": 100,
|
|
119
|
+
"offset": 0,
|
|
120
|
+
"total": 1
|
|
121
|
+
},
|
|
122
|
+
"nextActions": "You can use PUT /api/storage/buckets/:bucketName/objects/:objectKey to upload with a specific key, or POST /api/storage/buckets/:bucketName/objects to upload with auto-generated key, and GET /api/storage/buckets/:bucketName/objects/:objectKey to download an object."
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Pagination headers:
|
|
127
|
+
- `X-Total-Count`: Total number of objects
|
|
128
|
+
- `X-Page`: Current page number
|
|
129
|
+
- `X-Page-Size`: Number of items per page
|
|
130
|
+
|
|
131
|
+
Example curl:
|
|
132
|
+
```bash
|
|
133
|
+
# Windows PowerShell: use curl.exe
|
|
134
|
+
curl -X GET "http://localhost:7130/api/storage/buckets/avatars/objects?limit=10&prefix=users/" \
|
|
135
|
+
-H "Authorization: Bearer <token>"
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Delete Object
|
|
139
|
+
**DELETE** `/api/storage/buckets/:bucketName/objects/:objectKey`
|
|
140
|
+
|
|
141
|
+
Returns:
|
|
142
|
+
```json
|
|
143
|
+
{
|
|
144
|
+
"message": "Object deleted successfully"
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
Example curl:
|
|
149
|
+
```bash
|
|
150
|
+
# Windows PowerShell: use curl.exe
|
|
151
|
+
curl -X DELETE http://localhost:7130/api/storage/buckets/avatars/objects/user123.jpg \
|
|
152
|
+
-H "Authorization: Bearer <token>"
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Update Bucket
|
|
156
|
+
**PATCH** `/api/storage/buckets/:bucketName`
|
|
157
|
+
|
|
158
|
+
Request body:
|
|
159
|
+
```json
|
|
160
|
+
{ "isPublic": true }
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
Returns:
|
|
164
|
+
```json
|
|
165
|
+
{
|
|
166
|
+
"message": "Bucket visibility updated",
|
|
167
|
+
"bucket": "test-images",
|
|
168
|
+
"isPublic": false,
|
|
169
|
+
"nextActions": "Bucket is now PRIVATE - authentication is required to access objects."
|
|
170
|
+
}
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
Example curl:
|
|
174
|
+
```bash
|
|
175
|
+
# Mac/Linux
|
|
176
|
+
curl -X PATCH http://localhost:7130/api/storage/buckets/avatars \
|
|
177
|
+
-H 'Authorization: Bearer <token>' \
|
|
178
|
+
-H 'Content-Type: application/json' \
|
|
179
|
+
-d '{"isPublic": true}'
|
|
180
|
+
|
|
181
|
+
# Windows PowerShell (use curl.exe) - different quotes needed for nested JSON
|
|
182
|
+
curl.exe -X PATCH http://localhost:7130/api/storage/buckets/avatars \
|
|
183
|
+
-H "Authorization: Bearer <token>" \
|
|
184
|
+
-H "Content-Type: application/json" \
|
|
185
|
+
-d '{\"isPublic\": true}'
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
## Database Integration
|
|
189
|
+
|
|
190
|
+
### Option 1: Upload with Specific Key (PUT)
|
|
191
|
+
```javascript
|
|
192
|
+
// Step 1: Upload object with known key
|
|
193
|
+
const formData = new FormData();
|
|
194
|
+
formData.append('file', file);
|
|
195
|
+
const upload = await fetch('/api/storage/buckets/images/objects/avatar.jpg', {
|
|
196
|
+
method: 'PUT',
|
|
197
|
+
headers: { 'Authorization': `Bearer ${token}` },
|
|
198
|
+
body: formData
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
// Step 2: Store metadata
|
|
202
|
+
const records = [{
|
|
203
|
+
userId: 'user123',
|
|
204
|
+
image: await upload.json() // Store object metadata
|
|
205
|
+
}];
|
|
206
|
+
await fetch('/api/database/profiles', {
|
|
207
|
+
method: 'POST',
|
|
208
|
+
headers: {
|
|
209
|
+
'Authorization': `Bearer ${token}`,
|
|
210
|
+
'Content-Type': 'application/json'
|
|
211
|
+
},
|
|
212
|
+
body: JSON.stringify(records)
|
|
213
|
+
});
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### Option 2: Upload with Auto-Generated Key (POST)
|
|
217
|
+
```javascript
|
|
218
|
+
// Step 1: Upload object with auto-generated key
|
|
219
|
+
const formData = new FormData();
|
|
220
|
+
formData.append('file', file);
|
|
221
|
+
const upload = await fetch('/api/storage/buckets/images/objects', {
|
|
222
|
+
method: 'POST',
|
|
223
|
+
headers: { 'Authorization': `Bearer ${token}` },
|
|
224
|
+
body: formData
|
|
225
|
+
});
|
|
226
|
+
const fileData = await upload.json();
|
|
227
|
+
|
|
228
|
+
// Step 2: Store metadata with generated key
|
|
229
|
+
const records = [{
|
|
230
|
+
userId: 'user123',
|
|
231
|
+
image: fileData // Contains auto-generated key
|
|
232
|
+
}];
|
|
233
|
+
await fetch('/api/database/profiles', {
|
|
234
|
+
method: 'POST',
|
|
235
|
+
headers: {
|
|
236
|
+
'Authorization': `Bearer ${token}`,
|
|
237
|
+
'Content-Type': 'application/json'
|
|
238
|
+
},
|
|
239
|
+
body: JSON.stringify(records)
|
|
240
|
+
});
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
## Error Response Format
|
|
244
|
+
|
|
245
|
+
All error responses follow this format:
|
|
246
|
+
```json
|
|
247
|
+
{
|
|
248
|
+
"error": "ERROR_CODE",
|
|
249
|
+
"message": "Human-readable error message",
|
|
250
|
+
"statusCode": 400,
|
|
251
|
+
"nextActions": "Suggested action to resolve the error"
|
|
252
|
+
}
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
Example error:
|
|
256
|
+
```json
|
|
257
|
+
{
|
|
258
|
+
"error": "BUCKET_NOT_FOUND",
|
|
259
|
+
"message": "Bucket 'nonexistent' does not exist",
|
|
260
|
+
"statusCode": 404,
|
|
261
|
+
"nextActions": "Create the bucket first"
|
|
262
|
+
}
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
## Important Rules
|
|
266
|
+
|
|
267
|
+
1. **Object Operations**
|
|
268
|
+
- Upload uses multipart/form-data
|
|
269
|
+
- Database stores metadata only
|
|
270
|
+
- Use `json` column type for object metadata
|
|
271
|
+
|
|
272
|
+
2. **Bucket Names**
|
|
273
|
+
- Must be valid identifiers
|
|
274
|
+
- Cannot start with underscore
|
|
275
|
+
|
|
276
|
+
3. **Remember**
|
|
277
|
+
- Bucket management uses MCP tools
|
|
278
|
+
- Object operations use REST API
|
|
279
279
|
- All operations need API key
|