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,7 +1,97 @@
|
|
|
1
1
|
import splitSqlQuery from '@databases/split-sql-query';
|
|
2
2
|
import sql from '@databases/sql';
|
|
3
|
+
import { parseSync, loadModule } from 'libpg-query';
|
|
3
4
|
import logger from './logger.js';
|
|
4
5
|
|
|
6
|
+
let initialized = false;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Initialize the SQL parser WASM module.
|
|
10
|
+
* Must be called and awaited before using analyzeQuery().
|
|
11
|
+
*/
|
|
12
|
+
export async function initSqlParser(): Promise<void> {
|
|
13
|
+
if (initialized) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
await loadModule();
|
|
17
|
+
initialized = true;
|
|
18
|
+
logger.info('SQL parser initialized');
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface DatabaseResourceUpdate {
|
|
22
|
+
type: 'tables' | 'table' | 'records' | 'index' | 'trigger' | 'policy' | 'function' | 'extension';
|
|
23
|
+
name?: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const STMT_TYPES: Record<string, DatabaseResourceUpdate['type']> = {
|
|
27
|
+
InsertStmt: 'records',
|
|
28
|
+
UpdateStmt: 'records',
|
|
29
|
+
DeleteStmt: 'records',
|
|
30
|
+
CreateStmt: 'tables',
|
|
31
|
+
AlterTableStmt: 'table',
|
|
32
|
+
RenameStmt: 'table',
|
|
33
|
+
IndexStmt: 'index',
|
|
34
|
+
CreateTrigStmt: 'trigger',
|
|
35
|
+
CreatePolicyStmt: 'policy',
|
|
36
|
+
AlterPolicyStmt: 'policy',
|
|
37
|
+
CreateFunctionStmt: 'function',
|
|
38
|
+
CreateExtensionStmt: 'extension',
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const DROP_TYPES: Record<string, DatabaseResourceUpdate['type']> = {
|
|
42
|
+
OBJECT_TABLE: 'tables',
|
|
43
|
+
OBJECT_INDEX: 'index',
|
|
44
|
+
OBJECT_TRIGGER: 'trigger',
|
|
45
|
+
OBJECT_POLICY: 'policy',
|
|
46
|
+
OBJECT_FUNCTION: 'function',
|
|
47
|
+
OBJECT_EXTENSION: 'extension',
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
export function analyzeQuery(query: string): DatabaseResourceUpdate[] {
|
|
51
|
+
try {
|
|
52
|
+
const { stmts } = parseSync(query);
|
|
53
|
+
const changes = stmts
|
|
54
|
+
.map((s: { stmt: Record<string, unknown> }) => extractChange(s.stmt))
|
|
55
|
+
.filter((c: DatabaseResourceUpdate | null): c is DatabaseResourceUpdate => c !== null);
|
|
56
|
+
|
|
57
|
+
// Deduplicate by type+name
|
|
58
|
+
const seen = new Set<string>();
|
|
59
|
+
return changes.filter((c: DatabaseResourceUpdate) => {
|
|
60
|
+
const key = `${c.type}:${c.name ?? ''}`;
|
|
61
|
+
if (seen.has(key)) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
seen.add(key);
|
|
65
|
+
return true;
|
|
66
|
+
});
|
|
67
|
+
} catch (e) {
|
|
68
|
+
logger.warn('SQL parse error:', e);
|
|
69
|
+
return [];
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function extractChange(stmt: Record<string, unknown>): DatabaseResourceUpdate | null {
|
|
74
|
+
const [stmtType, data] = Object.entries(stmt)[0] as [string, Record<string, unknown>];
|
|
75
|
+
|
|
76
|
+
if (stmtType === 'DropStmt') {
|
|
77
|
+
const type = DROP_TYPES[data.removeType as string];
|
|
78
|
+
return type ? { type } : null;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const type = STMT_TYPES[stmtType];
|
|
82
|
+
if (!type) {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Only include name for 'table' (ALTER) and 'records' (DML)
|
|
87
|
+
if (type === 'table' || type === 'records') {
|
|
88
|
+
const name = (data.relation as Record<string, unknown>)?.relname as string;
|
|
89
|
+
return { type, name };
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return { type };
|
|
93
|
+
}
|
|
94
|
+
|
|
5
95
|
/**
|
|
6
96
|
* Parse a SQL string into individual statements, properly handling:
|
|
7
97
|
* - String literals with embedded semicolons
|
package/backend/tests/README.md
CHANGED
|
@@ -1,134 +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
|
-
|
|
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
134
|
Tests track failures and return appropriate exit codes for CI/CD integration.
|