insforge 0.3.1
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/.dockerignore +58 -0
- package/.env.example +49 -0
- package/.github/ISSUE_TEMPLATE/bug_report.yml +83 -0
- package/.github/ISSUE_TEMPLATE/config.yml +11 -0
- package/.github/ISSUE_TEMPLATE/feature_request.yml +79 -0
- package/.github/copilot-instructions.md +147 -0
- package/.github/workflows/build-image.yml +65 -0
- package/.github/workflows/ci-premerge-check.yml +24 -0
- package/.github/workflows/deploy-aws.yml +130 -0
- package/.github/workflows/lint-and-format.yml +33 -0
- package/.prettierignore +65 -0
- package/.prettierrc +9 -0
- package/CHANGELOG.md +3 -0
- package/CONTRIBUTING.md +126 -0
- package/Dockerfile +27 -0
- package/GITHUB_OAUTH_SETUP.md +49 -0
- package/GOOGLE_OAUTH_SETUP.md +148 -0
- package/LICENSE +201 -0
- package/README.md +134 -0
- package/assets/Dark.svg +23 -0
- package/assets/archDiagram.png +0 -0
- package/assets/banner.png +0 -0
- package/assets/mcpInstallv2.png +0 -0
- package/assets/sampleResponse.png +0 -0
- package/assets/signin.png +0 -0
- package/assets/userflow.png +0 -0
- package/backend/migrations/000_create-base-tables.sql +142 -0
- package/backend/migrations/001_create-helper-functions.sql +41 -0
- package/backend/migrations/002_rename-auth-tables.sql +30 -0
- package/backend/migrations/003_create-users-table.sql +56 -0
- package/backend/migrations/004_add-reload-postgrest-func.sql +24 -0
- package/backend/migrations/005_enable-project-admin-modify-users.sql +30 -0
- package/backend/migrations/006_modify-ai-usage-table.sql +25 -0
- package/backend/migrations/007_drop-metadata-table.sql +2 -0
- package/backend/migrations/008_add-system-tables.sql +77 -0
- package/backend/migrations/009_add-function-secrets.sql +24 -0
- package/backend/migrations/010_modify-ai-config-modalities.sql +93 -0
- package/backend/migrations/011_refactor-secrets-table.sql +15 -0
- package/backend/migrations/012_add-storage-uploaded-by.sql +8 -0
- package/backend/package.json +75 -0
- package/backend/src/api/middleware/auth.ts +240 -0
- package/backend/src/api/middleware/error.ts +231 -0
- package/backend/src/api/middleware/upload.ts +59 -0
- package/backend/src/api/routes/agent.ts +29 -0
- package/backend/src/api/routes/ai.ts +472 -0
- package/backend/src/api/routes/auth.oauth.ts +482 -0
- package/backend/src/api/routes/auth.ts +386 -0
- package/backend/src/api/routes/database.advance.ts +275 -0
- package/backend/src/api/routes/database.records.ts +246 -0
- package/backend/src/api/routes/database.tables.ts +161 -0
- package/backend/src/api/routes/docs.ts +66 -0
- package/backend/src/api/routes/functions.ts +183 -0
- package/backend/src/api/routes/logs.ts +150 -0
- package/backend/src/api/routes/metadata.ts +160 -0
- package/backend/src/api/routes/openapi.ts +82 -0
- package/backend/src/api/routes/secrets.ts +199 -0
- package/backend/src/api/routes/storage.ts +547 -0
- package/backend/src/api/routes/usage.ts +96 -0
- package/backend/src/core/ai/chat.ts +207 -0
- package/backend/src/core/ai/client.ts +242 -0
- package/backend/src/core/ai/config.ts +187 -0
- package/backend/src/core/ai/image.ts +156 -0
- package/backend/src/core/ai/model.ts +117 -0
- package/backend/src/core/ai/usage.ts +290 -0
- package/backend/src/core/auth/auth.ts +781 -0
- package/backend/src/core/auth/oauth.ts +398 -0
- package/backend/src/core/database/advance.ts +1074 -0
- package/backend/src/core/database/manager.ts +178 -0
- package/backend/src/core/database/table.ts +772 -0
- package/backend/src/core/documentation/agent.ts +689 -0
- package/backend/src/core/documentation/openapi.ts +856 -0
- package/backend/src/core/functions/functions.ts +310 -0
- package/backend/src/core/logs/analytics.ts +76 -0
- package/backend/src/core/logs/audit.ts +255 -0
- package/backend/src/core/logs/providers/base.provider.ts +83 -0
- package/backend/src/core/logs/providers/cloudwatch.provider.ts +510 -0
- package/backend/src/core/logs/providers/localdb.provider.ts +246 -0
- package/backend/src/core/secrets/encryption.ts +58 -0
- package/backend/src/core/secrets/secrets.ts +410 -0
- package/backend/src/core/socket/socket.ts +388 -0
- package/backend/src/core/socket/types.ts +79 -0
- package/backend/src/core/storage/storage.ts +923 -0
- package/backend/src/server.ts +288 -0
- package/backend/src/types/ai.ts +46 -0
- package/backend/src/types/auth.ts +90 -0
- package/backend/src/types/database.ts +136 -0
- package/backend/src/types/error-constants.ts +86 -0
- package/backend/src/types/logs.ts +47 -0
- package/backend/src/types/profile.ts +55 -0
- package/backend/src/types/storage.ts +23 -0
- package/backend/src/utils/cloud-token.ts +39 -0
- package/backend/src/utils/constants.ts +1 -0
- package/backend/src/utils/environment.ts +35 -0
- package/backend/src/utils/helpers.ts +49 -0
- package/backend/src/utils/logger.ts +13 -0
- package/backend/src/utils/response.ts +62 -0
- package/backend/src/utils/seed.ts +205 -0
- package/backend/src/utils/sql-parser.ts +63 -0
- package/backend/src/utils/uuid.ts +9 -0
- package/backend/src/utils/validations.ts +129 -0
- package/backend/tests/README.md +134 -0
- package/backend/tests/cleanup-all-test-data.sh +231 -0
- package/backend/tests/cloud/test-s3-multitenant.sh +132 -0
- package/backend/tests/local/comprehensive-curl-tests.sh +156 -0
- package/backend/tests/local/test-auth-router.sh +144 -0
- package/backend/tests/local/test-database-router.sh +222 -0
- package/backend/tests/local/test-e2e.sh +241 -0
- package/backend/tests/local/test-fk-errors.sh +97 -0
- package/backend/tests/local/test-id-field.sh +201 -0
- package/backend/tests/local/test-public-bucket.sh +265 -0
- package/backend/tests/local/test-secrets.sh +248 -0
- package/backend/tests/local/test-serverless-functions.sh.disabled +325 -0
- package/backend/tests/local/test-traditional-rest.sh +209 -0
- package/backend/tests/manual/README.md +51 -0
- package/backend/tests/manual/create-large-table-simple.sql +11 -0
- package/backend/tests/manual/seed-large-table.sql +101 -0
- package/backend/tests/manual/setup-large-table-extras.sql +34 -0
- package/backend/tests/manual/test-better-auth.sh +303 -0
- package/backend/tests/manual/test-bulk-upsert.sh +410 -0
- package/backend/tests/manual/test-database-advance.sh +297 -0
- package/backend/tests/manual/test-postgrest-stability.sh +192 -0
- package/backend/tests/manual/test-rawsql-export-import.sh +412 -0
- package/backend/tests/manual/test-universal-storage.sh +264 -0
- package/backend/tests/manual/test-users.sql +18 -0
- package/backend/tests/run-all-tests.sh +140 -0
- package/backend/tests/setup.ts +22 -0
- package/backend/tests/test-config.sh +303 -0
- package/backend/tsconfig.json +23 -0
- package/backend/tsup.config.ts +18 -0
- package/backend/vitest.config.ts +22 -0
- package/docker-compose.prod.yml +145 -0
- package/docker-compose.yml +167 -0
- package/docker-init/db/db-init.sql +125 -0
- package/docker-init/db/jwt.sql +5 -0
- package/docker-init/db/logs.sql +9 -0
- package/docker-init/db/postgresql.conf +17 -0
- package/docs/deprecated/insforge-auth-api.md +215 -0
- package/docs/deprecated/insforge-auth-sdk.md +100 -0
- package/docs/deprecated/insforge-db-api.md +359 -0
- package/docs/deprecated/insforge-db-sdk.md +140 -0
- package/docs/deprecated/insforge-debug-sdk.md +157 -0
- package/docs/deprecated/insforge-debug.md +65 -0
- package/docs/deprecated/insforge-instructions.md +124 -0
- package/docs/deprecated/insforge-project.md +118 -0
- package/docs/deprecated/insforge-storage-api.md +279 -0
- package/docs/deprecated/insforge-storage-sdk.md +159 -0
- package/docs/insforge-instructions-sdk.md +407 -0
- package/eslint.config.js +317 -0
- package/examples/oauth/frontend-oauth-example.html +251 -0
- package/examples/response-examples.md +444 -0
- package/frontend/README.md +112 -0
- package/frontend/components.json +17 -0
- package/frontend/index.html +13 -0
- package/frontend/package.json +63 -0
- package/frontend/public/favicon.ico +0 -0
- package/frontend/src/App.tsx +106 -0
- package/frontend/src/assets/icons/checkbox_checked.svg +6 -0
- package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -0
- package/frontend/src/assets/icons/checked.svg +3 -0
- package/frontend/src/assets/icons/error.svg +3 -0
- package/frontend/src/assets/icons/pencil.svg +4 -0
- package/frontend/src/assets/icons/refresh.svg +4 -0
- package/frontend/src/assets/icons/step_active.svg +3 -0
- package/frontend/src/assets/icons/step_inactive.svg +11 -0
- package/frontend/src/assets/icons/warning.svg +3 -0
- package/frontend/src/assets/logos/amazon.svg +1 -0
- package/frontend/src/assets/logos/claude_code.svg +3 -0
- package/frontend/src/assets/logos/cline.svg +6 -0
- package/frontend/src/assets/logos/cursor.svg +20 -0
- package/frontend/src/assets/logos/discord.svg +9 -0
- package/frontend/src/assets/logos/gemini.svg +19 -0
- package/frontend/src/assets/logos/github.svg +5 -0
- package/frontend/src/assets/logos/google.svg +13 -0
- package/frontend/src/assets/logos/grok.svg +10 -0
- package/frontend/src/assets/logos/insforge_dark.svg +15 -0
- package/frontend/src/assets/logos/insforge_light.svg +15 -0
- package/frontend/src/assets/logos/openai.svg +10 -0
- package/frontend/src/assets/logos/roo_code.svg +9 -0
- package/frontend/src/assets/logos/trae.svg +3 -0
- package/frontend/src/assets/logos/windsurf.svg +10 -0
- package/frontend/src/components/ButtonWithLoading.tsx +27 -0
- package/frontend/src/components/Checkbox.tsx +61 -0
- package/frontend/src/components/CodeBlock.tsx +32 -0
- package/frontend/src/components/ConfirmDialog.tsx +96 -0
- package/frontend/src/components/CopyButton.tsx +69 -0
- package/frontend/src/components/DeleteActionButton.tsx +42 -0
- package/frontend/src/components/EmptyState.tsx +41 -0
- package/frontend/src/components/ErrorState.tsx +35 -0
- package/frontend/src/components/FeatureSidebar.tsx +126 -0
- package/frontend/src/components/FeatureSidebarItem.tsx +101 -0
- package/frontend/src/components/JsonHighlight.tsx +61 -0
- package/frontend/src/components/LoadingState.tsx +16 -0
- package/frontend/src/components/PaginationControls.tsx +54 -0
- package/frontend/src/components/PromptDialog.tsx +68 -0
- package/frontend/src/components/SearchInput.tsx +90 -0
- package/frontend/src/components/SelectionClearButton.tsx +26 -0
- package/frontend/src/components/Stepper.tsx +139 -0
- package/frontend/src/components/ThemeToggle.tsx +58 -0
- package/frontend/src/components/TypeBadge.tsx +20 -0
- package/frontend/src/components/datagrid/DataGrid.tsx +264 -0
- package/frontend/src/components/datagrid/DefaultCellRenderer.tsx +114 -0
- package/frontend/src/components/datagrid/IdCell.tsx +44 -0
- package/frontend/src/components/datagrid/SortableHeader.tsx +74 -0
- package/frontend/src/components/datagrid/cell-editors/BooleanCellEditor.tsx +54 -0
- package/frontend/src/components/datagrid/cell-editors/DateCellEditor.tsx +483 -0
- package/frontend/src/components/datagrid/cell-editors/JsonCellEditor.tsx +362 -0
- package/frontend/src/components/datagrid/cell-editors/TextCellEditor.tsx +38 -0
- package/frontend/src/components/datagrid/cell-editors/index.ts +14 -0
- package/frontend/src/components/datagrid/cell-editors/types.ts +43 -0
- package/frontend/src/components/datagrid/datagridTypes.tsx +72 -0
- package/frontend/src/components/datagrid/index.tsx +20 -0
- package/frontend/src/components/index.ts +39 -0
- package/frontend/src/components/layout/AppHeader.tsx +146 -0
- package/frontend/src/components/layout/AppSidebar.tsx +190 -0
- package/frontend/src/components/layout/CloudLayout.tsx +95 -0
- package/frontend/src/components/layout/Layout.tsx +43 -0
- package/frontend/src/components/radix/Alert.tsx +45 -0
- package/frontend/src/components/radix/AlertDialog.tsx +115 -0
- package/frontend/src/components/radix/Avatar.tsx +45 -0
- package/frontend/src/components/radix/Badge.tsx +33 -0
- package/frontend/src/components/radix/Button.tsx +50 -0
- package/frontend/src/components/radix/Card.tsx +58 -0
- package/frontend/src/components/radix/Dialog.tsx +98 -0
- package/frontend/src/components/radix/DropdownMenu.tsx +185 -0
- package/frontend/src/components/radix/Form.tsx +167 -0
- package/frontend/src/components/radix/Input.tsx +22 -0
- package/frontend/src/components/radix/Label.tsx +19 -0
- package/frontend/src/components/radix/Popover.tsx +29 -0
- package/frontend/src/components/radix/ScrollArea.tsx +44 -0
- package/frontend/src/components/radix/Select.tsx +151 -0
- package/frontend/src/components/radix/Separator.tsx +26 -0
- package/frontend/src/components/radix/Sheet.tsx +119 -0
- package/frontend/src/components/radix/Skeleton.tsx +7 -0
- package/frontend/src/components/radix/Switch.tsx +29 -0
- package/frontend/src/components/radix/Tabs.tsx +50 -0
- package/frontend/src/components/radix/Textarea.tsx +21 -0
- package/frontend/src/components/radix/Tooltip.tsx +28 -0
- package/frontend/src/features/ai/components/AIConfigCard.tsx +154 -0
- package/frontend/src/features/ai/components/AIConfigDialog.tsx +76 -0
- package/frontend/src/features/ai/components/AIConfigForm.tsx +222 -0
- package/frontend/src/features/ai/components/AIEmptyState.tsx +18 -0
- package/frontend/src/features/ai/components/fields/ModalityField.tsx +87 -0
- package/frontend/src/features/ai/components/fields/ModelSelectionField.tsx +134 -0
- package/frontend/src/features/ai/components/fields/SystemPromptField.tsx +33 -0
- package/frontend/src/features/ai/helpers.ts +155 -0
- package/frontend/src/features/ai/hooks/useAIConfigs.ts +221 -0
- package/frontend/src/features/ai/hooks/useAIUsage.ts +77 -0
- package/frontend/src/features/ai/page/AIPage.tsx +178 -0
- package/frontend/src/features/ai/services/ai.service.ts +148 -0
- package/frontend/src/features/auth/components/AddOAuthDialog.tsx +106 -0
- package/frontend/src/features/auth/components/AuthMethodTab.tsx +238 -0
- package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +303 -0
- package/frontend/src/features/auth/components/OAuthEmptyState.tsx +15 -0
- package/frontend/src/features/auth/components/UserFormDialog.tsx +248 -0
- package/frontend/src/features/auth/components/UsersDataGrid.tsx +183 -0
- package/frontend/src/features/auth/components/UsersTab.tsx +114 -0
- package/frontend/src/features/auth/hooks/useOAuthConfig.ts +129 -0
- package/frontend/src/features/auth/hooks/useUsers.ts +57 -0
- package/frontend/src/features/auth/index.ts +9 -0
- package/frontend/src/features/auth/page/AuthenticationPage.tsx +169 -0
- package/frontend/src/features/auth/services/auth.service.ts +112 -0
- package/frontend/src/features/auth/services/oauth.service.ts +49 -0
- package/frontend/src/features/dashboard/page/DashboardPage.tsx +194 -0
- package/frontend/src/features/database/components/ColumnTypeSelect.tsx +64 -0
- package/frontend/src/features/database/components/DatabaseDataGrid.tsx +282 -0
- package/frontend/src/features/database/components/ForeignKeyCell.tsx +187 -0
- package/frontend/src/features/database/components/ForeignKeyPopover.tsx +378 -0
- package/frontend/src/features/database/components/LinkRecordModal.tsx +288 -0
- package/frontend/src/features/database/components/RecordFormDialog.tsx +164 -0
- package/frontend/src/features/database/components/RecordFormField.tsx +568 -0
- package/frontend/src/features/database/components/TableEmptyState.tsx +21 -0
- package/frontend/src/features/database/components/TableForm.tsx +656 -0
- package/frontend/src/features/database/components/TableFormColumn.tsx +137 -0
- package/frontend/src/features/database/components/TableListSkeleton.tsx +9 -0
- package/frontend/src/features/database/components/TableSidebar.tsx +47 -0
- package/frontend/src/features/database/constants.ts +26 -0
- package/frontend/src/features/database/helpers.ts +125 -0
- package/frontend/src/features/database/hooks/UseLinkModal.tsx +78 -0
- package/frontend/src/features/database/index.ts +12 -0
- package/frontend/src/features/database/page/DatabasePage.tsx +626 -0
- package/frontend/src/features/database/schema.ts +25 -0
- package/frontend/src/features/database/services/database.service.ts +216 -0
- package/frontend/src/features/functions/components/FunctionEmptyState.tsx +15 -0
- package/frontend/src/features/functions/components/FunctionRow.tsx +71 -0
- package/frontend/src/features/functions/components/FunctionViewer.tsx +46 -0
- package/frontend/src/features/functions/components/FunctionsContent.tsx +88 -0
- package/frontend/src/features/functions/components/FunctionsSidebar.tsx +56 -0
- package/frontend/src/features/functions/components/SecretEmptyState.tsx +23 -0
- package/frontend/src/features/functions/components/SecretRow.tsx +68 -0
- package/frontend/src/features/functions/components/SecretsContent.tsx +120 -0
- package/frontend/src/features/functions/hooks/useFunctions.ts +106 -0
- package/frontend/src/features/functions/page/FunctionsPage.tsx +28 -0
- package/frontend/src/features/functions/services/functions.service.ts +48 -0
- package/frontend/src/features/login/components/AuthErrorBoundary.tsx +87 -0
- package/frontend/src/features/login/components/PrivateRoute.tsx +24 -0
- package/frontend/src/features/login/page/CloudLoginPage.tsx +93 -0
- package/frontend/src/features/login/page/LoginPage.tsx +174 -0
- package/frontend/src/features/logs/components/AnalyticsLogsTable.tsx +313 -0
- package/frontend/src/features/logs/components/LogsTable.tsx +199 -0
- package/frontend/src/features/logs/hooks/useAuditLogs.ts +39 -0
- package/frontend/src/features/logs/index.ts +5 -0
- package/frontend/src/features/logs/page/AnalyticsLogsPage.tsx +530 -0
- package/frontend/src/features/logs/page/AuditsPage.tsx +192 -0
- package/frontend/src/features/logs/services/log.service.ts +171 -0
- package/frontend/src/features/metadata/hooks/useMetadata.ts +53 -0
- package/frontend/src/features/metadata/index.ts +0 -0
- package/frontend/src/features/metadata/page/MetadataPage.tsx +136 -0
- package/frontend/src/features/metadata/services/metadata.service.ts +17 -0
- package/frontend/src/features/onboard/components/CompletionCard.tsx +41 -0
- package/frontend/src/features/onboard/components/OnboardButton.tsx +84 -0
- package/frontend/src/features/onboard/components/StepContent.tsx +91 -0
- package/frontend/src/features/onboard/components/TestConnectionStep.tsx +53 -0
- package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +35 -0
- package/frontend/src/features/onboard/components/mcp/McpInstallation.tsx +144 -0
- package/frontend/src/features/onboard/components/mcp/index.ts +4 -0
- package/frontend/src/features/onboard/components/mcp/mcp-helper.tsx +98 -0
- package/frontend/src/features/onboard/index.ts +3 -0
- package/frontend/src/features/onboard/page/OnBoardPage.tsx +104 -0
- package/frontend/src/features/onboard/types.ts +8 -0
- package/frontend/src/features/secrets/hooks/useSecrets.ts +139 -0
- package/frontend/src/features/secrets/services/secrets.service.ts +57 -0
- package/frontend/src/features/storage/components/BucketEmptyState.tsx +19 -0
- package/frontend/src/features/storage/components/BucketFormDialog.tsx +194 -0
- package/frontend/src/features/storage/components/BucketListSkeleton.tsx +17 -0
- package/frontend/src/features/storage/components/FilePreviewDialog.tsx +287 -0
- package/frontend/src/features/storage/components/StorageDataGrid.tsx +239 -0
- package/frontend/src/features/storage/components/StorageManager.tsx +236 -0
- package/frontend/src/features/storage/components/StorageSidebar.tsx +44 -0
- package/frontend/src/features/storage/components/UploadToast.tsx +46 -0
- package/frontend/src/features/storage/index.ts +3 -0
- package/frontend/src/features/storage/page/StoragePage.tsx +553 -0
- package/frontend/src/features/storage/services/storage.service.ts +144 -0
- package/frontend/src/features/visualizer/components/AuthNode.tsx +107 -0
- package/frontend/src/features/visualizer/components/BucketNode.tsx +34 -0
- package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +359 -0
- package/frontend/src/features/visualizer/components/TableNode.tsx +152 -0
- package/frontend/src/features/visualizer/components/VisualizerSkeleton.tsx +24 -0
- package/frontend/src/features/visualizer/components/index.ts +5 -0
- package/frontend/src/features/visualizer/page/VisualizerPage.tsx +127 -0
- package/frontend/src/index.css +248 -0
- package/frontend/src/lib/api/client.ts +163 -0
- package/frontend/src/lib/contexts/AuthContext.tsx +157 -0
- package/frontend/src/lib/contexts/OnboardStepContext.tsx +68 -0
- package/frontend/src/lib/contexts/SocketContext.tsx +303 -0
- package/frontend/src/lib/contexts/ThemeContext.tsx +125 -0
- package/frontend/src/lib/hooks/useAuth.ts +4 -0
- package/frontend/src/lib/hooks/useConfirm.ts +55 -0
- package/frontend/src/lib/hooks/useInterval.ts +27 -0
- package/frontend/src/lib/hooks/useMediaQuery.ts +59 -0
- package/frontend/src/lib/hooks/useOnboardingCompletion.ts +29 -0
- package/frontend/src/lib/hooks/usePagination.ts +27 -0
- package/frontend/src/lib/hooks/useTimeout.ts +27 -0
- package/frontend/src/lib/hooks/useToast.tsx +229 -0
- package/frontend/src/lib/utils/constants.ts +38 -0
- package/frontend/src/lib/utils/utils.ts +165 -0
- package/frontend/src/lib/utils/validation-schemas.ts +126 -0
- package/frontend/src/main.tsx +16 -0
- package/frontend/src/rdg.css +194 -0
- package/frontend/src/vite-env.d.ts +12 -0
- package/frontend/tailwind.config.js +97 -0
- package/frontend/tsconfig.json +26 -0
- package/frontend/tsconfig.node.json +10 -0
- package/frontend/vite.config.ts +37 -0
- package/frontend/vitest.config.ts +36 -0
- package/functions/deno.json +25 -0
- package/functions/server.ts +290 -0
- package/functions/worker-template.js +126 -0
- package/openapi/ai.yaml +689 -0
- package/openapi/auth.yaml +563 -0
- package/openapi/functions.yaml +476 -0
- package/openapi/health.yaml +30 -0
- package/openapi/logs.yaml +224 -0
- package/openapi/metadata.yaml +178 -0
- package/openapi/records.yaml +382 -0
- package/openapi/secrets.yaml +371 -0
- package/openapi/storage.yaml +876 -0
- package/openapi/tables.yaml +464 -0
- package/package.json +88 -0
- package/shared-schemas/package.json +31 -0
- package/shared-schemas/src/ai-api.schema.ts +167 -0
- package/shared-schemas/src/ai.schema.ts +54 -0
- package/shared-schemas/src/auth-api.schema.ts +193 -0
- package/shared-schemas/src/auth.schema.ts +94 -0
- package/shared-schemas/src/database-api.schema.ts +259 -0
- package/shared-schemas/src/database.schema.ts +69 -0
- package/shared-schemas/src/functions-api.schema.ts +25 -0
- package/shared-schemas/src/functions.schema.ts +16 -0
- package/shared-schemas/src/index.ts +13 -0
- package/shared-schemas/src/logs-api.schema.ts +49 -0
- package/shared-schemas/src/logs.schema.ts +14 -0
- package/shared-schemas/src/metadata.schema.ts +56 -0
- package/shared-schemas/src/storage-api.schema.ts +65 -0
- package/shared-schemas/src/storage.schema.ts +19 -0
- package/shared-schemas/tsconfig.json +21 -0
- package/tsconfig.json +8 -0
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# Test Traditional REST Response Format
|
|
4
|
+
# This script tests various API endpoints to ensure they follow traditional REST conventions
|
|
5
|
+
|
|
6
|
+
# Get the directory where this script is located
|
|
7
|
+
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
|
8
|
+
|
|
9
|
+
# Source the test configuration
|
|
10
|
+
source "$SCRIPT_DIR/../test-config.sh"
|
|
11
|
+
|
|
12
|
+
# Check requirements
|
|
13
|
+
check_requirements
|
|
14
|
+
|
|
15
|
+
print_blue "🧪 Testing Traditional REST Response Format..."
|
|
16
|
+
|
|
17
|
+
# API Configuration
|
|
18
|
+
API_BASE="$TEST_API_BASE"
|
|
19
|
+
TEST_USER_EMAIL="testuser_rest_$(date +%s)@example.com"
|
|
20
|
+
TEST_USER_PASSWORD="TestPass123!"
|
|
21
|
+
AUTH_TOKEN=""
|
|
22
|
+
|
|
23
|
+
# Function to test response format
|
|
24
|
+
test_response_format() {
|
|
25
|
+
local test_name="$1"
|
|
26
|
+
local response="$2"
|
|
27
|
+
local expected_pattern="$3"
|
|
28
|
+
local should_not_exist="${4:-false}"
|
|
29
|
+
|
|
30
|
+
if [ "$should_not_exist" == "true" ]; then
|
|
31
|
+
# Check that pattern does NOT exist
|
|
32
|
+
if ! echo "$response" | grep -q "$expected_pattern"; then
|
|
33
|
+
print_success "$test_name"
|
|
34
|
+
return 0
|
|
35
|
+
else
|
|
36
|
+
print_fail "$test_name - found unwanted pattern: $expected_pattern"
|
|
37
|
+
track_test_failure
|
|
38
|
+
return 1
|
|
39
|
+
fi
|
|
40
|
+
else
|
|
41
|
+
# Check that pattern exists
|
|
42
|
+
if echo "$response" | grep -q "$expected_pattern"; then
|
|
43
|
+
print_success "$test_name"
|
|
44
|
+
return 0
|
|
45
|
+
else
|
|
46
|
+
print_fail "$test_name - missing pattern: $expected_pattern"
|
|
47
|
+
echo " Response: $(echo "$response" | head -c 200)..."
|
|
48
|
+
track_test_failure
|
|
49
|
+
return 1
|
|
50
|
+
fi
|
|
51
|
+
fi
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
# 1. Test Health Endpoint
|
|
55
|
+
print_info "1. Testing Health Endpoint (Success Response)"
|
|
56
|
+
response=$(curl -s "$API_BASE/health")
|
|
57
|
+
test_response_format "Direct data response" "$response" '"status":"ok"'
|
|
58
|
+
test_response_format "No success wrapper" "$response" '"success":true' "true"
|
|
59
|
+
test_response_format "No data wrapper" "$response" '"data":{' "true"
|
|
60
|
+
|
|
61
|
+
# 2. Test Authentication Errors
|
|
62
|
+
print_info "2. Testing Authentication Errors"
|
|
63
|
+
response=$(curl -s "$API_BASE/auth/sessions/current")
|
|
64
|
+
test_response_format "Error format" "$response" '"error":"AUTH_INVALID_CREDENTIALS"'
|
|
65
|
+
test_response_format "Message field" "$response" '"message":"Invalid token"'
|
|
66
|
+
# JWT auth includes error and message fields
|
|
67
|
+
|
|
68
|
+
# 3. Test Login Endpoint (Missing Credentials)
|
|
69
|
+
print_info "3. Testing Login Endpoint (Missing Credentials)"
|
|
70
|
+
response=$(curl -s -X POST "$API_BASE/auth/sessions" \
|
|
71
|
+
-H "Content-Type: application/json" \
|
|
72
|
+
-d '{}')
|
|
73
|
+
test_response_format "Error response" "$response" '"error":"INVALID_INPUT"'
|
|
74
|
+
test_response_format "Message field" "$response" '"message":"email: Required, password: Required"'
|
|
75
|
+
|
|
76
|
+
# 4. Test Invalid Endpoint (404)
|
|
77
|
+
print_info "4. Testing Invalid Endpoint (404)"
|
|
78
|
+
response=$(curl -s "$API_BASE/nonexistent")
|
|
79
|
+
test_response_format "404 error" "$response" '"statusCode":404'
|
|
80
|
+
test_response_format "Not found message" "$response" '"error":"NOT_FOUND"'
|
|
81
|
+
|
|
82
|
+
ADMIN_TOKEN=$(get_admin_token)
|
|
83
|
+
|
|
84
|
+
# 5. Test with Authentication
|
|
85
|
+
print_info "5. Creating test user for authenticated tests"
|
|
86
|
+
auth_response=$(curl -s -X POST "$API_BASE/auth/users" \
|
|
87
|
+
-H "Content-Type: application/json" \
|
|
88
|
+
-d "{
|
|
89
|
+
\"email\": \"$TEST_USER_EMAIL\",
|
|
90
|
+
\"password\": \"$TEST_USER_PASSWORD\",
|
|
91
|
+
\"name\": \"Test User\"
|
|
92
|
+
}")
|
|
93
|
+
|
|
94
|
+
# Check if registration was successful
|
|
95
|
+
if echo "$auth_response" | grep -q '"accessToken"'; then
|
|
96
|
+
AUTH_TOKEN=$(echo "$auth_response" | grep -o '"accessToken":"[^"]*' | cut -d'"' -f4)
|
|
97
|
+
print_success "User registered successfully"
|
|
98
|
+
register_test_user "$TEST_USER_EMAIL"
|
|
99
|
+
|
|
100
|
+
# Test authenticated endpoints
|
|
101
|
+
print_info "6. Testing Database Tables List (Authenticated)"
|
|
102
|
+
response=$(curl -s "$API_BASE/database/tables" \
|
|
103
|
+
-H "Authorization: Bearer $AUTH_TOKEN")
|
|
104
|
+
test_response_format "Direct array response" "$response" '^\['
|
|
105
|
+
test_response_format "No wrapper object" "$response" '"data":\[' "true"
|
|
106
|
+
|
|
107
|
+
# Test table creation
|
|
108
|
+
print_info "7. Testing Create Table (Success Response)"
|
|
109
|
+
TABLE_NAME="test_rest_table_$(date +%s)"
|
|
110
|
+
response=$(curl -s -X POST "$API_BASE/database/tables" \
|
|
111
|
+
-H "Authorization: Bearer $ADMIN_TOKEN" \
|
|
112
|
+
-H "Content-Type: application/json" \
|
|
113
|
+
-d "{
|
|
114
|
+
\"tableName\": \"$TABLE_NAME\",
|
|
115
|
+
\"rlsEnabled\": false,
|
|
116
|
+
\"columns\": [
|
|
117
|
+
{\"columnName\": \"id\", \"type\": \"uuid\", \"isNullable\": false, \"isUnique\": false, \"defaultValue\": \"gen_random_uuid()\"},
|
|
118
|
+
{\"columnName\": \"title\", \"type\": \"string\", \"isNullable\": false, \"isUnique\": false}
|
|
119
|
+
]
|
|
120
|
+
}")
|
|
121
|
+
|
|
122
|
+
if echo "$response" | grep -q '"tableName"'; then
|
|
123
|
+
print_success "Table created"
|
|
124
|
+
register_test_table "$TABLE_NAME"
|
|
125
|
+
test_response_format "Direct object response" "$response" "\"tableName\":\"$TABLE_NAME\""
|
|
126
|
+
test_response_format "No success wrapper" "$response" '"success":true' "true"
|
|
127
|
+
else
|
|
128
|
+
print_fail "Table creation failed"
|
|
129
|
+
echo "Response: $response"
|
|
130
|
+
track_test_failure
|
|
131
|
+
fi
|
|
132
|
+
|
|
133
|
+
# Test pagination headers
|
|
134
|
+
print_info "8. Testing Pagination Headers"
|
|
135
|
+
# Use -I for headers, but we need both headers and body
|
|
136
|
+
full_response=$(curl -s -i "$API_BASE/logs/audits?limit=10" \
|
|
137
|
+
-H "Authorization: Bearer $ADMIN_TOKEN")
|
|
138
|
+
|
|
139
|
+
# Extract headers (everything before empty line)
|
|
140
|
+
headers=$(echo "$full_response" | awk 'BEGIN{RS="\r\n\r\n"} NR==1')
|
|
141
|
+
|
|
142
|
+
# Test for PostgREST-style Content-Range header (format: start-end/total)
|
|
143
|
+
test_response_format "Content-Range header" "$headers" 'Content-Range:'
|
|
144
|
+
test_response_format "Preference-Applied header" "$headers" 'Preference-Applied:'
|
|
145
|
+
|
|
146
|
+
else
|
|
147
|
+
print_fail "Failed to register user"
|
|
148
|
+
echo "Response: $auth_response"
|
|
149
|
+
track_test_failure
|
|
150
|
+
fi
|
|
151
|
+
|
|
152
|
+
# 9. Test Storage API (requires API key)
|
|
153
|
+
print_info "9. Testing Storage API Format"
|
|
154
|
+
# First get admin token if we don't have it
|
|
155
|
+
if [ -z "$AUTH_TOKEN" ]; then
|
|
156
|
+
admin_token=$(get_admin_token)
|
|
157
|
+
else
|
|
158
|
+
admin_token="$AUTH_TOKEN"
|
|
159
|
+
fi
|
|
160
|
+
|
|
161
|
+
# Try to get API key from the API endpoint first
|
|
162
|
+
if [ -n "$admin_token" ]; then
|
|
163
|
+
api_key_response=$(curl -s "$API_BASE/metadata/api-key" \
|
|
164
|
+
-H "Authorization: Bearer $admin_token")
|
|
165
|
+
API_KEY=$(echo "$api_key_response" | grep -o '"apiKey":"[^"]*' | cut -d'"' -f4)
|
|
166
|
+
fi
|
|
167
|
+
|
|
168
|
+
# If that fails, try the helper function
|
|
169
|
+
if [ -z "$API_KEY" ]; then
|
|
170
|
+
API_KEY=$(get_admin_api_key)
|
|
171
|
+
fi
|
|
172
|
+
|
|
173
|
+
# Export for cleanup
|
|
174
|
+
if [ -n "$API_KEY" ]; then
|
|
175
|
+
export ACCESS_API_KEY="$API_KEY"
|
|
176
|
+
# List buckets
|
|
177
|
+
response=$(curl -s "$API_BASE/storage/buckets" \
|
|
178
|
+
-H "Authorization: Bearer $API_KEY")
|
|
179
|
+
test_response_format "Direct array for buckets" "$response" '^\['
|
|
180
|
+
|
|
181
|
+
# Create a test bucket
|
|
182
|
+
BUCKET_NAME="test-rest-bucket-$(date +%s)"
|
|
183
|
+
response=$(curl -s -X POST "$API_BASE/storage/buckets" \
|
|
184
|
+
-H "Content-Type: application/json" \
|
|
185
|
+
-H "Authorization: Bearer $API_KEY" \
|
|
186
|
+
-d "{\"bucketName\": \"$BUCKET_NAME\", \"isPublic\": true}")
|
|
187
|
+
|
|
188
|
+
if echo "$response" | grep -q '"bucketName"'; then
|
|
189
|
+
print_success "Bucket created"
|
|
190
|
+
register_test_bucket "$BUCKET_NAME"
|
|
191
|
+
test_response_format "Success message field" "$response" '"message":"Bucket created successfully"'
|
|
192
|
+
test_response_format "NextAction guidance" "$response" '"nextActions":'
|
|
193
|
+
else
|
|
194
|
+
print_fail "Bucket creation failed"
|
|
195
|
+
echo "Response: $response"
|
|
196
|
+
track_test_failure
|
|
197
|
+
fi
|
|
198
|
+
else
|
|
199
|
+
print_info "Skipping storage tests (no API key available)"
|
|
200
|
+
fi
|
|
201
|
+
|
|
202
|
+
# Summary
|
|
203
|
+
echo ""
|
|
204
|
+
print_blue "=========================================="
|
|
205
|
+
print_blue "Traditional REST Format Test Complete"
|
|
206
|
+
print_blue "=========================================="
|
|
207
|
+
|
|
208
|
+
# Exit with proper status
|
|
209
|
+
exit_with_status
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Manual Tests
|
|
2
|
+
|
|
3
|
+
This directory contains tests that need to be run manually and are not included in the automated test suite.
|
|
4
|
+
|
|
5
|
+
## Better Auth Tests
|
|
6
|
+
|
|
7
|
+
These tests are for the Better Auth v2 implementation.
|
|
8
|
+
|
|
9
|
+
### Running Better Auth Tests
|
|
10
|
+
|
|
11
|
+
Run the Better Auth test:
|
|
12
|
+
```bash
|
|
13
|
+
./tests/manual/test-better-auth.sh
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
### Prerequisites
|
|
17
|
+
|
|
18
|
+
- Docker must be running with the InsForge backend on port 7130
|
|
19
|
+
- Admin credentials should be configured in environment variables:
|
|
20
|
+
- `ADMIN_EMAIL` (default: admin@example.com)
|
|
21
|
+
- `ADMIN_PASSWORD` (default: change-this-password)
|
|
22
|
+
|
|
23
|
+
### Example Commands
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
# Run from the backend directory
|
|
27
|
+
cd backend
|
|
28
|
+
|
|
29
|
+
# Run Better Auth test
|
|
30
|
+
./tests/manual/test-better-auth.sh
|
|
31
|
+
|
|
32
|
+
# Run with custom admin credentials
|
|
33
|
+
ADMIN_EMAIL=admin@mycompany.com ADMIN_PASSWORD=mysecurepass ./tests/manual/test-better-auth.sh
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Test Coverage
|
|
37
|
+
|
|
38
|
+
The test covers:
|
|
39
|
+
- Admin authentication (sign-in, wrong password, non-admin email)
|
|
40
|
+
- User registration and sign-in
|
|
41
|
+
- Admin user management (list users with pagination)
|
|
42
|
+
- JWT token verification (admin role and type claims)
|
|
43
|
+
- Authorization checks (admin-only endpoints)
|
|
44
|
+
- Error handling (invalid email format, missing fields)
|
|
45
|
+
|
|
46
|
+
### Why These Tests Are Manual
|
|
47
|
+
|
|
48
|
+
These tests are kept separate because:
|
|
49
|
+
1. They use authentication endpoints (`/api/auth/v2/*`) that require specific setup
|
|
50
|
+
2. They test admin-specific functionality that needs manual verification
|
|
51
|
+
3. They verify JWT token structure and claims that may vary between environments
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
-- Create large_table with basic structure
|
|
2
|
+
CREATE TABLE IF NOT EXISTS large_table (
|
|
3
|
+
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
|
|
4
|
+
user_id UUID NOT NULL,
|
|
5
|
+
title TEXT NOT NULL,
|
|
6
|
+
content TEXT,
|
|
7
|
+
status VARCHAR(50) DEFAULT 'active',
|
|
8
|
+
metadata JSONB DEFAULT '{}',
|
|
9
|
+
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
10
|
+
updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
|
|
11
|
+
);
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
-- Insert 1500 test records into large_table
|
|
2
|
+
-- Using generate_series for efficient bulk insertion
|
|
3
|
+
|
|
4
|
+
INSERT INTO large_table (user_id, title, content, status, metadata, created_at, updated_at)
|
|
5
|
+
SELECT
|
|
6
|
+
-- Generate random user_ids from a pool of 10 different users
|
|
7
|
+
(ARRAY[
|
|
8
|
+
'550e8400-e29b-41d4-a716-446655440001'::uuid,
|
|
9
|
+
'550e8400-e29b-41d4-a716-446655440002'::uuid,
|
|
10
|
+
'550e8400-e29b-41d4-a716-446655440003'::uuid,
|
|
11
|
+
'550e8400-e29b-41d4-a716-446655440004'::uuid,
|
|
12
|
+
'550e8400-e29b-41d4-a716-446655440005'::uuid,
|
|
13
|
+
'550e8400-e29b-41d4-a716-446655440006'::uuid,
|
|
14
|
+
'550e8400-e29b-41d4-a716-446655440007'::uuid,
|
|
15
|
+
'550e8400-e29b-41d4-a716-446655440008'::uuid,
|
|
16
|
+
'550e8400-e29b-41d4-a716-446655440009'::uuid,
|
|
17
|
+
'550e8400-e29b-41d4-a716-446655440010'::uuid
|
|
18
|
+
])[1 + floor(random() * 10)::int] as user_id,
|
|
19
|
+
|
|
20
|
+
-- Generate title
|
|
21
|
+
'Test Record #' || i || ' - ' || (ARRAY['Important', 'Regular', 'Draft', 'Published', 'Archived'])[1 + floor(random() * 5)::int] as title,
|
|
22
|
+
|
|
23
|
+
-- Generate content with varying lengths
|
|
24
|
+
'This is the content for record ' || i || '. ' ||
|
|
25
|
+
repeat('Lorem ipsum dolor sit amet, consectetur adipiscing elit. ', 1 + floor(random() * 10)::int) ||
|
|
26
|
+
'End of content.' as content,
|
|
27
|
+
|
|
28
|
+
-- Random status
|
|
29
|
+
(ARRAY['active', 'inactive', 'pending', 'completed', 'archived'])[1 + floor(random() * 5)::int] as status,
|
|
30
|
+
|
|
31
|
+
-- Generate random metadata
|
|
32
|
+
jsonb_build_object(
|
|
33
|
+
'record_number', i,
|
|
34
|
+
'category', (ARRAY['technology', 'business', 'personal', 'research', 'other'])[1 + floor(random() * 5)::int],
|
|
35
|
+
'priority', floor(random() * 10 + 1)::int,
|
|
36
|
+
'tags', (ARRAY['["tag1"]', '["tag1", "tag2"]', '["tag1", "tag2", "tag3"]', '["important"]', '[]'])[1 + floor(random() * 5)::int]::jsonb,
|
|
37
|
+
'is_featured', (random() > 0.5),
|
|
38
|
+
'view_count', floor(random() * 1000)::int,
|
|
39
|
+
'test_data', true
|
|
40
|
+
) as metadata,
|
|
41
|
+
|
|
42
|
+
-- Generate created_at timestamps spread over the last 90 days
|
|
43
|
+
CURRENT_TIMESTAMP - (interval '1 hour' * floor(random() * 2160)) as created_at,
|
|
44
|
+
|
|
45
|
+
-- Updated_at should be equal or after created_at
|
|
46
|
+
CURRENT_TIMESTAMP - (interval '1 hour' * floor(random() * 720)) as updated_at
|
|
47
|
+
FROM generate_series(1, 1500) AS i;
|
|
48
|
+
|
|
49
|
+
-- Add some additional records with specific patterns for testing
|
|
50
|
+
-- Records with null content
|
|
51
|
+
INSERT INTO large_table (user_id, title, content, status, metadata)
|
|
52
|
+
VALUES
|
|
53
|
+
('550e8400-e29b-41d4-a716-446655440001'::uuid, 'Record with null content #1', NULL, 'active', '{"special": "null_content"}'),
|
|
54
|
+
('550e8400-e29b-41d4-a716-446655440002'::uuid, 'Record with null content #2', NULL, 'inactive', '{"special": "null_content"}'),
|
|
55
|
+
('550e8400-e29b-41d4-a716-446655440003'::uuid, 'Record with null content #3', NULL, 'pending', '{"special": "null_content"}');
|
|
56
|
+
|
|
57
|
+
-- Records with very long content
|
|
58
|
+
INSERT INTO large_table (user_id, title, content, status, metadata)
|
|
59
|
+
VALUES
|
|
60
|
+
('550e8400-e29b-41d4-a716-446655440004'::uuid,
|
|
61
|
+
'Record with very long content',
|
|
62
|
+
repeat('This is a very long text. ', 500),
|
|
63
|
+
'active',
|
|
64
|
+
'{"special": "long_content"}');
|
|
65
|
+
|
|
66
|
+
-- Records with special characters
|
|
67
|
+
INSERT INTO large_table (user_id, title, content, status, metadata)
|
|
68
|
+
VALUES
|
|
69
|
+
('550e8400-e29b-41d4-a716-446655440005'::uuid,
|
|
70
|
+
'Record with special chars: ñ, é, ü, 中文, 🎉',
|
|
71
|
+
'Content with special characters: "quoted", ''single quotes'', backslash \, tab character, newline
|
|
72
|
+
character',
|
|
73
|
+
'active',
|
|
74
|
+
'{"special": "special_chars", "unicode": "测试"}');
|
|
75
|
+
|
|
76
|
+
-- Records with complex JSON metadata
|
|
77
|
+
INSERT INTO large_table (user_id, title, content, status, metadata)
|
|
78
|
+
VALUES
|
|
79
|
+
('550e8400-e29b-41d4-a716-446655440006'::uuid,
|
|
80
|
+
'Record with complex metadata',
|
|
81
|
+
'This record has complex nested JSON metadata',
|
|
82
|
+
'active',
|
|
83
|
+
'{
|
|
84
|
+
"nested": {
|
|
85
|
+
"level1": {
|
|
86
|
+
"level2": {
|
|
87
|
+
"level3": "deep value"
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
"array": [1, 2, 3, 4, 5],
|
|
92
|
+
"mixed": {
|
|
93
|
+
"string": "text",
|
|
94
|
+
"number": 123.45,
|
|
95
|
+
"boolean": true,
|
|
96
|
+
"null_value": null
|
|
97
|
+
}
|
|
98
|
+
}');
|
|
99
|
+
|
|
100
|
+
-- Summary comment
|
|
101
|
+
-- Total records inserted: 1506 (1500 from generate_series + 6 special test cases)
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
-- Add indexes
|
|
2
|
+
CREATE INDEX IF NOT EXISTS idx_large_table_user_id ON large_table(user_id);
|
|
3
|
+
CREATE INDEX IF NOT EXISTS idx_large_table_created_at ON large_table(created_at);
|
|
4
|
+
CREATE INDEX IF NOT EXISTS idx_large_table_status ON large_table(status);
|
|
5
|
+
|
|
6
|
+
-- Create trigger function for updating updated_at timestamp
|
|
7
|
+
CREATE OR REPLACE FUNCTION update_updated_at_column()
|
|
8
|
+
RETURNS TRIGGER AS $$
|
|
9
|
+
BEGIN
|
|
10
|
+
NEW.updated_at = CURRENT_TIMESTAMP;
|
|
11
|
+
RETURN NEW;
|
|
12
|
+
END;
|
|
13
|
+
$$ LANGUAGE plpgsql;
|
|
14
|
+
|
|
15
|
+
-- Create trigger to automatically update updated_at
|
|
16
|
+
DROP TRIGGER IF EXISTS update_large_table_updated_at ON large_table;
|
|
17
|
+
CREATE TRIGGER update_large_table_updated_at
|
|
18
|
+
BEFORE UPDATE ON large_table
|
|
19
|
+
FOR EACH ROW
|
|
20
|
+
EXECUTE FUNCTION update_updated_at_column();
|
|
21
|
+
|
|
22
|
+
-- Enable Row Level Security
|
|
23
|
+
ALTER TABLE large_table ENABLE ROW LEVEL SECURITY;
|
|
24
|
+
|
|
25
|
+
-- Create RLS policies
|
|
26
|
+
DROP POLICY IF EXISTS "Enable read access for all users" ON large_table;
|
|
27
|
+
CREATE POLICY "Enable read access for all users"
|
|
28
|
+
ON large_table
|
|
29
|
+
FOR SELECT
|
|
30
|
+
USING (true);
|
|
31
|
+
|
|
32
|
+
-- Grant permissions
|
|
33
|
+
GRANT ALL ON large_table TO anon;
|
|
34
|
+
GRANT ALL ON large_table TO authenticated;
|