insforge 0.3.3 → 1.3.0
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/.dockerignore +60 -57
- package/.env.example +84 -49
- package/.github/ISSUE_TEMPLATE/bug_report.yml +36 -83
- package/.github/ISSUE_TEMPLATE/config.yml +11 -11
- package/.github/ISSUE_TEMPLATE/feature_request.yml +26 -79
- package/.github/PULL_REQUEST_TEMPLATE.md +7 -0
- package/.github/copilot-instructions.md +146 -146
- package/.github/workflows/build-image.yml +66 -65
- package/.github/workflows/ci-premerge-check.yml +23 -23
- package/.github/workflows/e2e.yml +63 -0
- package/.github/workflows/lint-and-format.yml +32 -32
- package/.prettierignore +64 -64
- package/CHANGELOG.md +44 -3
- package/CLAUDE_PLUGIN.md +104 -0
- package/CODE_OF_CONDUCT.md +128 -0
- package/CONTRIBUTING.md +125 -125
- package/Dockerfile +30 -27
- package/GITHUB_OAUTH_SETUP.md +49 -49
- package/GOOGLE_OAUTH_SETUP.md +148 -148
- package/LICENSE +201 -201
- package/README.md +182 -134
- package/assets/Dark.svg +23 -23
- 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 +117 -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 +60 -0
- package/auth/src/pages/SignUpPage.tsx +60 -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 +78 -75
- 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} +22 -26
- package/backend/src/api/routes/auth/index.routes.ts +667 -0
- package/backend/src/api/routes/auth/oauth.routes.ts +473 -0
- package/backend/src/api/routes/{database.advance.ts → database/advance.routes.ts} +128 -65
- package/backend/src/api/routes/database/index.routes.ts +90 -0
- package/backend/src/api/routes/{database.records.ts → database/records.routes.ts} +26 -12
- package/backend/src/api/routes/{database.tables.ts → database/tables.routes.ts} +6 -23
- package/backend/src/api/routes/docs/index.routes.ts +75 -0
- package/backend/src/api/routes/email/index.routes.ts +35 -0
- package/backend/src/api/routes/functions/index.routes.ts +194 -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} +33 -31
- package/backend/src/api/routes/realtime/channels.routes.ts +81 -0
- package/backend/src/api/routes/realtime/index.routes.ts +12 -0
- package/backend/src/api/routes/realtime/messages.routes.ts +48 -0
- package/backend/src/api/routes/realtime/permissions.routes.ts +19 -0
- package/backend/src/api/routes/{secrets.ts → secrets/index.routes.ts} +27 -22
- package/backend/src/api/routes/{storage.ts → storage/index.routes.ts} +48 -61
- package/backend/src/api/routes/usage/index.routes.ts +91 -0
- package/backend/src/infra/config/app.config.ts +51 -0
- package/backend/src/infra/database/database.manager.ts +182 -0
- package/backend/{migrations → src/infra/database/migrations}/000_create-base-tables.sql +141 -141
- package/backend/{migrations → src/infra/database/migrations}/001_create-helper-functions.sql +40 -40
- package/backend/{migrations → src/infra/database/migrations}/002_rename-auth-tables.sql +29 -29
- package/backend/{migrations → src/infra/database/migrations}/003_create-users-table.sql +55 -55
- package/backend/{migrations → src/infra/database/migrations}/004_add-reload-postgrest-func.sql +23 -23
- package/backend/{migrations → src/infra/database/migrations}/005_enable-project-admin-modify-users.sql +29 -29
- package/backend/{migrations → src/infra/database/migrations}/006_modify-ai-usage-table.sql +24 -24
- package/backend/{migrations → src/infra/database/migrations}/007_drop-metadata-table.sql +1 -1
- package/backend/{migrations → src/infra/database/migrations}/008_add-system-tables.sql +76 -76
- package/backend/{migrations → src/infra/database/migrations}/009_add-function-secrets.sql +23 -23
- package/backend/{migrations → src/infra/database/migrations}/010_modify-ai-config-modalities.sql +93 -93
- package/backend/{migrations → src/infra/database/migrations}/011_refactor-secrets-table.sql +15 -15
- package/backend/{migrations → src/infra/database/migrations}/012_add-storage-uploaded-by.sql +7 -7
- package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -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/infra/database/migrations/017_create-realtime-schema.sql +233 -0
- package/backend/src/infra/realtime/realtime.manager.ts +246 -0
- package/backend/src/infra/realtime/webhook-sender.ts +82 -0
- package/backend/src/{core/secrets/encryption.ts → infra/security/encryption.manager.ts} +3 -2
- package/backend/src/infra/security/token.manager.ts +219 -0
- package/backend/src/infra/socket/socket.manager.ts +522 -0
- package/backend/src/providers/ai/openrouter.provider.ts +380 -0
- package/backend/src/providers/email/base.provider.ts +38 -0
- package/backend/src/providers/email/cloud.provider.ts +271 -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/apple.provider.ts +266 -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 +8 -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 +317 -288
- 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 +1150 -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 +802 -0
- package/backend/src/services/database/database.service.ts +127 -0
- package/backend/src/services/email/email.service.ts +73 -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/services/realtime/index.ts +3 -0
- package/backend/src/services/realtime/realtime-auth.service.ts +104 -0
- package/backend/src/services/realtime/realtime-channel.service.ts +237 -0
- package/backend/src/services/realtime/realtime-message.service.ts +260 -0
- package/backend/src/{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 +77 -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/types/realtime.ts +18 -0
- package/backend/src/{core/socket/types.ts → types/socket.ts} +11 -36
- package/backend/src/utils/cookies.ts +35 -0
- package/backend/src/utils/environment.ts +9 -3
- package/backend/src/utils/logger.ts +20 -2
- package/backend/src/utils/s3-config-loader.ts +64 -0
- package/backend/src/utils/seed.ts +301 -205
- package/backend/src/utils/sql-parser.ts +91 -1
- package/backend/src/utils/utils.ts +114 -0
- package/backend/src/utils/validations.ts +40 -4
- package/backend/tests/README.md +133 -133
- package/backend/tests/cleanup-all-test-data.sh +230 -230
- package/backend/tests/cloud/test-s3-multitenant.sh +131 -131
- package/backend/tests/local/comprehensive-curl-tests.sh +155 -155
- package/backend/tests/local/test-ai-config.sh +129 -0
- package/backend/tests/local/test-ai-usage.sh +80 -0
- package/backend/tests/local/test-auth-router.sh +143 -143
- package/backend/tests/local/test-database-router.sh +222 -222
- package/backend/tests/local/test-e2e.sh +240 -240
- package/backend/tests/local/test-fk-errors.sh +96 -96
- package/backend/tests/local/test-functions.sh +123 -0
- package/backend/tests/local/test-id-field.sh +200 -200
- package/backend/tests/local/test-logs.sh +132 -0
- package/backend/tests/local/test-public-bucket.sh +264 -264
- package/backend/tests/local/test-secrets.sh +249 -247
- package/backend/tests/local/test-serverless-functions.sh.disabled +325 -325
- package/backend/tests/local/test-traditional-rest.sh +208 -208
- package/backend/tests/manual/README.md +50 -50
- package/backend/tests/manual/create-large-table-simple.sql +10 -10
- package/backend/tests/manual/seed-large-table.sql +100 -100
- package/backend/tests/manual/setup-large-table-extras.sql +33 -33
- package/backend/tests/manual/test-bulk-upsert.sh +409 -409
- package/backend/tests/manual/test-database-advance.sh +296 -296
- package/backend/tests/manual/test-postgrest-stability.sh +191 -191
- package/backend/tests/manual/test-rawsql-export-import.sh +411 -411
- package/backend/tests/manual/test-rawsql-modes.sh +244 -0
- package/backend/tests/manual/test-universal-storage.sh +263 -263
- package/backend/tests/manual/test-users.sql +17 -17
- package/backend/tests/run-all-tests.sh +139 -139
- package/backend/tests/setup.ts +0 -0
- package/backend/tests/test-config.sh +338 -302
- package/backend/tests/unit/analyze-query.test.ts +697 -0
- 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 +22 -22
- 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 +204 -144
- package/docker-compose.yml +232 -167
- package/docker-init/db/db-init.sql +97 -125
- package/docker-init/db/jwt.sql +5 -5
- package/docker-init/db/postgresql.conf +16 -16
- package/docker-init/logs/vector.yml +236 -0
- package/docs/README.md +44 -0
- package/docs/agent-docs/real-time.md +269 -0
- package/docs/changelog.mdx +119 -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/email/architecture.mdx +101 -0
- package/docs/core-concepts/email/sdk.mdx +53 -0
- package/docs/core-concepts/functions/architecture.mdx +105 -0
- package/docs/core-concepts/functions/sdk.mdx +184 -0
- package/docs/core-concepts/realtime/architecture.mdx +446 -0
- package/docs/core-concepts/realtime/sdk.mdx +409 -0
- package/docs/core-concepts/storage/architecture.mdx +243 -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/deprecated/insforge-auth-api.md +214 -214
- package/docs/deprecated/insforge-auth-sdk.md +99 -99
- package/docs/deprecated/insforge-db-api.md +358 -358
- package/docs/deprecated/insforge-db-sdk.md +139 -139
- package/docs/deprecated/insforge-debug-sdk.md +156 -156
- package/docs/deprecated/insforge-debug.md +64 -64
- package/docs/deprecated/insforge-instructions.md +123 -123
- package/docs/deprecated/insforge-project.md +117 -117
- package/docs/deprecated/insforge-storage-api.md +278 -278
- package/docs/deprecated/insforge-storage-sdk.md +158 -158
- package/docs/docs.json +232 -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/dec-2025/ai-integration.png +0 -0
- package/docs/images/changelog/dec-2025/ai-models.webp +0 -0
- package/docs/images/changelog/dec-2025/alipay-payment.webp +0 -0
- package/docs/images/changelog/dec-2025/apple-login.jpg +0 -0
- package/docs/images/changelog/dec-2025/mcp-installer.png +0 -0
- package/docs/images/changelog/dec-2025/realtime-module.jpg +0 -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 +89 -407
- package/docs/introduction.mdx +45 -0
- package/docs/logo/dark.svg +22 -0
- package/docs/logo/light.svg +20 -0
- package/docs/partnership.mdx +652 -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/examples/oauth/frontend-oauth-example.html +250 -250
- package/examples/response-examples.md +443 -443
- package/frontend/components.json +17 -17
- package/frontend/package.json +69 -63
- package/frontend/src/App.tsx +13 -82
- package/frontend/src/assets/icons/checkbox_checked.svg +6 -6
- package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -6
- package/frontend/src/assets/icons/checked.svg +3 -3
- package/frontend/src/assets/icons/connected.svg +3 -0
- package/frontend/src/assets/icons/error.svg +3 -3
- package/frontend/src/assets/icons/loader.svg +9 -0
- package/frontend/src/assets/icons/pencil.svg +4 -4
- package/frontend/src/assets/icons/refresh.svg +4 -4
- package/frontend/src/assets/icons/step_active.svg +3 -3
- package/frontend/src/assets/icons/step_inactive.svg +11 -11
- package/frontend/src/assets/icons/warning.svg +3 -3
- package/frontend/src/assets/logos/apple.svg +4 -0
- package/frontend/src/assets/logos/claude_code.svg +3 -3
- package/frontend/src/assets/logos/cline.svg +6 -6
- package/frontend/src/assets/logos/cursor.svg +20 -20
- package/frontend/src/assets/logos/discord.svg +8 -8
- package/frontend/src/assets/logos/facebook.svg +3 -0
- package/frontend/src/assets/logos/gemini.svg +19 -19
- package/frontend/src/assets/logos/github.svg +5 -5
- package/frontend/src/assets/logos/google.svg +13 -13
- package/frontend/src/assets/logos/grok.svg +10 -10
- package/frontend/src/assets/logos/insforge_dark.svg +15 -15
- package/frontend/src/assets/logos/insforge_light.svg +15 -15
- package/frontend/src/assets/logos/instagram.svg +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/openai.svg +10 -10
- package/frontend/src/assets/logos/roo_code.svg +9 -9
- package/frontend/src/assets/logos/spotify.svg +17 -0
- package/frontend/src/assets/logos/tiktok.svg +6 -0
- package/frontend/src/assets/logos/trae.svg +3 -3
- package/frontend/src/assets/logos/windsurf.svg +10 -10
- package/frontend/src/assets/logos/x.svg +3 -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 +131 -91
- 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/pages/AIPage.tsx +166 -0
- 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 +54 -30
- package/frontend/src/features/auth/components/UserFormDialog.tsx +13 -6
- package/frontend/src/features/auth/components/UsersDataGrid.tsx +50 -14
- package/frontend/src/features/auth/components/index.ts +5 -0
- package/frontend/src/features/auth/helpers.tsx +208 -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/pages/AuthMethodsPage.tsx +275 -0
- package/frontend/src/features/auth/pages/ConfigurationPage.tsx +395 -0
- package/frontend/src/features/auth/pages/UsersPage.tsx +257 -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/pages/DashboardPage.tsx +212 -0
- 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/SQLModal.tsx +75 -0
- package/frontend/src/features/database/components/TableEmptyState.tsx +6 -5
- package/frontend/src/features/database/components/TableForm.tsx +28 -19
- 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/useDatabase.ts +66 -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 +135 -0
- package/frontend/src/features/database/index.ts +7 -1
- package/frontend/src/features/database/pages/FunctionsPage.tsx +203 -0
- package/frontend/src/features/database/pages/IndexesPage.tsx +228 -0
- package/frontend/src/features/database/pages/PoliciesPage.tsx +237 -0
- package/frontend/src/features/database/pages/SQLEditorPage.tsx +382 -0
- package/frontend/src/features/database/{page/DatabasePage.tsx → pages/TablesPage.tsx} +168 -209
- package/frontend/src/features/database/pages/TemplatesPage.tsx +39 -0
- package/frontend/src/features/database/pages/TriggersPage.tsx +230 -0
- package/frontend/src/features/database/services/advance.service.ts +40 -0
- package/frontend/src/features/database/services/database.service.ts +33 -194
- package/frontend/src/features/database/services/record.service.ts +219 -0
- package/frontend/src/features/database/services/table.service.ts +58 -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/pages/FunctionsPage.tsx +148 -0
- package/frontend/src/features/functions/{components/SecretsContent.tsx → pages/SecretsPage.tsx} +19 -21
- 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/pages/CloudLoginPage.tsx +118 -0
- package/frontend/src/features/login/{page → pages}/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 +128 -0
- package/frontend/src/features/logs/index.ts +8 -2
- package/frontend/src/features/logs/{page → pages}/AuditsPage.tsx +91 -38
- package/frontend/src/features/logs/pages/LogsPage.tsx +152 -0
- package/frontend/src/features/logs/pages/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/realtime/components/ChannelRow.tsx +83 -0
- package/frontend/src/features/realtime/components/EditChannelModal.tsx +246 -0
- package/frontend/src/features/realtime/components/MessageRow.tsx +85 -0
- package/frontend/src/features/realtime/components/RealtimeEmptyState.tsx +30 -0
- package/frontend/src/features/realtime/hooks/useRealtime.ts +218 -0
- package/frontend/src/features/realtime/index.ts +11 -0
- package/frontend/src/features/realtime/pages/RealtimeChannelsPage.tsx +172 -0
- package/frontend/src/features/realtime/pages/RealtimeMessagesPage.tsx +211 -0
- package/frontend/src/features/realtime/pages/RealtimePermissionsPage.tsx +191 -0
- package/frontend/src/features/realtime/services/realtime.service.ts +107 -0
- package/frontend/src/features/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 → pages}/StoragePage.tsx +41 -143
- 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/pages/VisualizerPage.tsx +97 -0
- 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 +123 -80
- 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 +99 -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 +207 -0
- package/frontend/src/lib/utils/{validation-schemas.ts → schemaValidations.ts} +10 -5
- package/frontend/src/lib/utils/utils.ts +32 -1
- package/frontend/src/vite-env.d.ts +1 -0
- package/frontend/tsconfig.json +25 -25
- package/frontend/tsconfig.node.json +9 -9
- package/frontend/vite.config.ts +5 -3
- package/functions/deno.json +24 -24
- package/functions/server.ts +315 -290
- 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 +715 -688
- package/openapi/auth.yaml +1244 -563
- package/openapi/email.yaml +158 -0
- package/openapi/functions.yaml +475 -475
- package/openapi/health.yaml +29 -29
- package/openapi/logs.yaml +223 -223
- package/openapi/metadata.yaml +177 -177
- package/openapi/realtime.yaml +699 -0
- package/openapi/records.yaml +381 -381
- package/openapi/secrets.yaml +370 -370
- package/openapi/storage.yaml +875 -875
- package/openapi/tables.yaml +463 -463
- package/package.json +97 -88
- package/shared-schemas/package.json +31 -31
- package/shared-schemas/src/ai-api.schema.ts +34 -58
- package/shared-schemas/src/ai.schema.ts +63 -54
- package/shared-schemas/src/auth-api.schema.ts +352 -193
- package/shared-schemas/src/auth.schema.ts +43 -7
- package/shared-schemas/src/cloud-events.schema.ts +57 -0
- package/shared-schemas/src/database-api.schema.ts +35 -4
- package/shared-schemas/src/database.schema.ts +40 -1
- package/shared-schemas/src/docs.schema.ts +26 -0
- package/shared-schemas/src/email-api.schema.ts +30 -0
- package/shared-schemas/src/index.ts +5 -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 +18 -4
- package/shared-schemas/src/realtime-api.schema.ts +111 -0
- package/shared-schemas/src/realtime.schema.ts +143 -0
- package/shared-schemas/tsconfig.json +21 -21
- package/tsconfig.json +7 -7
- 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/manager.ts +0 -178
- 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/socket/socket.ts +0 -388
- 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/ai/page/AIPage.tsx +0 -178
- 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/dashboard/page/DashboardPage.tsx +0 -194
- 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/functions/page/FunctionsPage.tsx +0 -28
- package/frontend/src/features/login/components/AuthErrorBoundary.tsx +0 -87
- package/frontend/src/features/login/components/PrivateRoute.tsx +0 -24
- package/frontend/src/features/login/page/CloudLoginPage.tsx +0 -93
- 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/features/visualizer/page/VisualizerPage.tsx +0 -127
- 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/frontend/src/{features/metadata → lib}/services/metadata.service.ts +0 -0
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { ConvertedValue } from '@/components/datagrid/datagridTypes';
|
|
2
|
+
import { apiClient } from '@/lib/api/client';
|
|
3
|
+
import { ColumnSchema } from '@insforge/shared-schemas';
|
|
4
|
+
import { tableService } from './table.service';
|
|
5
|
+
|
|
6
|
+
export interface CSVImportResponse {
|
|
7
|
+
success: boolean;
|
|
8
|
+
message?: string;
|
|
9
|
+
data?: {
|
|
10
|
+
rowCount: number;
|
|
11
|
+
};
|
|
12
|
+
error?: string; // For backend error messages
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export class RecordService {
|
|
16
|
+
/**
|
|
17
|
+
* Data fetching method with built-in search, sorting, and pagination for UI components.
|
|
18
|
+
*
|
|
19
|
+
* @param tableName - Name of the table
|
|
20
|
+
* @param limit - Number of records to fetch
|
|
21
|
+
* @param offset - Number of records to skip
|
|
22
|
+
* @param searchQuery - Search term to filter text columns
|
|
23
|
+
* @param sortColumns - Sorting configuration
|
|
24
|
+
* @returns Structured response with records and pagination info
|
|
25
|
+
*/
|
|
26
|
+
async getTableRecords(
|
|
27
|
+
tableName: string,
|
|
28
|
+
limit = 10,
|
|
29
|
+
offset = 0,
|
|
30
|
+
searchQuery?: string,
|
|
31
|
+
sortColumns?: { columnKey: string; direction: string }[]
|
|
32
|
+
) {
|
|
33
|
+
const params = new URLSearchParams();
|
|
34
|
+
params.set('limit', limit.toString());
|
|
35
|
+
params.set('offset', offset.toString());
|
|
36
|
+
|
|
37
|
+
// Construct PostgREST filter directly in frontend if search query is provided
|
|
38
|
+
if (searchQuery && searchQuery.trim()) {
|
|
39
|
+
const searchValue = searchQuery.trim();
|
|
40
|
+
|
|
41
|
+
// Get table schema to identify text columns
|
|
42
|
+
const schema = await tableService.getTableSchema(tableName);
|
|
43
|
+
const textColumns = schema.columns
|
|
44
|
+
.filter((col: ColumnSchema) => {
|
|
45
|
+
const type = col.type.toLowerCase();
|
|
46
|
+
return type === 'string';
|
|
47
|
+
})
|
|
48
|
+
.map((col: ColumnSchema) => col.columnName);
|
|
49
|
+
|
|
50
|
+
if (textColumns.length) {
|
|
51
|
+
// Create PostgREST OR filter for text columns
|
|
52
|
+
const orFilters = textColumns
|
|
53
|
+
.map((column: string) => `${column}.ilike.*${searchValue}*`)
|
|
54
|
+
.join(',');
|
|
55
|
+
params.set('or', `(${orFilters})`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Add sorting if provided - PostgREST uses "order" parameter
|
|
60
|
+
if (sortColumns && sortColumns.length) {
|
|
61
|
+
const orderParam = sortColumns
|
|
62
|
+
.map((col) => `${col.columnKey}.${col.direction.toLowerCase()}`)
|
|
63
|
+
.join(',');
|
|
64
|
+
params.set('order', orderParam);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const response: {
|
|
68
|
+
data: { [key: string]: ConvertedValue }[];
|
|
69
|
+
pagination: { offset: number; limit: number; total: number };
|
|
70
|
+
} = await apiClient.request(`/database/records/${tableName}?${params.toString()}`, {
|
|
71
|
+
headers: {
|
|
72
|
+
Prefer: 'count=exact',
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
return {
|
|
77
|
+
records: response.data,
|
|
78
|
+
pagination: response.pagination,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Get a single record by foreign key value.
|
|
84
|
+
* Specifically designed for foreign key lookups.
|
|
85
|
+
*
|
|
86
|
+
* @param tableName - Name of the table to search in
|
|
87
|
+
* @param columnName - Name of the column to filter by
|
|
88
|
+
* @param value - Value to match
|
|
89
|
+
* @returns Single record or null if not found
|
|
90
|
+
*/
|
|
91
|
+
async getRecordByForeignKeyValue(tableName: string, columnName: string, value: string) {
|
|
92
|
+
const queryParams = `${columnName}=eq.${encodeURIComponent(value)}&limit=1`;
|
|
93
|
+
const response = await this.getRecords(tableName, queryParams);
|
|
94
|
+
|
|
95
|
+
// Return the first record if found, or null if not found
|
|
96
|
+
if (response.records && response.records.length) {
|
|
97
|
+
return response.records[0];
|
|
98
|
+
}
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
async getRecords(tableName: string, queryParams: string = '') {
|
|
103
|
+
const url = `/database/records/${tableName}${queryParams ? `?${queryParams}` : ''}`;
|
|
104
|
+
const response = await apiClient.request(url, {
|
|
105
|
+
headers: apiClient.withAccessToken(),
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
// Traditional REST: check if response is array (direct data) or wrapped
|
|
109
|
+
if (Array.isArray(response)) {
|
|
110
|
+
return {
|
|
111
|
+
records: response,
|
|
112
|
+
total: response.length,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// If backend returns wrapped format for this endpoint
|
|
117
|
+
if (response.data && Array.isArray(response.data)) {
|
|
118
|
+
return {
|
|
119
|
+
records: response.data,
|
|
120
|
+
total: response.data.length,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return {
|
|
125
|
+
records: response,
|
|
126
|
+
total: response.length,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
createRecords(table: string, records: { [key: string]: ConvertedValue }[]) {
|
|
131
|
+
// if data is json and data[id] == "" then remove id from data, because can't assign '' to uuid
|
|
132
|
+
records = records.map((record) => {
|
|
133
|
+
if (typeof record === 'object' && record.id === '') {
|
|
134
|
+
delete record.id;
|
|
135
|
+
}
|
|
136
|
+
return record;
|
|
137
|
+
});
|
|
138
|
+
return apiClient.request(`/database/records/${table}`, {
|
|
139
|
+
method: 'POST',
|
|
140
|
+
headers: apiClient.withAccessToken({
|
|
141
|
+
'Content-Type': 'application/json',
|
|
142
|
+
}),
|
|
143
|
+
body: JSON.stringify(records),
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
createRecord(table: string, data: { [key: string]: ConvertedValue }) {
|
|
148
|
+
if (typeof data === 'object' && data.id === '') {
|
|
149
|
+
// can't assign '' to uuid, so we need to remove it
|
|
150
|
+
delete data.id;
|
|
151
|
+
}
|
|
152
|
+
return this.createRecords(table, [data]);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
updateRecord(
|
|
156
|
+
table: string,
|
|
157
|
+
pkColumn: string,
|
|
158
|
+
pkValue: string,
|
|
159
|
+
data: { [key: string]: ConvertedValue }
|
|
160
|
+
) {
|
|
161
|
+
return apiClient.request(`/database/records/${table}?${pkColumn}=eq.${pkValue}`, {
|
|
162
|
+
method: 'PATCH',
|
|
163
|
+
headers: apiClient.withAccessToken({
|
|
164
|
+
'Content-Type': 'application/json',
|
|
165
|
+
}),
|
|
166
|
+
body: JSON.stringify(data),
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// PostgREST supports bulk deletes via in.() filter
|
|
171
|
+
deleteRecords(table: string, pkColumn: string, pkValues: string[]) {
|
|
172
|
+
if (!pkValues.length) {
|
|
173
|
+
return Promise.resolve();
|
|
174
|
+
}
|
|
175
|
+
const pkFilter = `in.(${pkValues.join(',')})`;
|
|
176
|
+
return apiClient.request(`/database/records/${table}?${pkColumn}=${pkFilter}`, {
|
|
177
|
+
method: 'DELETE',
|
|
178
|
+
headers: apiClient.withAccessToken(),
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
validateCSVFile(file: File): { valid: boolean; error?: string } {
|
|
183
|
+
if (file.type !== 'text/csv' && !file.name.endsWith('.csv')) {
|
|
184
|
+
return { valid: false, error: 'Invalid file type. Please upload a CSV file.' };
|
|
185
|
+
}
|
|
186
|
+
const maxSizeInBytes = 50 * 1024 * 1024;
|
|
187
|
+
if (file.size > maxSizeInBytes) {
|
|
188
|
+
return { valid: false, error: `File size exceeds the limit of ${maxSizeInBytes} bytes.` };
|
|
189
|
+
}
|
|
190
|
+
return { valid: true };
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
async importCSV(tableName: string, file: File): Promise<CSVImportResponse> {
|
|
194
|
+
const validation = this.validateCSVFile(file);
|
|
195
|
+
if (!validation.valid) {
|
|
196
|
+
throw new Error(validation.error || 'Invalid CSV file.');
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
const formData = new FormData();
|
|
200
|
+
formData.append('file', file);
|
|
201
|
+
formData.append('table', tableName);
|
|
202
|
+
|
|
203
|
+
const response = await apiClient.request(`/database/advance/bulk-upsert`, {
|
|
204
|
+
method: 'POST',
|
|
205
|
+
headers: apiClient.withAccessToken(),
|
|
206
|
+
body: formData,
|
|
207
|
+
});
|
|
208
|
+
return {
|
|
209
|
+
success: response.success,
|
|
210
|
+
message: response.message,
|
|
211
|
+
data: {
|
|
212
|
+
rowCount: response.rowsAffected,
|
|
213
|
+
},
|
|
214
|
+
error: response.error,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
export const recordService = new RecordService();
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { apiClient } from '@/lib/api/client';
|
|
2
|
+
import {
|
|
3
|
+
ColumnSchema,
|
|
4
|
+
GetTableSchemaResponse,
|
|
5
|
+
CreateTableRequest,
|
|
6
|
+
UpdateTableSchemaResponse,
|
|
7
|
+
UpdateTableSchemaRequest,
|
|
8
|
+
} from '@insforge/shared-schemas';
|
|
9
|
+
|
|
10
|
+
export class TableService {
|
|
11
|
+
async listTables(): Promise<string[]> {
|
|
12
|
+
const data = await apiClient.request('/database/tables', {
|
|
13
|
+
headers: apiClient.withAccessToken(),
|
|
14
|
+
});
|
|
15
|
+
// data is already unwrapped by request method and should be an array
|
|
16
|
+
// Filter out the 'users' table
|
|
17
|
+
return Array.isArray(data) ? data.filter((table) => table !== 'users') : [];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
getTableSchema(tableName: string): Promise<GetTableSchemaResponse> {
|
|
21
|
+
return apiClient.request(`/database/tables/${tableName}/schema`, {
|
|
22
|
+
headers: apiClient.withAccessToken(),
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
createTable(tableName: string, columns: ColumnSchema[]) {
|
|
27
|
+
const body: CreateTableRequest = { tableName: tableName, columns, rlsEnabled: true };
|
|
28
|
+
return apiClient.request('/database/tables', {
|
|
29
|
+
method: 'POST',
|
|
30
|
+
headers: apiClient.withAccessToken({
|
|
31
|
+
'Content-Type': 'application/json',
|
|
32
|
+
}),
|
|
33
|
+
body: JSON.stringify(body),
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
deleteTable(tableName: string) {
|
|
38
|
+
return apiClient.request(`/database/tables/${tableName}`, {
|
|
39
|
+
method: 'DELETE',
|
|
40
|
+
headers: apiClient.withAccessToken(),
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
updateTableSchema(
|
|
45
|
+
tableName: string,
|
|
46
|
+
operations: UpdateTableSchemaRequest
|
|
47
|
+
): Promise<UpdateTableSchemaResponse | void> {
|
|
48
|
+
return apiClient.request(`/database/tables/${tableName}/schema`, {
|
|
49
|
+
method: 'PATCH',
|
|
50
|
+
headers: apiClient.withAccessToken({
|
|
51
|
+
'Content-Type': 'application/json',
|
|
52
|
+
}),
|
|
53
|
+
body: JSON.stringify(operations),
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export const tableService = new TableService();
|
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
import { DatabaseTemplate } from './index';
|
|
2
|
+
|
|
3
|
+
export const aiChatbotTemplate: DatabaseTemplate = {
|
|
4
|
+
id: 'ai-chatbot',
|
|
5
|
+
title: 'AI Chatbot',
|
|
6
|
+
description:
|
|
7
|
+
'A chatbot app with conversations, message history, image uploads, and user specific data',
|
|
8
|
+
tableCount: 4,
|
|
9
|
+
visualizerSchema: [
|
|
10
|
+
{
|
|
11
|
+
tableName: 'conversations',
|
|
12
|
+
columns: [
|
|
13
|
+
{ columnName: 'id', type: 'uuid', isPrimaryKey: true, isNullable: false, isUnique: true },
|
|
14
|
+
{
|
|
15
|
+
columnName: 'user_id',
|
|
16
|
+
type: 'uuid',
|
|
17
|
+
isPrimaryKey: false,
|
|
18
|
+
isNullable: true,
|
|
19
|
+
isUnique: false,
|
|
20
|
+
foreignKey: {
|
|
21
|
+
referenceTable: 'users',
|
|
22
|
+
referenceColumn: 'id',
|
|
23
|
+
onDelete: 'CASCADE',
|
|
24
|
+
onUpdate: 'CASCADE',
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
columnName: 'title',
|
|
29
|
+
type: 'varchar',
|
|
30
|
+
isPrimaryKey: false,
|
|
31
|
+
isNullable: true,
|
|
32
|
+
isUnique: false,
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
columnName: 'model',
|
|
36
|
+
type: 'varchar',
|
|
37
|
+
isPrimaryKey: false,
|
|
38
|
+
isNullable: true,
|
|
39
|
+
isUnique: false,
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
columnName: 'created_at',
|
|
43
|
+
type: 'timestamp',
|
|
44
|
+
isPrimaryKey: false,
|
|
45
|
+
isNullable: true,
|
|
46
|
+
isUnique: false,
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
columnName: 'updated_at',
|
|
50
|
+
type: 'timestamp',
|
|
51
|
+
isPrimaryKey: false,
|
|
52
|
+
isNullable: true,
|
|
53
|
+
isUnique: false,
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
tableName: 'messages',
|
|
59
|
+
columns: [
|
|
60
|
+
{ columnName: 'id', type: 'uuid', isPrimaryKey: true, isNullable: false, isUnique: true },
|
|
61
|
+
{
|
|
62
|
+
columnName: 'conversation_id',
|
|
63
|
+
type: 'uuid',
|
|
64
|
+
isPrimaryKey: false,
|
|
65
|
+
isNullable: true,
|
|
66
|
+
isUnique: false,
|
|
67
|
+
foreignKey: {
|
|
68
|
+
referenceTable: 'conversations',
|
|
69
|
+
referenceColumn: 'id',
|
|
70
|
+
onDelete: 'CASCADE',
|
|
71
|
+
onUpdate: 'CASCADE',
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
columnName: 'role',
|
|
76
|
+
type: 'varchar',
|
|
77
|
+
isPrimaryKey: false,
|
|
78
|
+
isNullable: false,
|
|
79
|
+
isUnique: false,
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
columnName: 'content',
|
|
83
|
+
type: 'text',
|
|
84
|
+
isPrimaryKey: false,
|
|
85
|
+
isNullable: false,
|
|
86
|
+
isUnique: false,
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
columnName: 'tokens_used',
|
|
90
|
+
type: 'integer',
|
|
91
|
+
isPrimaryKey: false,
|
|
92
|
+
isNullable: true,
|
|
93
|
+
isUnique: false,
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
columnName: 'created_at',
|
|
97
|
+
type: 'timestamp',
|
|
98
|
+
isPrimaryKey: false,
|
|
99
|
+
isNullable: true,
|
|
100
|
+
isUnique: false,
|
|
101
|
+
},
|
|
102
|
+
],
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
tableName: 'feedback',
|
|
106
|
+
columns: [
|
|
107
|
+
{ columnName: 'id', type: 'uuid', isPrimaryKey: true, isNullable: false, isUnique: true },
|
|
108
|
+
{
|
|
109
|
+
columnName: 'message_id',
|
|
110
|
+
type: 'uuid',
|
|
111
|
+
isPrimaryKey: false,
|
|
112
|
+
isNullable: true,
|
|
113
|
+
isUnique: false,
|
|
114
|
+
foreignKey: {
|
|
115
|
+
referenceTable: 'messages',
|
|
116
|
+
referenceColumn: 'id',
|
|
117
|
+
onDelete: 'CASCADE',
|
|
118
|
+
onUpdate: 'CASCADE',
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
columnName: 'user_id',
|
|
123
|
+
type: 'uuid',
|
|
124
|
+
isPrimaryKey: false,
|
|
125
|
+
isNullable: true,
|
|
126
|
+
isUnique: false,
|
|
127
|
+
foreignKey: {
|
|
128
|
+
referenceTable: 'users',
|
|
129
|
+
referenceColumn: 'id',
|
|
130
|
+
onDelete: 'CASCADE',
|
|
131
|
+
onUpdate: 'CASCADE',
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
columnName: 'rating',
|
|
136
|
+
type: 'integer',
|
|
137
|
+
isPrimaryKey: false,
|
|
138
|
+
isNullable: true,
|
|
139
|
+
isUnique: false,
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
columnName: 'comment',
|
|
143
|
+
type: 'text',
|
|
144
|
+
isPrimaryKey: false,
|
|
145
|
+
isNullable: true,
|
|
146
|
+
isUnique: false,
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
columnName: 'created_at',
|
|
150
|
+
type: 'timestamp',
|
|
151
|
+
isPrimaryKey: false,
|
|
152
|
+
isNullable: true,
|
|
153
|
+
isUnique: false,
|
|
154
|
+
},
|
|
155
|
+
],
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
tableName: 'prompts',
|
|
159
|
+
columns: [
|
|
160
|
+
{ columnName: 'id', type: 'uuid', isPrimaryKey: true, isNullable: false, isUnique: true },
|
|
161
|
+
{
|
|
162
|
+
columnName: 'user_id',
|
|
163
|
+
type: 'uuid',
|
|
164
|
+
isPrimaryKey: false,
|
|
165
|
+
isNullable: true,
|
|
166
|
+
isUnique: false,
|
|
167
|
+
foreignKey: {
|
|
168
|
+
referenceTable: 'users',
|
|
169
|
+
referenceColumn: 'id',
|
|
170
|
+
onDelete: 'CASCADE',
|
|
171
|
+
onUpdate: 'CASCADE',
|
|
172
|
+
},
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
columnName: 'title',
|
|
176
|
+
type: 'varchar',
|
|
177
|
+
isPrimaryKey: false,
|
|
178
|
+
isNullable: false,
|
|
179
|
+
isUnique: false,
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
columnName: 'content',
|
|
183
|
+
type: 'text',
|
|
184
|
+
isPrimaryKey: false,
|
|
185
|
+
isNullable: false,
|
|
186
|
+
isUnique: false,
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
columnName: 'category',
|
|
190
|
+
type: 'varchar',
|
|
191
|
+
isPrimaryKey: false,
|
|
192
|
+
isNullable: true,
|
|
193
|
+
isUnique: false,
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
columnName: 'is_public',
|
|
197
|
+
type: 'boolean',
|
|
198
|
+
isPrimaryKey: false,
|
|
199
|
+
isNullable: true,
|
|
200
|
+
isUnique: false,
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
columnName: 'usage_count',
|
|
204
|
+
type: 'integer',
|
|
205
|
+
isPrimaryKey: false,
|
|
206
|
+
isNullable: true,
|
|
207
|
+
isUnique: false,
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
columnName: 'created_at',
|
|
211
|
+
type: 'timestamp',
|
|
212
|
+
isPrimaryKey: false,
|
|
213
|
+
isNullable: true,
|
|
214
|
+
isUnique: false,
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
columnName: 'updated_at',
|
|
218
|
+
type: 'timestamp',
|
|
219
|
+
isPrimaryKey: false,
|
|
220
|
+
isNullable: true,
|
|
221
|
+
isUnique: false,
|
|
222
|
+
},
|
|
223
|
+
],
|
|
224
|
+
},
|
|
225
|
+
],
|
|
226
|
+
sql: `-- AI Chatbot Database Schema
|
|
227
|
+
-- A comprehensive AI chatbot system with conversations, messages, feedback, and prompt library
|
|
228
|
+
|
|
229
|
+
-- Conversations table
|
|
230
|
+
CREATE TABLE conversations (
|
|
231
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
232
|
+
user_id UUID REFERENCES users(id) ON UPDATE CASCADE ON DELETE CASCADE,
|
|
233
|
+
title VARCHAR(255),
|
|
234
|
+
model VARCHAR(100) DEFAULT 'gpt-4',
|
|
235
|
+
created_at TIMESTAMP DEFAULT NOW(),
|
|
236
|
+
updated_at TIMESTAMP DEFAULT NOW()
|
|
237
|
+
);
|
|
238
|
+
|
|
239
|
+
-- Messages table
|
|
240
|
+
CREATE TABLE messages (
|
|
241
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
242
|
+
conversation_id UUID REFERENCES conversations(id) ON UPDATE CASCADE ON DELETE CASCADE,
|
|
243
|
+
role VARCHAR(50) NOT NULL CHECK (role IN ('user', 'assistant', 'system')),
|
|
244
|
+
content TEXT NOT NULL,
|
|
245
|
+
tokens_used INTEGER,
|
|
246
|
+
created_at TIMESTAMP DEFAULT NOW()
|
|
247
|
+
);
|
|
248
|
+
|
|
249
|
+
-- Feedback table
|
|
250
|
+
CREATE TABLE feedback (
|
|
251
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
252
|
+
message_id UUID REFERENCES messages(id) ON UPDATE CASCADE ON DELETE CASCADE,
|
|
253
|
+
user_id UUID REFERENCES users(id) ON UPDATE CASCADE ON DELETE CASCADE,
|
|
254
|
+
rating INTEGER CHECK (rating >= 1 AND rating <= 5),
|
|
255
|
+
comment TEXT,
|
|
256
|
+
created_at TIMESTAMP DEFAULT NOW()
|
|
257
|
+
);
|
|
258
|
+
|
|
259
|
+
-- Prompts library table
|
|
260
|
+
CREATE TABLE prompts (
|
|
261
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
262
|
+
user_id UUID REFERENCES users(id) ON UPDATE CASCADE ON DELETE CASCADE,
|
|
263
|
+
title VARCHAR(255) NOT NULL,
|
|
264
|
+
content TEXT NOT NULL,
|
|
265
|
+
category VARCHAR(100),
|
|
266
|
+
is_public BOOLEAN DEFAULT FALSE,
|
|
267
|
+
usage_count INTEGER DEFAULT 0,
|
|
268
|
+
created_at TIMESTAMP DEFAULT NOW(),
|
|
269
|
+
updated_at TIMESTAMP DEFAULT NOW()
|
|
270
|
+
);
|
|
271
|
+
|
|
272
|
+
-- Indexes for better performance
|
|
273
|
+
CREATE INDEX idx_conversations_user ON conversations(user_id);
|
|
274
|
+
CREATE INDEX idx_conversations_updated ON conversations(updated_at DESC);
|
|
275
|
+
CREATE INDEX idx_messages_conversation ON messages(conversation_id);
|
|
276
|
+
CREATE INDEX idx_messages_role ON messages(role);
|
|
277
|
+
CREATE INDEX idx_messages_created ON messages(created_at DESC);
|
|
278
|
+
CREATE INDEX idx_feedback_message ON feedback(message_id);
|
|
279
|
+
CREATE INDEX idx_feedback_user ON feedback(user_id);
|
|
280
|
+
CREATE INDEX idx_feedback_rating ON feedback(rating);
|
|
281
|
+
CREATE INDEX idx_prompts_user ON prompts(user_id);
|
|
282
|
+
CREATE INDEX idx_prompts_category ON prompts(category);
|
|
283
|
+
CREATE INDEX idx_prompts_public ON prompts(is_public) WHERE is_public = TRUE;
|
|
284
|
+
|
|
285
|
+
-- =======================
|
|
286
|
+
-- ROW LEVEL SECURITY (RLS)
|
|
287
|
+
-- =======================
|
|
288
|
+
|
|
289
|
+
-- Enable RLS on all tables
|
|
290
|
+
ALTER TABLE conversations ENABLE ROW LEVEL SECURITY;
|
|
291
|
+
ALTER TABLE messages ENABLE ROW LEVEL SECURITY;
|
|
292
|
+
ALTER TABLE feedback ENABLE ROW LEVEL SECURITY;
|
|
293
|
+
ALTER TABLE prompts ENABLE ROW LEVEL SECURITY;
|
|
294
|
+
|
|
295
|
+
-- Policies for conversations (users can only see their own)
|
|
296
|
+
CREATE POLICY "Users can view their own conversations"
|
|
297
|
+
ON conversations FOR SELECT
|
|
298
|
+
TO authenticated
|
|
299
|
+
USING (user_id = auth.uid());
|
|
300
|
+
|
|
301
|
+
CREATE POLICY "Users can create their own conversations"
|
|
302
|
+
ON conversations FOR INSERT
|
|
303
|
+
TO authenticated
|
|
304
|
+
WITH CHECK (user_id = auth.uid());
|
|
305
|
+
|
|
306
|
+
CREATE POLICY "Users can update their own conversations"
|
|
307
|
+
ON conversations FOR UPDATE
|
|
308
|
+
TO authenticated
|
|
309
|
+
USING (user_id = auth.uid())
|
|
310
|
+
WITH CHECK (user_id = auth.uid());
|
|
311
|
+
|
|
312
|
+
CREATE POLICY "Users can delete their own conversations"
|
|
313
|
+
ON conversations FOR DELETE
|
|
314
|
+
TO authenticated
|
|
315
|
+
USING (user_id = auth.uid());
|
|
316
|
+
|
|
317
|
+
-- Policies for messages (users can only see messages from their conversations)
|
|
318
|
+
CREATE POLICY "Users can view messages from their conversations"
|
|
319
|
+
ON messages FOR SELECT
|
|
320
|
+
TO authenticated
|
|
321
|
+
USING (
|
|
322
|
+
conversation_id IN (
|
|
323
|
+
SELECT id FROM conversations WHERE user_id = auth.uid()
|
|
324
|
+
)
|
|
325
|
+
);
|
|
326
|
+
|
|
327
|
+
CREATE POLICY "Users can create messages in their conversations"
|
|
328
|
+
ON messages FOR INSERT
|
|
329
|
+
TO authenticated
|
|
330
|
+
WITH CHECK (
|
|
331
|
+
conversation_id IN (
|
|
332
|
+
SELECT id FROM conversations WHERE user_id = auth.uid()
|
|
333
|
+
)
|
|
334
|
+
);
|
|
335
|
+
|
|
336
|
+
CREATE POLICY "Users can update messages in their conversations"
|
|
337
|
+
ON messages FOR UPDATE
|
|
338
|
+
TO authenticated
|
|
339
|
+
USING (
|
|
340
|
+
conversation_id IN (
|
|
341
|
+
SELECT id FROM conversations WHERE user_id = auth.uid()
|
|
342
|
+
)
|
|
343
|
+
)
|
|
344
|
+
WITH CHECK (
|
|
345
|
+
conversation_id IN (
|
|
346
|
+
SELECT id FROM conversations WHERE user_id = auth.uid()
|
|
347
|
+
)
|
|
348
|
+
);
|
|
349
|
+
|
|
350
|
+
CREATE POLICY "Users can delete messages from their conversations"
|
|
351
|
+
ON messages FOR DELETE
|
|
352
|
+
TO authenticated
|
|
353
|
+
USING (
|
|
354
|
+
conversation_id IN (
|
|
355
|
+
SELECT id FROM conversations WHERE user_id = auth.uid()
|
|
356
|
+
)
|
|
357
|
+
);
|
|
358
|
+
|
|
359
|
+
-- Policies for feedback
|
|
360
|
+
CREATE POLICY "Users can view their own feedback"
|
|
361
|
+
ON feedback FOR SELECT
|
|
362
|
+
TO authenticated
|
|
363
|
+
USING (user_id = auth.uid());
|
|
364
|
+
|
|
365
|
+
CREATE POLICY "Users can create their own feedback"
|
|
366
|
+
ON feedback FOR INSERT
|
|
367
|
+
TO authenticated
|
|
368
|
+
WITH CHECK (user_id = auth.uid());
|
|
369
|
+
|
|
370
|
+
CREATE POLICY "Users can update their own feedback"
|
|
371
|
+
ON feedback FOR UPDATE
|
|
372
|
+
TO authenticated
|
|
373
|
+
USING (user_id = auth.uid())
|
|
374
|
+
WITH CHECK (user_id = auth.uid());
|
|
375
|
+
|
|
376
|
+
CREATE POLICY "Users can delete their own feedback"
|
|
377
|
+
ON feedback FOR DELETE
|
|
378
|
+
TO authenticated
|
|
379
|
+
USING (user_id = auth.uid());
|
|
380
|
+
|
|
381
|
+
-- Policies for prompts (users can see their own and public prompts)
|
|
382
|
+
CREATE POLICY "Users can view their own and public prompts"
|
|
383
|
+
ON prompts FOR SELECT
|
|
384
|
+
TO authenticated
|
|
385
|
+
USING (user_id = auth.uid() OR is_public = TRUE);
|
|
386
|
+
|
|
387
|
+
CREATE POLICY "Users can create their own prompts"
|
|
388
|
+
ON prompts FOR INSERT
|
|
389
|
+
TO authenticated
|
|
390
|
+
WITH CHECK (user_id = auth.uid());
|
|
391
|
+
|
|
392
|
+
CREATE POLICY "Users can update their own prompts"
|
|
393
|
+
ON prompts FOR UPDATE
|
|
394
|
+
TO authenticated
|
|
395
|
+
USING (user_id = auth.uid())
|
|
396
|
+
WITH CHECK (user_id = auth.uid());
|
|
397
|
+
|
|
398
|
+
CREATE POLICY "Users can delete their own prompts"
|
|
399
|
+
ON prompts FOR DELETE
|
|
400
|
+
TO authenticated
|
|
401
|
+
USING (user_id = auth.uid());`,
|
|
402
|
+
};
|