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.
Files changed (335) hide show
  1. package/.claude-plugin/marketplace.json +20 -20
  2. package/.dockerignore +60 -60
  3. package/.env.example +83 -77
  4. package/.github/ISSUE_TEMPLATE/bug_report.yml +36 -36
  5. package/.github/ISSUE_TEMPLATE/config.yml +11 -11
  6. package/.github/ISSUE_TEMPLATE/feature_request.yml +26 -26
  7. package/.github/PULL_REQUEST_TEMPLATE.md +7 -7
  8. package/.github/copilot-instructions.md +146 -146
  9. package/.github/workflows/build-image.yml +65 -65
  10. package/.github/workflows/ci-premerge-check.yml +23 -23
  11. package/.github/workflows/e2e.yml +63 -63
  12. package/.github/workflows/lint-and-format.yml +32 -32
  13. package/.prettierignore +64 -64
  14. package/CHANGELOG.md +44 -44
  15. package/CLAUDE_PLUGIN.md +104 -104
  16. package/CODE_OF_CONDUCT.md +128 -128
  17. package/CONTRIBUTING.md +125 -125
  18. package/Dockerfile +30 -30
  19. package/GITHUB_OAUTH_SETUP.md +49 -49
  20. package/GOOGLE_OAUTH_SETUP.md +148 -148
  21. package/LICENSE +201 -201
  22. package/README.md +182 -182
  23. package/assets/Dark.svg +23 -23
  24. package/auth/package.json +28 -28
  25. package/auth/src/lib/broadcastService.ts +117 -115
  26. package/auth/src/pages/SignInPage.tsx +60 -57
  27. package/auth/src/pages/SignUpPage.tsx +60 -57
  28. package/auth/tsconfig.json +32 -32
  29. package/auth/tsconfig.node.json +11 -11
  30. package/backend/package.json +78 -75
  31. package/backend/src/api/routes/ai/index.routes.ts +3 -3
  32. package/backend/src/api/routes/auth/index.routes.ts +667 -570
  33. package/backend/src/api/routes/auth/oauth.routes.ts +473 -448
  34. package/backend/src/api/routes/database/advance.routes.ts +37 -16
  35. package/backend/src/api/routes/database/index.routes.ts +78 -1
  36. package/backend/src/api/routes/database/records.routes.ts +10 -10
  37. package/backend/src/api/routes/database/tables.routes.ts +0 -14
  38. package/backend/src/api/routes/docs/index.routes.ts +75 -76
  39. package/backend/src/api/routes/email/index.routes.ts +35 -0
  40. package/backend/src/api/routes/functions/index.routes.ts +18 -12
  41. package/backend/src/api/routes/metadata/index.routes.ts +12 -0
  42. package/backend/src/api/routes/realtime/channels.routes.ts +81 -0
  43. package/backend/src/api/routes/realtime/index.routes.ts +12 -0
  44. package/backend/src/api/routes/realtime/messages.routes.ts +48 -0
  45. package/backend/src/api/routes/realtime/permissions.routes.ts +19 -0
  46. package/backend/src/api/routes/storage/index.routes.ts +18 -12
  47. package/backend/src/api/routes/usage/index.routes.ts +6 -4
  48. package/backend/src/infra/database/database.manager.ts +14 -1
  49. package/backend/src/infra/database/migrations/000_create-base-tables.sql +141 -141
  50. package/backend/src/infra/database/migrations/001_create-helper-functions.sql +40 -40
  51. package/backend/src/infra/database/migrations/002_rename-auth-tables.sql +29 -29
  52. package/backend/src/infra/database/migrations/003_create-users-table.sql +55 -55
  53. package/backend/src/infra/database/migrations/004_add-reload-postgrest-func.sql +23 -23
  54. package/backend/src/infra/database/migrations/005_enable-project-admin-modify-users.sql +29 -29
  55. package/backend/src/infra/database/migrations/006_modify-ai-usage-table.sql +24 -24
  56. package/backend/src/infra/database/migrations/007_drop-metadata-table.sql +1 -1
  57. package/backend/src/infra/database/migrations/008_add-system-tables.sql +76 -76
  58. package/backend/src/infra/database/migrations/009_add-function-secrets.sql +23 -23
  59. package/backend/src/infra/database/migrations/010_modify-ai-config-modalities.sql +93 -93
  60. package/backend/src/infra/database/migrations/011_refactor-secrets-table.sql +15 -15
  61. package/backend/src/infra/database/migrations/012_add-storage-uploaded-by.sql +7 -7
  62. package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -44
  63. package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +7 -7
  64. package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +59 -59
  65. package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -24
  66. package/backend/src/infra/database/migrations/017_create-realtime-schema.sql +233 -0
  67. package/backend/src/infra/realtime/realtime.manager.ts +246 -0
  68. package/backend/src/infra/realtime/webhook-sender.ts +82 -0
  69. package/backend/src/infra/security/token.manager.ts +219 -125
  70. package/backend/src/infra/socket/socket.manager.ts +198 -64
  71. package/backend/src/providers/ai/openrouter.provider.ts +12 -9
  72. package/backend/src/providers/email/base.provider.ts +4 -7
  73. package/backend/src/providers/email/cloud.provider.ts +84 -0
  74. package/backend/src/providers/oauth/apple.provider.ts +266 -0
  75. package/backend/src/providers/oauth/index.ts +1 -0
  76. package/backend/src/server.ts +317 -284
  77. package/backend/src/services/ai/ai-model.service.ts +5 -5
  78. package/backend/src/services/ai/chat-completion.service.ts +4 -4
  79. package/backend/src/services/ai/image-generation.service.ts +3 -3
  80. package/backend/src/services/auth/auth.service.ts +14 -0
  81. package/backend/src/services/database/database-table.service.ts +0 -9
  82. package/backend/src/services/database/database.service.ts +127 -0
  83. package/backend/src/services/email/email.service.ts +5 -7
  84. package/backend/src/services/realtime/index.ts +3 -0
  85. package/backend/src/services/realtime/realtime-auth.service.ts +104 -0
  86. package/backend/src/services/realtime/realtime-channel.service.ts +237 -0
  87. package/backend/src/services/realtime/realtime-message.service.ts +260 -0
  88. package/backend/src/types/auth.ts +11 -0
  89. package/backend/src/types/realtime.ts +18 -0
  90. package/backend/src/types/socket.ts +7 -31
  91. package/backend/src/utils/cookies.ts +35 -0
  92. package/backend/src/utils/s3-config-loader.ts +64 -0
  93. package/backend/src/utils/seed.ts +301 -298
  94. package/backend/src/utils/sql-parser.ts +90 -0
  95. package/backend/tests/README.md +133 -133
  96. package/backend/tests/cleanup-all-test-data.sh +230 -230
  97. package/backend/tests/cloud/test-s3-multitenant.sh +131 -131
  98. package/backend/tests/local/comprehensive-curl-tests.sh +155 -155
  99. package/backend/tests/local/test-ai-config.sh +129 -129
  100. package/backend/tests/local/test-ai-usage.sh +80 -80
  101. package/backend/tests/local/test-auth-router.sh +143 -143
  102. package/backend/tests/local/test-database-router.sh +222 -222
  103. package/backend/tests/local/test-e2e.sh +240 -240
  104. package/backend/tests/local/test-fk-errors.sh +96 -96
  105. package/backend/tests/local/test-functions.sh +123 -123
  106. package/backend/tests/local/test-id-field.sh +200 -200
  107. package/backend/tests/local/test-logs.sh +132 -132
  108. package/backend/tests/local/test-public-bucket.sh +264 -264
  109. package/backend/tests/local/test-secrets.sh +249 -249
  110. package/backend/tests/local/test-serverless-functions.sh.disabled +325 -325
  111. package/backend/tests/local/test-traditional-rest.sh +208 -208
  112. package/backend/tests/manual/README.md +50 -50
  113. package/backend/tests/manual/create-large-table-simple.sql +10 -10
  114. package/backend/tests/manual/seed-large-table.sql +100 -100
  115. package/backend/tests/manual/setup-large-table-extras.sql +33 -33
  116. package/backend/tests/manual/test-bulk-upsert.sh +409 -409
  117. package/backend/tests/manual/test-database-advance.sh +296 -296
  118. package/backend/tests/manual/test-postgrest-stability.sh +191 -191
  119. package/backend/tests/manual/test-rawsql-export-import.sh +411 -411
  120. package/backend/tests/manual/test-rawsql-modes.sh +244 -244
  121. package/backend/tests/manual/test-universal-storage.sh +263 -263
  122. package/backend/tests/manual/test-users.sql +17 -17
  123. package/backend/tests/run-all-tests.sh +139 -139
  124. package/backend/tests/setup.ts +0 -0
  125. package/backend/tests/test-config.sh +338 -338
  126. package/backend/tests/unit/analyze-query.test.ts +697 -0
  127. package/backend/tsconfig.json +22 -22
  128. package/claude-plugin/.claude-plugin/plugin.json +24 -24
  129. package/claude-plugin/README.md +133 -133
  130. package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +270 -270
  131. package/docker-compose.prod.yml +204 -200
  132. package/docker-compose.yml +232 -228
  133. package/docker-init/db/db-init.sql +97 -97
  134. package/docker-init/db/jwt.sql +5 -5
  135. package/docker-init/db/postgresql.conf +16 -16
  136. package/docker-init/logs/vector.yml +236 -236
  137. package/docs/README.md +44 -44
  138. package/docs/agent-docs/real-time.md +269 -0
  139. package/docs/changelog.mdx +119 -67
  140. package/docs/core-concepts/ai/architecture.mdx +372 -372
  141. package/docs/core-concepts/ai/sdk.mdx +213 -213
  142. package/docs/core-concepts/authentication/architecture.mdx +278 -278
  143. package/docs/core-concepts/authentication/sdk.mdx +414 -414
  144. package/docs/core-concepts/authentication/ui-components/customization.mdx +529 -529
  145. package/docs/core-concepts/authentication/ui-components/nextjs.mdx +221 -221
  146. package/docs/core-concepts/authentication/ui-components/react-router.mdx +184 -184
  147. package/docs/core-concepts/authentication/ui-components/react.mdx +129 -129
  148. package/docs/core-concepts/database/architecture.mdx +255 -255
  149. package/docs/core-concepts/database/sdk.mdx +382 -382
  150. package/docs/core-concepts/email/architecture.mdx +101 -0
  151. package/docs/core-concepts/email/sdk.mdx +53 -0
  152. package/docs/core-concepts/functions/architecture.mdx +105 -105
  153. package/docs/core-concepts/functions/sdk.mdx +184 -184
  154. package/docs/core-concepts/realtime/architecture.mdx +446 -0
  155. package/docs/core-concepts/realtime/sdk.mdx +409 -0
  156. package/docs/core-concepts/storage/architecture.mdx +243 -243
  157. package/docs/core-concepts/storage/sdk.mdx +253 -253
  158. package/docs/deployment/README.md +94 -94
  159. package/docs/deployment/deploy-to-aws-ec2.md +564 -564
  160. package/docs/deployment/deploy-to-azure-virtual-machines.md +312 -312
  161. package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -613
  162. package/docs/deployment/deploy-to-render.md +441 -441
  163. package/docs/deprecated/insforge-auth-api.md +214 -214
  164. package/docs/deprecated/insforge-auth-sdk.md +99 -99
  165. package/docs/deprecated/insforge-db-api.md +358 -358
  166. package/docs/deprecated/insforge-db-sdk.md +139 -139
  167. package/docs/deprecated/insforge-debug-sdk.md +156 -156
  168. package/docs/deprecated/insforge-debug.md +64 -64
  169. package/docs/deprecated/insforge-instructions.md +123 -123
  170. package/docs/deprecated/insforge-project.md +117 -117
  171. package/docs/deprecated/insforge-storage-api.md +278 -278
  172. package/docs/deprecated/insforge-storage-sdk.md +158 -158
  173. package/docs/docs.json +232 -210
  174. package/docs/examples/framework-guides/nextjs.mdx +131 -131
  175. package/docs/examples/framework-guides/nuxt.mdx +165 -165
  176. package/docs/examples/framework-guides/react.mdx +165 -165
  177. package/docs/examples/framework-guides/svelte.mdx +153 -153
  178. package/docs/examples/framework-guides/vue.mdx +159 -159
  179. package/docs/examples/overview.mdx +67 -67
  180. package/docs/favicon.svg +19 -19
  181. package/docs/images/changelog/dec-2025/ai-integration.png +0 -0
  182. package/docs/images/changelog/dec-2025/ai-models.webp +0 -0
  183. package/docs/images/changelog/dec-2025/alipay-payment.webp +0 -0
  184. package/docs/images/changelog/dec-2025/apple-login.jpg +0 -0
  185. package/docs/images/changelog/dec-2025/mcp-installer.png +0 -0
  186. package/docs/images/changelog/dec-2025/realtime-module.jpg +0 -0
  187. package/docs/images/icons/ai.svg +4 -4
  188. package/docs/images/logos/nextjs.svg +4 -4
  189. package/docs/images/logos/nuxt.svg +4 -4
  190. package/docs/images/logos/react.svg +5 -5
  191. package/docs/images/logos/svelte.svg +4 -4
  192. package/docs/images/logos/vue.svg +5 -5
  193. package/docs/insforge-instructions-sdk.md +89 -88
  194. package/docs/introduction.mdx +45 -45
  195. package/docs/logo/dark.svg +22 -22
  196. package/docs/logo/light.svg +20 -20
  197. package/docs/partnership.mdx +651 -646
  198. package/docs/quickstart.mdx +82 -82
  199. package/docs/showcase.mdx +52 -52
  200. package/docs/snippets/sdk-installation.mdx +21 -21
  201. package/docs/snippets/service-icons.mdx +27 -27
  202. package/examples/oauth/frontend-oauth-example.html +250 -250
  203. package/examples/response-examples.md +443 -443
  204. package/frontend/components.json +17 -17
  205. package/frontend/package.json +69 -69
  206. package/frontend/src/assets/icons/checkbox_checked.svg +6 -6
  207. package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -6
  208. package/frontend/src/assets/icons/checked.svg +3 -3
  209. package/frontend/src/assets/icons/connected.svg +3 -3
  210. package/frontend/src/assets/icons/error.svg +3 -3
  211. package/frontend/src/assets/icons/loader.svg +9 -9
  212. package/frontend/src/assets/icons/pencil.svg +4 -4
  213. package/frontend/src/assets/icons/refresh.svg +4 -4
  214. package/frontend/src/assets/icons/step_active.svg +3 -3
  215. package/frontend/src/assets/icons/step_inactive.svg +11 -11
  216. package/frontend/src/assets/icons/warning.svg +3 -3
  217. package/frontend/src/assets/logos/apple.svg +3 -3
  218. package/frontend/src/assets/logos/claude_code.svg +3 -3
  219. package/frontend/src/assets/logos/cline.svg +6 -6
  220. package/frontend/src/assets/logos/cursor.svg +20 -20
  221. package/frontend/src/assets/logos/discord.svg +8 -8
  222. package/frontend/src/assets/logos/facebook.svg +3 -3
  223. package/frontend/src/assets/logos/gemini.svg +19 -19
  224. package/frontend/src/assets/logos/github.svg +5 -5
  225. package/frontend/src/assets/logos/google.svg +13 -13
  226. package/frontend/src/assets/logos/grok.svg +10 -10
  227. package/frontend/src/assets/logos/insforge_dark.svg +15 -15
  228. package/frontend/src/assets/logos/insforge_light.svg +15 -15
  229. package/frontend/src/assets/logos/instagram.svg +1 -1
  230. package/frontend/src/assets/logos/linkedin.svg +3 -3
  231. package/frontend/src/assets/logos/openai.svg +10 -10
  232. package/frontend/src/assets/logos/roo_code.svg +9 -9
  233. package/frontend/src/assets/logos/spotify.svg +16 -16
  234. package/frontend/src/assets/logos/tiktok.svg +5 -5
  235. package/frontend/src/assets/logos/trae.svg +3 -3
  236. package/frontend/src/assets/logos/windsurf.svg +10 -10
  237. package/frontend/src/assets/logos/x.svg +3 -3
  238. package/frontend/src/components/layout/AppHeader.tsx +9 -10
  239. package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +1 -0
  240. package/frontend/src/features/auth/components/UsersDataGrid.tsx +6 -0
  241. package/frontend/src/features/auth/helpers.tsx +8 -0
  242. package/frontend/src/features/auth/{page → pages}/UsersPage.tsx +0 -28
  243. package/frontend/src/features/database/components/SQLModal.tsx +75 -0
  244. package/frontend/src/features/database/components/TableForm.tsx +0 -4
  245. package/frontend/src/features/database/hooks/useDatabase.ts +66 -0
  246. package/frontend/src/features/database/hooks/useTables.ts +32 -28
  247. package/frontend/src/features/database/index.ts +1 -0
  248. package/frontend/src/features/database/{page → pages}/FunctionsPage.tsx +29 -37
  249. package/frontend/src/features/database/{page → pages}/IndexesPage.tsx +35 -47
  250. package/frontend/src/features/database/{page → pages}/PoliciesPage.tsx +43 -54
  251. package/frontend/src/features/database/{page → pages}/TablesPage.tsx +0 -42
  252. package/frontend/src/features/database/{page → pages}/TriggersPage.tsx +35 -47
  253. package/frontend/src/features/database/services/advance.service.ts +0 -26
  254. package/frontend/src/features/database/services/database.service.ts +55 -0
  255. package/frontend/src/features/database/services/table.service.ts +0 -6
  256. package/frontend/src/features/functions/{page → pages}/FunctionsPage.tsx +21 -44
  257. package/frontend/src/features/functions/{page → pages}/SecretsPage.tsx +11 -9
  258. package/frontend/src/features/logs/hooks/useMcpUsage.ts +13 -66
  259. package/frontend/src/features/realtime/components/ChannelRow.tsx +83 -0
  260. package/frontend/src/features/realtime/components/EditChannelModal.tsx +246 -0
  261. package/frontend/src/features/realtime/components/MessageRow.tsx +85 -0
  262. package/frontend/src/features/realtime/components/RealtimeEmptyState.tsx +30 -0
  263. package/frontend/src/features/realtime/hooks/useRealtime.ts +218 -0
  264. package/frontend/src/features/realtime/index.ts +11 -0
  265. package/frontend/src/features/realtime/pages/RealtimeChannelsPage.tsx +172 -0
  266. package/frontend/src/features/realtime/pages/RealtimeMessagesPage.tsx +211 -0
  267. package/frontend/src/features/realtime/pages/RealtimePermissionsPage.tsx +191 -0
  268. package/frontend/src/features/realtime/services/realtime.service.ts +107 -0
  269. package/frontend/src/features/storage/{page → pages}/StoragePage.tsx +1 -29
  270. package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +3 -3
  271. package/frontend/src/features/visualizer/{page → pages}/VisualizerPage.tsx +1 -35
  272. package/frontend/src/lib/contexts/SocketContext.tsx +119 -75
  273. package/frontend/src/lib/routing/AppRoutes.tsx +35 -20
  274. package/frontend/src/lib/utils/cloudMessaging.ts +1 -1
  275. package/frontend/src/lib/utils/menuItems.ts +24 -0
  276. package/frontend/src/lib/utils/utils.ts +14 -1
  277. package/frontend/tsconfig.json +25 -25
  278. package/frontend/tsconfig.node.json +9 -9
  279. package/functions/deno.json +24 -24
  280. package/functions/server.ts +315 -315
  281. package/i18n/README.ar.md +130 -130
  282. package/i18n/README.de.md +130 -130
  283. package/i18n/README.es.md +154 -154
  284. package/i18n/README.fr.md +134 -134
  285. package/i18n/README.hi.md +129 -129
  286. package/i18n/README.ja.md +174 -174
  287. package/i18n/README.ko.md +136 -136
  288. package/i18n/README.pt-BR.md +131 -131
  289. package/i18n/README.ru.md +129 -129
  290. package/i18n/README.zh-CN.md +133 -133
  291. package/openapi/ai.yaml +715 -715
  292. package/openapi/auth.yaml +1244 -1244
  293. package/openapi/email.yaml +158 -0
  294. package/openapi/functions.yaml +475 -475
  295. package/openapi/health.yaml +29 -29
  296. package/openapi/logs.yaml +223 -223
  297. package/openapi/metadata.yaml +177 -177
  298. package/openapi/realtime.yaml +699 -0
  299. package/openapi/records.yaml +381 -381
  300. package/openapi/secrets.yaml +370 -370
  301. package/openapi/storage.yaml +875 -875
  302. package/openapi/tables.yaml +463 -463
  303. package/package.json +97 -97
  304. package/shared-schemas/package.json +31 -31
  305. package/shared-schemas/src/ai.schema.ts +63 -59
  306. package/shared-schemas/src/auth-api.schema.ts +352 -339
  307. package/shared-schemas/src/auth.schema.ts +1 -1
  308. package/shared-schemas/src/database-api.schema.ts +32 -1
  309. package/shared-schemas/src/database.schema.ts +39 -0
  310. package/shared-schemas/src/docs.schema.ts +26 -0
  311. package/shared-schemas/src/email-api.schema.ts +30 -0
  312. package/shared-schemas/src/index.ts +4 -0
  313. package/shared-schemas/src/metadata.schema.ts +9 -0
  314. package/shared-schemas/src/realtime-api.schema.ts +111 -0
  315. package/shared-schemas/src/realtime.schema.ts +143 -0
  316. package/shared-schemas/tsconfig.json +21 -21
  317. package/tsconfig.json +7 -7
  318. package/zeabur/README.md +13 -13
  319. package/zeabur/template.yml +1032 -1032
  320. package/.cursor/rules/cursor-rules.mdc +0 -94
  321. package/frontend/src/features/database/hooks/useFullMetadata.ts +0 -18
  322. package/test-gemini.sh +0 -35
  323. package/test-usage-admin.sh +0 -57
  324. package/test-usage.sh +0 -50
  325. /package/frontend/src/features/ai/{page → pages}/AIPage.tsx +0 -0
  326. /package/frontend/src/features/auth/{page → pages}/AuthMethodsPage.tsx +0 -0
  327. /package/frontend/src/features/auth/{page → pages}/ConfigurationPage.tsx +0 -0
  328. /package/frontend/src/features/dashboard/{page → pages}/DashboardPage.tsx +0 -0
  329. /package/frontend/src/features/database/{page → pages}/SQLEditorPage.tsx +0 -0
  330. /package/frontend/src/features/database/{page → pages}/TemplatesPage.tsx +0 -0
  331. /package/frontend/src/features/login/{page → pages}/CloudLoginPage.tsx +0 -0
  332. /package/frontend/src/features/login/{page → pages}/LoginPage.tsx +0 -0
  333. /package/frontend/src/features/logs/{page → pages}/AuditsPage.tsx +0 -0
  334. /package/frontend/src/features/logs/{page → pages}/LogsPage.tsx +0 -0
  335. /package/frontend/src/features/logs/{page → pages}/MCPLogsPage.tsx +0 -0
