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,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 (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
+
250
250
  exit $TEST_FAILED