insforge 1.2.10 โ 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 -20
- package/.dockerignore +60 -60
- package/.env.example +83 -77
- package/.github/ISSUE_TEMPLATE/bug_report.yml +36 -36
- package/.github/ISSUE_TEMPLATE/config.yml +11 -11
- package/.github/ISSUE_TEMPLATE/feature_request.yml +26 -26
- package/.github/PULL_REQUEST_TEMPLATE.md +7 -7
- package/.github/copilot-instructions.md +146 -146
- package/.github/workflows/build-image.yml +65 -65
- package/.github/workflows/ci-premerge-check.yml +23 -23
- package/.github/workflows/e2e.yml +63 -63
- package/.github/workflows/lint-and-format.yml +32 -32
- package/.prettierignore +64 -64
- package/CHANGELOG.md +44 -44
- package/CLAUDE_PLUGIN.md +104 -104
- package/CODE_OF_CONDUCT.md +128 -128
- package/CONTRIBUTING.md +125 -125
- package/Dockerfile +30 -30
- package/GITHUB_OAUTH_SETUP.md +49 -49
- package/GOOGLE_OAUTH_SETUP.md +148 -148
- package/LICENSE +201 -201
- package/README.md +182 -182
- package/assets/Dark.svg +23 -23
- package/auth/package.json +28 -28
- package/auth/src/lib/broadcastService.ts +117 -115
- package/auth/src/pages/SignInPage.tsx +60 -57
- package/auth/src/pages/SignUpPage.tsx +60 -57
- package/auth/tsconfig.json +32 -32
- package/auth/tsconfig.node.json +11 -11
- package/backend/package.json +78 -75
- package/backend/src/api/routes/ai/index.routes.ts +3 -3
- package/backend/src/api/routes/auth/index.routes.ts +667 -570
- package/backend/src/api/routes/auth/oauth.routes.ts +473 -448
- package/backend/src/api/routes/database/advance.routes.ts +37 -16
- package/backend/src/api/routes/database/index.routes.ts +78 -1
- package/backend/src/api/routes/database/records.routes.ts +10 -10
- package/backend/src/api/routes/database/tables.routes.ts +0 -14
- package/backend/src/api/routes/docs/index.routes.ts +75 -76
- package/backend/src/api/routes/email/index.routes.ts +35 -0
- package/backend/src/api/routes/functions/index.routes.ts +18 -12
- package/backend/src/api/routes/metadata/index.routes.ts +12 -0
- 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/storage/index.routes.ts +18 -12
- package/backend/src/api/routes/usage/index.routes.ts +6 -4
- package/backend/src/infra/database/database.manager.ts +14 -1
- package/backend/src/infra/database/migrations/000_create-base-tables.sql +141 -141
- package/backend/src/infra/database/migrations/001_create-helper-functions.sql +40 -40
- package/backend/src/infra/database/migrations/002_rename-auth-tables.sql +29 -29
- package/backend/src/infra/database/migrations/003_create-users-table.sql +55 -55
- package/backend/src/infra/database/migrations/004_add-reload-postgrest-func.sql +23 -23
- package/backend/src/infra/database/migrations/005_enable-project-admin-modify-users.sql +29 -29
- package/backend/src/infra/database/migrations/006_modify-ai-usage-table.sql +24 -24
- package/backend/src/infra/database/migrations/007_drop-metadata-table.sql +1 -1
- package/backend/src/infra/database/migrations/008_add-system-tables.sql +76 -76
- package/backend/src/infra/database/migrations/009_add-function-secrets.sql +23 -23
- package/backend/src/infra/database/migrations/010_modify-ai-config-modalities.sql +93 -93
- package/backend/src/infra/database/migrations/011_refactor-secrets-table.sql +15 -15
- package/backend/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 -44
- package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +7 -7
- package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +59 -59
- package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -24
- 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/infra/security/token.manager.ts +219 -125
- package/backend/src/infra/socket/socket.manager.ts +198 -64
- package/backend/src/providers/ai/openrouter.provider.ts +12 -9
- package/backend/src/providers/email/base.provider.ts +4 -7
- package/backend/src/providers/email/cloud.provider.ts +84 -0
- package/backend/src/providers/oauth/apple.provider.ts +266 -0
- package/backend/src/providers/oauth/index.ts +1 -0
- package/backend/src/server.ts +317 -284
- package/backend/src/services/ai/ai-model.service.ts +5 -5
- package/backend/src/services/ai/chat-completion.service.ts +4 -4
- package/backend/src/services/ai/image-generation.service.ts +3 -3
- package/backend/src/services/auth/auth.service.ts +14 -0
- package/backend/src/services/database/database-table.service.ts +0 -9
- package/backend/src/services/database/database.service.ts +127 -0
- package/backend/src/services/email/email.service.ts +5 -7
- 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/types/auth.ts +11 -0
- package/backend/src/types/realtime.ts +18 -0
- package/backend/src/types/socket.ts +7 -31
- package/backend/src/utils/cookies.ts +35 -0
- package/backend/src/utils/s3-config-loader.ts +64 -0
- package/backend/src/utils/seed.ts +301 -298
- package/backend/src/utils/sql-parser.ts +90 -0
- 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 -129
- package/backend/tests/local/test-ai-usage.sh +80 -80
- 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 -123
- package/backend/tests/local/test-id-field.sh +200 -200
- package/backend/tests/local/test-logs.sh +132 -132
- package/backend/tests/local/test-public-bucket.sh +264 -264
- package/backend/tests/local/test-secrets.sh +249 -249
- 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 -244
- 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 -338
- package/backend/tests/unit/analyze-query.test.ts +697 -0
- package/backend/tsconfig.json +22 -22
- package/claude-plugin/.claude-plugin/plugin.json +24 -24
- package/claude-plugin/README.md +133 -133
- package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +270 -270
- package/docker-compose.prod.yml +204 -200
- package/docker-compose.yml +232 -228
- package/docker-init/db/db-init.sql +97 -97
- package/docker-init/db/jwt.sql +5 -5
- package/docker-init/db/postgresql.conf +16 -16
- package/docker-init/logs/vector.yml +236 -236
- package/docs/README.md +44 -44
- package/docs/agent-docs/real-time.md +269 -0
- package/docs/changelog.mdx +119 -67
- package/docs/core-concepts/ai/architecture.mdx +372 -372
- package/docs/core-concepts/ai/sdk.mdx +213 -213
- package/docs/core-concepts/authentication/architecture.mdx +278 -278
- package/docs/core-concepts/authentication/sdk.mdx +414 -414
- package/docs/core-concepts/authentication/ui-components/customization.mdx +529 -529
- package/docs/core-concepts/authentication/ui-components/nextjs.mdx +221 -221
- package/docs/core-concepts/authentication/ui-components/react-router.mdx +184 -184
- package/docs/core-concepts/authentication/ui-components/react.mdx +129 -129
- package/docs/core-concepts/database/architecture.mdx +255 -255
- package/docs/core-concepts/database/sdk.mdx +382 -382
- 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 -105
- package/docs/core-concepts/functions/sdk.mdx +184 -184
- 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 -243
- package/docs/core-concepts/storage/sdk.mdx +253 -253
- package/docs/deployment/README.md +94 -94
- package/docs/deployment/deploy-to-aws-ec2.md +564 -564
- package/docs/deployment/deploy-to-azure-virtual-machines.md +312 -312
- package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -613
- package/docs/deployment/deploy-to-render.md +441 -441
- 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 -210
- package/docs/examples/framework-guides/nextjs.mdx +131 -131
- package/docs/examples/framework-guides/nuxt.mdx +165 -165
- package/docs/examples/framework-guides/react.mdx +165 -165
- package/docs/examples/framework-guides/svelte.mdx +153 -153
- package/docs/examples/framework-guides/vue.mdx +159 -159
- package/docs/examples/overview.mdx +67 -67
- package/docs/favicon.svg +19 -19
- 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/icons/ai.svg +4 -4
- package/docs/images/logos/nextjs.svg +4 -4
- package/docs/images/logos/nuxt.svg +4 -4
- package/docs/images/logos/react.svg +5 -5
- package/docs/images/logos/svelte.svg +4 -4
- package/docs/images/logos/vue.svg +5 -5
- package/docs/insforge-instructions-sdk.md +89 -88
- package/docs/introduction.mdx +45 -45
- package/docs/logo/dark.svg +22 -22
- package/docs/logo/light.svg +20 -20
- package/docs/partnership.mdx +651 -646
- package/docs/quickstart.mdx +82 -82
- package/docs/showcase.mdx +52 -52
- package/docs/snippets/sdk-installation.mdx +21 -21
- package/docs/snippets/service-icons.mdx +27 -27
- 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 -69
- 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 -3
- package/frontend/src/assets/icons/error.svg +3 -3
- package/frontend/src/assets/icons/loader.svg +9 -9
- 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 +3 -3
- 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 -3
- 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 +1 -1
- package/frontend/src/assets/logos/linkedin.svg +3 -3
- 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 +16 -16
- package/frontend/src/assets/logos/tiktok.svg +5 -5
- 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 -3
- package/frontend/src/components/layout/AppHeader.tsx +9 -10
- package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +1 -0
- package/frontend/src/features/auth/components/UsersDataGrid.tsx +6 -0
- package/frontend/src/features/auth/helpers.tsx +8 -0
- package/frontend/src/features/auth/{page โ pages}/UsersPage.tsx +0 -28
- package/frontend/src/features/database/components/SQLModal.tsx +75 -0
- package/frontend/src/features/database/components/TableForm.tsx +0 -4
- package/frontend/src/features/database/hooks/useDatabase.ts +66 -0
- package/frontend/src/features/database/hooks/useTables.ts +32 -28
- package/frontend/src/features/database/index.ts +1 -0
- package/frontend/src/features/database/{page โ pages}/FunctionsPage.tsx +29 -37
- package/frontend/src/features/database/{page โ pages}/IndexesPage.tsx +35 -47
- package/frontend/src/features/database/{page โ pages}/PoliciesPage.tsx +43 -54
- package/frontend/src/features/database/{page โ pages}/TablesPage.tsx +0 -42
- package/frontend/src/features/database/{page โ pages}/TriggersPage.tsx +35 -47
- package/frontend/src/features/database/services/advance.service.ts +0 -26
- package/frontend/src/features/database/services/database.service.ts +55 -0
- package/frontend/src/features/database/services/table.service.ts +0 -6
- package/frontend/src/features/functions/{page โ pages}/FunctionsPage.tsx +21 -44
- package/frontend/src/features/functions/{page โ pages}/SecretsPage.tsx +11 -9
- package/frontend/src/features/logs/hooks/useMcpUsage.ts +13 -66
- 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/{page โ pages}/StoragePage.tsx +1 -29
- package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +3 -3
- package/frontend/src/features/visualizer/{page โ pages}/VisualizerPage.tsx +1 -35
- package/frontend/src/lib/contexts/SocketContext.tsx +119 -75
- package/frontend/src/lib/routing/AppRoutes.tsx +35 -20
- package/frontend/src/lib/utils/cloudMessaging.ts +1 -1
- package/frontend/src/lib/utils/menuItems.ts +24 -0
- package/frontend/src/lib/utils/utils.ts +14 -1
- package/frontend/tsconfig.json +25 -25
- package/frontend/tsconfig.node.json +9 -9
- package/functions/deno.json +24 -24
- package/functions/server.ts +315 -315
- package/i18n/README.ar.md +130 -130
- package/i18n/README.de.md +130 -130
- package/i18n/README.es.md +154 -154
- package/i18n/README.fr.md +134 -134
- package/i18n/README.hi.md +129 -129
- package/i18n/README.ja.md +174 -174
- package/i18n/README.ko.md +136 -136
- package/i18n/README.pt-BR.md +131 -131
- package/i18n/README.ru.md +129 -129
- package/i18n/README.zh-CN.md +133 -133
- package/openapi/ai.yaml +715 -715
- package/openapi/auth.yaml +1244 -1244
- 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 -97
- package/shared-schemas/package.json +31 -31
- package/shared-schemas/src/ai.schema.ts +63 -59
- package/shared-schemas/src/auth-api.schema.ts +352 -339
- package/shared-schemas/src/auth.schema.ts +1 -1
- package/shared-schemas/src/database-api.schema.ts +32 -1
- package/shared-schemas/src/database.schema.ts +39 -0
- 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 +4 -0
- package/shared-schemas/src/metadata.schema.ts +9 -0
- 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 -13
- package/zeabur/template.yml +1032 -1032
- package/.cursor/rules/cursor-rules.mdc +0 -94
- package/frontend/src/features/database/hooks/useFullMetadata.ts +0 -18
- package/test-gemini.sh +0 -35
- package/test-usage-admin.sh +0 -57
- package/test-usage.sh +0 -50
- /package/frontend/src/features/ai/{page โ pages}/AIPage.tsx +0 -0
- /package/frontend/src/features/auth/{page โ pages}/AuthMethodsPage.tsx +0 -0
- /package/frontend/src/features/auth/{page โ pages}/ConfigurationPage.tsx +0 -0
- /package/frontend/src/features/dashboard/{page โ pages}/DashboardPage.tsx +0 -0
- /package/frontend/src/features/database/{page โ pages}/SQLEditorPage.tsx +0 -0
- /package/frontend/src/features/database/{page โ pages}/TemplatesPage.tsx +0 -0
- /package/frontend/src/features/login/{page โ pages}/CloudLoginPage.tsx +0 -0
- /package/frontend/src/features/login/{page โ pages}/LoginPage.tsx +0 -0
- /package/frontend/src/features/logs/{page โ pages}/AuditsPage.tsx +0 -0
- /package/frontend/src/features/logs/{page โ pages}/LogsPage.tsx +0 -0
- /package/frontend/src/features/logs/{page โ pages}/MCPLogsPage.tsx +0 -0
|
@@ -1,132 +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 ""
|
|
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
132
|
echo "Example: s3://my-bucket/app12345/test-bucket/test-file.txt"
|
|
@@ -1,156 +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"
|
|
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
156
|
echo "โข Pagination: Via HTTP headers (X-Total-Count, X-Page, etc.)"
|