@@ -1,209 +1,209 @@
1
- #!/bin/bash
2
-
3
- # Test Traditional REST Response Format
4
- # This script tests various API endpoints to ensure they follow traditional REST conventions
5
-
6
- # Get the directory where this script is located
7
- SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
8
-
9
- # Source the test configuration
10
- source "$SCRIPT_DIR/../test-config.sh"
11
-
12
- # Check requirements
13
- check_requirements
14
-
15
- print_blue "🧪 Testing Traditional REST Response Format..."
16
-
17
- # API Configuration
18
- API_BASE="$TEST_API_BASE"
19
- TEST_USER_EMAIL="testuser_rest_$(date +%s)@example.com"
20
- TEST_USER_PASSWORD="TestPass123!"
21
- AUTH_TOKEN=""
22
-
23
- # Function to test response format
24
- test_response_format() {
25
- local test_name="$1"
26
- local response="$2"
27
- local expected_pattern="$3"
28
- local should_not_exist="${4:-false}"
29
-
30
- if [ "$should_not_exist" == "true" ]; then
31
- # Check that pattern does NOT exist
32
- if ! echo "$response" | grep -q "$expected_pattern"; then
33
- print_success "$test_name"
34
- return 0
35
- else
36
- print_fail "$test_name - found unwanted pattern: $expected_pattern"
37
- track_test_failure
38
- return 1
39
- fi
40
- else
41
- # Check that pattern exists
42
- if echo "$response" | grep -q "$expected_pattern"; then
43
- print_success "$test_name"
44
- return 0
45
- else
46
- print_fail "$test_name - missing pattern: $expected_pattern"
47
- echo " Response: $(echo "$response" | head -c 200)..."
48
- track_test_failure
49
- return 1
50
- fi
51
- fi
52
- }
53
-
54
- # 1. Test Health Endpoint
55
- print_info "1. Testing Health Endpoint (Success Response)"
56
- response=$(curl -s "$API_BASE/health")
57
- test_response_format "Direct data response" "$response" '"status":"ok"'
58
- test_response_format "No success wrapper" "$response" '"success":true' "true"
59
- test_response_format "No data wrapper" "$response" '"data":{' "true"
60
-
61
- # 2. Test Authentication Errors
62
- print_info "2. Testing Authentication Errors"
63
- response=$(curl -s "$API_BASE/auth/sessions/current")
64
- test_response_format "Error format" "$response" '"error":"AUTH_INVALID_CREDENTIALS"'
65
- test_response_format "Message field" "$response" '"message":"No token provided"'
66
- # JWT auth includes error and message fields
67
-
68
- # 3. Test Login Endpoint (Missing Credentials)
69
- print_info "3. Testing Login Endpoint (Missing Credentials)"
70
- response=$(curl -s -X POST "$API_BASE/auth/sessions" \
71
- -H "Content-Type: application/json" \
72
- -d '{}')
73
- test_response_format "Error response" "$response" '"error":"INVALID_INPUT"'
74
- test_response_format "Message field" "$response" '"message":"email: Required, password: Required"'
75
-
76
- # 4. Test Invalid Endpoint (404)
77
- print_info "4. Testing Invalid Endpoint (404)"
78
- response=$(curl -s "$API_BASE/nonexistent")
79
- test_response_format "404 error" "$response" '"statusCode":404'
80
- test_response_format "Not found message" "$response" '"error":"NOT_FOUND"'
81
-
82
- ADMIN_TOKEN=$(get_admin_token)
83
-
84
- # 5. Test with Authentication
85
- print_info "5. Creating test user for authenticated tests"
86
- auth_response=$(curl -s -X POST "$API_BASE/auth/users" \
87
- -H "Content-Type: application/json" \
88
- -d "{
89
- \"email\": \"$TEST_USER_EMAIL\",
90
- \"password\": \"$TEST_USER_PASSWORD\",
91
- \"name\": \"Test User\"
92
- }")
93
-
94
- # Check if registration was successful
95
- if echo "$auth_response" | grep -q '"accessToken"'; then
96
- AUTH_TOKEN=$(echo "$auth_response" | grep -o '"accessToken":"[^"]*' | cut -d'"' -f4)
97
- print_success "User registered successfully"
98
- register_test_user "$TEST_USER_EMAIL"
99
-
100
- # Test authenticated endpoints
101
- print_info "6. Testing Database Tables List (Authenticated)"
102
- response=$(curl -s "$API_BASE/database/tables" \
103
- -H "Authorization: Bearer $ADMIN_TOKEN")
104
- test_response_format "Direct array response" "$response" '^\['
105
- test_response_format "No wrapper object" "$response" '"data":\[' "true"
106
-
107
- # Test table creation
108
- print_info "7. Testing Create Table (Success Response)"
109
- TABLE_NAME="test_rest_table_$(date +%s)"
110
- response=$(curl -s -X POST "$API_BASE/database/tables" \
111
- -H "Authorization: Bearer $ADMIN_TOKEN" \
112
- -H "Content-Type: application/json" \
113
- -d "{
114
- \"tableName\": \"$TABLE_NAME\",
115
- \"rlsEnabled\": false,
116
- \"columns\": [
117
- {\"columnName\": \"id\", \"type\": \"uuid\", \"isNullable\": false, \"isUnique\": false, \"defaultValue\": \"gen_random_uuid()\"},
118
- {\"columnName\": \"title\", \"type\": \"string\", \"isNullable\": false, \"isUnique\": false}
119
- ]
120
- }")
121
-
122
- if echo "$response" | grep -q '"tableName"'; then
123
- print_success "Table created"
124
- register_test_table "$TABLE_NAME"
125
- test_response_format "Direct object response" "$response" "\"tableName\":\"$TABLE_NAME\""
126
- test_response_format "No success wrapper" "$response" '"success":true' "true"
127
- else
128
- print_fail "Table creation failed"
129
- echo "Response: $response"
130
- track_test_failure
131
- fi
132
-
133
- # Test pagination headers
134
- print_info "8. Testing Pagination Headers"
135
- # Use -I for headers, but we need both headers and body
136
- full_response=$(curl -s -i "$API_BASE/logs/audits?limit=10" \
137
- -H "Authorization: Bearer $ADMIN_TOKEN")
138
-
139
- # Extract headers (everything before empty line)
140
- headers=$(echo "$full_response" | awk 'BEGIN{RS="\r\n\r\n"} NR==1')
141
-
142
- # Test for PostgREST-style Content-Range header (format: start-end/total)
143
- test_response_format "Content-Range header" "$headers" 'Content-Range:'
144
- test_response_format "Preference-Applied header" "$headers" 'Preference-Applied:'
145
-
146
- else
147
- print_fail "Failed to register user"
148
- echo "Response: $auth_response"
149
- track_test_failure
150
- fi
151
-
152
- # 9. Test Storage API (requires API key)
153
- print_info "9. Testing Storage API Format"
154
- # First get admin token if we don't have it
155
- if [ -z "$AUTH_TOKEN" ]; then
156
- admin_token=$(get_admin_token)
157
- else
158
- admin_token="$AUTH_TOKEN"
159
- fi
160
-
161
- # Try to get API key from the API endpoint first
162
- if [ -n "$admin_token" ]; then
163
- api_key_response=$(curl -s "$API_BASE/metadata/api-key" \
164
- -H "Authorization: Bearer $admin_token")
165
- API_KEY=$(echo "$api_key_response" | grep -o '"apiKey":"[^"]*' | cut -d'"' -f4)
166
- fi
167
-
168
- # If that fails, try the helper function
169
- if [ -z "$API_KEY" ]; then
170
- API_KEY=$(get_admin_api_key)
171
- fi
172
-
173
- # Export for cleanup
174
- if [ -n "$API_KEY" ]; then
175
- export ACCESS_API_KEY="$API_KEY"
176
- # List buckets
177
- response=$(curl -s "$API_BASE/storage/buckets" \
178
- -H "Authorization: Bearer $API_KEY")
179
- test_response_format "Direct array for buckets" "$response" '^\['
180
-
181
- # Create a test bucket
182
- BUCKET_NAME="test-rest-bucket-$(date +%s)"
183
- response=$(curl -s -X POST "$API_BASE/storage/buckets" \
184
- -H "Content-Type: application/json" \
185
- -H "Authorization: Bearer $API_KEY" \
186
- -d "{\"bucketName\": \"$BUCKET_NAME\", \"isPublic\": true}")
187
-
188
- if echo "$response" | grep -q '"bucketName"'; then
189
- print_success "Bucket created"
190
- register_test_bucket "$BUCKET_NAME"
191
- test_response_format "Success message field" "$response" '"message":"Bucket created successfully"'
192
- test_response_format "NextAction guidance" "$response" '"nextActions":'
193
- else
194
- print_fail "Bucket creation failed"
195
- echo "Response: $response"
196
- track_test_failure
197
- fi
198
- else
199
- print_info "Skipping storage tests (no API key available)"
200
- fi
201
-
202
- # Summary
203
- echo ""
204
- print_blue "=========================================="
205
- print_blue "Traditional REST Format Test Complete"
206
- print_blue "=========================================="
207
-
208
- # Exit with proper status
1
+ #!/bin/bash
2
+
3
+ # Test Traditional REST Response Format
4
+ # This script tests various API endpoints to ensure they follow traditional REST conventions
5
+
6
+ # Get the directory where this script is located
7
+ SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
8
+
9
+ # Source the test configuration
10
+ source "$SCRIPT_DIR/../test-config.sh"
11
+
12
+ # Check requirements
13
+ check_requirements
14
+
15
+ print_blue "🧪 Testing Traditional REST Response Format..."
16
+
17
+ # API Configuration
18
+ API_BASE="$TEST_API_BASE"
19
+ TEST_USER_EMAIL="testuser_rest_$(date +%s)@example.com"
20
+ TEST_USER_PASSWORD="TestPass123!"
21
+ AUTH_TOKEN=""
22
+
23
+ # Function to test response format
24
+ test_response_format() {
25
+ local test_name="$1"
26
+ local response="$2"
27
+ local expected_pattern="$3"
28
+ local should_not_exist="${4:-false}"
29
+
30
+ if [ "$should_not_exist" == "true" ]; then
31
+ # Check that pattern does NOT exist
32
+ if ! echo "$response" | grep -q "$expected_pattern"; then
33
+ print_success "$test_name"
34
+ return 0
35
+ else
36
+ print_fail "$test_name - found unwanted pattern: $expected_pattern"
37
+ track_test_failure
38
+ return 1
39
+ fi
40
+ else
41
+ # Check that pattern exists
42
+ if echo "$response" | grep -q "$expected_pattern"; then
43
+ print_success "$test_name"
44
+ return 0
45
+ else
46
+ print_fail "$test_name - missing pattern: $expected_pattern"
47
+ echo " Response: $(echo "$response" | head -c 200)..."
48
+ track_test_failure
49
+ return 1
50
+ fi
51
+ fi
52
+ }
53
+
54
+ # 1. Test Health Endpoint
55
+ print_info "1. Testing Health Endpoint (Success Response)"
56
+ response=$(curl -s "$API_BASE/health")
57
+ test_response_format "Direct data response" "$response" '"status":"ok"'
58
+ test_response_format "No success wrapper" "$response" '"success":true' "true"
59
+ test_response_format "No data wrapper" "$response" '"data":{' "true"
60
+
61
+ # 2. Test Authentication Errors
62
+ print_info "2. Testing Authentication Errors"
63
+ response=$(curl -s "$API_BASE/auth/sessions/current")
64
+ test_response_format "Error format" "$response" '"error":"AUTH_INVALID_CREDENTIALS"'
65
+ test_response_format "Message field" "$response" '"message":"No token provided"'
66
+ # JWT auth includes error and message fields
67
+
68
+ # 3. Test Login Endpoint (Missing Credentials)
69
+ print_info "3. Testing Login Endpoint (Missing Credentials)"
70
+ response=$(curl -s -X POST "$API_BASE/auth/sessions" \
71
+ -H "Content-Type: application/json" \
72
+ -d '{}')
73
+ test_response_format "Error response" "$response" '"error":"INVALID_INPUT"'
74
+ test_response_format "Message field" "$response" '"message":"email: Required, password: Required"'
75
+
76
+ # 4. Test Invalid Endpoint (404)
77
+ print_info "4. Testing Invalid Endpoint (404)"
78
+ response=$(curl -s "$API_BASE/nonexistent")
79
+ test_response_format "404 error" "$response" '"statusCode":404'
80
+ test_response_format "Not found message" "$response" '"error":"NOT_FOUND"'
81
+
82
+ ADMIN_TOKEN=$(get_admin_token)
83
+
84
+ # 5. Test with Authentication
85
+ print_info "5. Creating test user for authenticated tests"
86
+ auth_response=$(curl -s -X POST "$API_BASE/auth/users" \
87
+ -H "Content-Type: application/json" \
88
+ -d "{
89
+ \"email\": \"$TEST_USER_EMAIL\",
90
+ \"password\": \"$TEST_USER_PASSWORD\",
91
+ \"name\": \"Test User\"
92
+ }")
93
+
94
+ # Check if registration was successful
95
+ if echo "$auth_response" | grep -q '"accessToken"'; then
96
+ AUTH_TOKEN=$(echo "$auth_response" | grep -o '"accessToken":"[^"]*' | cut -d'"' -f4)
97
+ print_success "User registered successfully"
98
+ register_test_user "$TEST_USER_EMAIL"
99
+
100
+ # Test authenticated endpoints
101
+ print_info "6. Testing Database Tables List (Authenticated)"
102
+ response=$(curl -s "$API_BASE/database/tables" \
103
+ -H "Authorization: Bearer $ADMIN_TOKEN")
104
+ test_response_format "Direct array response" "$response" '^\['
105
+ test_response_format "No wrapper object" "$response" '"data":\[' "true"
106
+
107
+ # Test table creation
108
+ print_info "7. Testing Create Table (Success Response)"
109
+ TABLE_NAME="test_rest_table_$(date +%s)"
110
+ response=$(curl -s -X POST "$API_BASE/database/tables" \
111
+ -H "Authorization: Bearer $ADMIN_TOKEN" \
112
+ -H "Content-Type: application/json" \
113
+ -d "{
114
+ \"tableName\": \"$TABLE_NAME\",
115
+ \"rlsEnabled\": false,
116
+ \"columns\": [
117
+ {\"columnName\": \"id\", \"type\": \"uuid\", \"isNullable\": false, \"isUnique\": false, \"defaultValue\": \"gen_random_uuid()\"},
118
+ {\"columnName\": \"title\", \"type\": \"string\", \"isNullable\": false, \"isUnique\": false}
119
+ ]
120
+ }")
121
+
122
+ if echo "$response" | grep -q '"tableName"'; then
123
+ print_success "Table created"
124
+ register_test_table "$TABLE_NAME"
125
+ test_response_format "Direct object response" "$response" "\"tableName\":\"$TABLE_NAME\""
126
+ test_response_format "No success wrapper" "$response" '"success":true' "true"
127
+ else
128
+ print_fail "Table creation failed"
129
+ echo "Response: $response"
130
+ track_test_failure
131
+ fi
132
+
133
+ # Test pagination headers
134
+ print_info "8. Testing Pagination Headers"
135
+ # Use -I for headers, but we need both headers and body
136
+ full_response=$(curl -s -i "$API_BASE/logs/audits?limit=10" \
137
+ -H "Authorization: Bearer $ADMIN_TOKEN")
138
+
139
+ # Extract headers (everything before empty line)
140
+ headers=$(echo "$full_response" | awk 'BEGIN{RS="\r\n\r\n"} NR==1')
141
+
142
+ # Test for PostgREST-style Content-Range header (format: start-end/total)
143
+ test_response_format "Content-Range header" "$headers" 'Content-Range:'
144
+ test_response_format "Preference-Applied header" "$headers" 'Preference-Applied:'
145
+
146
+ else
147
+ print_fail "Failed to register user"
148
+ echo "Response: $auth_response"
149
+ track_test_failure
150
+ fi
151
+
152
+ # 9. Test Storage API (requires API key)
153
+ print_info "9. Testing Storage API Format"
154
+ # First get admin token if we don't have it
155
+ if [ -z "$AUTH_TOKEN" ]; then
156
+ admin_token=$(get_admin_token)
157
+ else
158
+ admin_token="$AUTH_TOKEN"
159
+ fi
160
+
161
+ # Try to get API key from the API endpoint first
162
+ if [ -n "$admin_token" ]; then
163
+ api_key_response=$(curl -s "$API_BASE/metadata/api-key" \
164
+ -H "Authorization: Bearer $admin_token")
165
+ API_KEY=$(echo "$api_key_response" | grep -o '"apiKey":"[^"]*' | cut -d'"' -f4)
166
+ fi
167
+
168
+ # If that fails, try the helper function
169
+ if [ -z "$API_KEY" ]; then
170
+ API_KEY=$(get_admin_api_key)
171
+ fi
172
+
173
+ # Export for cleanup
174
+ if [ -n "$API_KEY" ]; then
175
+ export ACCESS_API_KEY="$API_KEY"
176
+ # List buckets
177
+ response=$(curl -s "$API_BASE/storage/buckets" \
178
+ -H "Authorization: Bearer $API_KEY")
179
+ test_response_format "Direct array for buckets" "$response" '^\['
180
+
181
+ # Create a test bucket
182
+ BUCKET_NAME="test-rest-bucket-$(date +%s)"
183
+ response=$(curl -s -X POST "$API_BASE/storage/buckets" \
184
+ -H "Content-Type: application/json" \
185
+ -H "Authorization: Bearer $API_KEY" \
186
+ -d "{\"bucketName\": \"$BUCKET_NAME\", \"isPublic\": true}")
187
+
188
+ if echo "$response" | grep -q '"bucketName"'; then
189
+ print_success "Bucket created"
190
+ register_test_bucket "$BUCKET_NAME"
191
+ test_response_format "Success message field" "$response" '"message":"Bucket created successfully"'
192
+ test_response_format "NextAction guidance" "$response" '"nextActions":'
193
+ else
194
+ print_fail "Bucket creation failed"
195
+ echo "Response: $response"
196
+ track_test_failure
197
+ fi
198
+ else
199
+ print_info "Skipping storage tests (no API key available)"
200
+ fi
201
+
202
+ # Summary
203
+ echo ""
204
+ print_blue "=========================================="
205
+ print_blue "Traditional REST Format Test Complete"
206
+ print_blue "=========================================="
207
+
208
+ # Exit with proper status
209
209
  exit_with_status
@@ -1,51 +1,51 @@
1
- # Manual Tests
2
-
3
- This directory contains tests that need to be run manually and are not included in the automated test suite.
4
-
5
- ## Better Auth Tests
6
-
7
- These tests are for the Better Auth v2 implementation.
8
-
9
- ### Running Better Auth Tests
10
-
11
- Run the Better Auth test:
12
- ```bash
13
- ./tests/manual/test-better-auth.sh
14
- ```
15
-
16
- ### Prerequisites
17
-
18
- - Docker must be running with the InsForge backend on port 7130
19
- - Admin credentials should be configured in environment variables:
20
- - `ADMIN_EMAIL` (default: admin@example.com)
21
- - `ADMIN_PASSWORD` (default: change-this-password)
22
-
23
- ### Example Commands
24
-
25
- ```bash
26
- # Run from the backend directory
27
- cd backend
28
-
29
- # Run Better Auth test
30
- ./tests/manual/test-better-auth.sh
31
-
32
- # Run with custom admin credentials
33
- ADMIN_EMAIL=admin@mycompany.com ADMIN_PASSWORD=mysecurepass ./tests/manual/test-better-auth.sh
34
- ```
35
-
36
- ### Test Coverage
37
-
38
- The test covers:
39
- - Admin authentication (sign-in, wrong password, non-admin email)
40
- - User registration and sign-in
41
- - Admin user management (list users with pagination)
42
- - JWT token verification (admin role and type claims)
43
- - Authorization checks (admin-only endpoints)
44
- - Error handling (invalid email format, missing fields)
45
-
46
- ### Why These Tests Are Manual
47
-
48
- These tests are kept separate because:
49
- 1. They use authentication endpoints (`/api/auth/v2/*`) that require specific setup
50
- 2. They test admin-specific functionality that needs manual verification
1
+ # Manual Tests
2
+
3
+ This directory contains tests that need to be run manually and are not included in the automated test suite.
4
+
5
+ ## Better Auth Tests
6
+
7
+ These tests are for the Better Auth v2 implementation.
8
+
9
+ ### Running Better Auth Tests
10
+
11
+ Run the Better Auth test:
12
+ ```bash
13
+ ./tests/manual/test-better-auth.sh
14
+ ```
15
+
16
+ ### Prerequisites
17
+
18
+ - Docker must be running with the InsForge backend on port 7130
19
+ - Admin credentials should be configured in environment variables:
20
+ - `ADMIN_EMAIL` (default: admin@example.com)
21
+ - `ADMIN_PASSWORD` (default: change-this-password)
22
+
23
+ ### Example Commands
24
+
25
+ ```bash
26
+ # Run from the backend directory
27
+ cd backend
28
+
29
+ # Run Better Auth test
30
+ ./tests/manual/test-better-auth.sh
31
+
32
+ # Run with custom admin credentials
33
+ ADMIN_EMAIL=admin@mycompany.com ADMIN_PASSWORD=mysecurepass ./tests/manual/test-better-auth.sh
34
+ ```
35
+
36
+ ### Test Coverage
37
+
38
+ The test covers:
39
+ - Admin authentication (sign-in, wrong password, non-admin email)
40
+ - User registration and sign-in
41
+ - Admin user management (list users with pagination)
42
+ - JWT token verification (admin role and type claims)
43
+ - Authorization checks (admin-only endpoints)
44
+ - Error handling (invalid email format, missing fields)
45
+
46
+ ### Why These Tests Are Manual
47
+
48
+ These tests are kept separate because:
49
+ 1. They use authentication endpoints (`/api/auth/v2/*`) that require specific setup
50
+ 2. They test admin-specific functionality that needs manual verification
51
51
  3. They verify JWT token structure and claims that may vary between environments
@@ -1,11 +1,11 @@
1
- -- Create large_table with basic structure
2
- CREATE TABLE IF NOT EXISTS large_table (
3
- id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
4
- user_id UUID NOT NULL,
5
- title TEXT NOT NULL,
6
- content TEXT,
7
- status VARCHAR(50) DEFAULT 'active',
8
- metadata JSONB DEFAULT '{}',
9
- created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
10
- updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
1
+ -- Create large_table with basic structure
2
+ CREATE TABLE IF NOT EXISTS large_table (
3
+ id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
4
+ user_id UUID NOT NULL,
5
+ title TEXT NOT NULL,
6
+ content TEXT,
7
+ status VARCHAR(50) DEFAULT 'active',
8
+ metadata JSONB DEFAULT '{}',
9
+ created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
10
+ updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
11
11
  );