insforge 1.2.10 → 1.4.8

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 (506) 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 +46 -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 +30 -28
  25. package/auth/src/lib/broadcastService.ts +4 -4
  26. package/auth/src/lib/insforge.ts +8 -0
  27. package/auth/src/main.tsx +2 -4
  28. package/auth/src/pages/SignInPage.tsx +5 -2
  29. package/auth/src/pages/SignUpPage.tsx +5 -2
  30. package/auth/src/pages/VerifyEmailPage.tsx +18 -0
  31. package/auth/tsconfig.json +33 -32
  32. package/auth/tsconfig.node.json +11 -11
  33. package/backend/package.json +82 -75
  34. package/backend/src/api/middlewares/rate-limiters.ts +127 -127
  35. package/backend/src/api/routes/ai/index.routes.ts +475 -468
  36. package/backend/src/api/routes/auth/index.routes.ts +720 -570
  37. package/backend/src/api/routes/auth/oauth.routes.ts +478 -448
  38. package/backend/src/api/routes/database/advance.routes.ts +37 -16
  39. package/backend/src/api/routes/database/index.routes.ts +80 -1
  40. package/backend/src/api/routes/database/records.routes.ts +48 -184
  41. package/backend/src/api/routes/database/rpc.routes.ts +69 -0
  42. package/backend/src/api/routes/database/tables.routes.ts +0 -14
  43. package/backend/src/api/routes/deployments/index.routes.ts +192 -0
  44. package/backend/src/api/routes/docs/index.routes.ts +76 -76
  45. package/backend/src/api/routes/email/index.routes.ts +35 -0
  46. package/backend/src/api/routes/functions/index.routes.ts +21 -15
  47. package/backend/src/api/routes/metadata/index.routes.ts +38 -0
  48. package/backend/src/api/routes/realtime/channels.routes.ts +81 -0
  49. package/backend/src/api/routes/realtime/index.routes.ts +12 -0
  50. package/backend/src/api/routes/realtime/messages.routes.ts +48 -0
  51. package/backend/src/api/routes/realtime/permissions.routes.ts +19 -0
  52. package/backend/src/api/routes/storage/index.routes.ts +18 -12
  53. package/backend/src/api/routes/usage/index.routes.ts +6 -4
  54. package/backend/src/api/routes/webhooks/index.routes.ts +109 -0
  55. package/backend/src/infra/database/database.manager.ts +14 -11
  56. package/backend/src/infra/database/migrations/000_create-base-tables.sql +141 -141
  57. package/backend/src/infra/database/migrations/001_create-helper-functions.sql +40 -40
  58. package/backend/src/infra/database/migrations/002_rename-auth-tables.sql +29 -29
  59. package/backend/src/infra/database/migrations/003_create-users-table.sql +55 -55
  60. package/backend/src/infra/database/migrations/004_add-reload-postgrest-func.sql +23 -23
  61. package/backend/src/infra/database/migrations/005_enable-project-admin-modify-users.sql +29 -29
  62. package/backend/src/infra/database/migrations/006_modify-ai-usage-table.sql +24 -24
  63. package/backend/src/infra/database/migrations/007_drop-metadata-table.sql +1 -1
  64. package/backend/src/infra/database/migrations/008_add-system-tables.sql +76 -76
  65. package/backend/src/infra/database/migrations/009_add-function-secrets.sql +23 -23
  66. package/backend/src/infra/database/migrations/010_modify-ai-config-modalities.sql +93 -93
  67. package/backend/src/infra/database/migrations/011_refactor-secrets-table.sql +15 -15
  68. package/backend/src/infra/database/migrations/012_add-storage-uploaded-by.sql +7 -7
  69. package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -44
  70. package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +7 -7
  71. package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +59 -59
  72. package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -24
  73. package/backend/src/infra/database/migrations/017_create-realtime-schema.sql +233 -0
  74. package/backend/src/infra/database/migrations/018_schema-rework.sql +441 -0
  75. package/backend/src/infra/database/migrations/019_create-deployments-table.sql +36 -0
  76. package/backend/src/infra/database/migrations/020_add-audio-modality.sql +11 -0
  77. package/backend/src/infra/database/migrations/bootstrap/bootstrap-migrations.js +103 -0
  78. package/backend/src/infra/realtime/realtime.manager.ts +246 -0
  79. package/backend/src/infra/realtime/webhook-sender.ts +82 -0
  80. package/backend/src/infra/security/token.manager.ts +216 -125
  81. package/backend/src/infra/socket/socket.manager.ts +198 -64
  82. package/backend/src/providers/ai/openrouter.provider.ts +24 -12
  83. package/backend/src/providers/database/base.provider.ts +39 -0
  84. package/backend/src/providers/database/cloud.provider.ts +159 -0
  85. package/backend/src/providers/deployments/vercel.provider.ts +516 -0
  86. package/backend/src/providers/email/base.provider.ts +4 -7
  87. package/backend/src/providers/email/cloud.provider.ts +84 -0
  88. package/backend/src/providers/oauth/apple.provider.ts +266 -0
  89. package/backend/src/providers/oauth/index.ts +1 -0
  90. package/backend/src/server.ts +329 -284
  91. package/backend/src/services/ai/ai-config.service.ts +6 -6
  92. package/backend/src/services/ai/ai-model.service.ts +60 -60
  93. package/backend/src/services/ai/ai-usage.service.ts +7 -7
  94. package/backend/src/services/ai/chat-completion.service.ts +415 -220
  95. package/backend/src/services/ai/helpers.ts +64 -64
  96. package/backend/src/services/ai/image-generation.service.ts +3 -3
  97. package/backend/src/services/ai/index.ts +13 -13
  98. package/backend/src/services/auth/auth-config.service.ts +4 -4
  99. package/backend/src/services/auth/auth-otp.service.ts +6 -6
  100. package/backend/src/services/auth/auth.service.ts +148 -74
  101. package/backend/src/services/auth/index.ts +4 -4
  102. package/backend/src/services/auth/oauth-config.service.ts +12 -12
  103. package/backend/src/services/database/database-advance.service.ts +19 -55
  104. package/backend/src/services/database/database-table.service.ts +38 -94
  105. package/backend/src/services/database/database.service.ts +127 -0
  106. package/backend/src/services/database/postgrest-proxy.service.ts +165 -0
  107. package/backend/src/services/deployments/deployment.service.ts +693 -0
  108. package/backend/src/services/email/email.service.ts +5 -7
  109. package/backend/src/services/functions/function.service.ts +61 -41
  110. package/backend/src/services/logs/audit.service.ts +10 -10
  111. package/backend/src/services/realtime/index.ts +3 -0
  112. package/backend/src/services/realtime/realtime-auth.service.ts +104 -0
  113. package/backend/src/services/realtime/realtime-channel.service.ts +237 -0
  114. package/backend/src/services/realtime/realtime-message.service.ts +260 -0
  115. package/backend/src/services/secrets/secret.service.ts +101 -27
  116. package/backend/src/services/storage/storage.service.ts +30 -30
  117. package/backend/src/services/usage/usage.service.ts +6 -6
  118. package/backend/src/types/ai.ts +8 -0
  119. package/backend/src/types/auth.ts +16 -1
  120. package/backend/src/types/database.ts +2 -0
  121. package/backend/src/types/deployments.ts +33 -0
  122. package/backend/src/types/realtime.ts +18 -0
  123. package/backend/src/types/socket.ts +7 -31
  124. package/backend/src/types/storage.ts +1 -1
  125. package/backend/src/types/webhooks.ts +45 -0
  126. package/backend/src/utils/cookies.ts +34 -0
  127. package/backend/src/utils/environment.ts +0 -14
  128. package/backend/src/utils/s3-config-loader.ts +64 -0
  129. package/backend/src/utils/seed.ts +79 -43
  130. package/backend/src/utils/sql-parser.ts +216 -0
  131. package/backend/src/utils/utils.ts +114 -114
  132. package/backend/src/utils/validations.ts +10 -10
  133. package/backend/tests/README.md +133 -133
  134. package/backend/tests/cleanup-all-test-data.sh +230 -230
  135. package/backend/tests/cloud/test-s3-multitenant.sh +131 -131
  136. package/backend/tests/local/comprehensive-curl-tests.sh +155 -155
  137. package/backend/tests/local/test-ai-config.sh +129 -129
  138. package/backend/tests/local/test-ai-usage.sh +80 -80
  139. package/backend/tests/local/test-auth-router.sh +143 -143
  140. package/backend/tests/local/test-database-router.sh +222 -222
  141. package/backend/tests/local/test-e2e.sh +240 -240
  142. package/backend/tests/local/test-fk-errors.sh +96 -96
  143. package/backend/tests/local/test-functions.sh +123 -123
  144. package/backend/tests/local/test-id-field.sh +200 -200
  145. package/backend/tests/local/test-logs.sh +132 -132
  146. package/backend/tests/local/test-public-bucket.sh +264 -264
  147. package/backend/tests/local/test-rpc.sh +141 -0
  148. package/backend/tests/local/test-secrets.sh +249 -249
  149. package/backend/tests/local/test-serverless-functions.sh.disabled +325 -325
  150. package/backend/tests/local/test-traditional-rest.sh +208 -208
  151. package/backend/tests/manual/README.md +50 -50
  152. package/backend/tests/manual/create-large-table-simple.sql +10 -10
  153. package/backend/tests/manual/seed-large-table.sql +100 -100
  154. package/backend/tests/manual/setup-large-table-extras.sql +33 -33
  155. package/backend/tests/manual/test-ai-model-plugins.sh +258 -0
  156. package/backend/tests/manual/test-bulk-upsert.sh +409 -409
  157. package/backend/tests/manual/test-database-advance.sh +296 -296
  158. package/backend/tests/manual/test-postgrest-stability.sh +191 -191
  159. package/backend/tests/manual/test-rawsql-export-import.sh +411 -411
  160. package/backend/tests/manual/test-rawsql-modes.sh +244 -244
  161. package/backend/tests/manual/test-universal-storage.sh +263 -263
  162. package/backend/tests/manual/test-users.sql +17 -17
  163. package/backend/tests/run-all-tests.sh +139 -139
  164. package/backend/tests/setup.ts +0 -0
  165. package/backend/tests/test-config.sh +338 -338
  166. package/backend/tests/unit/analyze-query.test.ts +697 -0
  167. package/backend/tests/unit/database-advance.test.ts +326 -0
  168. package/backend/tests/unit/helpers.test.ts +2 -2
  169. package/backend/tsconfig.json +22 -22
  170. package/claude-plugin/.claude-plugin/plugin.json +24 -24
  171. package/claude-plugin/README.md +133 -133
  172. package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +273 -270
  173. package/docker-compose.prod.yml +204 -200
  174. package/docker-compose.yml +232 -228
  175. package/docker-init/db/db-init.sql +97 -97
  176. package/docker-init/db/jwt.sql +5 -5
  177. package/docker-init/db/postgresql.conf +16 -16
  178. package/docker-init/logs/vector.yml +236 -236
  179. package/docs/README.md +44 -44
  180. package/docs/agent-docs/deployment.md +79 -0
  181. package/docs/agent-docs/real-time.md +269 -0
  182. package/docs/changelog.mdx +212 -67
  183. package/docs/core-concepts/ai/architecture.mdx +350 -372
  184. package/docs/core-concepts/ai/sdk.mdx +238 -213
  185. package/docs/core-concepts/authentication/architecture.mdx +276 -278
  186. package/docs/core-concepts/authentication/sdk.mdx +710 -414
  187. package/docs/core-concepts/authentication/ui-components/customization.mdx +733 -529
  188. package/docs/core-concepts/authentication/ui-components/nextjs.mdx +247 -221
  189. package/docs/core-concepts/authentication/ui-components/react-router.mdx +183 -184
  190. package/docs/core-concepts/authentication/ui-components/react.mdx +136 -129
  191. package/docs/core-concepts/database/architecture.mdx +292 -255
  192. package/docs/core-concepts/database/pgvector.mdx +138 -0
  193. package/docs/core-concepts/database/sdk.mdx +382 -382
  194. package/docs/core-concepts/deployments/architecture.mdx +152 -0
  195. package/docs/core-concepts/email/architecture.mdx +103 -0
  196. package/docs/core-concepts/email/sdk.mdx +53 -0
  197. package/docs/core-concepts/functions/architecture.mdx +105 -105
  198. package/docs/core-concepts/functions/sdk.mdx +183 -184
  199. package/docs/core-concepts/realtime/architecture.mdx +446 -0
  200. package/docs/core-concepts/realtime/sdk.mdx +409 -0
  201. package/docs/core-concepts/storage/architecture.mdx +243 -243
  202. package/docs/core-concepts/storage/sdk.mdx +253 -253
  203. package/docs/deployment/README.md +94 -94
  204. package/docs/deployment/deploy-to-aws-ec2.md +564 -564
  205. package/docs/deployment/deploy-to-azure-virtual-machines.md +312 -312
  206. package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -613
  207. package/docs/deployment/deploy-to-render.md +441 -441
  208. package/docs/deprecated/insforge-auth-api.md +214 -214
  209. package/docs/deprecated/insforge-auth-sdk.md +99 -99
  210. package/docs/deprecated/insforge-db-api.md +358 -358
  211. package/docs/deprecated/insforge-db-sdk.md +139 -139
  212. package/docs/deprecated/insforge-debug-sdk.md +156 -156
  213. package/docs/deprecated/insforge-debug.md +64 -64
  214. package/docs/deprecated/insforge-instructions.md +123 -123
  215. package/docs/deprecated/insforge-project.md +117 -117
  216. package/docs/deprecated/insforge-storage-api.md +278 -278
  217. package/docs/deprecated/insforge-storage-sdk.md +158 -158
  218. package/docs/docs.json +240 -210
  219. package/docs/examples/framework-guides/nextjs.mdx +131 -131
  220. package/docs/examples/framework-guides/nuxt.mdx +165 -165
  221. package/docs/examples/framework-guides/react.mdx +165 -165
  222. package/docs/examples/framework-guides/svelte.mdx +153 -153
  223. package/docs/examples/framework-guides/vue.mdx +159 -159
  224. package/docs/examples/overview.mdx +67 -67
  225. package/docs/favicon.png +0 -0
  226. package/docs/favicon.svg +4 -19
  227. package/docs/images/changelog/dec-2025/ai-integration.png +0 -0
  228. package/docs/images/changelog/dec-2025/ai-models.webp +0 -0
  229. package/docs/images/changelog/dec-2025/alipay-payment.webp +0 -0
  230. package/docs/images/changelog/dec-2025/apple-login.jpg +0 -0
  231. package/docs/images/changelog/dec-2025/apple-oauth.mp4 +0 -0
  232. package/docs/images/changelog/dec-2025/mcp-installer.png +0 -0
  233. package/docs/images/changelog/dec-2025/moreModels.png +0 -0
  234. package/docs/images/changelog/dec-2025/multi-region.webp +0 -0
  235. package/docs/images/changelog/dec-2025/postgres-connection.webp +0 -0
  236. package/docs/images/changelog/dec-2025/realtime-module.jpg +0 -0
  237. package/docs/images/changelog/dec-2025/realtime2.png +0 -0
  238. package/docs/images/icons/ai.svg +4 -4
  239. package/docs/images/logos/nextjs.svg +4 -4
  240. package/docs/images/logos/nuxt.svg +4 -4
  241. package/docs/images/logos/react.svg +5 -5
  242. package/docs/images/logos/svelte.svg +4 -4
  243. package/docs/images/logos/vue.svg +5 -5
  244. package/docs/images/mcp-setup/CC-MCP-1.mp4 +0 -0
  245. package/docs/images/mcp-setup/CC-MCP-2.mp4 +0 -0
  246. package/docs/images/mcp-setup/Cursor-MCP-1.mp4 +0 -0
  247. package/docs/images/mcp-setup/Cursor-MCP-2.mp4 +0 -0
  248. package/docs/images/mcp-setup/Cursor-MCP-3.mp4 +0 -0
  249. package/docs/images/mcp-setup/claude-code-connect.png +0 -0
  250. package/docs/images/mcp-setup/cline-1.png +0 -0
  251. package/docs/images/mcp-setup/cline-2.png +0 -0
  252. package/docs/images/mcp-setup/cline-3.png +0 -0
  253. package/docs/images/mcp-setup/connect-project.png +0 -0
  254. package/docs/images/mcp-setup/copilot-1.png +0 -0
  255. package/docs/images/mcp-setup/copilot-2.png +0 -0
  256. package/docs/images/mcp-setup/copilot-3.png +0 -0
  257. package/docs/images/mcp-setup/mcp-json-1.png +0 -0
  258. package/docs/images/mcp-setup/mcp-json-2.png +0 -0
  259. package/docs/images/mcp-setup/qoder-1.png +0 -0
  260. package/docs/images/mcp-setup/qoder-2.png +0 -0
  261. package/docs/images/mcp-setup/roocode-1.png +0 -0
  262. package/docs/images/mcp-setup/roocode-2.png +0 -0
  263. package/docs/images/mcp-setup/trae-1.png +0 -0
  264. package/docs/images/mcp-setup/trae-2.png +0 -0
  265. package/docs/images/mcp-setup/trae-3.png +0 -0
  266. package/docs/images/mcp-setup/trae-4.png +0 -0
  267. package/docs/images/mcp-setup/trae-5.png +0 -0
  268. package/docs/images/mcp-setup/windsurf-1.png +0 -0
  269. package/docs/images/mcp-setup/windsurf-2.png +0 -0
  270. package/docs/insforge-instructions-sdk.md +93 -88
  271. package/docs/introduction.mdx +46 -45
  272. package/docs/logo/dark.svg +22 -22
  273. package/docs/logo/light.svg +20 -20
  274. package/docs/mcp-setup.mdx +332 -0
  275. package/docs/oauth-server.mdx +563 -0
  276. package/docs/partnership.mdx +720 -646
  277. package/docs/quickstart.mdx +82 -82
  278. package/docs/showcase.mdx +52 -52
  279. package/docs/snippets/sdk-installation.mdx +21 -21
  280. package/docs/snippets/service-icons.mdx +27 -27
  281. package/docs/vscode-extension.mdx +74 -0
  282. package/eslint.config.js +1 -0
  283. package/examples/oauth/frontend-oauth-example.html +250 -250
  284. package/examples/response-examples.md +443 -443
  285. package/frontend/components.json +17 -17
  286. package/frontend/package.json +69 -69
  287. package/frontend/src/App.tsx +8 -3
  288. package/frontend/src/assets/icons/checkbox_checked.svg +6 -6
  289. package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -6
  290. package/frontend/src/assets/icons/checked.svg +3 -3
  291. package/frontend/src/assets/icons/connected.svg +3 -3
  292. package/frontend/src/assets/icons/error.svg +3 -3
  293. package/frontend/src/assets/icons/loader.svg +9 -9
  294. package/frontend/src/assets/icons/pencil.svg +4 -4
  295. package/frontend/src/assets/icons/refresh.svg +4 -4
  296. package/frontend/src/assets/icons/step_active.svg +3 -3
  297. package/frontend/src/assets/icons/step_inactive.svg +11 -11
  298. package/frontend/src/assets/icons/warning.svg +3 -3
  299. package/frontend/src/assets/logos/antigravity.svg +1 -0
  300. package/frontend/src/assets/logos/apple.svg +3 -3
  301. package/frontend/src/assets/logos/claude_code.svg +3 -3
  302. package/frontend/src/assets/logos/cline.svg +6 -6
  303. package/frontend/src/assets/logos/copilot.svg +10 -0
  304. package/frontend/src/assets/logos/cursor.svg +20 -20
  305. package/frontend/src/assets/logos/deepseek.svg +139 -0
  306. package/frontend/src/assets/logos/discord.svg +8 -8
  307. package/frontend/src/assets/logos/facebook.svg +3 -3
  308. package/frontend/src/assets/logos/gemini.svg +19 -19
  309. package/frontend/src/assets/logos/github.svg +5 -5
  310. package/frontend/src/assets/logos/google.svg +13 -13
  311. package/frontend/src/assets/logos/grok.svg +10 -10
  312. package/frontend/src/assets/logos/insforge_dark.svg +15 -15
  313. package/frontend/src/assets/logos/insforge_light.svg +15 -15
  314. package/frontend/src/assets/logos/instagram.svg +1 -1
  315. package/frontend/src/assets/logos/kiro.svg +9 -0
  316. package/frontend/src/assets/logos/linkedin.svg +3 -3
  317. package/frontend/src/assets/logos/openai.svg +10 -10
  318. package/frontend/src/assets/logos/qoder.svg +4 -0
  319. package/frontend/src/assets/logos/qwen.svg +15 -0
  320. package/frontend/src/assets/logos/roo_code.svg +9 -9
  321. package/frontend/src/assets/logos/spotify.svg +16 -16
  322. package/frontend/src/assets/logos/tiktok.svg +5 -5
  323. package/frontend/src/assets/logos/trae.svg +3 -3
  324. package/frontend/src/assets/logos/windsurf.svg +10 -10
  325. package/frontend/src/assets/logos/x.svg +3 -3
  326. package/frontend/src/components/CodeBlock.tsx +2 -2
  327. package/frontend/src/components/ConnectCTA.tsx +3 -2
  328. package/frontend/src/components/datagrid/DataGrid.tsx +90 -62
  329. package/frontend/src/components/datagrid/datagridTypes.tsx +2 -1
  330. package/frontend/src/components/datagrid/index.ts +1 -1
  331. package/frontend/src/components/index.ts +0 -1
  332. package/frontend/src/components/layout/AppHeader.tsx +13 -37
  333. package/frontend/src/components/layout/AppSidebar.tsx +85 -100
  334. package/frontend/src/components/layout/Layout.tsx +34 -32
  335. package/frontend/src/components/layout/PrimaryMenu.tsx +12 -4
  336. package/frontend/src/components/radix/Select.tsx +151 -151
  337. package/frontend/src/features/ai/components/AIConfigCard.tsx +200 -200
  338. package/frontend/src/features/ai/components/AIEmptyState.tsx +23 -23
  339. package/frontend/src/features/ai/components/ModalityFilterSidebar.tsx +102 -101
  340. package/frontend/src/features/ai/components/ModelSelectionDialog.tsx +135 -135
  341. package/frontend/src/features/ai/components/ModelSelectionGrid.tsx +51 -51
  342. package/frontend/src/features/ai/components/SystemPromptDialog.tsx +118 -118
  343. package/frontend/src/features/ai/components/index.ts +6 -6
  344. package/frontend/src/features/ai/helpers.ts +147 -141
  345. package/frontend/src/features/ai/{page → pages}/AIPage.tsx +166 -166
  346. package/frontend/src/features/auth/components/AuthPreview.tsx +96 -96
  347. package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +1 -0
  348. package/frontend/src/features/auth/components/UsersDataGrid.tsx +61 -31
  349. package/frontend/src/features/auth/components/index.ts +5 -5
  350. package/frontend/src/features/auth/helpers.tsx +8 -0
  351. package/frontend/src/features/auth/{page → pages}/AuthMethodsPage.tsx +275 -275
  352. package/frontend/src/features/auth/{page → pages}/UsersPage.tsx +0 -28
  353. package/frontend/src/features/dashboard/{page → pages}/DashboardPage.tsx +1 -1
  354. package/frontend/src/features/database/components/DatabaseDataGrid.tsx +0 -2
  355. package/frontend/src/features/database/components/ForeignKeyCell.tsx +38 -11
  356. package/frontend/src/features/database/components/ForeignKeyPopover.tsx +18 -8
  357. package/frontend/src/features/database/components/LinkRecordModal.tsx +61 -13
  358. package/frontend/src/features/database/components/RecordFormField.tsx +1 -1
  359. package/frontend/src/features/database/components/SQLModal.tsx +75 -0
  360. package/frontend/src/features/database/components/TableForm.tsx +0 -4
  361. package/frontend/src/features/database/components/TableSidebar.tsx +0 -3
  362. package/frontend/src/features/database/components/TablesEmptyState.tsx +1 -1
  363. package/frontend/src/features/database/components/TemplatePreview.tsx +1 -2
  364. package/frontend/src/features/database/constants.ts +16 -28
  365. package/frontend/src/features/database/hooks/useCSVImport.ts +3 -2
  366. package/frontend/src/features/database/hooks/useDatabase.ts +66 -0
  367. package/frontend/src/features/database/hooks/useRawSQL.ts +3 -2
  368. package/frontend/src/features/database/hooks/useTables.ts +30 -28
  369. package/frontend/src/features/database/index.ts +1 -0
  370. package/frontend/src/features/database/{page → pages}/FunctionsPage.tsx +29 -42
  371. package/frontend/src/features/database/{page → pages}/IndexesPage.tsx +34 -51
  372. package/frontend/src/features/database/{page → pages}/PoliciesPage.tsx +42 -58
  373. package/frontend/src/features/database/{page → pages}/SQLEditorPage.tsx +2 -2
  374. package/frontend/src/features/database/{page → pages}/TablesPage.tsx +0 -42
  375. package/frontend/src/features/database/{page → pages}/TriggersPage.tsx +34 -51
  376. package/frontend/src/features/database/services/advance.service.ts +1 -41
  377. package/frontend/src/features/database/services/database.service.ts +55 -0
  378. package/frontend/src/features/database/services/record.service.ts +4 -20
  379. package/frontend/src/features/database/services/table.service.ts +1 -10
  380. package/frontend/src/features/database/templates/ai-chatbot.ts +6 -6
  381. package/frontend/src/features/database/templates/ecommerce-platform.ts +2 -2
  382. package/frontend/src/features/database/templates/instagram-clone.ts +10 -10
  383. package/frontend/src/features/database/templates/notion-clone.ts +8 -8
  384. package/frontend/src/features/database/templates/reddit-clone.ts +10 -10
  385. package/frontend/src/features/deployments/components/DeploymentRow.tsx +93 -0
  386. package/frontend/src/features/deployments/components/DeploymentsEmptyState.tsx +15 -0
  387. package/frontend/src/features/deployments/hooks/useDeployments.ts +157 -0
  388. package/frontend/src/features/deployments/pages/DeploymentsPage.tsx +318 -0
  389. package/frontend/src/features/deployments/services/deployments.service.ts +63 -0
  390. package/frontend/src/features/functions/components/FunctionRow.tsx +72 -72
  391. package/frontend/src/features/functions/components/FunctionsSidebar.tsx +56 -56
  392. package/frontend/src/features/functions/components/SecretRow.tsx +3 -3
  393. package/frontend/src/features/functions/components/index.ts +5 -5
  394. package/frontend/src/features/functions/hooks/useFunctions.ts +5 -4
  395. package/frontend/src/features/functions/hooks/useSecrets.ts +6 -9
  396. package/frontend/src/features/functions/{page → pages}/FunctionsPage.tsx +21 -44
  397. package/frontend/src/features/functions/{page → pages}/SecretsPage.tsx +118 -116
  398. package/frontend/src/features/functions/services/function.service.ts +8 -25
  399. package/frontend/src/features/functions/services/secret.service.ts +23 -41
  400. package/frontend/src/features/login/{page → pages}/CloudLoginPage.tsx +125 -118
  401. package/frontend/src/features/logs/components/LogDetailPanel.tsx +41 -0
  402. package/frontend/src/features/logs/components/LogsDataGrid.tsx +32 -1
  403. package/frontend/src/features/logs/components/index.ts +1 -0
  404. package/frontend/src/features/logs/hooks/useMcpUsage.ts +13 -66
  405. package/frontend/src/features/logs/{page → pages}/LogsPage.tsx +36 -6
  406. package/frontend/src/features/onboard/components/ApiCredentialsSection.tsx +59 -0
  407. package/frontend/src/features/onboard/components/ConnectionStringSection.tsx +180 -0
  408. package/frontend/src/features/onboard/components/McpConnectionSection.tsx +159 -0
  409. package/frontend/src/features/onboard/components/OnboardingController.tsx +68 -0
  410. package/frontend/src/features/onboard/components/OnboardingModal.tsx +121 -267
  411. package/frontend/src/features/onboard/components/ShowPasswordButton.tsx +21 -0
  412. package/frontend/src/features/onboard/components/index.ts +9 -4
  413. package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +1 -1
  414. package/frontend/src/features/onboard/components/mcp/QoderDeeplinkGenerator.tsx +36 -0
  415. package/frontend/src/features/onboard/components/mcp/helpers.tsx +123 -98
  416. package/frontend/src/features/onboard/components/mcp/index.ts +4 -3
  417. package/frontend/src/features/onboard/index.ts +17 -13
  418. package/frontend/src/features/realtime/components/ChannelRow.tsx +83 -0
  419. package/frontend/src/features/realtime/components/EditChannelModal.tsx +246 -0
  420. package/frontend/src/features/realtime/components/MessageRow.tsx +85 -0
  421. package/frontend/src/features/realtime/components/RealtimeEmptyState.tsx +30 -0
  422. package/frontend/src/features/realtime/hooks/useRealtime.ts +218 -0
  423. package/frontend/src/features/realtime/index.ts +11 -0
  424. package/frontend/src/features/realtime/pages/RealtimeChannelsPage.tsx +172 -0
  425. package/frontend/src/features/realtime/pages/RealtimeMessagesPage.tsx +211 -0
  426. package/frontend/src/features/realtime/pages/RealtimePermissionsPage.tsx +191 -0
  427. package/frontend/src/features/realtime/services/realtime.service.ts +107 -0
  428. package/frontend/src/features/settings/pages/SettingsPage.tsx +349 -0
  429. package/frontend/src/features/storage/{page → pages}/StoragePage.tsx +1 -29
  430. package/frontend/src/features/visualizer/components/AuthNode.tsx +4 -4
  431. package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +24 -11
  432. package/frontend/src/features/visualizer/{page → pages}/VisualizerPage.tsx +11 -36
  433. package/frontend/src/index.css +249 -249
  434. package/frontend/src/lib/contexts/ModalContext.tsx +35 -0
  435. package/frontend/src/lib/contexts/SocketContext.tsx +119 -75
  436. package/frontend/src/lib/hooks/useMetadata.ts +45 -1
  437. package/frontend/src/lib/hooks/useModal.tsx +2 -0
  438. package/frontend/src/lib/routing/AppRoutes.tsx +103 -84
  439. package/frontend/src/lib/services/metadata.service.ts +20 -3
  440. package/frontend/src/lib/utils/cloudMessaging.ts +1 -1
  441. package/frontend/src/lib/utils/menuItems.ts +223 -183
  442. package/frontend/src/lib/utils/utils.ts +196 -183
  443. package/frontend/tsconfig.json +25 -25
  444. package/frontend/tsconfig.node.json +9 -9
  445. package/functions/deno.json +24 -24
  446. package/functions/server.ts +6 -6
  447. package/functions/worker-template.js +1 -1
  448. package/i18n/README.ar.md +130 -130
  449. package/i18n/README.de.md +130 -130
  450. package/i18n/README.es.md +154 -154
  451. package/i18n/README.fr.md +134 -134
  452. package/i18n/README.hi.md +129 -129
  453. package/i18n/README.ja.md +174 -174
  454. package/i18n/README.ko.md +136 -136
  455. package/i18n/README.pt-BR.md +131 -131
  456. package/i18n/README.ru.md +129 -129
  457. package/i18n/README.zh-CN.md +133 -133
  458. package/openapi/ai.yaml +825 -715
  459. package/openapi/auth.yaml +1324 -1244
  460. package/openapi/email.yaml +158 -0
  461. package/openapi/functions.yaml +475 -475
  462. package/openapi/health.yaml +29 -29
  463. package/openapi/logs.yaml +221 -223
  464. package/openapi/metadata.yaml +175 -177
  465. package/openapi/realtime.yaml +699 -0
  466. package/openapi/records.yaml +381 -381
  467. package/openapi/secrets.yaml +370 -370
  468. package/openapi/storage.yaml +875 -875
  469. package/openapi/tables.yaml +462 -463
  470. package/package.json +97 -97
  471. package/shared-schemas/package.json +31 -31
  472. package/shared-schemas/src/ai-api.schema.ts +251 -143
  473. package/shared-schemas/src/ai.schema.ts +8 -4
  474. package/shared-schemas/src/auth-api.schema.ts +380 -339
  475. package/shared-schemas/src/auth.schema.ts +18 -11
  476. package/shared-schemas/src/cloud-events.schema.ts +26 -0
  477. package/shared-schemas/src/database-api.schema.ts +32 -1
  478. package/shared-schemas/src/database.schema.ts +39 -0
  479. package/shared-schemas/src/deployments-api.schema.ts +55 -0
  480. package/shared-schemas/src/deployments.schema.ts +30 -0
  481. package/shared-schemas/src/docs.schema.ts +32 -0
  482. package/shared-schemas/src/email-api.schema.ts +30 -0
  483. package/shared-schemas/src/functions-api.schema.ts +13 -4
  484. package/shared-schemas/src/functions.schema.ts +1 -1
  485. package/shared-schemas/src/index.ts +22 -14
  486. package/shared-schemas/src/metadata.schema.ts +39 -4
  487. package/shared-schemas/src/realtime-api.schema.ts +111 -0
  488. package/shared-schemas/src/realtime.schema.ts +143 -0
  489. package/shared-schemas/src/secrets-api.schema.ts +44 -0
  490. package/shared-schemas/src/secrets.schema.ts +15 -0
  491. package/shared-schemas/tsconfig.json +21 -21
  492. package/tsconfig.json +7 -7
  493. package/zeabur/README.md +26 -13
  494. package/zeabur/template.yml +1001 -1032
  495. package/.cursor/rules/cursor-rules.mdc +0 -94
  496. package/backend/src/types/profile.ts +0 -55
  497. package/frontend/src/components/ProjectInfoModal.tsx +0 -128
  498. package/frontend/src/features/database/hooks/useFullMetadata.ts +0 -18
  499. package/test-gemini.sh +0 -35
  500. package/test-usage-admin.sh +0 -57
  501. package/test-usage.sh +0 -50
  502. /package/frontend/src/features/auth/{page → pages}/ConfigurationPage.tsx +0 -0
  503. /package/frontend/src/features/database/{page → pages}/TemplatesPage.tsx +0 -0
  504. /package/frontend/src/features/login/{page → pages}/LoginPage.tsx +0 -0
  505. /package/frontend/src/features/logs/{page → pages}/AuditsPage.tsx +0 -0
  506. /package/frontend/src/features/logs/{page → pages}/MCPLogsPage.tsx +0 -0
