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,134 @@
|
|
|
1
|
+
# Insforge Backend Tests
|
|
2
|
+
|
|
3
|
+
This directory contains all test scripts for the Insforge backend.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
- Backend server running on `http://localhost:7130`
|
|
8
|
+
- Admin credentials: `admin@example.com` / `change-this-password`
|
|
9
|
+
- API key for storage operations
|
|
10
|
+
|
|
11
|
+
## Environment Variables
|
|
12
|
+
|
|
13
|
+
Set these before running tests:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# Required for API authentication
|
|
17
|
+
export ACCESS_API_KEY="your_api_key_here"
|
|
18
|
+
|
|
19
|
+
# Optional - defaults shown
|
|
20
|
+
export ADMIN_EMAIL="admin@example.com"
|
|
21
|
+
export ADMIN_PASSWORD="change-this-password"
|
|
22
|
+
export TEST_API_BASE="http://localhost:7130/api"
|
|
23
|
+
|
|
24
|
+
# Required for cloud/S3 tests
|
|
25
|
+
export AWS_S3_BUCKET="your-s3-bucket"
|
|
26
|
+
export AWS_REGION="us-east-1"
|
|
27
|
+
export AWS_ACCESS_KEY_ID="your-access-key"
|
|
28
|
+
export AWS_SECRET_ACCESS_KEY="your-secret-key"
|
|
29
|
+
export APP_KEY="app12345" # 7-9 character tenant identifier
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Test Organization
|
|
33
|
+
|
|
34
|
+
Tests are organized into two categories:
|
|
35
|
+
|
|
36
|
+
### Local Tests (`./local/`)
|
|
37
|
+
Tests for local Docker deployment with local file storage:
|
|
38
|
+
- `test-auth-router.sh` - Authentication and JWT tests
|
|
39
|
+
- `test-database-router.sh` - Database CRUD operations
|
|
40
|
+
- `test-e2e.sh` - End-to-end workflows
|
|
41
|
+
- `test-public-bucket.sh` - Local storage bucket tests
|
|
42
|
+
- `test-config.sh` - Configuration management
|
|
43
|
+
- `test-oauth-config.sh` - OAuth configuration
|
|
44
|
+
- `comprehensive-curl-tests.sh` - Comprehensive API tests
|
|
45
|
+
|
|
46
|
+
### Cloud Tests (`./cloud/`)
|
|
47
|
+
Tests for cloud deployment with S3 multi-tenant storage:
|
|
48
|
+
- `test-s3-multitenant.sh` - S3 storage with APP_KEY folder structure
|
|
49
|
+
|
|
50
|
+
## Running Tests
|
|
51
|
+
|
|
52
|
+
### Run all tests
|
|
53
|
+
```bash
|
|
54
|
+
./run-all-tests.sh
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Run local tests only
|
|
58
|
+
```bash
|
|
59
|
+
cd local && for test in test-*.sh; do ./$test; done
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Run cloud tests only
|
|
63
|
+
```bash
|
|
64
|
+
cd cloud && for test in test-*.sh; do ./$test; done
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Run individual test
|
|
68
|
+
```bash
|
|
69
|
+
./local/test-auth-router.sh
|
|
70
|
+
./cloud/test-s3-multitenant.sh
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Test Data Cleanup
|
|
74
|
+
|
|
75
|
+
All tests automatically clean up after themselves by:
|
|
76
|
+
- Deleting test users (email prefix: `testuser_`)
|
|
77
|
+
- Removing test tables
|
|
78
|
+
- Deleting test storage buckets
|
|
79
|
+
|
|
80
|
+
### Manual cleanup
|
|
81
|
+
|
|
82
|
+
To remove ALL test data from the system:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
./cleanup-all-test-data.sh
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
This will prompt for confirmation and then delete:
|
|
89
|
+
- All users with email prefix `testuser_`
|
|
90
|
+
- All tables containing `test_`, `temp_`, `_test`, `_temp`
|
|
91
|
+
- All buckets containing `test`, `temp`, `public-images-`, `private-docs-`
|
|
92
|
+
- All API keys with "test" in their name
|
|
93
|
+
|
|
94
|
+
## Test Configuration
|
|
95
|
+
|
|
96
|
+
All tests source `test-config.sh` which provides:
|
|
97
|
+
- Shared configuration and environment variables
|
|
98
|
+
- Color output utilities
|
|
99
|
+
- Automatic cleanup functions
|
|
100
|
+
- Error tracking
|
|
101
|
+
|
|
102
|
+
## Writing New Tests
|
|
103
|
+
|
|
104
|
+
1. Create a new shell script in the appropriate subdirectory (`local/` or `cloud/`)
|
|
105
|
+
2. Source the test configuration:
|
|
106
|
+
```bash
|
|
107
|
+
source "$SCRIPT_DIR/test-config.sh"
|
|
108
|
+
```
|
|
109
|
+
3. Register resources for cleanup:
|
|
110
|
+
```bash
|
|
111
|
+
register_test_user "$email"
|
|
112
|
+
register_test_table "$table_name"
|
|
113
|
+
register_test_bucket "$bucket_name"
|
|
114
|
+
```
|
|
115
|
+
4. Use utility functions:
|
|
116
|
+
```bash
|
|
117
|
+
print_success "Test passed"
|
|
118
|
+
print_fail "Test failed"
|
|
119
|
+
print_info "Running test..."
|
|
120
|
+
```
|
|
121
|
+
5. Tests will automatically clean up on exit
|
|
122
|
+
|
|
123
|
+
## Authentication
|
|
124
|
+
|
|
125
|
+
- **Auth endpoints** (users, profiles): Use JWT tokens via `Authorization: Bearer $token`
|
|
126
|
+
- **Database endpoints**: Use JWT tokens via `Authorization: Bearer $token`
|
|
127
|
+
- **Storage endpoints**: Use API keys via `x-api-key: $api_key`
|
|
128
|
+
|
|
129
|
+
## Exit Codes
|
|
130
|
+
|
|
131
|
+
- `0`: All tests passed
|
|
132
|
+
- `1`: One or more tests failed
|
|
133
|
+
|
|
134
|
+
Tests track failures and return appropriate exit codes for CI/CD integration.
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# Comprehensive cleanup script for all test data
|
|
4
|
+
# This script removes ALL test data from the system including:
|
|
5
|
+
# - Test users (with email prefix "testuser_")
|
|
6
|
+
# - Test tables
|
|
7
|
+
# - Test buckets
|
|
8
|
+
# - Test API keys
|
|
9
|
+
|
|
10
|
+
# Get the directory where this script is located
|
|
11
|
+
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
|
12
|
+
|
|
13
|
+
# Source the test configuration for utilities
|
|
14
|
+
source "$SCRIPT_DIR/test-config.sh"
|
|
15
|
+
|
|
16
|
+
echo "=================================================="
|
|
17
|
+
echo "๐งน COMPREHENSIVE TEST DATA CLEANUP"
|
|
18
|
+
echo "=================================================="
|
|
19
|
+
echo ""
|
|
20
|
+
echo "โ ๏ธ WARNING: This will delete ALL test data!"
|
|
21
|
+
echo " - All users with email prefix: ${TEST_USER_EMAIL_PREFIX}"
|
|
22
|
+
echo " - All tables with test prefixes"
|
|
23
|
+
echo " - All test buckets"
|
|
24
|
+
echo ""
|
|
25
|
+
read -p "Are you sure you want to continue? (yes/no): " -n 3 -r
|
|
26
|
+
echo ""
|
|
27
|
+
|
|
28
|
+
if [[ ! $REPLY =~ ^[Yy][Ee][Ss]$ ]]; then
|
|
29
|
+
echo "Cleanup cancelled."
|
|
30
|
+
exit 0
|
|
31
|
+
fi
|
|
32
|
+
|
|
33
|
+
# Get admin credentials
|
|
34
|
+
admin_token=$(get_admin_token)
|
|
35
|
+
if [ -z "$admin_token" ]; then
|
|
36
|
+
print_fail "Could not authenticate as admin. Please check admin credentials."
|
|
37
|
+
exit 1
|
|
38
|
+
fi
|
|
39
|
+
|
|
40
|
+
print_success "Admin authentication successful"
|
|
41
|
+
|
|
42
|
+
# Get API key for storage operations
|
|
43
|
+
api_key=$(get_admin_api_key)
|
|
44
|
+
if [ -z "$api_key" ]; then
|
|
45
|
+
print_info "No API key available for storage operations"
|
|
46
|
+
fi
|
|
47
|
+
|
|
48
|
+
# 1. Clean up test users
|
|
49
|
+
print_info "๐ง Searching for test users..."
|
|
50
|
+
users_response=$(curl -s -X GET "$TEST_API_BASE/auth/users?limit=100" \
|
|
51
|
+
-H "Authorization: Bearer $admin_token" \
|
|
52
|
+
-H "Content-Type: application/json")
|
|
53
|
+
|
|
54
|
+
if echo "$users_response" | grep -q '\['; then
|
|
55
|
+
# Find all test users
|
|
56
|
+
test_user_ids=()
|
|
57
|
+
test_user_emails=()
|
|
58
|
+
|
|
59
|
+
# Parse users and find test users
|
|
60
|
+
while IFS= read -r line; do
|
|
61
|
+
if [[ $line =~ \"email\":\"($TEST_USER_EMAIL_PREFIX[^\"]+)\" ]]; then
|
|
62
|
+
email="${BASH_REMATCH[1]}"
|
|
63
|
+
# Get the ID for this user
|
|
64
|
+
id_line=$(echo "$users_response" | grep -B5 "\"email\":\"$email\"" | grep '"id"' | head -1)
|
|
65
|
+
if [[ $id_line =~ \"id\":\"([^\"]+)\" ]]; then
|
|
66
|
+
id="${BASH_REMATCH[1]}"
|
|
67
|
+
test_user_ids+=("$id")
|
|
68
|
+
test_user_emails+=("$email")
|
|
69
|
+
print_info " Found test user: $email (ID: $id)"
|
|
70
|
+
fi
|
|
71
|
+
fi
|
|
72
|
+
done <<< "$users_response"
|
|
73
|
+
|
|
74
|
+
if [ ${#test_user_ids[@]} -gt 0 ]; then
|
|
75
|
+
print_info "Found ${#test_user_ids[@]} test users to delete"
|
|
76
|
+
|
|
77
|
+
# Bulk delete test users
|
|
78
|
+
delete_response=$(curl -s -X DELETE "$TEST_API_BASE/auth/users/bulk-delete" \
|
|
79
|
+
-H "Authorization: Bearer $admin_token" \
|
|
80
|
+
-H "Content-Type: application/json" \
|
|
81
|
+
-d "{\"userIds\": [$(printf '"%s",' "${test_user_ids[@]}" | sed 's/,$//' )]}")
|
|
82
|
+
|
|
83
|
+
if ! echo "$delete_response" | grep -q '"error"'; then
|
|
84
|
+
print_success "โ
Deleted ${#test_user_ids[@]} test users"
|
|
85
|
+
else
|
|
86
|
+
print_fail "Failed to delete test users"
|
|
87
|
+
echo "Response: $delete_response"
|
|
88
|
+
fi
|
|
89
|
+
else
|
|
90
|
+
print_info "No test users found"
|
|
91
|
+
fi
|
|
92
|
+
else
|
|
93
|
+
print_fail "Could not list users"
|
|
94
|
+
fi
|
|
95
|
+
|
|
96
|
+
# 2. Clean up test tables
|
|
97
|
+
print_info "๐ Searching for test tables..."
|
|
98
|
+
tables_response=$(curl -s -X GET "$TEST_API_BASE/database/tables" \
|
|
99
|
+
-H "Authorization: Bearer $admin_token" \
|
|
100
|
+
-H "Content-Type: application/json")
|
|
101
|
+
|
|
102
|
+
if echo "$tables_response" | grep -q '\['; then
|
|
103
|
+
# Find test tables (common patterns)
|
|
104
|
+
test_tables=()
|
|
105
|
+
test_patterns=("test_" "temp_" "_test" "_temp")
|
|
106
|
+
|
|
107
|
+
while IFS= read -r line; do
|
|
108
|
+
if [[ $line =~ \"table_name\":\"([^\"]+)\" ]]; then
|
|
109
|
+
table="${BASH_REMATCH[1]}"
|
|
110
|
+
# Check if table matches any test pattern
|
|
111
|
+
for pattern in "${test_patterns[@]}"; do
|
|
112
|
+
if [[ $table == *"$pattern"* ]]; then
|
|
113
|
+
test_tables+=("$table")
|
|
114
|
+
print_info " Found test table: $table"
|
|
115
|
+
break
|
|
116
|
+
fi
|
|
117
|
+
done
|
|
118
|
+
fi
|
|
119
|
+
done <<< "$tables_response"
|
|
120
|
+
|
|
121
|
+
if [ ${#test_tables[@]} -gt 0 ]; then
|
|
122
|
+
print_info "Found ${#test_tables[@]} test tables to delete"
|
|
123
|
+
|
|
124
|
+
for table in "${test_tables[@]}"; do
|
|
125
|
+
print_info " Deleting table: $table"
|
|
126
|
+
curl -s -X DELETE "$TEST_API_BASE/database/tables/$table" \
|
|
127
|
+
-H "Authorization: Bearer $admin_token" \
|
|
128
|
+
-H "Content-Type: application/json" > /dev/null 2>&1
|
|
129
|
+
done
|
|
130
|
+
|
|
131
|
+
print_success "โ
Deleted ${#test_tables[@]} test tables"
|
|
132
|
+
else
|
|
133
|
+
print_info "No test tables found"
|
|
134
|
+
fi
|
|
135
|
+
else
|
|
136
|
+
print_fail "Could not list tables"
|
|
137
|
+
fi
|
|
138
|
+
|
|
139
|
+
# 3. Clean up test buckets
|
|
140
|
+
if [ -n "$api_key" ]; then
|
|
141
|
+
print_info "๐ชฃ Searching for test buckets..."
|
|
142
|
+
buckets_response=$(curl -s -X GET "$TEST_API_BASE/storage/buckets" \
|
|
143
|
+
-H "x-api-key: $api_key" \
|
|
144
|
+
-H "Content-Type: application/json")
|
|
145
|
+
|
|
146
|
+
if echo "$buckets_response" | grep -q '\['; then
|
|
147
|
+
# Find test buckets
|
|
148
|
+
test_buckets=()
|
|
149
|
+
bucket_patterns=("test" "temp" "public-images-" "private-docs-")
|
|
150
|
+
|
|
151
|
+
while IFS= read -r line; do
|
|
152
|
+
if [[ $line =~ \"name\":\"([^\"]+)\" ]]; then
|
|
153
|
+
bucket="${BASH_REMATCH[1]}"
|
|
154
|
+
# Check if bucket matches any test pattern
|
|
155
|
+
for pattern in "${bucket_patterns[@]}"; do
|
|
156
|
+
if [[ $bucket == *"$pattern"* ]]; then
|
|
157
|
+
test_buckets+=("$bucket")
|
|
158
|
+
print_info " Found test bucket: $bucket"
|
|
159
|
+
break
|
|
160
|
+
fi
|
|
161
|
+
done
|
|
162
|
+
fi
|
|
163
|
+
done <<< "$buckets_response"
|
|
164
|
+
|
|
165
|
+
if [ ${#test_buckets[@]} -gt 0 ]; then
|
|
166
|
+
print_info "Found ${#test_buckets[@]} test buckets to delete"
|
|
167
|
+
|
|
168
|
+
for bucket in "${test_buckets[@]}"; do
|
|
169
|
+
print_info " Deleting bucket: $bucket"
|
|
170
|
+
delete_response=$(curl -s -w "\n%{http_code}" -X DELETE "$TEST_API_BASE/storage/$bucket" \
|
|
171
|
+
-H "x-api-key: $api_key")
|
|
172
|
+
status=$(echo "$delete_response" | tail -n 1)
|
|
173
|
+
if [ "$status" -ge 200 ] && [ "$status" -lt 300 ]; then
|
|
174
|
+
echo " โ Deleted"
|
|
175
|
+
else
|
|
176
|
+
echo " โ Failed (status: $status)"
|
|
177
|
+
fi
|
|
178
|
+
done
|
|
179
|
+
|
|
180
|
+
print_success "โ
Deleted ${#test_buckets[@]} test buckets"
|
|
181
|
+
else
|
|
182
|
+
print_info "No test buckets found"
|
|
183
|
+
fi
|
|
184
|
+
else
|
|
185
|
+
print_fail "Could not list buckets"
|
|
186
|
+
fi
|
|
187
|
+
else
|
|
188
|
+
print_info "Skipping bucket cleanup (no API key available)"
|
|
189
|
+
fi
|
|
190
|
+
|
|
191
|
+
# 4. Clean up test API keys
|
|
192
|
+
print_info "๐ Searching for test API keys..."
|
|
193
|
+
api_keys_response=$(curl -s -X GET "$TEST_API_BASE/auth/api-keys" \
|
|
194
|
+
-H "Authorization: Bearer $admin_token" \
|
|
195
|
+
-H "Content-Type: application/json")
|
|
196
|
+
|
|
197
|
+
if echo "$api_keys_response" | grep -q '\['; then
|
|
198
|
+
# Find test API keys
|
|
199
|
+
test_key_ids=()
|
|
200
|
+
|
|
201
|
+
while IFS= read -r line; do
|
|
202
|
+
if [[ $line =~ \"name\":\"([^\"]*[Tt]est[^\"]*)\".+\"id\":\"([^\"]+)\" ]]; then
|
|
203
|
+
name="${BASH_REMATCH[1]}"
|
|
204
|
+
id="${BASH_REMATCH[2]}"
|
|
205
|
+
test_key_ids+=("$id")
|
|
206
|
+
print_info " Found test API key: $name (ID: $id)"
|
|
207
|
+
fi
|
|
208
|
+
done <<< "$api_keys_response"
|
|
209
|
+
|
|
210
|
+
if [ ${#test_key_ids[@]} -gt 0 ]; then
|
|
211
|
+
print_info "Found ${#test_key_ids[@]} test API keys to delete"
|
|
212
|
+
|
|
213
|
+
for key_id in "${test_key_ids[@]}"; do
|
|
214
|
+
print_info " Deleting API key: $key_id"
|
|
215
|
+
curl -s -X DELETE "$TEST_API_BASE/auth/api-keys/$key_id" \
|
|
216
|
+
-H "Authorization: Bearer $admin_token" \
|
|
217
|
+
-H "Content-Type: application/json" > /dev/null 2>&1
|
|
218
|
+
done
|
|
219
|
+
|
|
220
|
+
print_success "โ
Deleted ${#test_key_ids[@]} test API keys"
|
|
221
|
+
else
|
|
222
|
+
print_info "No test API keys found"
|
|
223
|
+
fi
|
|
224
|
+
else
|
|
225
|
+
print_fail "Could not list API keys"
|
|
226
|
+
fi
|
|
227
|
+
|
|
228
|
+
echo ""
|
|
229
|
+
echo "=================================================="
|
|
230
|
+
print_success "๐ Cleanup completed!"
|
|
231
|
+
echo "=================================================="
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# Test script for multi-tenant S3 storage
|
|
4
|
+
# This script tests the storage API with S3 backend and app key folder structure
|
|
5
|
+
|
|
6
|
+
# Get the directory where this script is located
|
|
7
|
+
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
|
8
|
+
PROJECT_ROOT="$(dirname "$(dirname "$SCRIPT_DIR")")"
|
|
9
|
+
|
|
10
|
+
# Load .env file if AWS variables not already set
|
|
11
|
+
if [ -z "$AWS_S3_BUCKET" ] && [ -f "$PROJECT_ROOT/.env" ]; then
|
|
12
|
+
echo "Loading environment from .env file..."
|
|
13
|
+
set -a # automatically export all variables
|
|
14
|
+
source "$PROJECT_ROOT/.env"
|
|
15
|
+
set +a # turn off automatic export
|
|
16
|
+
fi
|
|
17
|
+
|
|
18
|
+
# Source test configuration
|
|
19
|
+
source "$SCRIPT_DIR/../test-config.sh"
|
|
20
|
+
|
|
21
|
+
API_KEY="${ACCESS_API_KEY:-}"
|
|
22
|
+
# Use TEST_API_BASE if set, otherwise default to localhost
|
|
23
|
+
if [ -n "$TEST_API_BASE" ]; then
|
|
24
|
+
# TEST_API_BASE already includes /api
|
|
25
|
+
BASE_URL="$TEST_API_BASE"
|
|
26
|
+
else
|
|
27
|
+
BASE_URL="http://localhost:7130/api"
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
echo "=== Testing Multi-tenant S3 Storage ==="
|
|
31
|
+
echo "Note: Ensure AWS_S3_BUCKET and APP_KEY are set in your .env file"
|
|
32
|
+
echo "Base URL: $BASE_URL"
|
|
33
|
+
echo "API Key: ${API_KEY:0:10}..." # Show first 10 chars only
|
|
34
|
+
echo "AWS Bucket: ${AWS_S3_BUCKET:-not set}"
|
|
35
|
+
echo "App Key: ${APP_KEY:-not set}"
|
|
36
|
+
echo ""
|
|
37
|
+
|
|
38
|
+
# Create a test bucket
|
|
39
|
+
echo "1. Creating test bucket..."
|
|
40
|
+
curl -X POST "$BASE_URL/storage/buckets" \
|
|
41
|
+
-H "Content-Type: application/json" \
|
|
42
|
+
-H "x-api-key: $API_KEY" \
|
|
43
|
+
-d '{"bucketName": "test-bucket", "isPublic": true}' | jq .
|
|
44
|
+
|
|
45
|
+
echo ""
|
|
46
|
+
|
|
47
|
+
# List buckets
|
|
48
|
+
echo "2. Listing buckets..."
|
|
49
|
+
curl "$BASE_URL/storage/buckets" \
|
|
50
|
+
-H "x-api-key: $API_KEY" | jq .
|
|
51
|
+
|
|
52
|
+
echo ""
|
|
53
|
+
|
|
54
|
+
# Upload a file with specific key
|
|
55
|
+
echo "3. Uploading file with specific key..."
|
|
56
|
+
echo "Test content for S3" > test-file.txt
|
|
57
|
+
curl -X PUT "$BASE_URL/storage/test-bucket/test-file.txt" \
|
|
58
|
+
-H "x-api-key: $API_KEY" \
|
|
59
|
+
-F "file=@test-file.txt" | jq .
|
|
60
|
+
|
|
61
|
+
echo ""
|
|
62
|
+
|
|
63
|
+
# Upload a file with auto-generated key
|
|
64
|
+
echo "4. Uploading file with auto-generated key..."
|
|
65
|
+
curl -X POST "$BASE_URL/storage/test-bucket" \
|
|
66
|
+
-H "x-api-key: $API_KEY" \
|
|
67
|
+
-F "file=@test-file.txt" | jq .
|
|
68
|
+
|
|
69
|
+
echo ""
|
|
70
|
+
|
|
71
|
+
# List objects in bucket
|
|
72
|
+
echo "5. Listing objects in bucket..."
|
|
73
|
+
curl "$BASE_URL/storage/test-bucket" \
|
|
74
|
+
-H "x-api-key: $API_KEY" | jq .
|
|
75
|
+
|
|
76
|
+
echo ""
|
|
77
|
+
|
|
78
|
+
# Download a file (public bucket, no auth needed)
|
|
79
|
+
echo "6. Downloading file from public bucket..."
|
|
80
|
+
curl "$BASE_URL/storage/test-bucket/test-file.txt" \
|
|
81
|
+
-o downloaded-file.txt
|
|
82
|
+
echo "Downloaded content:"
|
|
83
|
+
cat downloaded-file.txt
|
|
84
|
+
echo ""
|
|
85
|
+
|
|
86
|
+
# Update bucket visibility to private
|
|
87
|
+
echo "7. Making bucket private..."
|
|
88
|
+
curl -X PATCH "$BASE_URL/storage/buckets/test-bucket" \
|
|
89
|
+
-H "Content-Type: application/json" \
|
|
90
|
+
-H "x-api-key: $API_KEY" \
|
|
91
|
+
-d '{"isPublic": false}' | jq .
|
|
92
|
+
|
|
93
|
+
echo ""
|
|
94
|
+
|
|
95
|
+
# Try downloading from private bucket without auth (should fail)
|
|
96
|
+
echo "8. Trying to download from private bucket without auth (should fail)..."
|
|
97
|
+
curl -v "$BASE_URL/api/storage/test-bucket/test-file.txt" 2>&1 | grep "< HTTP"
|
|
98
|
+
|
|
99
|
+
echo ""
|
|
100
|
+
|
|
101
|
+
# Download from private bucket with auth
|
|
102
|
+
echo "9. Downloading from private bucket with auth..."
|
|
103
|
+
curl "$BASE_URL/storage/test-bucket/test-file.txt" \
|
|
104
|
+
-H "x-api-key: $API_KEY" \
|
|
105
|
+
-o downloaded-private.txt
|
|
106
|
+
echo "Downloaded content:"
|
|
107
|
+
cat downloaded-private.txt
|
|
108
|
+
echo ""
|
|
109
|
+
|
|
110
|
+
# Delete a file
|
|
111
|
+
echo "10. Deleting a file..."
|
|
112
|
+
curl -X DELETE "$BASE_URL/storage/test-bucket/test-file.txt" \
|
|
113
|
+
-H "x-api-key: $API_KEY" | jq .
|
|
114
|
+
|
|
115
|
+
echo ""
|
|
116
|
+
|
|
117
|
+
# Delete the bucket
|
|
118
|
+
echo "11. Deleting the bucket..."
|
|
119
|
+
curl -X DELETE "$BASE_URL/storage/test-bucket" \
|
|
120
|
+
-H "x-api-key: $API_KEY" | jq .
|
|
121
|
+
|
|
122
|
+
echo ""
|
|
123
|
+
|
|
124
|
+
# Clean up
|
|
125
|
+
rm -f test-file.txt downloaded-file.txt downloaded-private.txt
|
|
126
|
+
|
|
127
|
+
echo "=== S3 Multi-tenant Storage Test Complete ==="
|
|
128
|
+
echo ""
|
|
129
|
+
echo "When AWS_S3_BUCKET is set, files are stored in S3 with structure:"
|
|
130
|
+
echo " s3://\${AWS_S3_BUCKET}/\${APP_KEY}/\${bucket}/\${key}"
|
|
131
|
+
echo ""
|
|
132
|
+
echo "Example: s3://my-bucket/app12345/test-bucket/test-file.txt"
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# Comprehensive curl tests for Traditional REST format
|
|
4
|
+
# Tests all major endpoints to verify response formats
|
|
5
|
+
|
|
6
|
+
BASE_URL="http://localhost:7130/api"
|
|
7
|
+
GREEN='\033[0;32m'
|
|
8
|
+
RED='\033[0;31m'
|
|
9
|
+
BLUE='\033[0;34m'
|
|
10
|
+
NC='\033[0m'
|
|
11
|
+
|
|
12
|
+
echo "๐งช Comprehensive Traditional REST Format Tests"
|
|
13
|
+
echo "============================================="
|
|
14
|
+
|
|
15
|
+
# 1. Health Check - Returns object directly
|
|
16
|
+
echo -e "\n${BLUE}1. Health Check (Object Response)${NC}"
|
|
17
|
+
echo "curl -s $BASE_URL/health"
|
|
18
|
+
curl -s "$BASE_URL/health" | jq '.'
|
|
19
|
+
echo -e "${GREEN}โ Returns object directly (no wrapper)${NC}"
|
|
20
|
+
|
|
21
|
+
# 2. Authentication - Returns object with user and token
|
|
22
|
+
echo -e "\n${BLUE}2. Authentication Tests${NC}"
|
|
23
|
+
EMAIL="test-$(date +%s)@example.com"
|
|
24
|
+
echo "Creating test user: $EMAIL"
|
|
25
|
+
|
|
26
|
+
# Register
|
|
27
|
+
echo -e "\n${BLUE}2a. Register (Object Response)${NC}"
|
|
28
|
+
REGISTER_RESPONSE=$(curl -s -X POST "$BASE_URL/auth/users" \
|
|
29
|
+
-H "Content-Type: application/json" \
|
|
30
|
+
-d "{\"email\": \"$EMAIL\", \"password\": \"Test123!\", \"name\": \"Test User\"}")
|
|
31
|
+
echo "$REGISTER_RESPONSE" | jq '.'
|
|
32
|
+
TOKEN=$(echo "$REGISTER_RESPONSE" | jq -r '.accessToken')
|
|
33
|
+
echo -e "${GREEN}โ Returns user object with token (no wrapper)${NC}"
|
|
34
|
+
|
|
35
|
+
# Login
|
|
36
|
+
echo -e "\n${BLUE}2b. Login (Object Response)${NC}"
|
|
37
|
+
curl -s -X POST "$BASE_URL/auth/sessions" \
|
|
38
|
+
-H "Content-Type: application/json" \
|
|
39
|
+
-d "{\"email\": \"$EMAIL\", \"password\": \"Test123!\"}" | jq '.'
|
|
40
|
+
echo -e "${GREEN}โ Returns user object with token (no wrapper)${NC}"
|
|
41
|
+
|
|
42
|
+
# Get current user
|
|
43
|
+
echo -e "\n${BLUE}2c. Get Current User (Object Response)${NC}"
|
|
44
|
+
curl -s "$BASE_URL/auth/sessions/current" \
|
|
45
|
+
-H "Authorization: Bearer $TOKEN" | jq '.'
|
|
46
|
+
echo -e "${GREEN}โ Returns user object directly${NC}"
|
|
47
|
+
|
|
48
|
+
# 3. Error Response
|
|
49
|
+
echo -e "\n${BLUE}3. Error Response Format${NC}"
|
|
50
|
+
echo "Testing with invalid credentials:"
|
|
51
|
+
curl -s -X POST "$BASE_URL/auth/sessions" \
|
|
52
|
+
-H "Content-Type: application/json" \
|
|
53
|
+
-d '{"email": "nonexistent@example.com", "password": "wrong"}' | jq '.'
|
|
54
|
+
echo -e "${GREEN}โ Error format: {error, message, statusCode, nextActions}${NC}"
|
|
55
|
+
|
|
56
|
+
# 4. Database Tables - Returns array
|
|
57
|
+
echo -e "\n${BLUE}4. Database Tables (Array Response)${NC}"
|
|
58
|
+
curl -s "$BASE_URL/database/tables" \
|
|
59
|
+
-H "Authorization: Bearer $TOKEN" | jq '.'
|
|
60
|
+
echo -e "${GREEN}โ Returns array directly${NC}"
|
|
61
|
+
|
|
62
|
+
# 5. Create a test table
|
|
63
|
+
echo -e "\n${BLUE}5. Create Table (Object Response)${NC}"
|
|
64
|
+
TABLE_NAME="test_products_$(date +%s)"
|
|
65
|
+
CREATE_TABLE_RESPONSE=$(curl -s -X POST "$BASE_URL/database/tables" \
|
|
66
|
+
-H "Authorization: Bearer $TOKEN" \
|
|
67
|
+
-H "Content-Type: application/json" \
|
|
68
|
+
-d "{
|
|
69
|
+
\"tableName\": \"$TABLE_NAME\",
|
|
70
|
+
\"columns\": [
|
|
71
|
+
{\"columnName\": \"name\", \"type\": \"string\", \"isNullable\": false, \"isUnique\": false},
|
|
72
|
+
{\"columnName\": \"price\", \"type\": \"float\", \"isNullable\": false, \"isUnique\": false}
|
|
73
|
+
]
|
|
74
|
+
}")
|
|
75
|
+
echo "$CREATE_TABLE_RESPONSE" | jq '.'
|
|
76
|
+
echo -e "${GREEN}โ Returns table info object directly${NC}"
|
|
77
|
+
|
|
78
|
+
# 6. Database Records - PostgREST returns array
|
|
79
|
+
echo -e "\n${BLUE}6. Database Records (PostgREST Array)${NC}"
|
|
80
|
+
|
|
81
|
+
# Insert a record
|
|
82
|
+
echo -e "\n${BLUE}6a. Insert Record${NC}"
|
|
83
|
+
curl -s -X POST "$BASE_URL/database/records/$TABLE_NAME" \
|
|
84
|
+
-H "Authorization: Bearer $TOKEN" \
|
|
85
|
+
-H "Content-Type: application/json" \
|
|
86
|
+
-d '[{"name": "Test Product", "price": 99.99}]' | jq '.'
|
|
87
|
+
echo -e "${GREEN}โ PostgREST returns empty array for INSERT${NC}"
|
|
88
|
+
|
|
89
|
+
# Get records
|
|
90
|
+
echo -e "\n${BLUE}6b. Get Records (Array Response)${NC}"
|
|
91
|
+
curl -s "$BASE_URL/database/records/$TABLE_NAME" \
|
|
92
|
+
-H "Authorization: Bearer $TOKEN" | jq '.'
|
|
93
|
+
echo -e "${GREEN}โ PostgREST returns array of records${NC}"
|
|
94
|
+
|
|
95
|
+
# 7. Storage endpoints
|
|
96
|
+
echo -e "\n${BLUE}7. Storage Endpoints${NC}"
|
|
97
|
+
|
|
98
|
+
# Get API key first
|
|
99
|
+
echo "Getting API key..."
|
|
100
|
+
API_KEY_RESPONSE=$(curl -s -X POST "$BASE_URL/config/apikey" \
|
|
101
|
+
-H "Authorization: Bearer $TOKEN" \
|
|
102
|
+
-H "Content-Type: application/json" \
|
|
103
|
+
-d '{"name": "test-key"}')
|
|
104
|
+
API_KEY=$(echo "$API_KEY_RESPONSE" | jq -r '.key' 2>/dev/null || echo "")
|
|
105
|
+
|
|
106
|
+
if [ -n "$API_KEY" ] && [ "$API_KEY" != "null" ]; then
|
|
107
|
+
# List buckets
|
|
108
|
+
echo -e "\n${BLUE}7a. List Buckets (Array Response)${NC}"
|
|
109
|
+
curl -s "$BASE_URL/storage/buckets" \
|
|
110
|
+
-H "Authorization: Bearer $API_KEY" | jq '.'
|
|
111
|
+
echo -e "${GREEN}โ Returns array of buckets${NC}"
|
|
112
|
+
else
|
|
113
|
+
echo -e "${RED}โ Could not get API key for storage tests${NC}"
|
|
114
|
+
fi
|
|
115
|
+
|
|
116
|
+
# 8. Logs with pagination
|
|
117
|
+
echo -e "\n${BLUE}8. Logs with Pagination Headers${NC}"
|
|
118
|
+
echo "Request: curl -s -i \"$BASE_URL/logs?limit=5\""
|
|
119
|
+
LOGS_RESPONSE=$(curl -s -i "$BASE_URL/logs?limit=5" \
|
|
120
|
+
-H "Authorization: Bearer $TOKEN")
|
|
121
|
+
echo "$LOGS_RESPONSE" | head -20
|
|
122
|
+
echo -e "${GREEN}โ Returns array with pagination in headers${NC}"
|
|
123
|
+
|
|
124
|
+
# 9. Documentation
|
|
125
|
+
echo -e "\n${BLUE}9. Documentation Endpoints${NC}"
|
|
126
|
+
|
|
127
|
+
# List docs
|
|
128
|
+
echo -e "\n${BLUE}9a. List Documentation (Array Response)${NC}"
|
|
129
|
+
curl -s "$BASE_URL/docs" | jq '.'
|
|
130
|
+
echo -e "${GREEN}โ Returns array of available docs${NC}"
|
|
131
|
+
|
|
132
|
+
# Get specific doc
|
|
133
|
+
echo -e "\n${BLUE}9b. Get Specific Doc (Object Response)${NC}"
|
|
134
|
+
curl -s "$BASE_URL/docs/db-api" | jq '.type'
|
|
135
|
+
echo -e "${GREEN}โ Returns doc object directly${NC}"
|
|
136
|
+
|
|
137
|
+
# 10. 404 Error
|
|
138
|
+
echo -e "\n${BLUE}10. 404 Not Found${NC}"
|
|
139
|
+
curl -s "$BASE_URL/nonexistent" | jq '.'
|
|
140
|
+
echo -e "${GREEN}โ Traditional error format${NC}"
|
|
141
|
+
|
|
142
|
+
# Cleanup
|
|
143
|
+
echo -e "\n${BLUE}Cleanup${NC}"
|
|
144
|
+
if [ -n "$TOKEN" ]; then
|
|
145
|
+
# Delete test table
|
|
146
|
+
curl -s -X DELETE "$BASE_URL/database/tables/$TABLE_NAME" \
|
|
147
|
+
-H "Authorization: Bearer $TOKEN" > /dev/null
|
|
148
|
+
echo "โ Deleted test table: $TABLE_NAME"
|
|
149
|
+
fi
|
|
150
|
+
|
|
151
|
+
echo -e "\n${GREEN}โ
All tests completed!${NC}"
|
|
152
|
+
echo -e "\n${BLUE}Summary of Response Formats:${NC}"
|
|
153
|
+
echo "โข Objects: health, auth, table info, specific doc"
|
|
154
|
+
echo "โข Arrays: database tables, database records (PostgREST), storage buckets, docs list"
|
|
155
|
+
echo "โข Errors: Consistent format with error, message, statusCode, nextActions"
|
|
156
|
+
echo "โข Pagination: Via HTTP headers (X-Total-Count, X-Page, etc.)"
|