insforge 0.3.3 → 1.2.10
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 -0
- package/.cursor/rules/cursor-rules.mdc +94 -0
- package/.dockerignore +3 -0
- package/.env.example +33 -4
- package/.github/ISSUE_TEMPLATE/bug_report.yml +13 -60
- package/.github/ISSUE_TEMPLATE/config.yml +2 -2
- package/.github/ISSUE_TEMPLATE/feature_request.yml +10 -63
- package/.github/PULL_REQUEST_TEMPLATE.md +7 -0
- package/.github/workflows/build-image.yml +2 -1
- package/.github/workflows/e2e.yml +63 -0
- package/CHANGELOG.md +41 -0
- package/CLAUDE_PLUGIN.md +104 -0
- package/CODE_OF_CONDUCT.md +128 -0
- package/CONTRIBUTING.md +1 -1
- package/Dockerfile +4 -1
- package/README.md +66 -18
- package/assets/mcpInstallv2.png +0 -0
- package/assets/sampleResponse.png +0 -0
- package/auth/index.html +13 -0
- package/auth/package.json +28 -0
- package/auth/public/favicon.ico +0 -0
- package/auth/src/App.tsx +33 -0
- package/auth/src/components/ErrorCard.tsx +37 -0
- package/auth/src/components/Layout.tsx +13 -0
- package/auth/src/index.css +19 -0
- package/auth/src/lib/broadcastService.ts +115 -0
- package/auth/src/lib/utils.ts +11 -0
- package/auth/src/main.tsx +22 -0
- package/auth/src/pages/ForgotPasswordPage.tsx +11 -0
- package/auth/src/pages/ResetPasswordPage.tsx +11 -0
- package/auth/src/pages/SignInPage.tsx +57 -0
- package/auth/src/pages/SignUpPage.tsx +57 -0
- package/auth/src/pages/VerifyEmailPage.tsx +20 -0
- package/auth/src/vite-env.d.ts +10 -0
- package/auth/tsconfig.json +32 -0
- package/auth/tsconfig.node.json +11 -0
- package/auth/vite.config.ts +25 -0
- package/backend/package.json +9 -9
- package/backend/src/api/{middleware → middlewares}/auth.ts +8 -9
- package/backend/src/api/middlewares/rate-limiters.ts +127 -0
- package/backend/src/api/routes/{ai.ts → ai/index.routes.ts} +20 -24
- package/backend/src/api/routes/auth/index.routes.ts +570 -0
- package/backend/src/api/routes/auth/oauth.routes.ts +448 -0
- package/backend/src/api/routes/{database.advance.ts → database/advance.routes.ts} +107 -65
- package/backend/src/api/routes/database/index.routes.ts +13 -0
- package/backend/src/api/routes/{database.records.ts → database/records.routes.ts} +22 -8
- package/backend/src/api/routes/{database.tables.ts → database/tables.routes.ts} +20 -23
- package/backend/src/api/routes/docs/index.routes.ts +76 -0
- package/backend/src/api/routes/functions/index.routes.ts +188 -0
- package/backend/src/api/routes/{logs.ts → logs/index.routes.ts} +25 -30
- package/backend/src/api/routes/{metadata.ts → metadata/index.routes.ts} +21 -31
- package/backend/src/api/routes/{secrets.ts → secrets/index.routes.ts} +27 -22
- package/backend/src/api/routes/{storage.ts → storage/index.routes.ts} +34 -53
- package/backend/src/api/routes/usage/index.routes.ts +89 -0
- package/backend/src/infra/config/app.config.ts +51 -0
- package/backend/src/{core/database/manager.ts → infra/database/database.manager.ts} +76 -85
- package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -0
- package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +8 -0
- package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +60 -0
- package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -0
- package/backend/src/{core/secrets/encryption.ts → infra/security/encryption.manager.ts} +3 -2
- package/backend/src/infra/security/token.manager.ts +125 -0
- package/backend/src/{core/socket/socket.ts → infra/socket/socket.manager.ts} +15 -15
- package/backend/src/providers/ai/openrouter.provider.ts +377 -0
- package/backend/src/providers/email/base.provider.ts +41 -0
- package/backend/src/providers/email/cloud.provider.ts +187 -0
- package/backend/src/{core/logs/providers → providers/logs}/base.provider.ts +11 -11
- package/backend/src/{core/logs/providers → providers/logs}/cloudwatch.provider.ts +61 -38
- package/backend/src/providers/logs/local.provider.ts +185 -0
- package/backend/src/providers/oauth/base.provider.ts +29 -0
- package/backend/src/providers/oauth/discord.provider.ts +195 -0
- package/backend/src/providers/oauth/facebook.provider.ts +194 -0
- package/backend/src/providers/oauth/github.provider.ts +208 -0
- package/backend/src/providers/oauth/google.provider.ts +249 -0
- package/backend/src/providers/oauth/index.ts +7 -0
- package/backend/src/providers/oauth/linkedin.provider.ts +240 -0
- package/backend/src/providers/oauth/microsoft.provider.ts +169 -0
- package/backend/src/providers/oauth/x.provider.ts +202 -0
- package/backend/src/providers/storage/base.provider.ts +29 -0
- package/backend/src/providers/storage/local.provider.ts +103 -0
- package/backend/src/providers/storage/s3.provider.ts +313 -0
- package/backend/src/server.ts +70 -74
- package/backend/src/{core/ai/config.ts → services/ai/ai-config.service.ts} +19 -24
- package/backend/src/services/ai/ai-model.service.ts +60 -0
- package/backend/src/{core/ai/usage.ts → services/ai/ai-usage.service.ts} +28 -35
- package/backend/src/{core/ai/chat.ts → services/ai/chat-completion.service.ts} +37 -24
- package/backend/src/services/ai/helpers.ts +64 -0
- package/backend/src/{core/ai/image.ts → services/ai/image-generation.service.ts} +17 -19
- package/backend/src/services/ai/index.ts +13 -0
- package/backend/src/services/auth/auth-config.service.ts +250 -0
- package/backend/src/services/auth/auth-otp.service.ts +424 -0
- package/backend/src/services/auth/auth.service.ts +1136 -0
- package/backend/src/services/auth/index.ts +4 -0
- package/backend/src/{core/auth/oauth.ts → services/auth/oauth-config.service.ts} +106 -52
- package/backend/src/{core/database/advance.ts → services/database/database-advance.service.ts} +97 -131
- package/backend/src/services/database/database-table.service.ts +811 -0
- package/backend/src/services/email/email.service.ts +75 -0
- package/backend/src/{core/functions/functions.ts → services/functions/function.service.ts} +95 -88
- package/backend/src/{core/logs/audit.ts → services/logs/audit.service.ts} +92 -75
- package/backend/src/services/logs/log.service.ts +73 -0
- package/backend/src/{core/secrets/secrets.ts → services/secrets/secret.service.ts} +48 -66
- package/backend/src/services/storage/storage.service.ts +617 -0
- package/backend/src/services/usage/usage.service.ts +149 -0
- package/backend/src/types/auth.ts +66 -2
- package/backend/src/types/email.ts +8 -0
- package/backend/src/types/error-constants.ts +4 -0
- package/backend/src/types/logs.ts +0 -29
- package/backend/src/{core/socket/types.ts → types/socket.ts} +5 -6
- package/backend/src/utils/environment.ts +9 -3
- package/backend/src/utils/logger.ts +20 -2
- package/backend/src/utils/seed.ts +150 -57
- package/backend/src/utils/sql-parser.ts +1 -1
- package/backend/src/utils/utils.ts +114 -0
- package/backend/src/utils/validations.ts +40 -4
- package/backend/tests/local/test-ai-config.sh +129 -0
- package/backend/tests/local/test-ai-usage.sh +80 -0
- package/backend/tests/local/test-auth-router.sh +1 -1
- package/backend/tests/local/test-e2e.sh +1 -1
- package/backend/tests/local/test-functions.sh +123 -0
- package/backend/tests/local/test-logs.sh +132 -0
- package/backend/tests/local/test-public-bucket.sh +3 -3
- package/backend/tests/local/test-secrets.sh +14 -12
- package/backend/tests/local/test-traditional-rest.sh +2 -2
- package/backend/tests/manual/test-rawsql-modes.sh +244 -0
- package/backend/tests/test-config.sh +37 -1
- package/backend/tests/unit/cloud-token.test.ts +48 -0
- package/backend/tests/unit/constant.test.ts +8 -0
- package/backend/tests/unit/email.test.ts +372 -0
- package/backend/tests/unit/environment.test.ts +59 -0
- package/backend/tests/unit/helpers.test.ts +63 -0
- package/backend/tests/unit/logger.test.ts +22 -0
- package/backend/tests/unit/rate-limit.test.ts +154 -0
- package/backend/tests/unit/response.test.ts +58 -0
- package/backend/tests/unit/sql-parser.test.ts +74 -0
- package/backend/tests/unit/uuid.test.ts +21 -0
- package/backend/tests/unit/validations.test.ts +80 -0
- package/backend/tsconfig.json +1 -1
- package/backend/vitest.config.ts +11 -0
- package/claude-plugin/.claude-plugin/plugin.json +24 -0
- package/claude-plugin/README.md +133 -0
- package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +270 -0
- package/docker-compose.prod.yml +60 -4
- package/docker-compose.yml +65 -4
- package/docker-init/db/db-init.sql +6 -34
- package/docker-init/logs/vector.yml +236 -0
- package/docs/README.md +44 -0
- package/docs/changelog.mdx +67 -0
- package/docs/core-concepts/ai/architecture.mdx +373 -0
- package/docs/core-concepts/ai/sdk.mdx +213 -0
- package/docs/core-concepts/authentication/architecture.mdx +278 -0
- package/docs/core-concepts/authentication/sdk.mdx +414 -0
- package/docs/core-concepts/authentication/ui-components/customization.mdx +529 -0
- package/docs/core-concepts/authentication/ui-components/nextjs.mdx +221 -0
- package/docs/core-concepts/authentication/ui-components/react-router.mdx +184 -0
- package/docs/core-concepts/authentication/ui-components/react.mdx +129 -0
- package/docs/core-concepts/database/architecture.mdx +256 -0
- package/docs/core-concepts/database/sdk.mdx +382 -0
- package/docs/core-concepts/functions/architecture.mdx +105 -0
- package/docs/core-concepts/functions/sdk.mdx +184 -0
- package/docs/core-concepts/storage/architecture.mdx +243 -0
- package/docs/core-concepts/storage/sdk.mdx +253 -0
- package/docs/deployment/README.md +94 -0
- package/docs/deployment/deploy-to-aws-ec2.md +565 -0
- package/docs/deployment/deploy-to-azure-virtual-machines.md +313 -0
- package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -0
- package/docs/deployment/deploy-to-render.md +441 -0
- package/docs/docs.json +210 -0
- package/docs/examples/framework-guides/nextjs.mdx +131 -0
- package/docs/examples/framework-guides/nuxt.mdx +165 -0
- package/docs/examples/framework-guides/react.mdx +165 -0
- package/docs/examples/framework-guides/svelte.mdx +153 -0
- package/docs/examples/framework-guides/vue.mdx +159 -0
- package/docs/examples/overview.mdx +67 -0
- package/docs/favicon.svg +19 -0
- package/docs/images/changelog/nov-2025/auth-components.webp +0 -0
- package/docs/images/changelog/nov-2025/database-metadata.webp +0 -0
- package/docs/images/changelog/nov-2025/quickstart-prompts.webp +0 -0
- package/docs/images/changelog/nov-2025/sql-editor.webp +0 -0
- package/docs/images/changelog/nov-2025/usage-page.webp +0 -0
- package/docs/images/changelog/october-2025/csv-upload.webp +0 -0
- package/docs/images/changelog/october-2025/logs-feature.webp +0 -0
- package/docs/images/changelog/october-2025/oauth-providers.webp +0 -0
- package/docs/images/checks-passed.png +0 -0
- package/docs/images/dashboard-connect-expanded.png +0 -0
- package/docs/images/dashboard-connect.png +0 -0
- package/docs/images/hero-dark.png +0 -0
- package/docs/images/hero-light.png +0 -0
- package/docs/images/icons/ai.svg +4 -0
- package/docs/images/icons/auth.svg +1 -0
- package/docs/images/icons/database.svg +1 -0
- package/docs/images/icons/function.svg +1 -0
- package/docs/images/icons/storage.svg +1 -0
- package/docs/images/logos/nextjs.svg +4 -0
- package/docs/images/logos/nuxt.svg +4 -0
- package/docs/images/logos/react.svg +5 -0
- package/docs/images/logos/svelte.svg +4 -0
- package/docs/images/logos/vue.svg +5 -0
- package/docs/images/mcp-install.png +0 -0
- package/docs/images/onboarding-mcp.png +0 -0
- package/docs/insforge-instructions-sdk.md +55 -374
- package/docs/introduction.mdx +45 -0
- package/docs/logo/dark.svg +22 -0
- package/docs/logo/light.svg +20 -0
- package/docs/partnership.mdx +647 -0
- package/docs/quickstart.mdx +83 -0
- package/docs/showcase/2048-arena.png +0 -0
- package/docs/showcase/framegen-cloud.png +0 -0
- package/docs/showcase/line-connect-race.png +0 -0
- package/docs/showcase/moment-vibe.png +0 -0
- package/docs/showcase/national-flags.png +0 -0
- package/docs/showcase/pokemon-vibe.png +0 -0
- package/docs/showcase/pure-browse-buy.png +0 -0
- package/docs/showcase.mdx +52 -0
- package/docs/snippets/sdk-installation.mdx +22 -0
- package/docs/snippets/service-icons.mdx +27 -0
- package/eslint.config.js +10 -3
- package/frontend/package.json +10 -4
- package/frontend/src/App.tsx +13 -82
- package/frontend/src/assets/icons/connected.svg +3 -0
- package/frontend/src/assets/icons/loader.svg +9 -0
- package/frontend/src/assets/logos/apple.svg +4 -0
- package/frontend/src/assets/logos/discord.svg +1 -1
- package/frontend/src/assets/logos/facebook.svg +3 -0
- package/frontend/src/assets/logos/instagram.svg +2 -0
- package/frontend/src/assets/logos/linkedin.svg +3 -0
- package/frontend/src/assets/logos/microsoft.svg +1 -0
- package/frontend/src/assets/logos/spotify.svg +17 -0
- package/frontend/src/assets/logos/tiktok.svg +6 -0
- package/frontend/src/assets/logos/x.svg +3 -0
- package/frontend/src/components/Checkbox.tsx +27 -29
- package/frontend/src/components/CodeBlock.tsx +55 -2
- package/frontend/src/components/CodeEditor.tsx +92 -0
- package/frontend/src/components/ConfirmDialog.tsx +1 -1
- package/frontend/src/components/ConnectCTA.tsx +38 -0
- package/frontend/src/components/CopyButton.tsx +52 -15
- package/frontend/src/components/ErrorState.tsx +1 -2
- package/frontend/src/components/FeatureSidebar.tsx +6 -6
- package/frontend/src/components/FeatureSidebarItem.tsx +2 -2
- package/frontend/src/components/JsonHighlight.tsx +21 -9
- package/frontend/src/components/ProjectInfoModal.tsx +128 -0
- package/frontend/src/components/PromptDialog.tsx +1 -4
- package/frontend/src/components/SearchInput.tsx +1 -2
- package/frontend/src/components/Stepper.tsx +53 -0
- package/frontend/src/components/ThemeToggle.tsx +3 -3
- package/frontend/src/components/datagrid/DataGrid.tsx +25 -32
- package/frontend/src/components/datagrid/cell-editors/DateCellEditor.tsx +1 -2
- package/frontend/src/components/datagrid/cell-editors/JsonCellEditor.tsx +2 -4
- package/frontend/src/components/datagrid/index.ts +23 -0
- package/frontend/src/components/index.ts +23 -30
- package/frontend/src/components/layout/AppHeader.tsx +133 -92
- package/frontend/src/components/layout/AppSidebar.tsx +80 -170
- package/frontend/src/components/layout/Layout.tsx +12 -23
- package/frontend/src/components/layout/PrimaryMenu.tsx +187 -0
- package/frontend/src/components/layout/SecondaryMenu.tsx +70 -0
- package/frontend/src/components/layout/index.ts +5 -0
- package/frontend/src/components/radix/Tooltip.tsx +24 -13
- package/frontend/src/components/radix/index.ts +22 -0
- package/frontend/src/features/ai/components/AIConfigCard.tsx +129 -83
- package/frontend/src/features/ai/components/AIEmptyState.tsx +12 -7
- package/frontend/src/features/ai/components/ModalityFilterSidebar.tsx +101 -0
- package/frontend/src/features/ai/components/ModelSelectionDialog.tsx +135 -0
- package/frontend/src/features/ai/components/ModelSelectionGrid.tsx +51 -0
- package/frontend/src/features/ai/components/SystemPromptDialog.tsx +118 -0
- package/frontend/src/features/ai/components/index.ts +6 -0
- package/frontend/src/features/ai/helpers.ts +57 -71
- package/frontend/src/features/ai/hooks/useAIConfigs.ts +39 -113
- package/frontend/src/features/ai/hooks/useAIUsage.ts +0 -2
- package/frontend/src/features/ai/page/AIPage.tsx +67 -79
- package/frontend/src/features/ai/services/ai.service.ts +5 -5
- package/frontend/src/features/auth/components/AuthPreview.tsx +96 -0
- package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +53 -30
- package/frontend/src/features/auth/components/UserFormDialog.tsx +13 -6
- package/frontend/src/features/auth/components/UsersDataGrid.tsx +44 -14
- package/frontend/src/features/auth/components/index.ts +5 -0
- package/frontend/src/features/auth/helpers.tsx +200 -0
- package/frontend/src/features/auth/hooks/useAnonToken.ts +30 -0
- package/frontend/src/features/auth/hooks/useAuthConfig.ts +48 -0
- package/frontend/src/features/auth/hooks/useOAuthConfig.ts +14 -10
- package/frontend/src/features/auth/hooks/useUsers.ts +43 -5
- package/frontend/src/features/auth/index.ts +3 -2
- package/frontend/src/features/auth/page/AuthMethodsPage.tsx +275 -0
- package/frontend/src/features/auth/page/ConfigurationPage.tsx +395 -0
- package/frontend/src/features/auth/page/UsersPage.tsx +285 -0
- package/frontend/src/features/auth/services/anonToken.service.ts +11 -0
- package/frontend/src/features/auth/services/config.service.ts +19 -0
- package/frontend/src/features/auth/services/{oauth.service.ts → oauth-config.service.ts} +4 -4
- package/frontend/src/features/auth/services/{auth.service.ts → user.service.ts} +7 -53
- package/frontend/src/features/dashboard/components/ConnectionSuccessBanner.tsx +35 -0
- package/frontend/src/features/dashboard/components/PromptCard.tsx +21 -0
- package/frontend/src/features/dashboard/components/PromptDialog.tsx +103 -0
- package/frontend/src/features/dashboard/components/StatsCard.tsx +50 -0
- package/frontend/src/features/dashboard/components/index.ts +4 -0
- package/frontend/src/features/dashboard/page/DashboardPage.tsx +187 -169
- package/frontend/src/features/dashboard/prompts/ai-chatbot.ts +13 -0
- package/frontend/src/features/dashboard/prompts/crm-system.ts +13 -0
- package/frontend/src/features/dashboard/prompts/ecommerce-platform.ts +12 -0
- package/frontend/src/features/dashboard/prompts/index.ts +31 -0
- package/frontend/src/features/dashboard/prompts/instagram-clone.ts +11 -0
- package/frontend/src/features/dashboard/prompts/notion-clone.ts +14 -0
- package/frontend/src/features/dashboard/prompts/reddit-clone.ts +12 -0
- package/frontend/src/features/database/components/DatabaseDataGrid.tsx +48 -17
- package/frontend/src/features/database/components/ForeignKeyCell.tsx +15 -34
- package/frontend/src/features/database/components/ForeignKeyPopover.tsx +19 -20
- package/frontend/src/features/database/components/LinkRecordModal.tsx +120 -125
- package/frontend/src/features/database/components/RecordFormDialog.tsx +22 -33
- package/frontend/src/features/database/components/RecordFormField.tsx +45 -47
- package/frontend/src/features/database/components/TableEmptyState.tsx +6 -5
- package/frontend/src/features/database/components/TableForm.tsx +28 -15
- package/frontend/src/features/database/components/TableFormColumn.tsx +2 -3
- package/frontend/src/features/database/components/TableSidebar.tsx +1 -1
- package/frontend/src/features/database/components/TablesEmptyState.tsx +48 -0
- package/frontend/src/features/database/components/TemplateCard.tsx +37 -0
- package/frontend/src/features/database/components/TemplatePreview.tsx +92 -0
- package/frontend/src/features/database/components/index.ts +19 -0
- package/frontend/src/features/database/constants.ts +28 -2
- package/frontend/src/features/database/contexts/SQLEditorContext.tsx +188 -0
- package/frontend/src/features/database/helpers.ts +2 -2
- package/frontend/src/features/database/hooks/useCSVImport.ts +29 -0
- package/frontend/src/features/database/hooks/useFullMetadata.ts +18 -0
- package/frontend/src/features/database/hooks/useRawSQL.ts +55 -0
- package/frontend/src/features/database/hooks/useRecords.ts +139 -0
- package/frontend/src/features/database/hooks/useTables.ts +131 -0
- package/frontend/src/features/database/index.ts +6 -1
- package/frontend/src/features/database/page/FunctionsPage.tsx +211 -0
- package/frontend/src/features/database/page/IndexesPage.tsx +240 -0
- package/frontend/src/features/database/page/PoliciesPage.tsx +248 -0
- package/frontend/src/features/database/page/SQLEditorPage.tsx +382 -0
- package/frontend/src/features/database/page/{DatabasePage.tsx → TablesPage.tsx} +186 -185
- package/frontend/src/features/database/page/TemplatesPage.tsx +39 -0
- package/frontend/src/features/database/page/TriggersPage.tsx +242 -0
- package/frontend/src/features/database/services/advance.service.ts +66 -0
- package/frontend/src/features/database/services/{database.service.ts → record.service.ts} +67 -64
- package/frontend/src/features/database/services/table.service.ts +64 -0
- package/frontend/src/features/database/templates/ai-chatbot.ts +402 -0
- package/frontend/src/features/database/templates/crm-system.ts +528 -0
- package/frontend/src/features/database/templates/ecommerce-platform.ts +553 -0
- package/frontend/src/features/database/templates/index.ts +34 -0
- package/frontend/src/features/database/templates/instagram-clone.ts +222 -0
- package/frontend/src/features/database/templates/notion-clone.ts +483 -0
- package/frontend/src/features/database/templates/reddit-clone.ts +526 -0
- package/frontend/src/features/functions/components/FunctionRow.tsx +2 -1
- package/frontend/src/features/functions/components/FunctionsSidebar.tsx +1 -1
- package/frontend/src/features/functions/components/SecretRow.tsx +1 -1
- package/frontend/src/features/functions/components/index.ts +5 -0
- package/frontend/src/features/functions/hooks/useFunctions.ts +4 -4
- package/frontend/src/features/{secrets → functions}/hooks/useSecrets.ts +5 -5
- package/frontend/src/features/functions/page/FunctionsPage.tsx +160 -17
- package/frontend/src/features/functions/{components/SecretsContent.tsx → page/SecretsPage.tsx} +8 -12
- package/frontend/src/features/functions/services/{functions.service.ts → function.service.ts} +2 -2
- package/frontend/src/features/{secrets/services/secrets.service.ts → functions/services/secret.service.ts} +2 -2
- package/frontend/src/features/login/hooks/usePartnerOrigin.ts +27 -0
- package/frontend/src/features/login/page/CloudLoginPage.tsx +79 -54
- package/frontend/src/features/login/page/LoginPage.tsx +16 -23
- package/frontend/src/features/login/services/partnership.service.ts +65 -0
- package/frontend/src/features/logs/components/LogsDataGrid.tsx +89 -0
- package/frontend/src/features/logs/components/SeverityBadge.tsx +18 -0
- package/frontend/src/features/logs/components/index.ts +2 -0
- package/frontend/src/features/logs/helpers.ts +24 -0
- package/frontend/src/features/logs/hooks/useAuditLogs.ts +4 -4
- package/frontend/src/features/logs/hooks/useLogSources.ts +137 -0
- package/frontend/src/features/logs/hooks/useLogs.ts +163 -0
- package/frontend/src/features/logs/hooks/useMcpUsage.ts +181 -0
- package/frontend/src/features/logs/index.ts +8 -2
- package/frontend/src/features/logs/page/AuditsPage.tsx +91 -38
- package/frontend/src/features/logs/page/LogsPage.tsx +152 -0
- package/frontend/src/features/logs/page/MCPLogsPage.tsx +84 -0
- package/frontend/src/features/logs/services/audit.service.ts +63 -0
- package/frontend/src/features/logs/services/log.service.ts +15 -110
- package/frontend/src/features/logs/services/usage.service.ts +31 -0
- package/frontend/src/features/onboard/components/McpConnectionStatus.tsx +68 -0
- package/frontend/src/features/onboard/components/OnboardingModal.tsx +267 -0
- package/frontend/src/features/onboard/components/VideoDemoModal.tsx +38 -0
- package/frontend/src/features/onboard/components/index.ts +4 -0
- package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +2 -2
- package/frontend/src/features/onboard/components/mcp/{mcp-helper.tsx → helpers.tsx} +8 -8
- package/frontend/src/features/onboard/components/mcp/index.ts +2 -3
- package/frontend/src/features/onboard/index.ts +13 -3
- package/frontend/src/features/storage/components/BucketEmptyState.tsx +9 -6
- package/frontend/src/features/storage/components/BucketFormDialog.tsx +25 -41
- package/frontend/src/features/storage/components/FilePreviewDialog.tsx +20 -8
- package/frontend/src/features/storage/components/StorageDataGrid.tsx +4 -3
- package/frontend/src/features/storage/components/StorageManager.tsx +23 -34
- package/frontend/src/features/storage/components/index.ts +12 -0
- package/frontend/src/features/storage/hooks/useStorage.ts +208 -0
- package/frontend/src/features/storage/page/StoragePage.tsx +41 -115
- package/frontend/src/features/storage/services/storage.service.ts +22 -1
- package/frontend/src/features/visualizer/components/AuthNode.tsx +72 -56
- package/frontend/src/features/visualizer/components/BucketNode.tsx +4 -4
- package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +108 -80
- package/frontend/src/features/visualizer/components/TableNode.tsx +34 -41
- package/frontend/src/features/visualizer/components/VisualizerSkeleton.tsx +12 -4
- package/frontend/src/features/visualizer/page/VisualizerPage.tsx +33 -29
- package/frontend/src/index.css +1 -0
- package/frontend/src/lib/analytics/posthog.tsx +27 -0
- package/frontend/src/lib/contexts/AuthContext.tsx +38 -31
- package/frontend/src/lib/contexts/SocketContext.tsx +5 -6
- package/frontend/src/{features/metadata → lib}/hooks/useMetadata.ts +1 -1
- package/frontend/src/lib/hooks/useToast.tsx +6 -2
- package/frontend/src/lib/routing/AppRoutes.tsx +84 -0
- package/frontend/src/lib/routing/RequireAuth.tsx +27 -0
- package/frontend/src/lib/utils/cloudMessaging.ts +20 -0
- package/frontend/src/lib/utils/menuItems.ts +183 -0
- package/frontend/src/lib/utils/{validation-schemas.ts → schemaValidations.ts} +10 -5
- package/frontend/src/lib/utils/utils.ts +19 -1
- package/frontend/src/vite-env.d.ts +1 -0
- package/frontend/vite.config.ts +5 -3
- package/functions/server.ts +28 -3
- package/functions/worker-template.js +15 -4
- package/i18n/README.ar.md +130 -0
- package/i18n/README.de.md +130 -0
- package/i18n/README.es.md +154 -0
- package/i18n/README.fr.md +134 -0
- package/i18n/README.hi.md +129 -0
- package/i18n/README.ja.md +174 -0
- package/i18n/README.ko.md +137 -0
- package/i18n/README.pt-BR.md +131 -0
- package/i18n/README.ru.md +129 -0
- package/i18n/README.zh-CN.md +133 -0
- package/openapi/ai.yaml +31 -4
- package/openapi/auth.yaml +827 -146
- package/package.json +16 -7
- package/shared-schemas/package.json +1 -1
- package/shared-schemas/src/ai-api.schema.ts +34 -58
- package/shared-schemas/src/ai.schema.ts +5 -0
- package/shared-schemas/src/auth-api.schema.ts +154 -8
- package/shared-schemas/src/auth.schema.ts +42 -6
- package/shared-schemas/src/cloud-events.schema.ts +57 -0
- package/shared-schemas/src/database-api.schema.ts +3 -3
- package/shared-schemas/src/database.schema.ts +1 -1
- package/shared-schemas/src/index.ts +1 -0
- package/shared-schemas/src/logs-api.schema.ts +7 -1
- package/shared-schemas/src/logs.schema.ts +26 -0
- package/shared-schemas/src/metadata.schema.ts +9 -4
- package/test-gemini.sh +35 -0
- package/test-usage-admin.sh +57 -0
- package/test-usage.sh +50 -0
- package/zeabur/README.md +13 -0
- package/zeabur/template.yml +1032 -0
- package/.github/workflows/deploy-aws.yml +0 -130
- package/backend/src/api/routes/agent.ts +0 -29
- package/backend/src/api/routes/auth.oauth.ts +0 -482
- package/backend/src/api/routes/auth.ts +0 -386
- package/backend/src/api/routes/docs.ts +0 -66
- package/backend/src/api/routes/functions.ts +0 -183
- package/backend/src/api/routes/openapi.ts +0 -82
- package/backend/src/api/routes/usage.ts +0 -96
- package/backend/src/core/ai/client.ts +0 -242
- package/backend/src/core/ai/model.ts +0 -117
- package/backend/src/core/auth/auth.ts +0 -780
- package/backend/src/core/database/table.ts +0 -772
- package/backend/src/core/documentation/agent.ts +0 -689
- package/backend/src/core/documentation/openapi.ts +0 -856
- package/backend/src/core/logs/analytics.ts +0 -76
- package/backend/src/core/logs/providers/localdb.provider.ts +0 -246
- package/backend/src/core/storage/storage.ts +0 -923
- package/backend/src/utils/cloud-token.ts +0 -39
- package/backend/src/utils/helpers.ts +0 -49
- package/backend/src/utils/uuid.ts +0 -9
- package/backend/tests/manual/test-better-auth.sh +0 -303
- package/docker-init/db/logs.sql +0 -9
- package/frontend/README.md +0 -112
- package/frontend/src/components/datagrid/index.tsx +0 -20
- package/frontend/src/components/layout/CloudLayout.tsx +0 -95
- package/frontend/src/features/ai/components/AIConfigDialog.tsx +0 -76
- package/frontend/src/features/ai/components/AIConfigForm.tsx +0 -222
- package/frontend/src/features/ai/components/fields/ModalityField.tsx +0 -87
- package/frontend/src/features/ai/components/fields/ModelSelectionField.tsx +0 -134
- package/frontend/src/features/ai/components/fields/SystemPromptField.tsx +0 -33
- package/frontend/src/features/auth/components/AddOAuthDialog.tsx +0 -106
- package/frontend/src/features/auth/components/AuthMethodTab.tsx +0 -238
- package/frontend/src/features/auth/components/UsersTab.tsx +0 -114
- package/frontend/src/features/auth/page/AuthenticationPage.tsx +0 -169
- package/frontend/src/features/database/hooks/UseLinkModal.tsx +0 -78
- package/frontend/src/features/functions/components/FunctionViewer.tsx +0 -46
- package/frontend/src/features/functions/components/FunctionsContent.tsx +0 -88
- package/frontend/src/features/login/components/AuthErrorBoundary.tsx +0 -87
- package/frontend/src/features/login/components/PrivateRoute.tsx +0 -24
- package/frontend/src/features/logs/components/AnalyticsLogsTable.tsx +0 -313
- package/frontend/src/features/logs/components/LogsTable.tsx +0 -199
- package/frontend/src/features/logs/page/AnalyticsLogsPage.tsx +0 -530
- package/frontend/src/features/metadata/index.ts +0 -0
- package/frontend/src/features/metadata/page/MetadataPage.tsx +0 -136
- package/frontend/src/features/onboard/components/CompletionCard.tsx +0 -41
- package/frontend/src/features/onboard/components/OnboardButton.tsx +0 -84
- package/frontend/src/features/onboard/components/StepContent.tsx +0 -91
- package/frontend/src/features/onboard/components/TestConnectionStep.tsx +0 -53
- package/frontend/src/features/onboard/components/mcp/McpInstallation.tsx +0 -144
- package/frontend/src/features/onboard/page/OnBoardPage.tsx +0 -104
- package/frontend/src/features/onboard/types.ts +0 -8
- package/frontend/src/lib/contexts/OnboardStepContext.tsx +0 -68
- package/frontend/src/lib/hooks/useOnboardingCompletion.ts +0 -29
- /package/backend/src/api/{middleware → middlewares}/error.ts +0 -0
- /package/backend/src/api/{middleware → middlewares}/upload.ts +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/000_create-base-tables.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/001_create-helper-functions.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/002_rename-auth-tables.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/003_create-users-table.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/004_add-reload-postgrest-func.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/005_enable-project-admin-modify-users.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/006_modify-ai-usage-table.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/007_drop-metadata-table.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/008_add-system-tables.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/009_add-function-secrets.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/010_modify-ai-config-modalities.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/011_refactor-secrets-table.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/012_add-storage-uploaded-by.sql +0 -0
- /package/frontend/src/{features/metadata → lib}/services/metadata.service.ts +0 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Architecture
|
|
3
|
+
description: Serverless JavaScript functions running in isolated Deno runtime
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## Overview
|
|
7
|
+
|
|
8
|
+
InsForge Functions provide a secure, scalable serverless compute platform that runs JavaScript/TypeScript code in isolated Deno workers with full access to the InsForge SDK.
|
|
9
|
+
|
|
10
|
+
## Technology Stack
|
|
11
|
+
|
|
12
|
+
```mermaid
|
|
13
|
+
graph TB
|
|
14
|
+
Client[Client Application] --> Backend[Backend API :7130]
|
|
15
|
+
Backend --> Proxy[Proxy Layer]
|
|
16
|
+
Proxy --> Deno[Deno Runtime :7133]
|
|
17
|
+
Deno --> Worker[Web Worker]
|
|
18
|
+
Worker --> Sandbox[Isolated Sandbox]
|
|
19
|
+
|
|
20
|
+
Backend --> DB[(PostgreSQL)]
|
|
21
|
+
Deno --> DB
|
|
22
|
+
Worker --> SDK[InsForge SDK]
|
|
23
|
+
SDK --> Backend
|
|
24
|
+
|
|
25
|
+
style Client fill:#1e293b,stroke:#475569,color:#e2e8f0
|
|
26
|
+
style Backend fill:#166534,stroke:#22c55e,color:#dcfce7
|
|
27
|
+
style Proxy fill:#1e40af,stroke:#3b82f6,color:#dbeafe
|
|
28
|
+
style Deno fill:#c2410c,stroke:#fb923c,color:#fed7aa
|
|
29
|
+
style Worker fill:#4c1d95,stroke:#8b5cf6,color:#ede9fe
|
|
30
|
+
style Sandbox fill:#7c2d12,stroke:#f97316,color:#fed7aa
|
|
31
|
+
style DB fill:#0e7490,stroke:#06b6d4,color:#cffafe
|
|
32
|
+
style SDK fill:#1e40af,stroke:#3b82f6,color:#dbeafe
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Core Components
|
|
36
|
+
|
|
37
|
+
| Component | Technology | Port | Purpose |
|
|
38
|
+
|-----------|------------|------|---------|
|
|
39
|
+
| **Backend API** | Node.js/Express | 7130 | Function management, authentication, proxy |
|
|
40
|
+
| **Runtime** | Deno v2.0.6 | 7133 | Secure JavaScript/TypeScript execution |
|
|
41
|
+
| **Sandbox** | Web Workers | - | Isolated execution environment |
|
|
42
|
+
| **Database** | PostgreSQL | 5432 | Function code and metadata storage |
|
|
43
|
+
| **SDK** | @insforge/sdk | - | Pre-injected client for backend access |
|
|
44
|
+
| **Secrets** | AES-256-GCM | - | Encrypted environment variables |
|
|
45
|
+
|
|
46
|
+
## How It Works
|
|
47
|
+
|
|
48
|
+
When a client makes a request to `/functions/{slug}`:
|
|
49
|
+
|
|
50
|
+
1. The backend API receives and validates the request
|
|
51
|
+
2. Request is proxied to the Deno runtime
|
|
52
|
+
3. Function code is executed in an isolated Web Worker
|
|
53
|
+
4. The function has access to the InsForge SDK and environment variables
|
|
54
|
+
5. Response is returned to the client
|
|
55
|
+
|
|
56
|
+
### Authentication Flow
|
|
57
|
+
|
|
58
|
+
```mermaid
|
|
59
|
+
sequenceDiagram
|
|
60
|
+
participant C as Client
|
|
61
|
+
participant B as Backend API
|
|
62
|
+
participant D as Deno Runtime
|
|
63
|
+
participant W as Worker
|
|
64
|
+
participant SDK as InsForge SDK
|
|
65
|
+
|
|
66
|
+
C->>B: POST /functions/my-api<br/>Authorization: Bearer TOKEN
|
|
67
|
+
B->>D: Proxy request with headers
|
|
68
|
+
D->>D: Fetch function code from DB
|
|
69
|
+
D->>D: Decrypt secrets
|
|
70
|
+
D->>W: Create worker with code + secrets
|
|
71
|
+
W->>SDK: createClient({token})
|
|
72
|
+
SDK->>B: Validate token
|
|
73
|
+
B-->>SDK: User data
|
|
74
|
+
W->>C: HTTP Response
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Performance Characteristics
|
|
78
|
+
|
|
79
|
+
### Execution Limits
|
|
80
|
+
|
|
81
|
+
| Limit | Value | Description |
|
|
82
|
+
|-------|-------|-------------|
|
|
83
|
+
| **Timeout** | 30 seconds | Maximum execution time per invocation |
|
|
84
|
+
| **Memory** | Worker default | Depends on Deno worker allocation |
|
|
85
|
+
| **Payload Size** | 10MB | Maximum request/response size |
|
|
86
|
+
| **Concurrent Workers** | System dependent | Limited by server resources |
|
|
87
|
+
| **Cold Start** | ~50-200ms | Time to create new worker |
|
|
88
|
+
|
|
89
|
+
### Optimization Strategies
|
|
90
|
+
|
|
91
|
+
1. **Worker Pooling**: Workers are created on-demand
|
|
92
|
+
2. **Code Caching**: Function code cached in memory
|
|
93
|
+
3. **Secret Caching**: Decrypted secrets cached per execution
|
|
94
|
+
4. **SDK Reuse**: SDK client created once per worker
|
|
95
|
+
|
|
96
|
+
## Best Practices
|
|
97
|
+
|
|
98
|
+
1. **Keep Functions Small**: Single responsibility per function
|
|
99
|
+
2. **Handle Errors Gracefully**: Always return proper HTTP responses
|
|
100
|
+
3. **Validate Input**: Check request data before processing
|
|
101
|
+
4. **Use Caching**: Cache frequently accessed data
|
|
102
|
+
5. **Optimize Queries**: Use efficient database queries
|
|
103
|
+
6. **Monitor Performance**: Track execution times and errors
|
|
104
|
+
7. **Secure Secrets**: Never log sensitive data
|
|
105
|
+
8. **Test Locally**: Test functions before deployment
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Functions SDK Reference
|
|
3
|
+
description: Invoke serverless functions with the InsForge SDK
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
import Installation from '/snippets/sdk-installation.mdx';
|
|
7
|
+
|
|
8
|
+
<Installation />
|
|
9
|
+
|
|
10
|
+
## invoke()
|
|
11
|
+
|
|
12
|
+
Invoke a serverless function by slug.
|
|
13
|
+
|
|
14
|
+
### Parameters
|
|
15
|
+
|
|
16
|
+
- `slug` (string, required) - Function slug/name
|
|
17
|
+
- `body` (any, optional) - Request body (JSON-serializable)
|
|
18
|
+
- `headers` (object, optional) - Custom headers
|
|
19
|
+
- `method` ('GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE', optional) - HTTP method (default: POST)
|
|
20
|
+
|
|
21
|
+
### Returns
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
{
|
|
25
|
+
data: any | null, // Response from function
|
|
26
|
+
error: Error | null
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
<Note>
|
|
31
|
+
SDK automatically includes authentication token from logged-in user.
|
|
32
|
+
</Note>
|
|
33
|
+
|
|
34
|
+
### Example (POST with body)
|
|
35
|
+
|
|
36
|
+
```javascript
|
|
37
|
+
const { data, error } = await insforge.functions.invoke('hello-world', {
|
|
38
|
+
body: { name: 'World', greeting: 'Hello' }
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
console.log(data)
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Output (POST with body)
|
|
45
|
+
|
|
46
|
+
```json
|
|
47
|
+
{
|
|
48
|
+
"data": {
|
|
49
|
+
"message": "Hello, World!",
|
|
50
|
+
"timestamp": "2024-01-15T10:30:00Z"
|
|
51
|
+
},
|
|
52
|
+
"error": null
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Example (GET request)
|
|
57
|
+
|
|
58
|
+
```javascript
|
|
59
|
+
const { data, error } = await insforge.functions.invoke('get-stats', {
|
|
60
|
+
method: 'GET'
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
console.log(data)
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Output (GET request)
|
|
67
|
+
|
|
68
|
+
```json
|
|
69
|
+
{
|
|
70
|
+
"data": {
|
|
71
|
+
"users": 100,
|
|
72
|
+
"posts": 500,
|
|
73
|
+
"comments": 1200
|
|
74
|
+
},
|
|
75
|
+
"error": null
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Example (With custom headers)
|
|
80
|
+
|
|
81
|
+
```javascript
|
|
82
|
+
const { data, error } = await insforge.functions.invoke('api-endpoint', {
|
|
83
|
+
method: 'PUT',
|
|
84
|
+
body: { id: '123', status: 'active' },
|
|
85
|
+
headers: { 'X-Custom-Header': 'value' }
|
|
86
|
+
})
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Output (With custom headers)
|
|
90
|
+
|
|
91
|
+
```json
|
|
92
|
+
{
|
|
93
|
+
"data": {
|
|
94
|
+
"updated": true,
|
|
95
|
+
"id": "123"
|
|
96
|
+
},
|
|
97
|
+
"error": null
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Complete Serverless Function Examples
|
|
102
|
+
|
|
103
|
+
### Example 1: Public Function (No Authentication Required)
|
|
104
|
+
|
|
105
|
+
```javascript
|
|
106
|
+
// Use anon token for public data access
|
|
107
|
+
// No import needed - createClient is injected by the worker template
|
|
108
|
+
module.exports = async function(request) {
|
|
109
|
+
const corsHeaders = {
|
|
110
|
+
'Access-Control-Allow-Origin': '*',
|
|
111
|
+
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
|
|
112
|
+
'Access-Control-Allow-Headers': 'Content-Type, Authorization'
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
if (request.method === 'OPTIONS') {
|
|
116
|
+
return new Response(null, { status: 204, headers: corsHeaders });
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Create client with anon token - no authentication needed
|
|
120
|
+
const client = createClient({
|
|
121
|
+
baseUrl: Deno.env.get('INSFORGE_INTERNAL_URL') || 'http://insforge:7130',
|
|
122
|
+
anonKey: Deno.env.get('ANON_KEY')
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
// Access public data
|
|
126
|
+
const { data, error } = await client.database
|
|
127
|
+
.from('public_posts')
|
|
128
|
+
.select('*')
|
|
129
|
+
.limit(10);
|
|
130
|
+
|
|
131
|
+
return new Response(JSON.stringify({ data }), {
|
|
132
|
+
status: 200,
|
|
133
|
+
headers: { ...corsHeaders, 'Content-Type': 'application/json' }
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Example 2: Authenticated Function (Access User Data)
|
|
139
|
+
|
|
140
|
+
```javascript
|
|
141
|
+
// Use functionToken to access authenticated user's data
|
|
142
|
+
// No import needed - createClient is injected by the worker template
|
|
143
|
+
module.exports = async function(request) {
|
|
144
|
+
const corsHeaders = {
|
|
145
|
+
'Access-Control-Allow-Origin': '*',
|
|
146
|
+
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
|
|
147
|
+
'Access-Control-Allow-Headers': 'Content-Type, Authorization'
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
if (request.method === 'OPTIONS') {
|
|
151
|
+
return new Response(null, { status: 204, headers: corsHeaders });
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Extract token from request headers
|
|
155
|
+
const authHeader = request.headers.get('Authorization');
|
|
156
|
+
const userToken = authHeader ? authHeader.replace('Bearer ', '') : null;
|
|
157
|
+
|
|
158
|
+
// Create client with user's token for authenticated access
|
|
159
|
+
const client = createClient({
|
|
160
|
+
baseUrl: Deno.env.get('INSFORGE_INTERNAL_URL') || 'http://insforge:7130',
|
|
161
|
+
edgeFunctionToken: userToken
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
// Get authenticated user
|
|
165
|
+
const { data: userData } = await client.auth.getCurrentUser();
|
|
166
|
+
if (!userData?.user?.id) {
|
|
167
|
+
return new Response(JSON.stringify({ error: 'Unauthorized' }), {
|
|
168
|
+
status: 401,
|
|
169
|
+
headers: { ...corsHeaders, 'Content-Type': 'application/json' }
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Access user's private data or create records with user_id
|
|
174
|
+
await client.database.from('user_posts').insert([{
|
|
175
|
+
user_id: userData.user.id,
|
|
176
|
+
content: 'My post'
|
|
177
|
+
}]);
|
|
178
|
+
|
|
179
|
+
return new Response(JSON.stringify({ success: true }), {
|
|
180
|
+
status: 200,
|
|
181
|
+
headers: { ...corsHeaders, 'Content-Type': 'application/json' }
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
```
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Architecture
|
|
3
|
+
description: Enterprise-grade storage system powered by AWS S3
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## Overview
|
|
7
|
+
|
|
8
|
+
InsForge provides a high-performance, scalable storage system built on AWS S3, delivering enterprise-grade reliability with 99.999999999% (11 9's) durability.
|
|
9
|
+
|
|
10
|
+
## Technology Stack
|
|
11
|
+
|
|
12
|
+
```mermaid
|
|
13
|
+
graph TB
|
|
14
|
+
Client[Client Application] --> SDK[InsForge SDK]
|
|
15
|
+
SDK --> StorageAPI[Storage API]
|
|
16
|
+
|
|
17
|
+
StorageAPI --> S3[AWS S3]
|
|
18
|
+
|
|
19
|
+
StorageAPI --> DB[(PostgreSQL)]
|
|
20
|
+
DB --> Metadata[File Metadata]
|
|
21
|
+
DB --> Buckets[Bucket Configuration]
|
|
22
|
+
|
|
23
|
+
S3 --> DirectUpload[Presigned URLs]
|
|
24
|
+
S3 --> SecureAccess[IAM Policies]
|
|
25
|
+
|
|
26
|
+
style Client fill:#1e293b,stroke:#475569,color:#e2e8f0
|
|
27
|
+
style SDK fill:#1e40af,stroke:#3b82f6,color:#dbeafe
|
|
28
|
+
style StorageAPI fill:#166534,stroke:#22c55e,color:#dcfce7
|
|
29
|
+
style S3 fill:#ea580c,stroke:#f97316,color:#fed7aa
|
|
30
|
+
style DB fill:#0e7490,stroke:#06b6d4,color:#cffafe
|
|
31
|
+
style Metadata fill:#0e7490,stroke:#22d3ee,color:#cffafe
|
|
32
|
+
style Buckets fill:#0e7490,stroke:#22d3ee,color:#cffafe
|
|
33
|
+
style DirectUpload fill:#ea580c,stroke:#fb923c,color:#fed7aa
|
|
34
|
+
style SecureAccess fill:#ea580c,stroke:#fb923c,color:#fed7aa
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Core Components
|
|
38
|
+
|
|
39
|
+
| Component | Technology | Purpose |
|
|
40
|
+
|-----------|------------|---------|
|
|
41
|
+
| **Storage Backend** | AWS S3 | Enterprise-grade object storage |
|
|
42
|
+
| **Metadata Store** | PostgreSQL | File metadata, bucket configuration |
|
|
43
|
+
| **Upload Handler** | Multer | Multipart form data parsing (both backends) |
|
|
44
|
+
| **URL Strategy** | Presigned URLs | Secure direct uploads/downloads (S3 only) |
|
|
45
|
+
| **Access Control** | JWT + Bucket visibility | Public/private bucket permissions |
|
|
46
|
+
|
|
47
|
+
## AWS S3 Architecture
|
|
48
|
+
|
|
49
|
+
### Enterprise Features
|
|
50
|
+
|
|
51
|
+
- **Direct Uploads**: Presigned URLs bypass API server for unlimited scale
|
|
52
|
+
- **IAM Security**: Role-based authentication without credential management
|
|
53
|
+
- **Multi-Tenancy**: Secure isolation between projects using app key prefix
|
|
54
|
+
- **Bucket Policies**: Public and private bucket configurations
|
|
55
|
+
- **Automatic Cleanup**: Configurable lifecycle policies
|
|
56
|
+
- **Metadata Tracking**: Rich file metadata stored in PostgreSQL
|
|
57
|
+
|
|
58
|
+
## Upload Strategies
|
|
59
|
+
|
|
60
|
+
### Direct Upload to S3
|
|
61
|
+
|
|
62
|
+
```mermaid
|
|
63
|
+
sequenceDiagram
|
|
64
|
+
participant Client
|
|
65
|
+
participant API
|
|
66
|
+
participant S3
|
|
67
|
+
participant DB
|
|
68
|
+
|
|
69
|
+
Client->>API: POST/PUT with multipart/form-data
|
|
70
|
+
API->>S3: Upload file
|
|
71
|
+
S3-->>API: Success
|
|
72
|
+
API->>DB: Store metadata
|
|
73
|
+
API-->>Client: {url, key, size}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Presigned URL Upload (Recommended)
|
|
77
|
+
|
|
78
|
+
```mermaid
|
|
79
|
+
sequenceDiagram
|
|
80
|
+
participant Client
|
|
81
|
+
participant API
|
|
82
|
+
participant S3
|
|
83
|
+
participant DB
|
|
84
|
+
|
|
85
|
+
Client->>API: GET upload strategy
|
|
86
|
+
API->>S3: Generate presigned URL
|
|
87
|
+
S3-->>API: Presigned URL
|
|
88
|
+
API-->>Client: {uploadUrl, key}
|
|
89
|
+
Client->>S3: Direct upload
|
|
90
|
+
Client->>API: Confirm upload
|
|
91
|
+
API->>DB: Store metadata
|
|
92
|
+
API-->>Client: {url, key, size}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Bucket Configuration
|
|
96
|
+
|
|
97
|
+
### Bucket Types
|
|
98
|
+
|
|
99
|
+
| Type | Access | Use Case |
|
|
100
|
+
|------|--------|----------|
|
|
101
|
+
| **Public** | No auth required for downloads | Public assets, images, static files |
|
|
102
|
+
| **Private** | Auth required for all operations | User files, sensitive documents |
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
## File Operations
|
|
106
|
+
|
|
107
|
+
### Upload Flow
|
|
108
|
+
|
|
109
|
+
1. **Request Upload**: Client requests upload permission
|
|
110
|
+
2. **Validation**: Check auth, bucket permissions, file size
|
|
111
|
+
3. **Strategy Selection**: Choose direct or presigned upload
|
|
112
|
+
4. **Upload**: Client uploads via selected method
|
|
113
|
+
5. **Confirmation**: Verify upload and store metadata
|
|
114
|
+
6. **Response**: Return file URL and metadata
|
|
115
|
+
|
|
116
|
+
### Download Flow
|
|
117
|
+
|
|
118
|
+
1. **Request File**: Client requests file access
|
|
119
|
+
2. **Permission Check**: Verify bucket/object permissions
|
|
120
|
+
3. **Strategy Selection**: Direct serve or presigned URL
|
|
121
|
+
4. **Delivery**: Stream file or redirect to URL
|
|
122
|
+
|
|
123
|
+
## Security Features
|
|
124
|
+
|
|
125
|
+
<CardGroup cols={2}>
|
|
126
|
+
<Card title="Bucket Policies" icon="shield">
|
|
127
|
+
Public, private, or protected bucket access control
|
|
128
|
+
</Card>
|
|
129
|
+
|
|
130
|
+
<Card title="JWT Authentication" icon="key">
|
|
131
|
+
Token-based access for private resources
|
|
132
|
+
</Card>
|
|
133
|
+
|
|
134
|
+
<Card title="Presigned URLs" icon="link">
|
|
135
|
+
Time-limited URLs for secure S3 access
|
|
136
|
+
</Card>
|
|
137
|
+
|
|
138
|
+
<Card title="MIME Type Validation" icon="file-check">
|
|
139
|
+
Restrict uploads to allowed file types
|
|
140
|
+
</Card>
|
|
141
|
+
|
|
142
|
+
<Card title="Size Limits" icon="weight">
|
|
143
|
+
10MB default, configurable via MAX_FILE_SIZE
|
|
144
|
+
</Card>
|
|
145
|
+
|
|
146
|
+
<Card title="App Key Isolation" icon="key">
|
|
147
|
+
Multi-tenant isolation using app key prefix in S3
|
|
148
|
+
</Card>
|
|
149
|
+
</CardGroup>
|
|
150
|
+
|
|
151
|
+
## Intelligent Metadata Management
|
|
152
|
+
|
|
153
|
+
InsForge maintains optimized metadata in PostgreSQL for instant queries:
|
|
154
|
+
|
|
155
|
+
- **Fast Search**: Indexed metadata for sub-millisecond lookups
|
|
156
|
+
- **Rich Metadata**: MIME types, sizes, timestamps, custom tags
|
|
157
|
+
- **Usage Analytics**: Track downloads, bandwidth, popular files
|
|
158
|
+
- **Access Control**: Fine-grained permissions per file or bucket
|
|
159
|
+
|
|
160
|
+
### Secure URL Generation
|
|
161
|
+
|
|
162
|
+
| Type | Use Case | Security |
|
|
163
|
+
|------|----------|----------|
|
|
164
|
+
| **Public Access** | Static assets, images | Direct S3 URLs |
|
|
165
|
+
| **Presigned GET** | Private file access | Time-limited, single-use |
|
|
166
|
+
| **Presigned POST** | Direct uploads | Validated, size-limited |
|
|
167
|
+
|
|
168
|
+
## Performance Optimizations
|
|
169
|
+
|
|
170
|
+
### Performance Features
|
|
171
|
+
|
|
172
|
+
- **Direct S3 Access**: Bypass API server for uploads/downloads
|
|
173
|
+
- **Browser Caching**: Cache-Control headers
|
|
174
|
+
- **ETag Support**: Conditional requests for S3
|
|
175
|
+
- **Parallel Uploads**: Support for multipart uploads
|
|
176
|
+
|
|
177
|
+
### Upload Methods
|
|
178
|
+
|
|
179
|
+
**1. Direct Upload through API Server:**
|
|
180
|
+
- Client sends file to `/api/storage/buckets/{bucket}/objects`
|
|
181
|
+
- File passes through API server memory
|
|
182
|
+
- Server uploads to S3
|
|
183
|
+
- Limited by server memory (10MB default)
|
|
184
|
+
|
|
185
|
+
**2. Presigned URL Upload (Recommended):**
|
|
186
|
+
- Client requests upload URL from `/api/storage/buckets/{bucket}/upload-strategy`
|
|
187
|
+
- Server returns presigned POST URL
|
|
188
|
+
- Client uploads directly to S3 (bypasses API server)
|
|
189
|
+
- No server memory constraints
|
|
190
|
+
- Client confirms upload via `/api/storage/buckets/{bucket}/objects/{key}/confirm-upload`
|
|
191
|
+
|
|
192
|
+
## Configuration
|
|
193
|
+
|
|
194
|
+
### Environment Variables
|
|
195
|
+
|
|
196
|
+
| Variable | Description | Example |
|
|
197
|
+
|----------|-------------|---------|
|
|
198
|
+
| `AWS_S3_BUCKET` | S3 bucket name | `my-app-storage` |
|
|
199
|
+
| `AWS_REGION` | AWS region | `us-east-2` |
|
|
200
|
+
| `APP_KEY` | App key for S3 multi-tenancy | `my-app-key` |
|
|
201
|
+
|
|
202
|
+
### S3 Configuration
|
|
203
|
+
|
|
204
|
+
```javascript
|
|
205
|
+
// S3 client configuration
|
|
206
|
+
const s3Client = new S3Client({
|
|
207
|
+
region: this.region, // e.g., 'us-east-2'
|
|
208
|
+
// IAM role credentials are automatically used on EC2
|
|
209
|
+
// No explicit credentials needed in production
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
// File paths use app key prefix for multi-tenancy
|
|
213
|
+
const s3Key = `${this.appKey}/${bucket}/${key}`;
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
## Best Practices
|
|
217
|
+
|
|
218
|
+
<CardGroup cols={2}>
|
|
219
|
+
<Card title="Use Buckets" icon="folder">
|
|
220
|
+
Organize files logically in buckets
|
|
221
|
+
</Card>
|
|
222
|
+
|
|
223
|
+
<Card title="Set Limits" icon="gauge">
|
|
224
|
+
Configure appropriate size/type limits
|
|
225
|
+
</Card>
|
|
226
|
+
|
|
227
|
+
<Card title="Clean URLs" icon="link">
|
|
228
|
+
Use consistent, SEO-friendly key naming
|
|
229
|
+
</Card>
|
|
230
|
+
|
|
231
|
+
<Card title="Metadata" icon="tags">
|
|
232
|
+
Store searchable metadata in database
|
|
233
|
+
</Card>
|
|
234
|
+
|
|
235
|
+
<Card title="Backup Strategy" icon="cloud-arrow-up">
|
|
236
|
+
Implement regular backups for production
|
|
237
|
+
</Card>
|
|
238
|
+
|
|
239
|
+
<Card title="Monitor Usage" icon="chart-line">
|
|
240
|
+
Track storage costs and usage patterns
|
|
241
|
+
</Card>
|
|
242
|
+
</CardGroup>
|
|
243
|
+
|