@@ -0,0 +1,141 @@
1
+ #!/bin/bash
2
+
3
+ # RPC endpoint test script
4
+
5
+ # Get the directory where this script is located
6
+ SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
7
+
8
+ # Source the test configuration
9
+ source "$SCRIPT_DIR/../test-config.sh"
10
+
11
+ echo "🧪 Testing RPC endpoint..."
12
+
13
+ # Configuration
14
+ API_BASE="$TEST_API_BASE"
15
+ AUTH_TOKEN=""
16
+ TEST_FUNC="test_rpc_add_$(date +%s)"
17
+
18
+ # 1. Login to get token
19
+ echo "🔑 Logging in to get authentication token..."
20
+ AUTH_TOKEN=$(get_admin_token)
21
+
22
+ if [ -n "$AUTH_TOKEN" ]; then
23
+ print_success "Login successful"
24
+ else
25
+ print_fail "Login failed"
26
+ echo "Please ensure the service is running and admin account exists"
27
+ exit 1
28
+ fi
29
+
30
+ # 2. Create test PostgreSQL function
31
+ echo ""
32
+ print_info "📝 Creating test RPC function ($TEST_FUNC)..."
33
+
34
+ create_func_response=$(curl -s -X POST "$API_BASE/database/advance/rawsql/unrestricted" \
35
+ -H "Authorization: Bearer $AUTH_TOKEN" \
36
+ -H "Content-Type: application/json" \
37
+ -d '{"query": "CREATE OR REPLACE FUNCTION '"$TEST_FUNC"'(a integer, b integer) RETURNS integer LANGUAGE sql AS $$ SELECT a + b; $$;"}')
38
+
39
+ if echo "$create_func_response" | grep -q '"error"'; then
40
+ print_fail "Failed to create test function"
41
+ echo "Response: $create_func_response"
42
+ exit 1
43
+ else
44
+ print_success "Test function created"
45
+ fi
46
+
47
+ # Wait for PostgREST schema cache to refresh
48
+ echo "⏳ Waiting for schema cache refresh..."
49
+ sleep 3
50
+
51
+ # 3. Test RPC POST with JSON body
52
+ echo ""
53
+ print_info "🔧 Test 1: RPC POST with JSON body"
54
+
55
+ rpc_post_response=$(curl -s -w "\n%{http_code}" -X POST "$API_BASE/database/rpc/$TEST_FUNC" \
56
+ -H "Authorization: Bearer $AUTH_TOKEN" \
57
+ -H "Content-Type: application/json" \
58
+ -d '{"a": 5, "b": 3}')
59
+
60
+ body=$(echo "$rpc_post_response" | sed '$d')
61
+ status=$(echo "$rpc_post_response" | tail -n 1)
62
+
63
+ if [ "$status" -eq 200 ] && [ "$body" = "8" ]; then
64
+ print_success "RPC POST: 5 + 3 = $body"
65
+ else
66
+ print_fail "RPC POST failed (status: $status)"
67
+ echo "Expected: 8, Got: $body"
68
+ fi
69
+
70
+ # 4. Test RPC GET with query params
71
+ echo ""
72
+ print_info "🔧 Test 2: RPC GET with query params"
73
+
74
+ rpc_get_response=$(curl -s -w "\n%{http_code}" "$API_BASE/database/rpc/$TEST_FUNC?a=10&b=20" \
75
+ -H "Authorization: Bearer $AUTH_TOKEN")
76
+
77
+ body=$(echo "$rpc_get_response" | sed '$d')
78
+ status=$(echo "$rpc_get_response" | tail -n 1)
79
+
80
+ if [ "$status" -eq 200 ] && [ "$body" = "30" ]; then
81
+ print_success "RPC GET: 10 + 20 = $body"
82
+ else
83
+ print_fail "RPC GET failed (status: $status)"
84
+ echo "Expected: 30, Got: $body"
85
+ fi
86
+
87
+ # 5. Test RPC with non-existent function (should return 404)
88
+ echo ""
89
+ print_info "🔧 Test 3: RPC call to non-existent function (expect 404)"
90
+
91
+ rpc_404_response=$(curl -s -w "\n%{http_code}" -X POST "$API_BASE/database/rpc/nonexistent_function_xyz" \
92
+ -H "Authorization: Bearer $AUTH_TOKEN" \
93
+ -H "Content-Type: application/json" \
94
+ -d '{}')
95
+
96
+ body=$(echo "$rpc_404_response" | sed '$d')
97
+ status=$(echo "$rpc_404_response" | tail -n 1)
98
+
99
+ if [ "$status" -eq 404 ]; then
100
+ print_success "Non-existent function returns 404"
101
+ else
102
+ print_fail "Expected 404, got $status"
103
+ echo "Response: $body"
104
+ fi
105
+
106
+ # 6. Test RPC with wrong parameter types
107
+ echo ""
108
+ print_info "🔧 Test 4: RPC with wrong parameter types (expect error)"
109
+
110
+ rpc_error_response=$(curl -s -w "\n%{http_code}" -X POST "$API_BASE/database/rpc/$TEST_FUNC" \
111
+ -H "Authorization: Bearer $AUTH_TOKEN" \
112
+ -H "Content-Type: application/json" \
113
+ -d '{"a": "not_a_number", "b": 3}')
114
+
115
+ body=$(echo "$rpc_error_response" | sed '$d')
116
+ status=$(echo "$rpc_error_response" | tail -n 1)
117
+
118
+ if [ "$status" -ge 400 ]; then
119
+ print_success "Invalid params return error ($status)"
120
+ else
121
+ print_fail "Expected error status, got $status"
122
+ echo "Response: $body"
123
+ fi
124
+
125
+ # 7. Cleanup - drop the test function
126
+ echo ""
127
+ print_info "🧹 Cleaning up test function..."
128
+
129
+ cleanup_response=$(curl -s -X POST "$API_BASE/database/advance/rawsql/unrestricted" \
130
+ -H "Authorization: Bearer $AUTH_TOKEN" \
131
+ -H "Content-Type: application/json" \
132
+ -d '{"query": "DROP FUNCTION IF EXISTS '"$TEST_FUNC"'(integer, integer);"}')
133
+
134
+ if echo "$cleanup_response" | grep -q '"error"'; then
135
+ print_fail "Cleanup failed"
136
+ else
137
+ print_success "Test function dropped"
138
+ fi
139
+
140
+ echo ""
141
+ echo -e "${GREEN}🎉 RPC endpoint tests completed!${NC}"
@@ -1,250 +1,250 @@
1
- #!/bin/bash
2
-
3
- # Test secrets API endpoints (refactored to use _secrets table)
4
- # Tests CRUD operations for secrets and edge function integration
5
-
6
- # Get the directory where this script is located
7
- SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
8
- source "$SCRIPT_DIR/../test-config.sh"
9
-
10
- # API base URL
11
- API_BASE="${TEST_API_BASE:-http://localhost:7130/api}"
12
- DENO_BASE="${DENO_BASE:-http://localhost:7133}"
13
-
14
- print_blue "🔐 Testing Secrets API (refactored)..."
15
-
16
- # 1. Test authentication requirement
17
- print_info "1. Testing authentication requirement for secrets"
18
- response=$(curl -s -o /dev/null -w "%{http_code}" "$API_BASE/secrets")
19
- if [ "$response" = "401" ]; then
20
- print_success "Unauthorized without auth"
21
- else
22
- print_fail "Expected 401, got $response"
23
- track_test_failure
24
- fi
25
-
26
- # Get admin token
27
- print_info "2. Logging in as admin"
28
- ADMIN_TOKEN=$(get_admin_token)
29
- if [ -z "$ADMIN_TOKEN" ]; then
30
- print_fail "Failed to get admin token"
31
- exit 1
32
- fi
33
- print_success "Admin logged in"
34
-
35
- # 3. List initial secrets (should include BACKEND_INTERNAL_URL)
36
- print_info "3. Listing initial secrets"
37
- response=$(curl -s "$API_BASE/secrets" \
38
- -H "Authorization: Bearer $ADMIN_TOKEN")
39
-
40
- if echo "$response" | jq -e '.secrets | map(select(.key == "INSFORGE_INTERNAL_URL")) | length == 1' >/dev/null 2>&1; then
41
- print_success "System secret INSFORGE_INTERNAL_URL exists"
42
- else
43
- print_fail "Expected INSFORGE_INTERNAL_URL secret to exist"
44
- echo "Response: $response"
45
- track_test_failure
46
- fi
47
-
48
- # 4. Create a test secret
49
- print_info "4. Creating a test secret"
50
- TEST_KEY="TEST_SECRET_$(date +%s)"
51
- TEST_VALUE="test_value_12345"
52
-
53
- response=$(curl -s "$API_BASE/secrets" \
54
- -X POST \
55
- -H "Authorization: Bearer $ADMIN_TOKEN" \
56
- -H "Content-Type: application/json" \
57
- -d "{\"key\": \"$TEST_KEY\", \"value\": \"$TEST_VALUE\"}")
58
-
59
- if echo "$response" | grep -q "success.*true"; then
60
- print_success "Secret created successfully"
61
- SECRET_ID=$(echo "$response" | jq -r '.id')
62
- else
63
- print_fail "Failed to create secret"
64
- echo "Response: $response"
65
- track_test_failure
66
- fi
67
-
68
- # 5. Get the secret value
69
- print_info "5. Getting the test secret value"
70
- response=$(curl -s "$API_BASE/secrets/$TEST_KEY" \
71
- -H "Authorization: Bearer $ADMIN_TOKEN")
72
-
73
- if echo "$response" | jq -e ".value == \"$TEST_VALUE\"" >/dev/null 2>&1; then
74
- print_success "Secret value retrieved correctly"
75
- else
76
- print_fail "Failed to retrieve secret value"
77
- echo "Response: $response"
78
- track_test_failure
79
- fi
80
-
81
- # 6. Update the secret
82
- print_info "6. Updating the test secret"
83
- UPDATE_VALUE="updated_value_67890"
84
-
85
- response=$(curl -s "$API_BASE/secrets/$TEST_KEY" \
86
- -X PUT \
87
- -H "Authorization: Bearer $ADMIN_TOKEN" \
88
- -H "Content-Type: application/json" \
89
- -d "{\"value\": \"$UPDATE_VALUE\"}")
90
-
91
- if echo "$response" | grep -q "success.*true"; then
92
- print_success "Secret updated successfully"
93
- else
94
- print_fail "Failed to update secret"
95
- echo "Response: $response"
96
- track_test_failure
97
- fi
98
-
99
- # 7. Verify update
100
- print_info "7. Verifying secret update"
101
- response=$(curl -s "$API_BASE/secrets/$TEST_KEY" \
102
- -H "Authorization: Bearer $ADMIN_TOKEN")
103
-
104
- if echo "$response" | jq -e ".value == \"$UPDATE_VALUE\"" >/dev/null 2>&1; then
105
- print_success "Secret value updated correctly"
106
- else
107
- print_fail "Secret value not updated"
108
- echo "Response: $response"
109
- track_test_failure
110
- fi
111
-
112
- # 8. List secrets and verify our test secret exists
113
- print_info "8. Verifying secret exists in list"
114
- response=$(curl -s "$API_BASE/secrets" \
115
- -H "Authorization: Bearer $ADMIN_TOKEN")
116
-
117
- if echo "$response" | jq -e ".secrets[] | select(.key == \"$TEST_KEY\")" >/dev/null 2>&1; then
118
- print_success "Test secret found in list"
119
- IS_ACTIVE=$(echo "$response" | jq -r ".secrets[] | select(.key == \"$TEST_KEY\") | .isActive")
120
- if [ "$IS_ACTIVE" = "true" ]; then
121
- print_success "Secret is active"
122
- else
123
- print_fail "Secret is not active"
124
- track_test_failure
125
- fi
126
- else
127
- print_fail "Test secret not found in list"
128
- echo "Response: $response"
129
- track_test_failure
130
- fi
131
-
132
- # 9. Test edge function with secret
133
- print_info "9. Creating edge function to test secret access"
134
-
135
- # Create a simple function that returns the secret
136
- cat > /tmp/test-secrets-function.js << EOF
137
- module.exports = async function(request) {
138
- const testSecret = Deno.env.get('$TEST_KEY');
139
- const systemSecret = Deno.env.get('INSFORGE_INTERNAL_URL');
140
-
141
- return new Response(JSON.stringify({
142
- testSecretFound: !!testSecret,
143
- testSecretValue: testSecret === '$UPDATE_VALUE',
144
- systemSecretFound: !!systemSecret,
145
- denoEnvWorks: typeof Deno.env.get === 'function'
146
- }), {
147
- headers: { 'Content-Type': 'application/json' }
148
- });
149
- };
150
- EOF
151
-
152
- # Create the function
153
- FUNCTION_SLUG="test-secrets-fn-$(date +%s)"
154
- response=$(curl -s -X POST "$API_BASE/functions" \
155
- -H "Authorization: Bearer $ADMIN_TOKEN" \
156
- -H "Content-Type: application/json" \
157
- -d "{
158
- \"slug\": \"$FUNCTION_SLUG\",
159
- \"name\": \"Test Secrets Function\",
160
- \"code\": $(jq -Rs . < /tmp/test-secrets-function.js),
161
- \"status\": \"active\"
162
- }")
163
-
164
- if echo "$response" | grep -q "id"; then
165
- print_success "Edge function created"
166
-
167
- # Restart Deno to pick up new secrets (allow failure in CI)
168
- docker compose restart deno >/dev/null 2>&1 || true
169
- sleep 3
170
-
171
- # Test the function
172
- print_info "10. Testing edge function secret access"
173
- response=$(curl -s "$DENO_BASE/$FUNCTION_SLUG" || true)
174
-
175
- if [ -z "$response" ]; then
176
- print_info "Skipping edge function test - Deno not accessible (CI environment)"
177
- else
178
- if echo "$response" | jq -e '.testSecretValue == true and .systemSecretFound == true' >/dev/null 2>&1; then
179
- print_success "Edge function can access secrets"
180
- else
181
- print_fail "Edge function cannot access secrets properly"
182
- echo "Response: $response"
183
- track_test_failure
184
- fi
185
- fi
186
-
187
- # Clean up function
188
- curl -s -X DELETE "$API_BASE/functions/$FUNCTION_SLUG" \
189
- -H "Authorization: Bearer $ADMIN_TOKEN" >/dev/null 2>&1
190
- else
191
- print_fail "Failed to create edge function"
192
- echo "Response: $response"
193
- track_test_failure
194
- fi
195
-
196
- # 11. Test soft delete (mark as inactive)
197
- print_info "11. Deleting test secret (soft delete)"
198
- response=$(curl -s -X DELETE "$API_BASE/secrets/$TEST_KEY" \
199
- -H "Authorization: Bearer $ADMIN_TOKEN")
200
-
201
- if echo "$response" | grep -q "success.*true\|deleted"; then
202
- print_success "Secret deleted successfully"
203
- else
204
- print_fail "Failed to delete secret"
205
- echo "Response: $response"
206
- track_test_failure
207
- fi
208
-
209
- # 12. Verify secret is marked as inactive
210
- print_info "12. Verifying secret is marked as inactive"
211
- response=$(curl -s "$API_BASE/secrets" \
212
- -H "Authorization: Bearer $ADMIN_TOKEN")
213
-
214
- if echo "$response" | jq -e ".secrets[] | select(.key == \"$TEST_KEY\")" >/dev/null 2>&1; then
215
- IS_ACTIVE=$(echo "$response" | jq -r ".secrets[] | select(.key == \"$TEST_KEY\") | .isActive")
216
- if [ "$IS_ACTIVE" = "false" ]; then
217
- print_success "Secret is marked as inactive (soft delete)"
218
- else
219
- print_fail "Secret is still active after deletion"
220
- echo "isActive: $IS_ACTIVE"
221
- track_test_failure
222
- fi
223
- else
224
- # Secret might be completely hidden after deletion, which is also fine
225
- print_success "Secret no longer visible after deletion"
226
- fi
227
-
228
- # 13. Test that deleted secret returns 404
229
- print_info "13. Testing that deleted secret returns 404"
230
- response_code=$(curl -s -o /dev/null -w "%{http_code}" "$API_BASE/secrets/$TEST_KEY" \
231
- -H "Authorization: Bearer $ADMIN_TOKEN")
232
-
233
- if [ "$response_code" = "404" ]; then
234
- print_success "Deleted secret returns 404"
235
- else
236
- print_fail "Expected 404 for deleted secret, got $response_code"
237
- track_test_failure
238
- fi
239
-
240
-
241
- # Clean up
242
- rm -f /tmp/test-secrets-function.js
243
-
244
- # Summary
245
- echo ""
246
- print_blue "=========================================="
247
- print_blue "Secrets API Test Complete"
248
- print_blue "=========================================="
249
-
1
+ #!/bin/bash
2
+
3
+ # Test secrets API endpoints (uses system.secrets table)
4
+ # Tests CRUD operations for secrets and edge function integration
5
+
6
+ # Get the directory where this script is located
7
+ SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
8
+ source "$SCRIPT_DIR/../test-config.sh"
9
+
10
+ # API base URL
11
+ API_BASE="${TEST_API_BASE:-http://localhost:7130/api}"
12
+ DENO_BASE="${DENO_BASE:-http://localhost:7133}"
13
+
14
+ print_blue "🔐 Testing Secrets API (refactored)..."
15
+
16
+ # 1. Test authentication requirement
17
+ print_info "1. Testing authentication requirement for secrets"
18
+ response=$(curl -s -o /dev/null -w "%{http_code}" "$API_BASE/secrets")
19
+ if [ "$response" = "401" ]; then
20
+ print_success "Unauthorized without auth"
21
+ else
22
+ print_fail "Expected 401, got $response"
23
+ track_test_failure
24
+ fi
25
+
26
+ # Get admin token
27
+ print_info "2. Logging in as admin"
28
+ ADMIN_TOKEN=$(get_admin_token)
29
+ if [ -z "$ADMIN_TOKEN" ]; then
30
+ print_fail "Failed to get admin token"
31
+ exit 1
32
+ fi
33
+ print_success "Admin logged in"
34
+
35
+ # 3. List initial secrets (should include BACKEND_INTERNAL_URL)
36
+ print_info "3. Listing initial secrets"
37
+ response=$(curl -s "$API_BASE/secrets" \
38
+ -H "Authorization: Bearer $ADMIN_TOKEN")
39
+
40
+ if echo "$response" | jq -e '.secrets | map(select(.key == "INSFORGE_INTERNAL_URL")) | length == 1' >/dev/null 2>&1; then
41
+ print_success "System secret INSFORGE_INTERNAL_URL exists"
42
+ else
43
+ print_fail "Expected INSFORGE_INTERNAL_URL secret to exist"
44
+ echo "Response: $response"
45
+ track_test_failure
46
+ fi
47
+
48
+ # 4. Create a test secret
49
+ print_info "4. Creating a test secret"
50
+ TEST_KEY="TEST_SECRET_$(date +%s)"
51
+ TEST_VALUE="test_value_12345"
52
+
53
+ response=$(curl -s "$API_BASE/secrets" \
54
+ -X POST \
55
+ -H "Authorization: Bearer $ADMIN_TOKEN" \
56
+ -H "Content-Type: application/json" \
57
+ -d "{\"key\": \"$TEST_KEY\", \"value\": \"$TEST_VALUE\"}")
58
+
59
+ if echo "$response" | grep -q "success.*true"; then
60
+ print_success "Secret created successfully"
61
+ SECRET_ID=$(echo "$response" | jq -r '.id')
62
+ else
63
+ print_fail "Failed to create secret"
64
+ echo "Response: $response"
65
+ track_test_failure
66
+ fi
67
+
68
+ # 5. Get the secret value
69
+ print_info "5. Getting the test secret value"
70
+ response=$(curl -s "$API_BASE/secrets/$TEST_KEY" \
71
+ -H "Authorization: Bearer $ADMIN_TOKEN")
72
+
73
+ if echo "$response" | jq -e ".value == \"$TEST_VALUE\"" >/dev/null 2>&1; then
74
+ print_success "Secret value retrieved correctly"
75
+ else
76
+ print_fail "Failed to retrieve secret value"
77
+ echo "Response: $response"
78
+ track_test_failure
79
+ fi
80
+
81
+ # 6. Update the secret
82
+ print_info "6. Updating the test secret"
83
+ UPDATE_VALUE="updated_value_67890"
84
+
85
+ response=$(curl -s "$API_BASE/secrets/$TEST_KEY" \
86
+ -X PUT \
87
+ -H "Authorization: Bearer $ADMIN_TOKEN" \
88
+ -H "Content-Type: application/json" \
89
+ -d "{\"value\": \"$UPDATE_VALUE\"}")
90
+
91
+ if echo "$response" | grep -q "success.*true"; then
92
+ print_success "Secret updated successfully"
93
+ else
94
+ print_fail "Failed to update secret"
95
+ echo "Response: $response"
96
+ track_test_failure
97
+ fi
98
+
99
+ # 7. Verify update
100
+ print_info "7. Verifying secret update"
101
+ response=$(curl -s "$API_BASE/secrets/$TEST_KEY" \
102
+ -H "Authorization: Bearer $ADMIN_TOKEN")
103
+
104
+ if echo "$response" | jq -e ".value == \"$UPDATE_VALUE\"" >/dev/null 2>&1; then
105
+ print_success "Secret value updated correctly"
106
+ else
107
+ print_fail "Secret value not updated"
108
+ echo "Response: $response"
109
+ track_test_failure
110
+ fi
111
+
112
+ # 8. List secrets and verify our test secret exists
113
+ print_info "8. Verifying secret exists in list"
114
+ response=$(curl -s "$API_BASE/secrets" \
115
+ -H "Authorization: Bearer $ADMIN_TOKEN")
116
+
117
+ if echo "$response" | jq -e ".secrets[] | select(.key == \"$TEST_KEY\")" >/dev/null 2>&1; then
118
+ print_success "Test secret found in list"
119
+ IS_ACTIVE=$(echo "$response" | jq -r ".secrets[] | select(.key == \"$TEST_KEY\") | .isActive")
120
+ if [ "$IS_ACTIVE" = "true" ]; then
121
+ print_success "Secret is active"
122
+ else
123
+ print_fail "Secret is not active"
124
+ track_test_failure
125
+ fi
126
+ else
127
+ print_fail "Test secret not found in list"
128
+ echo "Response: $response"
129
+ track_test_failure
130
+ fi
131
+
132
+ # 9. Test edge function with secret
133
+ print_info "9. Creating edge function to test secret access"
134
+
135
+ # Create a simple function that returns the secret
136
+ cat > /tmp/test-secrets-function.js << EOF
137
+ module.exports = async function(request) {
138
+ const testSecret = Deno.env.get('$TEST_KEY');
139
+ const systemSecret = Deno.env.get('INSFORGE_INTERNAL_URL');
140
+
141
+ return new Response(JSON.stringify({
142
+ testSecretFound: !!testSecret,
143
+ testSecretValue: testSecret === '$UPDATE_VALUE',
144
+ systemSecretFound: !!systemSecret,
145
+ denoEnvWorks: typeof Deno.env.get === 'function'
146
+ }), {
147
+ headers: { 'Content-Type': 'application/json' }
148
+ });
149
+ };
150
+ EOF
151
+
152
+ # Create the function
153
+ FUNCTION_SLUG="test-secrets-fn-$(date +%s)"
154
+ response=$(curl -s -X POST "$API_BASE/functions" \
155
+ -H "Authorization: Bearer $ADMIN_TOKEN" \
156
+ -H "Content-Type: application/json" \
157
+ -d "{
158
+ \"slug\": \"$FUNCTION_SLUG\",
159
+ \"name\": \"Test Secrets Function\",
160
+ \"code\": $(jq -Rs . < /tmp/test-secrets-function.js),
161
+ \"status\": \"active\"
162
+ }")
163
+
164
+ if echo "$response" | grep -q "id"; then
165
+ print_success "Edge function created"
166
+
167
+ # Restart Deno to pick up new secrets (allow failure in CI)
168
+ docker compose restart deno >/dev/null 2>&1 || true
169
+ sleep 3
170
+
171
+ # Test the function
172
+ print_info "10. Testing edge function secret access"
173
+ response=$(curl -s "$DENO_BASE/$FUNCTION_SLUG" || true)
174
+
175
+ if [ -z "$response" ]; then
176
+ print_info "Skipping edge function test - Deno not accessible (CI environment)"
177
+ else
178
+ if echo "$response" | jq -e '.testSecretValue == true and .systemSecretFound == true' >/dev/null 2>&1; then
179
+ print_success "Edge function can access secrets"
180
+ else
181
+ print_fail "Edge function cannot access secrets properly"
182
+ echo "Response: $response"
183
+ track_test_failure
184
+ fi
185
+ fi
186
+
187
+ # Clean up function
188
+ curl -s -X DELETE "$API_BASE/functions/$FUNCTION_SLUG" \
189
+ -H "Authorization: Bearer $ADMIN_TOKEN" >/dev/null 2>&1
190
+ else
191
+ print_fail "Failed to create edge function"
192
+ echo "Response: $response"
193
+ track_test_failure
194
+ fi
195
+
196
+ # 11. Test soft delete (mark as inactive)
197
+ print_info "11. Deleting test secret (soft delete)"
198
+ response=$(curl -s -X DELETE "$API_BASE/secrets/$TEST_KEY" \
199
+ -H "Authorization: Bearer $ADMIN_TOKEN")
200
+
201
+ if echo "$response" | grep -q "success.*true\|deleted"; then
202
+ print_success "Secret deleted successfully"
203
+ else
204
+ print_fail "Failed to delete secret"
205
+ echo "Response: $response"
206
+ track_test_failure
207
+ fi
208
+
209
+ # 12. Verify secret is marked as inactive
210
+ print_info "12. Verifying secret is marked as inactive"
211
+ response=$(curl -s "$API_BASE/secrets" \
212
+ -H "Authorization: Bearer $ADMIN_TOKEN")
213
+
214
+ if echo "$response" | jq -e ".secrets[] | select(.key == \"$TEST_KEY\")" >/dev/null 2>&1; then
215
+ IS_ACTIVE=$(echo "$response" | jq -r ".secrets[] | select(.key == \"$TEST_KEY\") | .isActive")
216
+ if [ "$IS_ACTIVE" = "false" ]; then
217
+ print_success "Secret is marked as inactive (soft delete)"
218
+ else
219
+ print_fail "Secret is still active after deletion"
220
+ echo "isActive: $IS_ACTIVE"
221
+ track_test_failure
222
+ fi
223
+ else
224
+ # Secret might be completely hidden after deletion, which is also fine
225
+ print_success "Secret no longer visible after deletion"
226
+ fi
227
+
228
+ # 13. Test that deleted secret returns 404
229
+ print_info "13. Testing that deleted secret returns 404"
230
+ response_code=$(curl -s -o /dev/null -w "%{http_code}" "$API_BASE/secrets/$TEST_KEY" \
231
+ -H "Authorization: Bearer $ADMIN_TOKEN")
232
+
233
+ if [ "$response_code" = "404" ]; then
234
+ print_success "Deleted secret returns 404"
235
+ else
236
+ print_fail "Expected 404 for deleted secret, got $response_code"
237
+ track_test_failure
238
+ fi
239
+
240
+
241
+ # Clean up
242
+ rm -f /tmp/test-secrets-function.js
243
+
244
+ # Summary
245
+ echo ""
246
+ print_blue "=========================================="
247
+ print_blue "Secrets API Test Complete"
248
+ print_blue "=========================================="
249
+
250
250
  exit $TEST_FAILED