insforge 0.3.2 → 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 -781
- package/backend/src/core/database/table.ts +0 -772
- package/backend/src/core/documentation/agent.ts +0 -689
- package/backend/src/core/documentation/openapi.ts +0 -856
- package/backend/src/core/logs/analytics.ts +0 -76
- package/backend/src/core/logs/providers/localdb.provider.ts +0 -246
- package/backend/src/core/storage/storage.ts +0 -923
- package/backend/src/utils/cloud-token.ts +0 -39
- package/backend/src/utils/helpers.ts +0 -49
- package/backend/src/utils/uuid.ts +0 -9
- package/backend/tests/manual/test-better-auth.sh +0 -303
- package/docker-init/db/logs.sql +0 -9
- package/frontend/README.md +0 -112
- package/frontend/src/components/datagrid/index.tsx +0 -20
- package/frontend/src/components/layout/CloudLayout.tsx +0 -95
- package/frontend/src/features/ai/components/AIConfigDialog.tsx +0 -76
- package/frontend/src/features/ai/components/AIConfigForm.tsx +0 -222
- package/frontend/src/features/ai/components/fields/ModalityField.tsx +0 -87
- package/frontend/src/features/ai/components/fields/ModelSelectionField.tsx +0 -134
- package/frontend/src/features/ai/components/fields/SystemPromptField.tsx +0 -33
- package/frontend/src/features/auth/components/AddOAuthDialog.tsx +0 -106
- package/frontend/src/features/auth/components/AuthMethodTab.tsx +0 -238
- package/frontend/src/features/auth/components/UsersTab.tsx +0 -114
- package/frontend/src/features/auth/page/AuthenticationPage.tsx +0 -169
- package/frontend/src/features/database/hooks/UseLinkModal.tsx +0 -78
- package/frontend/src/features/functions/components/FunctionViewer.tsx +0 -46
- package/frontend/src/features/functions/components/FunctionsContent.tsx +0 -88
- package/frontend/src/features/login/components/AuthErrorBoundary.tsx +0 -87
- package/frontend/src/features/login/components/PrivateRoute.tsx +0 -24
- package/frontend/src/features/logs/components/AnalyticsLogsTable.tsx +0 -313
- package/frontend/src/features/logs/components/LogsTable.tsx +0 -199
- package/frontend/src/features/logs/page/AnalyticsLogsPage.tsx +0 -530
- package/frontend/src/features/metadata/index.ts +0 -0
- package/frontend/src/features/metadata/page/MetadataPage.tsx +0 -136
- package/frontend/src/features/onboard/components/CompletionCard.tsx +0 -41
- package/frontend/src/features/onboard/components/OnboardButton.tsx +0 -84
- package/frontend/src/features/onboard/components/StepContent.tsx +0 -91
- package/frontend/src/features/onboard/components/TestConnectionStep.tsx +0 -53
- package/frontend/src/features/onboard/components/mcp/McpInstallation.tsx +0 -144
- package/frontend/src/features/onboard/page/OnBoardPage.tsx +0 -104
- package/frontend/src/features/onboard/types.ts +0 -8
- package/frontend/src/lib/contexts/OnboardStepContext.tsx +0 -68
- package/frontend/src/lib/hooks/useOnboardingCompletion.ts +0 -29
- /package/backend/src/api/{middleware → middlewares}/error.ts +0 -0
- /package/backend/src/api/{middleware → middlewares}/upload.ts +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/000_create-base-tables.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/001_create-helper-functions.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/002_rename-auth-tables.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/003_create-users-table.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/004_add-reload-postgrest-func.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/005_enable-project-admin-modify-users.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/006_modify-ai-usage-table.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/007_drop-metadata-table.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/008_add-system-tables.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/009_add-function-secrets.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/010_modify-ai-config-modalities.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/011_refactor-secrets-table.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/012_add-storage-uploaded-by.sql +0 -0
- /package/frontend/src/{features/metadata → lib}/services/metadata.service.ts +0 -0
|
@@ -0,0 +1,526 @@
|
|
|
1
|
+
import { DatabaseTemplate } from './index';
|
|
2
|
+
|
|
3
|
+
export const redditCloneTemplate: DatabaseTemplate = {
|
|
4
|
+
id: 'reddit-clone',
|
|
5
|
+
title: 'Reddit Clone',
|
|
6
|
+
description: 'A community space with posts, comments, threaded replies, and voting',
|
|
7
|
+
tableCount: 5,
|
|
8
|
+
visualizerSchema: [
|
|
9
|
+
{
|
|
10
|
+
tableName: 'communities',
|
|
11
|
+
columns: [
|
|
12
|
+
{ columnName: 'id', type: 'uuid', isPrimaryKey: true, isNullable: false, isUnique: true },
|
|
13
|
+
{
|
|
14
|
+
columnName: 'name',
|
|
15
|
+
type: 'varchar',
|
|
16
|
+
isPrimaryKey: false,
|
|
17
|
+
isNullable: false,
|
|
18
|
+
isUnique: true,
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
columnName: 'display_name',
|
|
22
|
+
type: 'varchar',
|
|
23
|
+
isPrimaryKey: false,
|
|
24
|
+
isNullable: false,
|
|
25
|
+
isUnique: false,
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
columnName: 'description',
|
|
29
|
+
type: 'text',
|
|
30
|
+
isPrimaryKey: false,
|
|
31
|
+
isNullable: true,
|
|
32
|
+
isUnique: false,
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
columnName: 'creator_id',
|
|
36
|
+
type: 'uuid',
|
|
37
|
+
isPrimaryKey: false,
|
|
38
|
+
isNullable: false,
|
|
39
|
+
isUnique: false,
|
|
40
|
+
foreignKey: {
|
|
41
|
+
referenceTable: 'users',
|
|
42
|
+
referenceColumn: 'id',
|
|
43
|
+
onDelete: 'CASCADE',
|
|
44
|
+
onUpdate: 'CASCADE',
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
columnName: 'is_active',
|
|
49
|
+
type: 'boolean',
|
|
50
|
+
isPrimaryKey: false,
|
|
51
|
+
isNullable: true,
|
|
52
|
+
isUnique: false,
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
columnName: 'created_at',
|
|
56
|
+
type: 'timestamp',
|
|
57
|
+
isPrimaryKey: false,
|
|
58
|
+
isNullable: true,
|
|
59
|
+
isUnique: false,
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
columnName: 'updated_at',
|
|
63
|
+
type: 'timestamp',
|
|
64
|
+
isPrimaryKey: false,
|
|
65
|
+
isNullable: true,
|
|
66
|
+
isUnique: false,
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
tableName: 'posts',
|
|
72
|
+
columns: [
|
|
73
|
+
{ columnName: 'id', type: 'uuid', isPrimaryKey: true, isNullable: false, isUnique: true },
|
|
74
|
+
{
|
|
75
|
+
columnName: 'community_id',
|
|
76
|
+
type: 'uuid',
|
|
77
|
+
isPrimaryKey: false,
|
|
78
|
+
isNullable: false,
|
|
79
|
+
isUnique: false,
|
|
80
|
+
foreignKey: {
|
|
81
|
+
referenceTable: 'communities',
|
|
82
|
+
referenceColumn: 'id',
|
|
83
|
+
onDelete: 'CASCADE',
|
|
84
|
+
onUpdate: 'CASCADE',
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
columnName: 'user_id',
|
|
89
|
+
type: 'uuid',
|
|
90
|
+
isPrimaryKey: false,
|
|
91
|
+
isNullable: false,
|
|
92
|
+
isUnique: false,
|
|
93
|
+
foreignKey: {
|
|
94
|
+
referenceTable: 'users',
|
|
95
|
+
referenceColumn: 'id',
|
|
96
|
+
onDelete: 'CASCADE',
|
|
97
|
+
onUpdate: 'CASCADE',
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
columnName: 'title',
|
|
102
|
+
type: 'varchar',
|
|
103
|
+
isPrimaryKey: false,
|
|
104
|
+
isNullable: false,
|
|
105
|
+
isUnique: false,
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
columnName: 'content',
|
|
109
|
+
type: 'text',
|
|
110
|
+
isPrimaryKey: false,
|
|
111
|
+
isNullable: true,
|
|
112
|
+
isUnique: false,
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
columnName: 'link_url',
|
|
116
|
+
type: 'varchar',
|
|
117
|
+
isPrimaryKey: false,
|
|
118
|
+
isNullable: true,
|
|
119
|
+
isUnique: false,
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
columnName: 'post_type',
|
|
123
|
+
type: 'varchar',
|
|
124
|
+
isPrimaryKey: false,
|
|
125
|
+
isNullable: false,
|
|
126
|
+
isUnique: false,
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
columnName: 'is_active',
|
|
130
|
+
type: 'boolean',
|
|
131
|
+
isPrimaryKey: false,
|
|
132
|
+
isNullable: true,
|
|
133
|
+
isUnique: false,
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
columnName: 'created_at',
|
|
137
|
+
type: 'timestamp',
|
|
138
|
+
isPrimaryKey: false,
|
|
139
|
+
isNullable: true,
|
|
140
|
+
isUnique: false,
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
columnName: 'updated_at',
|
|
144
|
+
type: 'timestamp',
|
|
145
|
+
isPrimaryKey: false,
|
|
146
|
+
isNullable: true,
|
|
147
|
+
isUnique: false,
|
|
148
|
+
},
|
|
149
|
+
],
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
tableName: 'comments',
|
|
153
|
+
columns: [
|
|
154
|
+
{ columnName: 'id', type: 'uuid', isPrimaryKey: true, isNullable: false, isUnique: true },
|
|
155
|
+
{
|
|
156
|
+
columnName: 'post_id',
|
|
157
|
+
type: 'uuid',
|
|
158
|
+
isPrimaryKey: false,
|
|
159
|
+
isNullable: false,
|
|
160
|
+
isUnique: false,
|
|
161
|
+
foreignKey: {
|
|
162
|
+
referenceTable: 'posts',
|
|
163
|
+
referenceColumn: 'id',
|
|
164
|
+
onDelete: 'CASCADE',
|
|
165
|
+
onUpdate: 'CASCADE',
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
columnName: 'user_id',
|
|
170
|
+
type: 'uuid',
|
|
171
|
+
isPrimaryKey: false,
|
|
172
|
+
isNullable: false,
|
|
173
|
+
isUnique: false,
|
|
174
|
+
foreignKey: {
|
|
175
|
+
referenceTable: 'users',
|
|
176
|
+
referenceColumn: 'id',
|
|
177
|
+
onDelete: 'CASCADE',
|
|
178
|
+
onUpdate: 'CASCADE',
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
columnName: 'parent_comment_id',
|
|
183
|
+
type: 'uuid',
|
|
184
|
+
isPrimaryKey: false,
|
|
185
|
+
isNullable: true,
|
|
186
|
+
isUnique: false,
|
|
187
|
+
foreignKey: {
|
|
188
|
+
referenceTable: 'comments',
|
|
189
|
+
referenceColumn: 'id',
|
|
190
|
+
onDelete: 'CASCADE',
|
|
191
|
+
onUpdate: 'CASCADE',
|
|
192
|
+
},
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
columnName: 'content',
|
|
196
|
+
type: 'text',
|
|
197
|
+
isPrimaryKey: false,
|
|
198
|
+
isNullable: false,
|
|
199
|
+
isUnique: false,
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
columnName: 'is_active',
|
|
203
|
+
type: 'boolean',
|
|
204
|
+
isPrimaryKey: false,
|
|
205
|
+
isNullable: true,
|
|
206
|
+
isUnique: false,
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
columnName: 'created_at',
|
|
210
|
+
type: 'timestamp',
|
|
211
|
+
isPrimaryKey: false,
|
|
212
|
+
isNullable: true,
|
|
213
|
+
isUnique: false,
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
columnName: 'updated_at',
|
|
217
|
+
type: 'timestamp',
|
|
218
|
+
isPrimaryKey: false,
|
|
219
|
+
isNullable: true,
|
|
220
|
+
isUnique: false,
|
|
221
|
+
},
|
|
222
|
+
],
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
tableName: 'votes',
|
|
226
|
+
columns: [
|
|
227
|
+
{ columnName: 'id', type: 'uuid', isPrimaryKey: true, isNullable: false, isUnique: true },
|
|
228
|
+
{
|
|
229
|
+
columnName: 'user_id',
|
|
230
|
+
type: 'uuid',
|
|
231
|
+
isPrimaryKey: false,
|
|
232
|
+
isNullable: false,
|
|
233
|
+
isUnique: false,
|
|
234
|
+
foreignKey: {
|
|
235
|
+
referenceTable: 'users',
|
|
236
|
+
referenceColumn: 'id',
|
|
237
|
+
onDelete: 'CASCADE',
|
|
238
|
+
onUpdate: 'CASCADE',
|
|
239
|
+
},
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
columnName: 'post_id',
|
|
243
|
+
type: 'uuid',
|
|
244
|
+
isPrimaryKey: false,
|
|
245
|
+
isNullable: true,
|
|
246
|
+
isUnique: false,
|
|
247
|
+
foreignKey: {
|
|
248
|
+
referenceTable: 'posts',
|
|
249
|
+
referenceColumn: 'id',
|
|
250
|
+
onDelete: 'CASCADE',
|
|
251
|
+
onUpdate: 'CASCADE',
|
|
252
|
+
},
|
|
253
|
+
},
|
|
254
|
+
{
|
|
255
|
+
columnName: 'comment_id',
|
|
256
|
+
type: 'uuid',
|
|
257
|
+
isPrimaryKey: false,
|
|
258
|
+
isNullable: true,
|
|
259
|
+
isUnique: false,
|
|
260
|
+
foreignKey: {
|
|
261
|
+
referenceTable: 'comments',
|
|
262
|
+
referenceColumn: 'id',
|
|
263
|
+
onDelete: 'CASCADE',
|
|
264
|
+
onUpdate: 'CASCADE',
|
|
265
|
+
},
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
columnName: 'vote_type',
|
|
269
|
+
type: 'integer',
|
|
270
|
+
isPrimaryKey: false,
|
|
271
|
+
isNullable: false,
|
|
272
|
+
isUnique: false,
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
columnName: 'created_at',
|
|
276
|
+
type: 'timestamp',
|
|
277
|
+
isPrimaryKey: false,
|
|
278
|
+
isNullable: true,
|
|
279
|
+
isUnique: false,
|
|
280
|
+
},
|
|
281
|
+
],
|
|
282
|
+
},
|
|
283
|
+
{
|
|
284
|
+
tableName: 'community_members',
|
|
285
|
+
columns: [
|
|
286
|
+
{ columnName: 'id', type: 'uuid', isPrimaryKey: true, isNullable: false, isUnique: true },
|
|
287
|
+
{
|
|
288
|
+
columnName: 'community_id',
|
|
289
|
+
type: 'uuid',
|
|
290
|
+
isPrimaryKey: false,
|
|
291
|
+
isNullable: false,
|
|
292
|
+
isUnique: false,
|
|
293
|
+
foreignKey: {
|
|
294
|
+
referenceTable: 'communities',
|
|
295
|
+
referenceColumn: 'id',
|
|
296
|
+
onDelete: 'CASCADE',
|
|
297
|
+
onUpdate: 'CASCADE',
|
|
298
|
+
},
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
columnName: 'user_id',
|
|
302
|
+
type: 'uuid',
|
|
303
|
+
isPrimaryKey: false,
|
|
304
|
+
isNullable: false,
|
|
305
|
+
isUnique: false,
|
|
306
|
+
foreignKey: {
|
|
307
|
+
referenceTable: 'users',
|
|
308
|
+
referenceColumn: 'id',
|
|
309
|
+
onDelete: 'CASCADE',
|
|
310
|
+
onUpdate: 'CASCADE',
|
|
311
|
+
},
|
|
312
|
+
},
|
|
313
|
+
{
|
|
314
|
+
columnName: 'role',
|
|
315
|
+
type: 'varchar',
|
|
316
|
+
isPrimaryKey: false,
|
|
317
|
+
isNullable: false,
|
|
318
|
+
isUnique: false,
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
columnName: 'created_at',
|
|
322
|
+
type: 'timestamp',
|
|
323
|
+
isPrimaryKey: false,
|
|
324
|
+
isNullable: true,
|
|
325
|
+
isUnique: false,
|
|
326
|
+
},
|
|
327
|
+
],
|
|
328
|
+
},
|
|
329
|
+
],
|
|
330
|
+
sql: `-- Reddit Clone Database Schema
|
|
331
|
+
-- A community-based platform with subreddits, posts, threaded comments, and voting
|
|
332
|
+
|
|
333
|
+
-- Communities table (subreddits)
|
|
334
|
+
CREATE TABLE communities (
|
|
335
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
336
|
+
name VARCHAR(100) UNIQUE NOT NULL CHECK (name ~ '^[a-zA-Z0-9_]+$'),
|
|
337
|
+
display_name VARCHAR(200) NOT NULL,
|
|
338
|
+
description TEXT,
|
|
339
|
+
creator_id UUID NOT NULL REFERENCES users(id) ON UPDATE CASCADE ON DELETE CASCADE,
|
|
340
|
+
is_active BOOLEAN DEFAULT true,
|
|
341
|
+
created_at TIMESTAMP DEFAULT NOW(),
|
|
342
|
+
updated_at TIMESTAMP DEFAULT NOW()
|
|
343
|
+
);
|
|
344
|
+
|
|
345
|
+
-- Posts table
|
|
346
|
+
CREATE TABLE posts (
|
|
347
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
348
|
+
community_id UUID NOT NULL REFERENCES communities(id) ON UPDATE CASCADE ON DELETE CASCADE,
|
|
349
|
+
user_id UUID NOT NULL REFERENCES users(id) ON UPDATE CASCADE ON DELETE CASCADE,
|
|
350
|
+
title VARCHAR(300) NOT NULL CHECK (LENGTH(TRIM(title)) > 0),
|
|
351
|
+
content TEXT,
|
|
352
|
+
link_url VARCHAR(500),
|
|
353
|
+
post_type VARCHAR(20) NOT NULL CHECK (post_type IN ('text', 'link', 'image')),
|
|
354
|
+
is_active BOOLEAN DEFAULT true,
|
|
355
|
+
created_at TIMESTAMP DEFAULT NOW(),
|
|
356
|
+
updated_at TIMESTAMP DEFAULT NOW(),
|
|
357
|
+
CHECK (
|
|
358
|
+
(post_type = 'text' AND content IS NOT NULL) OR
|
|
359
|
+
(post_type = 'link' AND link_url IS NOT NULL) OR
|
|
360
|
+
(post_type = 'image' AND link_url IS NOT NULL)
|
|
361
|
+
)
|
|
362
|
+
);
|
|
363
|
+
|
|
364
|
+
-- Comments table (with threading support)
|
|
365
|
+
CREATE TABLE comments (
|
|
366
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
367
|
+
post_id UUID NOT NULL REFERENCES posts(id) ON UPDATE CASCADE ON DELETE CASCADE,
|
|
368
|
+
user_id UUID NOT NULL REFERENCES users(id) ON UPDATE CASCADE ON DELETE CASCADE,
|
|
369
|
+
parent_comment_id UUID REFERENCES comments(id) ON UPDATE CASCADE ON DELETE CASCADE,
|
|
370
|
+
content TEXT NOT NULL CHECK (LENGTH(TRIM(content)) > 0),
|
|
371
|
+
is_active BOOLEAN DEFAULT true,
|
|
372
|
+
created_at TIMESTAMP DEFAULT NOW(),
|
|
373
|
+
updated_at TIMESTAMP DEFAULT NOW()
|
|
374
|
+
);
|
|
375
|
+
|
|
376
|
+
-- Votes table (for both posts and comments)
|
|
377
|
+
CREATE TABLE votes (
|
|
378
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
379
|
+
user_id UUID NOT NULL REFERENCES users(id) ON UPDATE CASCADE ON DELETE CASCADE,
|
|
380
|
+
post_id UUID REFERENCES posts(id) ON UPDATE CASCADE ON DELETE CASCADE,
|
|
381
|
+
comment_id UUID REFERENCES comments(id) ON UPDATE CASCADE ON DELETE CASCADE,
|
|
382
|
+
vote_type INTEGER NOT NULL CHECK (vote_type IN (-1, 1)),
|
|
383
|
+
created_at TIMESTAMP DEFAULT NOW(),
|
|
384
|
+
CHECK (
|
|
385
|
+
(post_id IS NOT NULL AND comment_id IS NULL) OR
|
|
386
|
+
(post_id IS NULL AND comment_id IS NOT NULL)
|
|
387
|
+
),
|
|
388
|
+
UNIQUE(user_id, post_id),
|
|
389
|
+
UNIQUE(user_id, comment_id)
|
|
390
|
+
);
|
|
391
|
+
|
|
392
|
+
-- Community members table (subscriptions and roles)
|
|
393
|
+
CREATE TABLE community_members (
|
|
394
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
395
|
+
community_id UUID NOT NULL REFERENCES communities(id) ON UPDATE CASCADE ON DELETE CASCADE,
|
|
396
|
+
user_id UUID NOT NULL REFERENCES users(id) ON UPDATE CASCADE ON DELETE CASCADE,
|
|
397
|
+
role VARCHAR(20) NOT NULL DEFAULT 'member' CHECK (role IN ('member', 'moderator', 'admin')),
|
|
398
|
+
created_at TIMESTAMP DEFAULT NOW(),
|
|
399
|
+
UNIQUE(community_id, user_id)
|
|
400
|
+
);
|
|
401
|
+
|
|
402
|
+
-- Create indexes for better performance
|
|
403
|
+
CREATE INDEX idx_communities_name ON communities(name);
|
|
404
|
+
CREATE INDEX idx_communities_creator ON communities(creator_id);
|
|
405
|
+
CREATE INDEX idx_communities_active ON communities(is_active);
|
|
406
|
+
CREATE INDEX idx_posts_community ON posts(community_id);
|
|
407
|
+
CREATE INDEX idx_posts_user ON posts(user_id);
|
|
408
|
+
CREATE INDEX idx_posts_created ON posts(created_at DESC);
|
|
409
|
+
CREATE INDEX idx_posts_active ON posts(is_active);
|
|
410
|
+
CREATE INDEX idx_comments_post ON comments(post_id);
|
|
411
|
+
CREATE INDEX idx_comments_user ON comments(user_id);
|
|
412
|
+
CREATE INDEX idx_comments_parent ON comments(parent_comment_id);
|
|
413
|
+
CREATE INDEX idx_comments_created ON comments(created_at ASC);
|
|
414
|
+
CREATE INDEX idx_comments_active ON comments(is_active);
|
|
415
|
+
CREATE INDEX idx_votes_post ON votes(post_id);
|
|
416
|
+
CREATE INDEX idx_votes_comment ON votes(comment_id);
|
|
417
|
+
CREATE INDEX idx_votes_user ON votes(user_id);
|
|
418
|
+
CREATE INDEX idx_community_members_community ON community_members(community_id);
|
|
419
|
+
CREATE INDEX idx_community_members_user ON community_members(user_id);
|
|
420
|
+
|
|
421
|
+
-- =======================
|
|
422
|
+
-- ROW LEVEL SECURITY (RLS)
|
|
423
|
+
-- =======================
|
|
424
|
+
|
|
425
|
+
-- Enable RLS
|
|
426
|
+
ALTER TABLE communities ENABLE ROW LEVEL SECURITY;
|
|
427
|
+
ALTER TABLE posts ENABLE ROW LEVEL SECURITY;
|
|
428
|
+
ALTER TABLE comments ENABLE ROW LEVEL SECURITY;
|
|
429
|
+
ALTER TABLE votes ENABLE ROW LEVEL SECURITY;
|
|
430
|
+
ALTER TABLE community_members ENABLE ROW LEVEL SECURITY;
|
|
431
|
+
|
|
432
|
+
-- Communities policies: Anyone can view active communities
|
|
433
|
+
CREATE POLICY communities_select_policy ON communities
|
|
434
|
+
FOR SELECT
|
|
435
|
+
USING (is_active = true);
|
|
436
|
+
|
|
437
|
+
CREATE POLICY communities_insert_policy ON communities
|
|
438
|
+
FOR INSERT
|
|
439
|
+
WITH CHECK (auth.uid() = creator_id);
|
|
440
|
+
|
|
441
|
+
CREATE POLICY communities_update_policy ON communities
|
|
442
|
+
FOR UPDATE
|
|
443
|
+
USING (
|
|
444
|
+
auth.uid() = creator_id OR
|
|
445
|
+
EXISTS(
|
|
446
|
+
SELECT 1 FROM community_members
|
|
447
|
+
WHERE community_id = communities.id
|
|
448
|
+
AND user_id = auth.uid()
|
|
449
|
+
AND role IN ('moderator', 'admin')
|
|
450
|
+
)
|
|
451
|
+
);
|
|
452
|
+
|
|
453
|
+
CREATE POLICY communities_delete_policy ON communities
|
|
454
|
+
FOR DELETE
|
|
455
|
+
USING (auth.uid() = creator_id);
|
|
456
|
+
|
|
457
|
+
-- Posts policies: Anyone can view active posts, members can create
|
|
458
|
+
CREATE POLICY posts_select_policy ON posts
|
|
459
|
+
FOR SELECT
|
|
460
|
+
USING (is_active = true);
|
|
461
|
+
|
|
462
|
+
CREATE POLICY posts_insert_policy ON posts
|
|
463
|
+
FOR INSERT
|
|
464
|
+
WITH CHECK (
|
|
465
|
+
auth.uid() = user_id AND
|
|
466
|
+
EXISTS(
|
|
467
|
+
SELECT 1 FROM community_members
|
|
468
|
+
WHERE community_id = posts.community_id AND user_id = auth.uid()
|
|
469
|
+
)
|
|
470
|
+
);
|
|
471
|
+
|
|
472
|
+
CREATE POLICY posts_update_policy ON posts
|
|
473
|
+
FOR UPDATE
|
|
474
|
+
USING (auth.uid() = user_id);
|
|
475
|
+
|
|
476
|
+
CREATE POLICY posts_delete_policy ON posts
|
|
477
|
+
FOR DELETE
|
|
478
|
+
USING (auth.uid() = user_id);
|
|
479
|
+
|
|
480
|
+
-- Comments policies: Anyone can view active comments, authenticated users can create
|
|
481
|
+
CREATE POLICY comments_select_policy ON comments
|
|
482
|
+
FOR SELECT
|
|
483
|
+
USING (is_active = true);
|
|
484
|
+
|
|
485
|
+
CREATE POLICY comments_insert_policy ON comments
|
|
486
|
+
FOR INSERT
|
|
487
|
+
WITH CHECK (auth.uid() = user_id);
|
|
488
|
+
|
|
489
|
+
CREATE POLICY comments_update_policy ON comments
|
|
490
|
+
FOR UPDATE
|
|
491
|
+
USING (auth.uid() = user_id);
|
|
492
|
+
|
|
493
|
+
CREATE POLICY comments_delete_policy ON comments
|
|
494
|
+
FOR DELETE
|
|
495
|
+
USING (auth.uid() = user_id);
|
|
496
|
+
|
|
497
|
+
-- Votes policies: Users can view all votes, create/update their own
|
|
498
|
+
CREATE POLICY votes_select_policy ON votes
|
|
499
|
+
FOR SELECT
|
|
500
|
+
USING (true);
|
|
501
|
+
|
|
502
|
+
CREATE POLICY votes_insert_policy ON votes
|
|
503
|
+
FOR INSERT
|
|
504
|
+
WITH CHECK (auth.uid() = user_id);
|
|
505
|
+
|
|
506
|
+
CREATE POLICY votes_update_policy ON votes
|
|
507
|
+
FOR UPDATE
|
|
508
|
+
USING (auth.uid() = user_id);
|
|
509
|
+
|
|
510
|
+
CREATE POLICY votes_delete_policy ON votes
|
|
511
|
+
FOR DELETE
|
|
512
|
+
USING (auth.uid() = user_id);
|
|
513
|
+
|
|
514
|
+
-- Community members policies: Anyone can view, users can manage their own memberships
|
|
515
|
+
CREATE POLICY community_members_select_policy ON community_members
|
|
516
|
+
FOR SELECT
|
|
517
|
+
USING (true);
|
|
518
|
+
|
|
519
|
+
CREATE POLICY community_members_insert_policy ON community_members
|
|
520
|
+
FOR INSERT
|
|
521
|
+
WITH CHECK (auth.uid() = user_id);
|
|
522
|
+
|
|
523
|
+
CREATE POLICY community_members_delete_policy ON community_members
|
|
524
|
+
FOR DELETE
|
|
525
|
+
USING (auth.uid() = user_id);`,
|
|
526
|
+
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CopyButton } from '@/components/CopyButton';
|
|
2
|
-
import { type EdgeFunction } from '../services/
|
|
2
|
+
import { type EdgeFunction } from '../services/function.service';
|
|
3
3
|
import { cn, getBackendUrl } from '@/lib/utils/utils';
|
|
4
4
|
import { format, formatDistance } from 'date-fns';
|
|
5
5
|
interface FunctionRowProps {
|
|
@@ -37,6 +37,7 @@ export function FunctionRow({ function: func, onClick, className }: FunctionRowP
|
|
|
37
37
|
{functionUrl}
|
|
38
38
|
</span>
|
|
39
39
|
<CopyButton
|
|
40
|
+
variant="secondary"
|
|
40
41
|
showText={false}
|
|
41
42
|
text={functionUrl}
|
|
42
43
|
className="h-7 w-7 dark:hover:bg-neutral-500 dark:data-[copied=true]:group-hover:bg-neutral-700 dark:data-[copied=true]:hover:bg-neutral-700"
|
|
@@ -22,7 +22,7 @@ export function FunctionsSidebar({ selectedSection, onSectionSelect }: Functions
|
|
|
22
22
|
return (
|
|
23
23
|
<div className="w-60 px-3 py-4 flex flex-col h-full bg-white dark:bg-neutral-800 border-r border-border-gray dark:border-neutral-700">
|
|
24
24
|
<div className="mb-4 w-full">
|
|
25
|
-
<p className="text-base text-zinc-950 dark:text-
|
|
25
|
+
<p className="text-base font-bold text-zinc-950 dark:text-white">Edge Functions</p>
|
|
26
26
|
</div>
|
|
27
27
|
<div className="flex-1 overflow-y-auto">
|
|
28
28
|
<div className="space-y-2">
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Trash2 } from 'lucide-react';
|
|
2
2
|
import { Button } from '@/components/radix/Button';
|
|
3
|
-
import { type Secret } from '@/features/
|
|
3
|
+
import { type Secret } from '@/features/functions/services/secret.service';
|
|
4
4
|
import { cn } from '@/lib/utils/utils';
|
|
5
5
|
import { formatDistance } from 'date-fns';
|
|
6
6
|
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { default as FunctionEmptyState } from './FunctionEmptyState';
|
|
2
|
+
export { FunctionRow } from './FunctionRow';
|
|
3
|
+
export { FunctionsSidebar } from './FunctionsSidebar';
|
|
4
|
+
export { default as SecretEmptyState } from './SecretEmptyState';
|
|
5
|
+
export { SecretRow } from './SecretRow';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useState, useCallback, useMemo } from 'react';
|
|
2
2
|
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
|
|
3
|
-
import {
|
|
3
|
+
import { functionService, type EdgeFunction } from '../services/function.service';
|
|
4
4
|
import { useToast } from '@/lib/hooks/useToast';
|
|
5
5
|
|
|
6
6
|
export function useFunctions() {
|
|
@@ -16,7 +16,7 @@ export function useFunctions() {
|
|
|
16
16
|
refetch,
|
|
17
17
|
} = useQuery({
|
|
18
18
|
queryKey: ['functions'],
|
|
19
|
-
queryFn: () =>
|
|
19
|
+
queryFn: () => functionService.listFunctions(),
|
|
20
20
|
staleTime: 2 * 60 * 1000, // Cache for 2 minutes
|
|
21
21
|
});
|
|
22
22
|
|
|
@@ -28,7 +28,7 @@ export function useFunctions() {
|
|
|
28
28
|
const selectFunction = useCallback(
|
|
29
29
|
async (func: EdgeFunction) => {
|
|
30
30
|
try {
|
|
31
|
-
const data = await
|
|
31
|
+
const data = await functionService.getFunctionBySlug(func.slug);
|
|
32
32
|
setSelectedFunction(data);
|
|
33
33
|
} catch (error) {
|
|
34
34
|
console.error('Failed to fetch function details:', error);
|
|
@@ -47,7 +47,7 @@ export function useFunctions() {
|
|
|
47
47
|
|
|
48
48
|
// Delete function mutation (for future use)
|
|
49
49
|
const deleteFunctionMutation = useMutation({
|
|
50
|
-
mutationFn: (slug: string) =>
|
|
50
|
+
mutationFn: (slug: string) => functionService.deleteFunction(slug),
|
|
51
51
|
onSuccess: (_, slug) => {
|
|
52
52
|
void queryClient.invalidateQueries({ queryKey: ['functions'] });
|
|
53
53
|
showToast('Function deleted successfully', 'success');
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { useState, useCallback } from 'react';
|
|
2
2
|
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
|
|
3
3
|
import {
|
|
4
|
-
|
|
4
|
+
secretService,
|
|
5
5
|
type Secret,
|
|
6
6
|
type CreateSecretInput,
|
|
7
|
-
} from '@/features/
|
|
7
|
+
} from '@/features/functions/services/secret.service';
|
|
8
8
|
import { useToast } from '@/lib/hooks/useToast';
|
|
9
9
|
import { useConfirm } from '@/lib/hooks/useConfirm';
|
|
10
10
|
|
|
@@ -22,7 +22,7 @@ export function useSecrets() {
|
|
|
22
22
|
refetch,
|
|
23
23
|
} = useQuery({
|
|
24
24
|
queryKey: ['secrets'],
|
|
25
|
-
queryFn: () =>
|
|
25
|
+
queryFn: () => secretService.listSecrets(),
|
|
26
26
|
staleTime: 2 * 60 * 1000, // Cache for 2 minutes
|
|
27
27
|
});
|
|
28
28
|
|
|
@@ -31,7 +31,7 @@ export function useSecrets() {
|
|
|
31
31
|
|
|
32
32
|
// Create secret mutation
|
|
33
33
|
const createSecretMutation = useMutation({
|
|
34
|
-
mutationFn: (input: CreateSecretInput) =>
|
|
34
|
+
mutationFn: (input: CreateSecretInput) => secretService.createSecret(input),
|
|
35
35
|
onSuccess: () => {
|
|
36
36
|
void queryClient.invalidateQueries({ queryKey: ['secrets'] });
|
|
37
37
|
showToast('Secret created successfully', 'success');
|
|
@@ -45,7 +45,7 @@ export function useSecrets() {
|
|
|
45
45
|
|
|
46
46
|
// Delete secret mutation
|
|
47
47
|
const deleteSecretMutation = useMutation({
|
|
48
|
-
mutationFn: (key: string) =>
|
|
48
|
+
mutationFn: (key: string) => secretService.deleteSecret(key),
|
|
49
49
|
onSuccess: () => {
|
|
50
50
|
void queryClient.invalidateQueries({ queryKey: ['secrets'] });
|
|
51
51
|
showToast('Secret deleted successfully', 'success');
|