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
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { createRemoteJWKSet, JWTPayload, jwtVerify } from 'jose';
|
|
2
|
-
import { AppError } from '@/api/middleware/error.js';
|
|
3
|
-
import { ERROR_CODES, NEXT_ACTION } from '@/types/error-constants.js';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Helper function to verify cloud backend JWT token
|
|
7
|
-
* Validates JWT tokens from api.insforge.dev using JWKS
|
|
8
|
-
*/
|
|
9
|
-
export async function verifyCloudToken(
|
|
10
|
-
token: string
|
|
11
|
-
): Promise<{ projectId: string; payload: JWTPayload }> {
|
|
12
|
-
// Create JWKS endpoint for remote key set
|
|
13
|
-
const JWKS = createRemoteJWKSet(
|
|
14
|
-
new URL((process.env.CLOUD_API_HOST || 'https://api.insforge.dev') + '/.well-known/jwks.json')
|
|
15
|
-
);
|
|
16
|
-
|
|
17
|
-
// Verify the token with jose
|
|
18
|
-
const { payload } = await jwtVerify(token, JWKS, {
|
|
19
|
-
algorithms: ['RS256', 'RS384', 'RS512', 'ES256', 'ES384', 'ES512'],
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
// Verify project_id matches if configured
|
|
23
|
-
const tokenProjectId = payload['projectId'] as string;
|
|
24
|
-
const expectedProjectId = process.env.PROJECT_ID;
|
|
25
|
-
|
|
26
|
-
if (expectedProjectId && tokenProjectId !== expectedProjectId) {
|
|
27
|
-
throw new AppError(
|
|
28
|
-
'Project ID mismatch',
|
|
29
|
-
403,
|
|
30
|
-
ERROR_CODES.AUTH_UNAUTHORIZED,
|
|
31
|
-
NEXT_ACTION.CHECK_TOKEN
|
|
32
|
-
);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
return {
|
|
36
|
-
projectId: tokenProjectId || expectedProjectId || 'local',
|
|
37
|
-
payload,
|
|
38
|
-
};
|
|
39
|
-
}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { ColumnType } from '@insforge/shared-schemas';
|
|
2
|
-
|
|
3
|
-
export const convertSqlTypeToColumnType = (sqlType: string): ColumnType | string => {
|
|
4
|
-
switch (sqlType.toLowerCase()) {
|
|
5
|
-
case 'uuid':
|
|
6
|
-
return ColumnType.UUID;
|
|
7
|
-
case 'timestamptz':
|
|
8
|
-
case 'timestamp with time zone':
|
|
9
|
-
return ColumnType.DATETIME;
|
|
10
|
-
case 'date':
|
|
11
|
-
return ColumnType.DATE;
|
|
12
|
-
case 'integer':
|
|
13
|
-
case 'bigint':
|
|
14
|
-
case 'smallint':
|
|
15
|
-
case 'int':
|
|
16
|
-
case 'int2':
|
|
17
|
-
case 'int4':
|
|
18
|
-
case 'serial':
|
|
19
|
-
case 'serial2':
|
|
20
|
-
case 'serial4':
|
|
21
|
-
case 'serial8':
|
|
22
|
-
case 'smallserial':
|
|
23
|
-
case 'bigserial':
|
|
24
|
-
return ColumnType.INTEGER;
|
|
25
|
-
case 'double precision':
|
|
26
|
-
case 'real':
|
|
27
|
-
case 'numeric':
|
|
28
|
-
case 'float':
|
|
29
|
-
case 'float4':
|
|
30
|
-
case 'float8':
|
|
31
|
-
case 'decimal':
|
|
32
|
-
return ColumnType.FLOAT;
|
|
33
|
-
case 'boolean':
|
|
34
|
-
case 'bool':
|
|
35
|
-
return ColumnType.BOOLEAN;
|
|
36
|
-
case 'json':
|
|
37
|
-
case 'jsonb':
|
|
38
|
-
case 'array':
|
|
39
|
-
return ColumnType.JSON;
|
|
40
|
-
case 'text':
|
|
41
|
-
case 'varchar':
|
|
42
|
-
case 'char':
|
|
43
|
-
case 'character varying':
|
|
44
|
-
case 'character':
|
|
45
|
-
return ColumnType.STRING;
|
|
46
|
-
default:
|
|
47
|
-
return sqlType.slice(0, 5);
|
|
48
|
-
}
|
|
49
|
-
};
|
|
@@ -1,303 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
# Better Auth test script
|
|
4
|
-
# Tests the Better Auth v2 endpoints including admin functionality
|
|
5
|
-
|
|
6
|
-
# Get the directory where this script is located
|
|
7
|
-
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
|
8
|
-
|
|
9
|
-
# Test configuration
|
|
10
|
-
TEST_API_BASE="${TEST_API_BASE:-http://localhost:7130/api}"
|
|
11
|
-
TEST_ADMIN_EMAIL="${TEST_ADMIN_EMAIL:-${ADMIN_EMAIL:-admin@example.com}}"
|
|
12
|
-
TEST_ADMIN_PASSWORD="${TEST_ADMIN_PASSWORD:-${ADMIN_PASSWORD:-change-this-password}}"
|
|
13
|
-
TEST_USER_EMAIL_PREFIX="${TEST_USER_EMAIL_PREFIX:-testuser_}"
|
|
14
|
-
|
|
15
|
-
# Colors for output
|
|
16
|
-
RED='\033[0;31m'
|
|
17
|
-
GREEN='\033[0;32m'
|
|
18
|
-
YELLOW='\033[1;33m'
|
|
19
|
-
BLUE='\033[0;34m'
|
|
20
|
-
NC='\033[0m' # No Color
|
|
21
|
-
|
|
22
|
-
# Utility functions
|
|
23
|
-
print_success() {
|
|
24
|
-
echo -e "${GREEN}✅ $1${NC}"
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
print_fail() {
|
|
28
|
-
echo -e "${RED}❌ $1${NC}"
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
print_info() {
|
|
32
|
-
echo -e "${YELLOW}$1${NC}"
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
# Simple cleanup tracking
|
|
36
|
-
declare -a TEST_USERS_CREATED=()
|
|
37
|
-
|
|
38
|
-
register_test_user() {
|
|
39
|
-
local user_email=$1
|
|
40
|
-
TEST_USERS_CREATED+=("$user_email")
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
echo "🧪 Testing Better Auth v2..."
|
|
44
|
-
|
|
45
|
-
# Use configuration from test-config.sh
|
|
46
|
-
API_BASE="$TEST_API_BASE"
|
|
47
|
-
BETTER_AUTH_BASE="${API_BASE}/auth/v2"
|
|
48
|
-
ADMIN_TOKEN=""
|
|
49
|
-
USER_TOKEN=""
|
|
50
|
-
|
|
51
|
-
# Test function
|
|
52
|
-
# $1: method, $2: endpoint, $3: data, $4: description, $5: expected status (optional)
|
|
53
|
-
test_endpoint() {
|
|
54
|
-
local method=$1
|
|
55
|
-
local endpoint=$2
|
|
56
|
-
local data=$3
|
|
57
|
-
local description=$4
|
|
58
|
-
local expected_status=${5:-200}
|
|
59
|
-
local token=${6:-""}
|
|
60
|
-
|
|
61
|
-
print_info "Test: $description"
|
|
62
|
-
|
|
63
|
-
local response
|
|
64
|
-
if [ "$method" = "GET" ]; then
|
|
65
|
-
if [ -n "$token" ]; then
|
|
66
|
-
response=$(curl -s -w "\n%{http_code}" -X GET "$endpoint" \
|
|
67
|
-
-H "Content-Type: application/json" \
|
|
68
|
-
-H "Authorization: Bearer $token")
|
|
69
|
-
else
|
|
70
|
-
response=$(curl -s -w "\n%{http_code}" -X GET "$endpoint" \
|
|
71
|
-
-H "Content-Type: application/json")
|
|
72
|
-
fi
|
|
73
|
-
elif [ "$method" = "POST" ]; then
|
|
74
|
-
if [ -n "$token" ]; then
|
|
75
|
-
response=$(curl -s -w "\n%{http_code}" -X POST "$endpoint" \
|
|
76
|
-
-H "Content-Type: application/json" \
|
|
77
|
-
-H "Authorization: Bearer $token" \
|
|
78
|
-
-d "$data")
|
|
79
|
-
else
|
|
80
|
-
response=$(curl -s -w "\n%{http_code}" -X POST "$endpoint" \
|
|
81
|
-
-H "Content-Type: application/json" \
|
|
82
|
-
-d "$data")
|
|
83
|
-
fi
|
|
84
|
-
elif [ "$method" = "DELETE" ]; then
|
|
85
|
-
if [ -n "$token" ]; then
|
|
86
|
-
response=$(curl -s -w "\n%{http_code}" -X DELETE "$endpoint" \
|
|
87
|
-
-H "Content-Type: application/json" \
|
|
88
|
-
-H "Authorization: Bearer $token")
|
|
89
|
-
else
|
|
90
|
-
response=$(curl -s -w "\n%{http_code}" -X DELETE "$endpoint" \
|
|
91
|
-
-H "Content-Type: application/json")
|
|
92
|
-
fi
|
|
93
|
-
fi
|
|
94
|
-
|
|
95
|
-
# Split response into body and status code
|
|
96
|
-
# Use sed instead of head -n -1 for better compatibility
|
|
97
|
-
body=$(echo "$response" | sed '$d')
|
|
98
|
-
status=$(echo "$response" | tail -n 1)
|
|
99
|
-
|
|
100
|
-
if [ "$status" = "$expected_status" ]; then
|
|
101
|
-
print_success "Success ($status)"
|
|
102
|
-
if [ -n "$body" ]; then
|
|
103
|
-
echo "Response: $body" | head -c 200
|
|
104
|
-
echo ""
|
|
105
|
-
fi
|
|
106
|
-
else
|
|
107
|
-
print_fail "Failed - Expected $expected_status, got $status"
|
|
108
|
-
echo "Error: $body"
|
|
109
|
-
fi
|
|
110
|
-
echo ""
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
echo "=== Admin Authentication Tests ==="
|
|
114
|
-
echo ""
|
|
115
|
-
|
|
116
|
-
# 1. Test admin sign-in with correct credentials
|
|
117
|
-
print_info "1. Admin sign-in with correct credentials"
|
|
118
|
-
admin_response=$(curl -s -X POST "$BETTER_AUTH_BASE/admin/sign-in" \
|
|
119
|
-
-H "Content-Type: application/json" \
|
|
120
|
-
-d "{\"email\":\"$TEST_ADMIN_EMAIL\",\"password\":\"$TEST_ADMIN_PASSWORD\"}")
|
|
121
|
-
|
|
122
|
-
if echo "$admin_response" | grep -q '"token"'; then
|
|
123
|
-
print_success "Admin sign-in successful"
|
|
124
|
-
ADMIN_TOKEN=$(echo "$admin_response" | grep -o '"token":"[^"]*"' | cut -d'"' -f4)
|
|
125
|
-
admin_user=$(echo "$admin_response" | grep -o '"user":{[^}]*}' || echo "")
|
|
126
|
-
echo "Admin info: $admin_user"
|
|
127
|
-
else
|
|
128
|
-
print_fail "Admin sign-in failed"
|
|
129
|
-
echo "Response: $admin_response"
|
|
130
|
-
fi
|
|
131
|
-
echo ""
|
|
132
|
-
|
|
133
|
-
# 2. Test admin sign-in with wrong password
|
|
134
|
-
test_endpoint "POST" "$BETTER_AUTH_BASE/admin/sign-in" \
|
|
135
|
-
"{\"email\":\"$TEST_ADMIN_EMAIL\",\"password\":\"wrong-password\"}" \
|
|
136
|
-
"Admin sign-in with wrong password (should fail)" \
|
|
137
|
-
"401"
|
|
138
|
-
|
|
139
|
-
# 3. Test admin sign-in with non-admin email
|
|
140
|
-
test_endpoint "POST" "$BETTER_AUTH_BASE/admin/sign-in" \
|
|
141
|
-
"{\"email\":\"notadmin@example.com\",\"password\":\"$TEST_ADMIN_PASSWORD\"}" \
|
|
142
|
-
"Admin sign-in with non-admin email (should fail)" \
|
|
143
|
-
"403"
|
|
144
|
-
|
|
145
|
-
# 4. Test admin register (should fail - already exists)
|
|
146
|
-
test_endpoint "POST" "$BETTER_AUTH_BASE/admin/register" \
|
|
147
|
-
"{\"email\":\"$TEST_ADMIN_EMAIL\",\"password\":\"$TEST_ADMIN_PASSWORD\",\"name\":\"Admin\"}" \
|
|
148
|
-
"Admin register when already exists (should fail)" \
|
|
149
|
-
"409"
|
|
150
|
-
|
|
151
|
-
echo "=== Regular User Registration Tests ==="
|
|
152
|
-
echo ""
|
|
153
|
-
|
|
154
|
-
# 5. Register a regular user
|
|
155
|
-
USER_EMAIL="${TEST_USER_EMAIL_PREFIX}betterauth_$(date +%s)@example.com"
|
|
156
|
-
USER_PASS="testpass123"
|
|
157
|
-
USER_NAME="Better Auth Test User"
|
|
158
|
-
|
|
159
|
-
register_test_user "$USER_EMAIL"
|
|
160
|
-
|
|
161
|
-
print_info "5. Registering new user: $USER_EMAIL"
|
|
162
|
-
register_response=$(curl -s -X POST "$BETTER_AUTH_BASE/sign-up/email" \
|
|
163
|
-
-H "Content-Type: application/json" \
|
|
164
|
-
-d "{\"email\":\"$USER_EMAIL\",\"password\":\"$USER_PASS\",\"name\":\"$USER_NAME\"}")
|
|
165
|
-
|
|
166
|
-
if echo "$register_response" | grep -q '"user"'; then
|
|
167
|
-
print_success "User registration successful"
|
|
168
|
-
user_info=$(echo "$register_response" | grep -o '"user":{[^}]*}' || echo "")
|
|
169
|
-
echo "User info: $user_info"
|
|
170
|
-
else
|
|
171
|
-
print_fail "User registration failed"
|
|
172
|
-
echo "Response: $register_response"
|
|
173
|
-
fi
|
|
174
|
-
echo ""
|
|
175
|
-
|
|
176
|
-
# 6. Sign in as regular user
|
|
177
|
-
print_info "6. Sign in as regular user"
|
|
178
|
-
signin_response=$(curl -s -X POST "$BETTER_AUTH_BASE/sign-in/email" \
|
|
179
|
-
-H "Content-Type: application/json" \
|
|
180
|
-
-d "{\"email\":\"$USER_EMAIL\",\"password\":\"$USER_PASS\"}")
|
|
181
|
-
|
|
182
|
-
if echo "$signin_response" | grep -q '"token"'; then
|
|
183
|
-
print_success "User sign-in successful"
|
|
184
|
-
USER_TOKEN=$(echo "$signin_response" | grep -o '"token":"[^"]*"' | cut -d'"' -f4)
|
|
185
|
-
else
|
|
186
|
-
print_fail "User sign-in failed"
|
|
187
|
-
echo "Response: $signin_response"
|
|
188
|
-
fi
|
|
189
|
-
echo ""
|
|
190
|
-
|
|
191
|
-
# 7. Test duplicate registration
|
|
192
|
-
test_endpoint "POST" "$BETTER_AUTH_BASE/sign-up/email" \
|
|
193
|
-
"{\"email\":\"$USER_EMAIL\",\"password\":\"$USER_PASS\",\"name\":\"Duplicate\"}" \
|
|
194
|
-
"Duplicate user registration (should fail)" \
|
|
195
|
-
"422"
|
|
196
|
-
|
|
197
|
-
echo "=== Admin User Management Tests ==="
|
|
198
|
-
echo ""
|
|
199
|
-
|
|
200
|
-
# 8. List users with admin token
|
|
201
|
-
print_info "8. List all users (admin only)"
|
|
202
|
-
if [ -n "$ADMIN_TOKEN" ]; then
|
|
203
|
-
users_response=$(curl -s -X GET "$BETTER_AUTH_BASE/admin/users" \
|
|
204
|
-
-H "Authorization: Bearer $ADMIN_TOKEN")
|
|
205
|
-
|
|
206
|
-
if echo "$users_response" | grep -q '"users"'; then
|
|
207
|
-
print_success "List users successful"
|
|
208
|
-
user_count=$(echo "$users_response" | grep -o '"total":[0-9]*' | cut -d':' -f2 || echo "0")
|
|
209
|
-
echo "Total non-admin users: $user_count"
|
|
210
|
-
|
|
211
|
-
# Verify admin is not in the list
|
|
212
|
-
if echo "$users_response" | grep -q "$TEST_ADMIN_EMAIL"; then
|
|
213
|
-
print_fail "Admin user should not be in regular user list!"
|
|
214
|
-
else
|
|
215
|
-
print_success "Admin correctly excluded from user list"
|
|
216
|
-
fi
|
|
217
|
-
else
|
|
218
|
-
print_fail "List users failed"
|
|
219
|
-
echo "Response: $users_response"
|
|
220
|
-
fi
|
|
221
|
-
else
|
|
222
|
-
print_fail "No admin token available"
|
|
223
|
-
fi
|
|
224
|
-
echo ""
|
|
225
|
-
|
|
226
|
-
# 9. List users with pagination
|
|
227
|
-
test_endpoint "GET" "$BETTER_AUTH_BASE/admin/users?limit=5&offset=0" \
|
|
228
|
-
"" \
|
|
229
|
-
"List users with pagination (limit=5)" \
|
|
230
|
-
"200" \
|
|
231
|
-
"$ADMIN_TOKEN"
|
|
232
|
-
|
|
233
|
-
# 10. Try to access admin endpoint without token
|
|
234
|
-
test_endpoint "GET" "$BETTER_AUTH_BASE/admin/users" \
|
|
235
|
-
"" \
|
|
236
|
-
"Access admin endpoint without token (should fail)" \
|
|
237
|
-
"401"
|
|
238
|
-
|
|
239
|
-
# 11. Try to access admin endpoint with regular user token
|
|
240
|
-
if [ -n "$USER_TOKEN" ]; then
|
|
241
|
-
test_endpoint "GET" "$BETTER_AUTH_BASE/admin/users" \
|
|
242
|
-
"" \
|
|
243
|
-
"Access admin endpoint with regular user token (should fail)" \
|
|
244
|
-
"401" \
|
|
245
|
-
"$USER_TOKEN"
|
|
246
|
-
fi
|
|
247
|
-
|
|
248
|
-
echo "=== Token Verification Tests ==="
|
|
249
|
-
echo ""
|
|
250
|
-
|
|
251
|
-
# 12. Verify admin JWT claims
|
|
252
|
-
if [ -n "$ADMIN_TOKEN" ]; then
|
|
253
|
-
print_info "12. Verifying admin JWT claims"
|
|
254
|
-
# Decode JWT payload (base64 decode the middle part)
|
|
255
|
-
payload=$(echo "$ADMIN_TOKEN" | cut -d'.' -f2 | base64 -d 2>/dev/null || echo "")
|
|
256
|
-
|
|
257
|
-
if echo "$payload" | grep -q '"role":"project_admin"'; then
|
|
258
|
-
print_success "Admin token has correct role claim"
|
|
259
|
-
else
|
|
260
|
-
print_fail "Admin token missing project_admin role"
|
|
261
|
-
fi
|
|
262
|
-
|
|
263
|
-
if echo "$payload" | grep -q '"type":"admin"'; then
|
|
264
|
-
print_success "Admin token has correct type claim"
|
|
265
|
-
else
|
|
266
|
-
print_fail "Admin token missing admin type"
|
|
267
|
-
fi
|
|
268
|
-
fi
|
|
269
|
-
|
|
270
|
-
# 13. Note about regular user tokens
|
|
271
|
-
if [ -n "$USER_TOKEN" ]; then
|
|
272
|
-
print_info "13. Regular user tokens"
|
|
273
|
-
print_success "Regular users receive session tokens (not JWTs)"
|
|
274
|
-
echo "Token format: $USER_TOKEN" | cut -c1-50
|
|
275
|
-
echo "..."
|
|
276
|
-
fi
|
|
277
|
-
|
|
278
|
-
echo ""
|
|
279
|
-
echo "=== Additional Better Auth Tests ==="
|
|
280
|
-
echo ""
|
|
281
|
-
|
|
282
|
-
# 17. Test error handling
|
|
283
|
-
test_endpoint "POST" "$BETTER_AUTH_BASE/sign-in/email" \
|
|
284
|
-
"{\"email\":\"invalid-email\",\"password\":\"pass\"}" \
|
|
285
|
-
"Sign in with invalid email format" \
|
|
286
|
-
"400"
|
|
287
|
-
|
|
288
|
-
test_endpoint "POST" "$BETTER_AUTH_BASE/sign-up/email" \
|
|
289
|
-
"{\"email\":\"test@example.com\"}" \
|
|
290
|
-
"Register without password" \
|
|
291
|
-
"500"
|
|
292
|
-
|
|
293
|
-
echo ""
|
|
294
|
-
print_success "🎉 Better Auth test completed!"
|
|
295
|
-
|
|
296
|
-
# Simple cleanup
|
|
297
|
-
if [ ${#TEST_USERS_CREATED[@]} -gt 0 ]; then
|
|
298
|
-
print_info "Test users created: ${#TEST_USERS_CREATED[@]}"
|
|
299
|
-
print_info "Manual cleanup may be required for test users"
|
|
300
|
-
fi
|
|
301
|
-
|
|
302
|
-
echo ""
|
|
303
|
-
print_info "Test completed!"
|
package/docker-init/db/logs.sql
DELETED
package/frontend/README.md
DELETED
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
# Insforge Dashboard
|
|
2
|
-
|
|
3
|
-
A React-based admin dashboard for managing Insforge projects and databases.
|
|
4
|
-
|
|
5
|
-
## Features
|
|
6
|
-
|
|
7
|
-
- **Dashboard Overview**: System statistics and project overview
|
|
8
|
-
- **Project Management**: Create, view, and delete projects
|
|
9
|
-
- **Database Viewer**: Browse tables, schemas, and data
|
|
10
|
-
- **API Key Management**: Copy and manage project API keys
|
|
11
|
-
- **User Authentication**: Secure admin login
|
|
12
|
-
|
|
13
|
-
## Development
|
|
14
|
-
|
|
15
|
-
```bash
|
|
16
|
-
# Install dependencies
|
|
17
|
-
npm install
|
|
18
|
-
|
|
19
|
-
# Start development server (runs on port 7131)
|
|
20
|
-
npm run dev
|
|
21
|
-
|
|
22
|
-
# Build for production
|
|
23
|
-
npm run build
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
## Built With
|
|
27
|
-
|
|
28
|
-
- **React 18** - UI Framework
|
|
29
|
-
- **TypeScript** - Type safety
|
|
30
|
-
- **Tailwind CSS** - Styling
|
|
31
|
-
- **Vite** - Build tool
|
|
32
|
-
- **React Router** - Navigation
|
|
33
|
-
- **Lucide React** - Icons
|
|
34
|
-
|
|
35
|
-
## API Integration
|
|
36
|
-
|
|
37
|
-
The dashboard communicates with the Insforge backend via REST API:
|
|
38
|
-
|
|
39
|
-
### Authentication
|
|
40
|
-
- `POST /api/auth/register` - User registration
|
|
41
|
-
- `POST /api/auth/login` - User login (email/password)
|
|
42
|
-
- `GET /api/auth/me` - Get current user info
|
|
43
|
-
- `GET /api/auth/users` - List all users (admin only)
|
|
44
|
-
|
|
45
|
-
### Database Management
|
|
46
|
-
- `GET /api/database/tables` - List all tables
|
|
47
|
-
- `POST /api/database/tables` - Create new table with schema
|
|
48
|
-
- `DELETE /api/database/tables/:tablename` - Delete table
|
|
49
|
-
- `GET /api/database/tables/:tablename/schema` - Get table schema
|
|
50
|
-
- `PATCH /api/database/tables/:tablename/schema` - Modify table schema
|
|
51
|
-
|
|
52
|
-
### Record Operations
|
|
53
|
-
- `GET /api/database/records/:tablename` - Query records (supports pagination)
|
|
54
|
-
- `POST /api/database/records/:tablename` - Insert records
|
|
55
|
-
- `PATCH /api/database/records/:tablename?id=eq.:id` - Update specific record
|
|
56
|
-
- `DELETE /api/database/records/:tablename?id=eq.:id` - Delete specific record
|
|
57
|
-
|
|
58
|
-
### Storage
|
|
59
|
-
- `GET /api/storage/buckets` - List all buckets
|
|
60
|
-
- `POST /api/storage/buckets` - Create new bucket
|
|
61
|
-
- `PATCH /api/storage/buckets/:bucketName` - Update bucket
|
|
62
|
-
- `DELETE /api/storage/buckets/:bucketName` - Delete bucket
|
|
63
|
-
- `GET /api/storage/buckets/:bucketName/objects` - List objects in bucket
|
|
64
|
-
- `PUT /api/storage/buckets/:bucketName/objects/:objectKey` - Upload object with specific key
|
|
65
|
-
- `POST /api/storage/buckets/:bucketName/objects` - Upload object with auto-generated key
|
|
66
|
-
- `GET /api/storage/buckets/:bucketName/objects/:objectKey` - Download object
|
|
67
|
-
- `DELETE /api/storage/buckets/:bucketName/objects/:objectKey` - Delete object
|
|
68
|
-
|
|
69
|
-
### Metadata & Logs
|
|
70
|
-
- `GET /api/metadata` - Get system metadata and statistics
|
|
71
|
-
- `GET /api/logs` - Get activity logs (admin only)
|
|
72
|
-
|
|
73
|
-
## Project Structure
|
|
74
|
-
|
|
75
|
-
```
|
|
76
|
-
frontend/
|
|
77
|
-
├── src/
|
|
78
|
-
│ ├── components/ # Reusable UI components
|
|
79
|
-
│ │ ├── layout/ # Layout components
|
|
80
|
-
│ │ └── table/ # Table components
|
|
81
|
-
│ ├── features/ # Feature modules
|
|
82
|
-
│ │ ├── auth/ # Authentication (login, users)
|
|
83
|
-
│ │ ├── dashboard/ # Dashboard & metadata
|
|
84
|
-
│ │ ├── database/ # Database management
|
|
85
|
-
│ │ ├── logs/ # Activity logs
|
|
86
|
-
│ │ └── storage/ # File storage
|
|
87
|
-
│ ├── lib/ # Utilities and API client
|
|
88
|
-
│ │ └── api/ # API client configuration
|
|
89
|
-
│ ├── types/ # TypeScript type definitions
|
|
90
|
-
│ ├── App.tsx # Main app component
|
|
91
|
-
│ └── main.tsx # Entry point
|
|
92
|
-
├── public/ # Static assets
|
|
93
|
-
├── index.html # HTML template
|
|
94
|
-
├── vite.config.ts # Vite configuration
|
|
95
|
-
└── package.json # Dependencies
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
## Usage
|
|
99
|
-
|
|
100
|
-
1. Start the Insforge backend server
|
|
101
|
-
2. Navigate to `http://localhost:7130` in your browser (production) or `http://localhost:7131` (development)
|
|
102
|
-
3. Login with your admin credentials (from .env file)
|
|
103
|
-
4. Create tables and manage data
|
|
104
|
-
|
|
105
|
-
### Key Features
|
|
106
|
-
- **Table Management**: Create tables with explicit schemas defining column types
|
|
107
|
-
- **Data Types**: Support for string, integer, float, boolean, datetime, json, uuid, and file types
|
|
108
|
-
- **Auto-generated Fields**: Every table gets id, created_at, and updated_at fields
|
|
109
|
-
- **Record Management**: Full CRUD operations with pagination support
|
|
110
|
-
- **API Key**: Single API key for all database operations (displayed in dashboard)
|
|
111
|
-
|
|
112
|
-
The dashboard is automatically served by the backend when you access the root URL.
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
export type {
|
|
2
|
-
Column,
|
|
3
|
-
SortColumn,
|
|
4
|
-
RenderCellProps,
|
|
5
|
-
RenderEditCellProps,
|
|
6
|
-
RenderHeaderCellProps,
|
|
7
|
-
CellClickArgs,
|
|
8
|
-
CellMouseEvent,
|
|
9
|
-
} from 'react-data-grid';
|
|
10
|
-
export * from './datagridTypes';
|
|
11
|
-
|
|
12
|
-
import IdCell from './IdCell';
|
|
13
|
-
import SortableHeaderRenderer from './SortableHeader';
|
|
14
|
-
import { createDefaultCellRenderer } from './DefaultCellRenderer';
|
|
15
|
-
import DataGrid, { type DataGridProps } from './DataGrid';
|
|
16
|
-
|
|
17
|
-
export { IdCell, SortableHeaderRenderer, DataGrid, type DataGridProps, createDefaultCellRenderer };
|
|
18
|
-
|
|
19
|
-
// Export cell editors
|
|
20
|
-
export * from './cell-editors';
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import { useEffect } from 'react';
|
|
2
|
-
import { useNavigate, useLocation } from 'react-router-dom';
|
|
3
|
-
import { ThemeProvider } from '@/lib/contexts/ThemeContext';
|
|
4
|
-
import { cn } from '@/lib/utils/utils';
|
|
5
|
-
import { ServerEvents, useSocket } from '@/lib/contexts/SocketContext';
|
|
6
|
-
|
|
7
|
-
interface CloudLayoutProps {
|
|
8
|
-
children: React.ReactNode;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
interface RouterMessage {
|
|
12
|
-
type: 'ROUTE_CHANGE' | 'REFRESH';
|
|
13
|
-
path: string;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export default function CloudLayout({ children }: CloudLayoutProps) {
|
|
17
|
-
const navigate = useNavigate();
|
|
18
|
-
const location = useLocation();
|
|
19
|
-
const { socket } = useSocket();
|
|
20
|
-
|
|
21
|
-
useEffect(() => {
|
|
22
|
-
const handleCloudMessage = (event: MessageEvent) => {
|
|
23
|
-
try {
|
|
24
|
-
const message = event.data as RouterMessage;
|
|
25
|
-
|
|
26
|
-
if (message.type === 'ROUTE_CHANGE' && message.path) {
|
|
27
|
-
// Navigate to the corresponding cloud route
|
|
28
|
-
void navigate(message.path);
|
|
29
|
-
} else if (message.type === 'REFRESH') {
|
|
30
|
-
window.location.reload();
|
|
31
|
-
}
|
|
32
|
-
} catch (error) {
|
|
33
|
-
console.error('Error handling router message:', error);
|
|
34
|
-
}
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
// Add event listener for messages from parent window
|
|
38
|
-
window.addEventListener('message', handleCloudMessage);
|
|
39
|
-
|
|
40
|
-
// Cleanup listener on unmount
|
|
41
|
-
return () => {
|
|
42
|
-
window.removeEventListener('message', handleCloudMessage);
|
|
43
|
-
};
|
|
44
|
-
}, [navigate]);
|
|
45
|
-
|
|
46
|
-
useEffect(() => {
|
|
47
|
-
// Only send messages if we're in an iframe (not the main window)
|
|
48
|
-
if (window.parent !== window) {
|
|
49
|
-
// Send the current route to the parent cloud application
|
|
50
|
-
window.parent.postMessage(
|
|
51
|
-
{
|
|
52
|
-
type: 'APP_ROUTE_CHANGE',
|
|
53
|
-
path: location.pathname,
|
|
54
|
-
},
|
|
55
|
-
'*'
|
|
56
|
-
);
|
|
57
|
-
}
|
|
58
|
-
}, [location.pathname]);
|
|
59
|
-
|
|
60
|
-
// Listen for MCP connection events and forward to parent
|
|
61
|
-
useEffect(() => {
|
|
62
|
-
if (!socket || window.parent === window) {
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const handleMcpConnected = () => {
|
|
67
|
-
window.parent.postMessage(
|
|
68
|
-
{
|
|
69
|
-
type: 'MCP_CONNECTION_STATUS',
|
|
70
|
-
connected: true,
|
|
71
|
-
},
|
|
72
|
-
'*'
|
|
73
|
-
);
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
socket.on(ServerEvents.MCP_CONNECTED, handleMcpConnected);
|
|
77
|
-
|
|
78
|
-
return () => {
|
|
79
|
-
socket.off(ServerEvents.MCP_CONNECTED, handleMcpConnected);
|
|
80
|
-
};
|
|
81
|
-
}, [socket]);
|
|
82
|
-
|
|
83
|
-
return (
|
|
84
|
-
<ThemeProvider forcedTheme="dark">
|
|
85
|
-
<div
|
|
86
|
-
className={cn(
|
|
87
|
-
'h-screen bg-neutral-800',
|
|
88
|
-
location.pathname !== '/cloud/visualizer' && 'pt-13 pl-13'
|
|
89
|
-
)}
|
|
90
|
-
>
|
|
91
|
-
{children}
|
|
92
|
-
</div>
|
|
93
|
-
</ThemeProvider>
|
|
94
|
-
);
|
|
95
|
-
}
|