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,13 +1,13 @@
|
|
|
1
1
|
import { Pool } from 'pg';
|
|
2
|
-
import { DatabaseManager } from '@/
|
|
3
|
-
import {
|
|
4
|
-
import { AppError } from '@/api/
|
|
2
|
+
import { DatabaseManager } from '@/infra/database/database.manager.js';
|
|
3
|
+
import { SecretService } from '@/services/secrets/secret.service.js';
|
|
4
|
+
import { AppError } from '@/api/middlewares/error.js';
|
|
5
5
|
import { ERROR_CODES } from '@/types/error-constants.js';
|
|
6
6
|
import logger from '@/utils/logger.js';
|
|
7
|
-
import { OAuthConfigSchema } from '@insforge/shared-schemas';
|
|
7
|
+
import { OAuthConfigSchema, OAuthProvidersSchema } from '@insforge/shared-schemas';
|
|
8
8
|
|
|
9
9
|
export interface CreateOAuthConfigInput {
|
|
10
|
-
provider:
|
|
10
|
+
provider: OAuthProvidersSchema;
|
|
11
11
|
clientId?: string;
|
|
12
12
|
clientSecret?: string;
|
|
13
13
|
redirectUri?: string;
|
|
@@ -26,11 +26,11 @@ export interface UpdateOAuthConfigInput {
|
|
|
26
26
|
export class OAuthConfigService {
|
|
27
27
|
private static instance: OAuthConfigService;
|
|
28
28
|
private pool: Pool | null = null;
|
|
29
|
-
private
|
|
29
|
+
private secretService: SecretService;
|
|
30
30
|
|
|
31
31
|
private constructor() {
|
|
32
|
-
this.
|
|
33
|
-
logger.info('
|
|
32
|
+
this.secretService = SecretService.getInstance();
|
|
33
|
+
logger.info('OAuthConfigService initialized');
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
public static getInstance(): OAuthConfigService {
|
|
@@ -51,15 +51,17 @@ export class OAuthConfigService {
|
|
|
51
51
|
* Get all OAuth configurations
|
|
52
52
|
*/
|
|
53
53
|
async getAllConfigs(): Promise<OAuthConfigSchema[]> {
|
|
54
|
-
const client = await this.getPool().connect();
|
|
55
54
|
try {
|
|
56
|
-
const result = await
|
|
55
|
+
const result = await this.getPool().query(
|
|
57
56
|
`SELECT
|
|
57
|
+
id,
|
|
58
58
|
provider,
|
|
59
59
|
client_id as "clientId",
|
|
60
60
|
redirect_uri as "redirectUri",
|
|
61
61
|
scopes,
|
|
62
|
-
use_shared_key as "useSharedKey"
|
|
62
|
+
use_shared_key as "useSharedKey",
|
|
63
|
+
created_at as "createdAt",
|
|
64
|
+
updated_at as "updatedAt"
|
|
63
65
|
FROM _oauth_configs
|
|
64
66
|
ORDER BY provider ASC`
|
|
65
67
|
);
|
|
@@ -68,8 +70,26 @@ export class OAuthConfigService {
|
|
|
68
70
|
} catch (error) {
|
|
69
71
|
logger.error('Failed to get OAuth configs', { error });
|
|
70
72
|
throw new AppError('Failed to get OAuth configurations', 500, ERROR_CODES.INTERNAL_ERROR);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Get public OAuth provider information (safe for public API)
|
|
78
|
+
* Only returns non-sensitive information about configured providers
|
|
79
|
+
*/
|
|
80
|
+
async getConfiguredProviders(): Promise<OAuthProvidersSchema[]> {
|
|
81
|
+
try {
|
|
82
|
+
const result = await this.getPool().query(
|
|
83
|
+
`SELECT
|
|
84
|
+
provider
|
|
85
|
+
FROM _oauth_configs
|
|
86
|
+
ORDER BY provider ASC`
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
return result.rows.map((row) => row.provider);
|
|
90
|
+
} catch (error) {
|
|
91
|
+
logger.error('Failed to get public OAuth providers', { error });
|
|
92
|
+
throw new AppError('Failed to get OAuth providers', 500, ERROR_CODES.INTERNAL_ERROR);
|
|
73
93
|
}
|
|
74
94
|
}
|
|
75
95
|
|
|
@@ -77,22 +97,24 @@ export class OAuthConfigService {
|
|
|
77
97
|
* Get OAuth configuration by provider name
|
|
78
98
|
*/
|
|
79
99
|
async getConfigByProvider(provider: string): Promise<OAuthConfigSchema | null> {
|
|
80
|
-
const client = await this.getPool().connect();
|
|
81
100
|
try {
|
|
82
|
-
const result = await
|
|
101
|
+
const result = await this.getPool().query(
|
|
83
102
|
`SELECT
|
|
103
|
+
id,
|
|
84
104
|
provider,
|
|
85
105
|
client_id as "clientId",
|
|
86
106
|
redirect_uri as "redirectUri",
|
|
87
107
|
scopes,
|
|
88
|
-
use_shared_key as "useSharedKey"
|
|
108
|
+
use_shared_key as "useSharedKey",
|
|
109
|
+
created_at as "createdAt",
|
|
110
|
+
updated_at as "updatedAt"
|
|
89
111
|
FROM _oauth_configs
|
|
90
112
|
WHERE LOWER(provider) = LOWER($1)
|
|
91
113
|
LIMIT 1`,
|
|
92
114
|
[provider]
|
|
93
115
|
);
|
|
94
116
|
|
|
95
|
-
if (result.rows.length
|
|
117
|
+
if (!result.rows.length) {
|
|
96
118
|
return null;
|
|
97
119
|
}
|
|
98
120
|
|
|
@@ -100,8 +122,6 @@ export class OAuthConfigService {
|
|
|
100
122
|
} catch (error) {
|
|
101
123
|
logger.error('Failed to get OAuth config by provider', { error, provider });
|
|
102
124
|
throw new AppError('Failed to get OAuth configuration', 500, ERROR_CODES.INTERNAL_ERROR);
|
|
103
|
-
} finally {
|
|
104
|
-
client.release();
|
|
105
125
|
}
|
|
106
126
|
}
|
|
107
127
|
|
|
@@ -109,9 +129,8 @@ export class OAuthConfigService {
|
|
|
109
129
|
* Get OAuth provider secret
|
|
110
130
|
*/
|
|
111
131
|
async getClientSecretByProvider(provider: string): Promise<string | null> {
|
|
112
|
-
const client = await this.getPool().connect();
|
|
113
132
|
try {
|
|
114
|
-
const result = await
|
|
133
|
+
const result = await this.getPool().query(
|
|
115
134
|
`SELECT
|
|
116
135
|
secret_id as "secretId"
|
|
117
136
|
FROM _oauth_configs
|
|
@@ -120,12 +139,12 @@ export class OAuthConfigService {
|
|
|
120
139
|
[provider]
|
|
121
140
|
);
|
|
122
141
|
|
|
123
|
-
if (result.rows.length
|
|
142
|
+
if (!result.rows.length) {
|
|
124
143
|
return null;
|
|
125
144
|
}
|
|
126
145
|
|
|
127
146
|
const config = result.rows[0];
|
|
128
|
-
const clientSecret = await this.
|
|
147
|
+
const clientSecret = await this.secretService.getSecretById(config.secretId);
|
|
129
148
|
if (!clientSecret) {
|
|
130
149
|
logger.warn('OAuth config exists but secret not found', { provider });
|
|
131
150
|
return null;
|
|
@@ -135,8 +154,6 @@ export class OAuthConfigService {
|
|
|
135
154
|
} catch (error) {
|
|
136
155
|
logger.error('Failed to get OAuth config with secret', { error, provider });
|
|
137
156
|
throw new AppError('Failed to get OAuth configuration', 500, ERROR_CODES.INTERNAL_ERROR);
|
|
138
|
-
} finally {
|
|
139
|
-
client.release();
|
|
140
157
|
}
|
|
141
158
|
}
|
|
142
159
|
|
|
@@ -154,7 +171,7 @@ export class OAuthConfigService {
|
|
|
154
171
|
[input.provider]
|
|
155
172
|
);
|
|
156
173
|
|
|
157
|
-
if (existingConfig.rows.length
|
|
174
|
+
if (existingConfig.rows.length) {
|
|
158
175
|
throw new AppError(
|
|
159
176
|
`OAuth configuration for ${input.provider} already exists`,
|
|
160
177
|
409,
|
|
@@ -167,7 +184,7 @@ export class OAuthConfigService {
|
|
|
167
184
|
// Only create secret if clientSecret is provided and not using shared key
|
|
168
185
|
if (input.clientSecret && !input.useSharedKey) {
|
|
169
186
|
// Create new secret
|
|
170
|
-
const secret = await this.
|
|
187
|
+
const secret = await this.secretService.createSecret({
|
|
171
188
|
key: `${input.provider.toUpperCase()}_CLIENT_SECRET`,
|
|
172
189
|
value: input.clientSecret,
|
|
173
190
|
});
|
|
@@ -177,11 +194,42 @@ export class OAuthConfigService {
|
|
|
177
194
|
// Set default scopes if not provided
|
|
178
195
|
let scopes = input.scopes;
|
|
179
196
|
if (!scopes) {
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
197
|
+
switch (input.provider) {
|
|
198
|
+
case 'google':
|
|
199
|
+
scopes = ['openid', 'email', 'profile'];
|
|
200
|
+
break;
|
|
201
|
+
case 'github':
|
|
202
|
+
scopes = ['user:email'];
|
|
203
|
+
break;
|
|
204
|
+
case 'discord':
|
|
205
|
+
scopes = ['identify', 'email'];
|
|
206
|
+
break;
|
|
207
|
+
case 'linkedin':
|
|
208
|
+
scopes = ['openid', 'profile', 'email'];
|
|
209
|
+
break;
|
|
210
|
+
case 'facebook':
|
|
211
|
+
scopes = ['email', 'public_profile'];
|
|
212
|
+
break;
|
|
213
|
+
case 'instagram':
|
|
214
|
+
scopes = ['user_profile', 'user_media'];
|
|
215
|
+
break;
|
|
216
|
+
case 'tiktok':
|
|
217
|
+
scopes = ['user.info.basic'];
|
|
218
|
+
break;
|
|
219
|
+
case 'apple':
|
|
220
|
+
scopes = ['name', 'email'];
|
|
221
|
+
break;
|
|
222
|
+
case 'x':
|
|
223
|
+
scopes = ['tweet.read', 'users.read'];
|
|
224
|
+
break;
|
|
225
|
+
case 'spotify':
|
|
226
|
+
scopes = ['user-read-email', 'user-read-private'];
|
|
227
|
+
break;
|
|
228
|
+
case 'microsoft':
|
|
229
|
+
scopes = ['User.Read'];
|
|
230
|
+
break;
|
|
231
|
+
default:
|
|
232
|
+
scopes = ['email', 'profile'];
|
|
185
233
|
}
|
|
186
234
|
}
|
|
187
235
|
|
|
@@ -190,11 +238,14 @@ export class OAuthConfigService {
|
|
|
190
238
|
`INSERT INTO _oauth_configs (provider, client_id, secret_id, redirect_uri, scopes, use_shared_key)
|
|
191
239
|
VALUES ($1, $2, $3, $4, $5, $6)
|
|
192
240
|
RETURNING
|
|
241
|
+
id,
|
|
193
242
|
provider,
|
|
194
243
|
client_id as "clientId",
|
|
195
244
|
redirect_uri as "redirectUri",
|
|
196
245
|
scopes,
|
|
197
|
-
use_shared_key as "useSharedKey"
|
|
246
|
+
use_shared_key as "useSharedKey",
|
|
247
|
+
created_at as "createdAt",
|
|
248
|
+
updated_at as "updatedAt"`,
|
|
198
249
|
[
|
|
199
250
|
input.provider.toLowerCase(),
|
|
200
251
|
input.clientId || null,
|
|
@@ -235,7 +286,7 @@ export class OAuthConfigService {
|
|
|
235
286
|
[provider]
|
|
236
287
|
);
|
|
237
288
|
|
|
238
|
-
if (existingResult.rows.length
|
|
289
|
+
if (!existingResult.rows.length) {
|
|
239
290
|
throw new AppError('OAuth configuration not found', 404, ERROR_CODES.NOT_FOUND);
|
|
240
291
|
}
|
|
241
292
|
|
|
@@ -245,12 +296,12 @@ export class OAuthConfigService {
|
|
|
245
296
|
if (input.clientSecret !== undefined) {
|
|
246
297
|
if (existingConfig.secretId) {
|
|
247
298
|
// Update existing secret
|
|
248
|
-
await this.
|
|
299
|
+
await this.secretService.updateSecret(existingConfig.secretId, {
|
|
249
300
|
value: input.clientSecret,
|
|
250
301
|
});
|
|
251
302
|
} else {
|
|
252
303
|
// Create new secret if it doesn't exist
|
|
253
|
-
const secret = await this.
|
|
304
|
+
const secret = await this.secretService.createSecret({
|
|
254
305
|
key: `${provider.toUpperCase()}_CLIENT_SECRET`,
|
|
255
306
|
value: input.clientSecret,
|
|
256
307
|
});
|
|
@@ -287,7 +338,7 @@ export class OAuthConfigService {
|
|
|
287
338
|
values.push(input.useSharedKey);
|
|
288
339
|
}
|
|
289
340
|
|
|
290
|
-
if (updates.length
|
|
341
|
+
if (!updates.length && input.clientSecret === undefined) {
|
|
291
342
|
await client.query('COMMIT');
|
|
292
343
|
// Return the config in the correct format
|
|
293
344
|
const config = await this.getConfigByProvider(provider);
|
|
@@ -297,7 +348,7 @@ export class OAuthConfigService {
|
|
|
297
348
|
return config;
|
|
298
349
|
}
|
|
299
350
|
|
|
300
|
-
if (updates.length
|
|
351
|
+
if (updates.length) {
|
|
301
352
|
updates.push('updated_at = NOW()');
|
|
302
353
|
values.push(provider.toLowerCase());
|
|
303
354
|
|
|
@@ -306,30 +357,33 @@ export class OAuthConfigService {
|
|
|
306
357
|
SET ${updates.join(', ')}
|
|
307
358
|
WHERE LOWER(provider) = $${paramCount}
|
|
308
359
|
RETURNING
|
|
360
|
+
id,
|
|
309
361
|
provider,
|
|
310
362
|
client_id as "clientId",
|
|
311
363
|
redirect_uri as "redirectUri",
|
|
312
364
|
scopes,
|
|
313
|
-
use_shared_key as "useSharedKey"
|
|
365
|
+
use_shared_key as "useSharedKey",
|
|
366
|
+
created_at as "createdAt",
|
|
367
|
+
updated_at as "updatedAt"`,
|
|
314
368
|
values
|
|
315
369
|
);
|
|
316
370
|
|
|
317
371
|
await client.query('COMMIT');
|
|
318
372
|
logger.info('OAuth config updated', { provider });
|
|
319
373
|
return result.rows[0];
|
|
320
|
-
} else {
|
|
321
|
-
// Only secret was updated
|
|
322
|
-
await client.query('COMMIT');
|
|
323
|
-
const updatedConfig = await this.getConfigByProvider(provider);
|
|
324
|
-
if (!updatedConfig) {
|
|
325
|
-
throw new AppError(
|
|
326
|
-
'Failed to retrieve updated configuration',
|
|
327
|
-
500,
|
|
328
|
-
ERROR_CODES.INTERNAL_ERROR
|
|
329
|
-
);
|
|
330
|
-
}
|
|
331
|
-
return updatedConfig;
|
|
332
374
|
}
|
|
375
|
+
|
|
376
|
+
// Only secret was updated
|
|
377
|
+
await client.query('COMMIT');
|
|
378
|
+
const updatedConfig = await this.getConfigByProvider(provider);
|
|
379
|
+
if (!updatedConfig) {
|
|
380
|
+
throw new AppError(
|
|
381
|
+
'Failed to retrieve updated configuration',
|
|
382
|
+
500,
|
|
383
|
+
ERROR_CODES.INTERNAL_ERROR
|
|
384
|
+
);
|
|
385
|
+
}
|
|
386
|
+
return updatedConfig;
|
|
333
387
|
} catch (error) {
|
|
334
388
|
await client.query('ROLLBACK');
|
|
335
389
|
logger.error('Failed to update OAuth config', { error, provider });
|
|
@@ -356,7 +410,7 @@ export class OAuthConfigService {
|
|
|
356
410
|
[provider]
|
|
357
411
|
);
|
|
358
412
|
|
|
359
|
-
if (existingResult.rows.length
|
|
413
|
+
if (!existingResult.rows.length) {
|
|
360
414
|
await client.query('ROLLBACK');
|
|
361
415
|
return false;
|
|
362
416
|
}
|