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
package/openapi/auth.yaml CHANGED
@@ -1,1244 +1,1324 @@
1
- openapi: 3.0.3
2
- info:
3
- title: Insforge Authentication API
4
- version: 2.0.0
5
- description: Authentication endpoints with separated auth and profile tables
6
-
7
- paths:
8
- /api/auth/public-config:
9
- get:
10
- summary: Get public authentication configuration
11
- description: Get all public authentication configuration including OAuth providers and email auth settings (public endpoint)
12
- tags:
13
- - Client
14
- responses:
15
- '200':
16
- description: Public authentication configuration
17
- content:
18
- application/json:
19
- schema:
20
- type: object
21
- properties:
22
- oAuthProviders:
23
- type: array
24
- items:
25
- type: object
26
- properties:
27
- provider:
28
- type: string
29
- enum: [google, github, discord, linkedin, facebook, microsoft]
30
- useSharedKey:
31
- type: boolean
32
- requireEmailVerification:
33
- type: boolean
34
- passwordMinLength:
35
- type: integer
36
- minimum: 4
37
- maximum: 128
38
- requireNumber:
39
- type: boolean
40
- requireLowercase:
41
- type: boolean
42
- requireUppercase:
43
- type: boolean
44
- requireSpecialChar:
45
- type: boolean
46
- verifyEmailRedirectTo:
47
- type: string
48
- nullable: true
49
- description: URL to redirect users after successful email verification (if not set, shows default success page)
50
- resetPasswordRedirectTo:
51
- type: string
52
- nullable: true
53
- description: URL to redirect users after successful password reset (if not set, shows default success page)
54
- verifyEmailMethod:
55
- type: string
56
- enum: [code, link]
57
- description: Method for email verification (code = 6-digit OTP, link = magic link)
58
- resetPasswordMethod:
59
- type: string
60
- enum: [code, link]
61
- description: Method for password reset (code = 6-digit OTP + exchange flow, link = magic link)
62
-
63
- /api/auth/config:
64
- get:
65
- summary: Get authentication configuration
66
- description: Get current authentication settings including all configuration options (admin only)
67
- tags:
68
- - Admin
69
- security:
70
- - bearerAuth: []
71
- responses:
72
- '200':
73
- description: Authentication configuration
74
- content:
75
- application/json:
76
- schema:
77
- type: object
78
- properties:
79
- id:
80
- type: string
81
- format: uuid
82
- requireEmailVerification:
83
- type: boolean
84
- passwordMinLength:
85
- type: integer
86
- minimum: 4
87
- maximum: 128
88
- requireNumber:
89
- type: boolean
90
- requireLowercase:
91
- type: boolean
92
- requireUppercase:
93
- type: boolean
94
- requireSpecialChar:
95
- type: boolean
96
- verifyEmailRedirectTo:
97
- type: string
98
- nullable: true
99
- description: URL to redirect users after successful email verification (if not set, shows default success page)
100
- resetPasswordRedirectTo:
101
- type: string
102
- nullable: true
103
- description: URL to redirect users after successful password reset (if not set, shows default success page)
104
- verifyEmailMethod:
105
- type: string
106
- enum: [code, link]
107
- description: Method for email verification (code = 6-digit OTP, link = magic link)
108
- resetPasswordMethod:
109
- type: string
110
- enum: [code, link]
111
- description: Method for password reset (code = 6-digit OTP + exchange flow, link = magic link)
112
- signInRedirectTo:
113
- type: string
114
- nullable: true
115
- description: URL to redirect users after successful sign in
116
- createdAt:
117
- type: string
118
- format: date-time
119
- updatedAt:
120
- type: string
121
- format: date-time
122
- '401':
123
- description: Unauthorized
124
- '403':
125
- description: Forbidden - Admin only
126
-
127
- put:
128
- summary: Update authentication configuration
129
- description: Update authentication settings (admin only)
130
- tags:
131
- - Admin
132
- security:
133
- - bearerAuth: []
134
- requestBody:
135
- required: true
136
- content:
137
- application/json:
138
- schema:
139
- type: object
140
- properties:
141
- requireEmailVerification:
142
- type: boolean
143
- passwordMinLength:
144
- type: integer
145
- minimum: 4
146
- maximum: 128
147
- requireNumber:
148
- type: boolean
149
- requireLowercase:
150
- type: boolean
151
- requireUppercase:
152
- type: boolean
153
- requireSpecialChar:
154
- type: boolean
155
- verifyEmailRedirectTo:
156
- type: string
157
- nullable: true
158
- description: URL to redirect users after successful email verification (if not set, shows default success page)
159
- resetPasswordRedirectTo:
160
- type: string
161
- nullable: true
162
- description: URL to redirect users after successful password reset (if not set, shows default success page)
163
- verifyEmailMethod:
164
- type: string
165
- enum: [code, link]
166
- description: Method for email verification (code = 6-digit OTP, link = magic link)
167
- resetPasswordMethod:
168
- type: string
169
- enum: [code, link]
170
- description: Method for password reset (code = 6-digit OTP + exchange flow, link = magic link)
171
- signInRedirectTo:
172
- type: string
173
- nullable: true
174
- description: URL to redirect users after successful sign in
175
- responses:
176
- '200':
177
- description: Configuration updated successfully
178
- content:
179
- application/json:
180
- schema:
181
- type: object
182
- properties:
183
- id:
184
- type: string
185
- format: uuid
186
- requireEmailVerification:
187
- type: boolean
188
- passwordMinLength:
189
- type: integer
190
- minimum: 4
191
- maximum: 128
192
- requireNumber:
193
- type: boolean
194
- requireLowercase:
195
- type: boolean
196
- requireUppercase:
197
- type: boolean
198
- requireSpecialChar:
199
- type: boolean
200
- verifyEmailRedirectTo:
201
- type: string
202
- nullable: true
203
- description: URL to redirect users after successful email verification (if not set, shows default success page)
204
- resetPasswordRedirectTo:
205
- type: string
206
- nullable: true
207
- description: URL to redirect users after successful password reset (if not set, shows default success page)
208
- verifyEmailMethod:
209
- type: string
210
- enum: [code, link]
211
- resetPasswordMethod:
212
- type: string
213
- enum: [code, link]
214
- signInRedirectTo:
215
- type: string
216
- nullable: true
217
- createdAt:
218
- type: string
219
- format: date-time
220
- updatedAt:
221
- type: string
222
- format: date-time
223
- '400':
224
- description: Invalid request
225
- '401':
226
- description: Unauthorized
227
- '403':
228
- description: Forbidden - Admin only
229
-
230
- /api/auth/users:
231
- post:
232
- summary: Register new user
233
- description: Creates a new user account
234
- tags:
235
- - Client
236
- requestBody:
237
- required: true
238
- content:
239
- application/json:
240
- schema:
241
- type: object
242
- required:
243
- - email
244
- - password
245
- properties:
246
- email:
247
- type: string
248
- format: email
249
- example: user@example.com
250
- password:
251
- type: string
252
- description: Password meeting configured requirements (check /api/auth/email/config for current requirements)
253
- example: securepassword123
254
- name:
255
- type: string
256
- example: John Doe
257
- responses:
258
- '200':
259
- description: User created successfully
260
- content:
261
- application/json:
262
- schema:
263
- type: object
264
- properties:
265
- user:
266
- $ref: '#/components/schemas/UserResponse'
267
- accessToken:
268
- type: string
269
- nullable: true
270
- description: JWT authentication token (null if email verification required)
271
- requireEmailVerification:
272
- type: boolean
273
- description: Whether email verification is required before login
274
- redirectTo:
275
- type: string
276
- format: uri
277
- description: Optional URL to redirect user after registration (only present if email verification not required)
278
- '400':
279
- description: Invalid request
280
- '409':
281
- description: User already exists
282
-
283
- get:
284
- summary: List all users (admin only)
285
- description: Returns paginated list of users
286
- tags:
287
- - Admin
288
- security:
289
- - bearerAuth: []
290
- parameters:
291
- - name: offset
292
- in: query
293
- schema:
294
- type: string
295
- default: '0'
296
- description: Number of records to skip
297
- - name: limit
298
- in: query
299
- schema:
300
- type: string
301
- default: '10'
302
- description: Maximum number of records to return
303
- - name: search
304
- in: query
305
- schema:
306
- type: string
307
- description: Search by email or name
308
- responses:
309
- '200':
310
- description: List of users
311
- content:
312
- application/json:
313
- schema:
314
- type: object
315
- properties:
316
- data:
317
- type: array
318
- items:
319
- $ref: '#/components/schemas/UserResponse'
320
- pagination:
321
- type: object
322
- properties:
323
- offset:
324
- type: integer
325
- limit:
326
- type: integer
327
- total:
328
- type: integer
329
- '401':
330
- description: Unauthorized
331
- '403':
332
- description: Forbidden - Admin only
333
-
334
- delete:
335
- summary: Delete users (admin only)
336
- description: Delete multiple users by their IDs
337
- tags:
338
- - Admin
339
- security:
340
- - bearerAuth: []
341
- requestBody:
342
- required: true
343
- content:
344
- application/json:
345
- schema:
346
- type: object
347
- properties:
348
- userIds:
349
- type: array
350
- items:
351
- type: string
352
- required:
353
- - userIds
354
- responses:
355
- '200':
356
- description: Users deleted successfully
357
- content:
358
- application/json:
359
- schema:
360
- type: object
361
- properties:
362
- message:
363
- type: string
364
- deletedCount:
365
- type: integer
366
- '401':
367
- description: Unauthorized
368
- '403':
369
- description: Forbidden - Admin only
370
-
371
- /api/auth/users/{userId}:
372
- get:
373
- summary: Get specific user
374
- description: Get user details by ID (admin only)
375
- tags:
376
- - Admin
377
- security:
378
- - bearerAuth: []
379
- parameters:
380
- - name: userId
381
- in: path
382
- required: true
383
- schema:
384
- type: string
385
- format: uuid
386
- description: User ID
387
- responses:
388
- '200':
389
- description: User details
390
- content:
391
- application/json:
392
- schema:
393
- $ref: '#/components/schemas/UserResponse'
394
- '400':
395
- description: Invalid user ID format
396
- '401':
397
- description: Unauthorized
398
- '403':
399
- description: Forbidden - Admin only
400
- '404':
401
- description: User not found
402
-
403
- /api/auth/sessions:
404
- post:
405
- summary: User login
406
- description: Authenticates user and returns access token
407
- tags:
408
- - Client
409
- requestBody:
410
- required: true
411
- content:
412
- application/json:
413
- schema:
414
- type: object
415
- required:
416
- - email
417
- - password
418
- properties:
419
- email:
420
- type: string
421
- format: email
422
- password:
423
- type: string
424
- responses:
425
- '200':
426
- description: Login successful
427
- content:
428
- application/json:
429
- schema:
430
- type: object
431
- properties:
432
- user:
433
- $ref: '#/components/schemas/UserResponse'
434
- accessToken:
435
- type: string
436
- redirectTo:
437
- type: string
438
- format: uri
439
- description: Optional URL to redirect user after login (if configured)
440
- '401':
441
- description: Invalid credentials
442
- '403':
443
- description: Email verification required
444
-
445
- /api/auth/sessions/current:
446
- get:
447
- summary: Get current user
448
- description: Returns the currently authenticated user's basic info from JWT token
449
- tags:
450
- - Client
451
- security:
452
- - bearerAuth: []
453
- responses:
454
- '200':
455
- description: Current user info
456
- content:
457
- application/json:
458
- schema:
459
- type: object
460
- properties:
461
- user:
462
- type: object
463
- properties:
464
- id:
465
- type: string
466
- format: uuid
467
- email:
468
- type: string
469
- format: email
470
- role:
471
- type: string
472
- enum: [authenticated, project_admin]
473
- '401':
474
- description: Unauthorized
475
-
476
- /api/auth/admin/sessions:
477
- post:
478
- summary: Admin login
479
- description: Authenticates admin user for dashboard access
480
- tags:
481
- - Admin
482
- requestBody:
483
- required: true
484
- content:
485
- application/json:
486
- schema:
487
- type: object
488
- required:
489
- - email
490
- - password
491
- properties:
492
- email:
493
- type: string
494
- format: email
495
- password:
496
- type: string
497
- responses:
498
- '200':
499
- description: Admin login successful
500
- content:
501
- application/json:
502
- schema:
503
- type: object
504
- properties:
505
- user:
506
- $ref: '#/components/schemas/UserResponse'
507
- accessToken:
508
- type: string
509
- '401':
510
- description: Invalid credentials
511
- '403':
512
- description: User is not an admin
513
-
514
- /api/auth/admin/sessions/exchange:
515
- post:
516
- summary: Exchange cloud provider authorization code for admin session
517
- description: Verifies an authorization code/JWT from from Insforge Cloud platform and issues an internal admin session token with project_admin role
518
- tags:
519
- - Admin
520
- requestBody:
521
- required: true
522
- content:
523
- application/json:
524
- schema:
525
- type: object
526
- required:
527
- - code
528
- properties:
529
- code:
530
- type: string
531
- description: Authorization code or JWT from the Insforge
532
- example: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
533
- responses:
534
- '200':
535
- description: Cloud authorization verified, admin session created
536
- content:
537
- application/json:
538
- schema:
539
- type: object
540
- properties:
541
- user:
542
- $ref: '#/components/schemas/UserResponse'
543
- accessToken:
544
- type: string
545
- description: Internal JWT for admin authentication
546
- '400':
547
- description: Invalid authorization code or JWT verification failed
548
- content:
549
- application/json:
550
- schema:
551
- $ref: '#/components/schemas/ErrorResponse'
552
-
553
- /api/auth/tokens/anon:
554
- post:
555
- summary: Generate anonymous token
556
- description: Generate a non-expiring anonymous JWT token for public API access (admin only)
557
- tags:
558
- - Admin
559
- security:
560
- - bearerAuth: []
561
- responses:
562
- '200':
563
- description: Anonymous token generated successfully
564
- content:
565
- application/json:
566
- schema:
567
- type: object
568
- properties:
569
- accessToken:
570
- type: string
571
- description: Non-expiring anonymous JWT token
572
- example: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
573
- message:
574
- type: string
575
- description: Success message
576
- example: "Anonymous token generated successfully (never expires)"
577
- '401':
578
- description: Unauthorized - requires authentication
579
- '403':
580
- description: Forbidden - admin access required
581
-
582
- /api/auth/email/send-verification:
583
- post:
584
- summary: Send email verification (code or link based on config)
585
- description: Send email verification using the method configured in auth settings (verifyEmailMethod). When method is 'code', sends a 6-digit numeric code. When method is 'link', sends a magic link. Prevents user enumeration by returning success even if email doesn't exist.
586
- tags:
587
- - Client
588
- requestBody:
589
- required: true
590
- content:
591
- application/json:
592
- schema:
593
- type: object
594
- required:
595
- - email
596
- properties:
597
- email:
598
- type: string
599
- format: email
600
- example: user@example.com
601
- responses:
602
- '202':
603
- description: Verification email sent (if email exists). Message varies based on configured method.
604
- content:
605
- application/json:
606
- schema:
607
- type: object
608
- properties:
609
- success:
610
- type: boolean
611
- message:
612
- type: string
613
- example: "If your email is registered, we have sent you a verification code/link. Please check your inbox."
614
- '400':
615
- description: Invalid request
616
-
617
- /api/auth/email/verify:
618
- post:
619
- summary: Verify email with code or link
620
- description: |
621
- Verify email address using the method configured in auth settings (verifyEmailMethod):
622
- - Code verification: Provide both `email` and `otp` (6-digit numeric code)
623
- - Link verification: Provide only `otp` (64-character hex token from magic link)
624
-
625
- Successfully verified users will receive a session token.
626
-
627
- The email verification link sent to users always points to the backend API endpoint.
628
- If `verifyEmailRedirectTo` is configured, the backend will redirect to that URL after successful verification.
629
- Otherwise, a default success page is displayed.
630
- tags:
631
- - Client
632
- requestBody:
633
- required: true
634
- content:
635
- application/json:
636
- schema:
637
- type: object
638
- required:
639
- - otp
640
- properties:
641
- email:
642
- type: string
643
- format: email
644
- description: Required for numeric code verification, omit for magic link verification
645
- example: user@example.com
646
- otp:
647
- type: string
648
- description: Either a 6-digit numeric code or a 64-character hex token from magic link
649
- example: "123456"
650
- responses:
651
- '200':
652
- description: Email verified successfully, session created
653
- content:
654
- application/json:
655
- schema:
656
- type: object
657
- properties:
658
- user:
659
- $ref: '#/components/schemas/UserResponse'
660
- accessToken:
661
- type: string
662
- description: JWT authentication token
663
- redirectTo:
664
- type: string
665
- format: uri
666
- description: Optional URL to redirect user after verification (only present if configured)
667
- '400':
668
- description: Invalid verification code or token
669
- '401':
670
- description: Verification code/token expired or invalid
671
-
672
- /api/auth/email/send-reset-password:
673
- post:
674
- summary: Send password reset (code or link based on config)
675
- description: Send password reset email using the method configured in auth settings (resetPasswordMethod). When method is 'code', sends a 6-digit numeric code for two-step flow. When method is 'link', sends a magic link. Prevents user enumeration by returning success even if email doesn't exist.
676
- tags:
677
- - Client
678
- requestBody:
679
- required: true
680
- content:
681
- application/json:
682
- schema:
683
- type: object
684
- required:
685
- - email
686
- properties:
687
- email:
688
- type: string
689
- format: email
690
- example: user@example.com
691
- responses:
692
- '202':
693
- description: Password reset email sent (if email exists). Message varies based on configured method.
694
- content:
695
- application/json:
696
- schema:
697
- type: object
698
- properties:
699
- success:
700
- type: boolean
701
- message:
702
- type: string
703
- example: "If your email is registered, we have sent you a password reset code/link. Please check your inbox."
704
- '400':
705
- description: Invalid request
706
-
707
- /api/auth/email/exchange-reset-password-token:
708
- post:
709
- summary: Exchange reset password code for reset token
710
- description: |
711
- Step 1 of two-step password reset flow (only used when resetPasswordMethod is 'code'):
712
- 1. Verify the 6-digit code sent to user's email
713
- 2. Return a reset token that can be used to actually reset the password
714
-
715
- This endpoint is not used when resetPasswordMethod is 'link' (magic link flow is direct).
716
- tags:
717
- - Client
718
- requestBody:
719
- required: true
720
- content:
721
- application/json:
722
- schema:
723
- type: object
724
- required:
725
- - email
726
- - code
727
- properties:
728
- email:
729
- type: string
730
- format: email
731
- example: user@example.com
732
- code:
733
- type: string
734
- description: 6-digit numeric code from email
735
- example: "123456"
736
- responses:
737
- '200':
738
- description: Code verified successfully, reset token returned
739
- content:
740
- application/json:
741
- schema:
742
- type: object
743
- properties:
744
- token:
745
- type: string
746
- description: Reset token to be used in reset-password endpoint
747
- expiresAt:
748
- type: string
749
- format: date-time
750
- description: Token expiration timestamp
751
- '400':
752
- description: Invalid request
753
- '401':
754
- description: Invalid or expired code
755
-
756
- /api/auth/email/reset-password:
757
- post:
758
- summary: Reset password with token
759
- description: |
760
- Reset user password with a token. The token can be:
761
- - Magic link token (64-character hex token from send-reset-password when method is 'link')
762
- - Reset token (from exchange-reset-password-token after code verification when method is 'code')
763
-
764
- Both token types use RESET_PASSWORD purpose and are verified the same way.
765
-
766
- Flow summary:
767
- - Code method: send-reset-password → exchange-reset-password-token → reset-password (with resetToken)
768
- - Link method: send-reset-password reset-password (with link token directly)
769
- tags:
770
- - Client
771
- requestBody:
772
- required: true
773
- content:
774
- application/json:
775
- schema:
776
- type: object
777
- required:
778
- - newPassword
779
- - otp
780
- properties:
781
- newPassword:
782
- type: string
783
- description: New password meeting configured requirements
784
- example: newSecurePassword123
785
- otp:
786
- type: string
787
- description: Reset token (either from magic link or from exchange-reset-password-token endpoint)
788
- example: "a1b2c3d4..."
789
- responses:
790
- '200':
791
- description: Password reset successfully
792
- content:
793
- application/json:
794
- schema:
795
- type: object
796
- properties:
797
- message:
798
- type: string
799
- example: "Password reset successfully"
800
- '400':
801
- description: Invalid request or password requirements not met
802
- '401':
803
- description: Verification code/token expired or invalid
804
-
805
- /api/auth/oauth/configs:
806
- get:
807
- summary: List all OAuth configurations
808
- description: Get all configured OAuth providers (admin only)
809
- tags:
810
- - Admin
811
- security:
812
- - bearerAuth: []
813
- responses:
814
- '200':
815
- description: List of OAuth configurations
816
- content:
817
- application/json:
818
- schema:
819
- type: object
820
- properties:
821
- data:
822
- type: array
823
- items:
824
- $ref: '#/components/schemas/OAuthConfig'
825
- count:
826
- type: integer
827
- '401':
828
- description: Unauthorized
829
- '403':
830
- description: Forbidden - Admin only
831
-
832
- post:
833
- summary: Create OAuth configuration
834
- description: Create a new OAuth provider configuration (admin only)
835
- tags:
836
- - Admin
837
- security:
838
- - bearerAuth: []
839
- requestBody:
840
- required: true
841
- content:
842
- application/json:
843
- schema:
844
- type: object
845
- required:
846
- - provider
847
- properties:
848
- provider:
849
- type: string
850
- enum: [google, github, discord, linkedin, facebook, microsoft]
851
- clientId:
852
- type: string
853
- clientSecret:
854
- type: string
855
- redirectUri:
856
- type: string
857
- scopes:
858
- type: array
859
- items:
860
- type: string
861
- useSharedKey:
862
- type: boolean
863
- responses:
864
- '200':
865
- description: OAuth configuration created
866
- content:
867
- application/json:
868
- schema:
869
- $ref: '#/components/schemas/OAuthConfig'
870
- '400':
871
- description: Invalid request
872
- '401':
873
- description: Unauthorized
874
- '403':
875
- description: Forbidden - Admin only
876
-
877
- /api/auth/oauth/{provider}/config:
878
- get:
879
- summary: Get OAuth configuration for specific provider
880
- description: Get OAuth configuration including client secret (admin only)
881
- tags:
882
- - Admin
883
- security:
884
- - bearerAuth: []
885
- parameters:
886
- - name: provider
887
- in: path
888
- required: true
889
- schema:
890
- type: string
891
- enum: [google, github, discord, linkedin, facebook, microsoft]
892
- responses:
893
- '200':
894
- description: OAuth configuration
895
- content:
896
- application/json:
897
- schema:
898
- allOf:
899
- - $ref: '#/components/schemas/OAuthConfig'
900
- - type: object
901
- properties:
902
- clientSecret:
903
- type: string
904
- '401':
905
- description: Unauthorized
906
- '403':
907
- description: Forbidden - Admin only
908
- '404':
909
- description: Configuration not found
910
-
911
- put:
912
- summary: Update OAuth configuration
913
- description: Update OAuth provider configuration (admin only)
914
- tags:
915
- - Admin
916
- security:
917
- - bearerAuth: []
918
- parameters:
919
- - name: provider
920
- in: path
921
- required: true
922
- schema:
923
- type: string
924
- enum: [google, github, discord, linkedin, facebook, microsoft]
925
- requestBody:
926
- required: true
927
- content:
928
- application/json:
929
- schema:
930
- type: object
931
- properties:
932
- clientId:
933
- type: string
934
- clientSecret:
935
- type: string
936
- redirectUri:
937
- type: string
938
- scopes:
939
- type: array
940
- items:
941
- type: string
942
- useSharedKey:
943
- type: boolean
944
- responses:
945
- '200':
946
- description: Configuration updated
947
- content:
948
- application/json:
949
- schema:
950
- $ref: '#/components/schemas/OAuthConfig'
951
- '400':
952
- description: Invalid request
953
- '401':
954
- description: Unauthorized
955
- '403':
956
- description: Forbidden - Admin only
957
- '404':
958
- description: Configuration not found
959
-
960
- delete:
961
- summary: Delete OAuth configuration
962
- description: Delete OAuth provider configuration (admin only)
963
- tags:
964
- - Admin
965
- security:
966
- - bearerAuth: []
967
- parameters:
968
- - name: provider
969
- in: path
970
- required: true
971
- schema:
972
- type: string
973
- enum: [google, github, discord, linkedin, facebook, microsoft]
974
- responses:
975
- '200':
976
- description: Configuration deleted
977
- content:
978
- application/json:
979
- schema:
980
- type: object
981
- properties:
982
- success:
983
- type: boolean
984
- message:
985
- type: string
986
- '401':
987
- description: Unauthorized
988
- '403':
989
- description: Forbidden - Admin only
990
- '404':
991
- description: Configuration not found
992
-
993
- /api/auth/oauth/{provider}:
994
- get:
995
- summary: Initiate OAuth flow
996
- description: Generate OAuth authorization URL for any supported provider
997
- tags:
998
- - Client
999
- parameters:
1000
- - name: provider
1001
- in: path
1002
- required: true
1003
- schema:
1004
- type: string
1005
- enum: [google, github, discord, linkedin, facebook, microsoft]
1006
- - name: redirect_uri
1007
- in: query
1008
- required: true
1009
- schema:
1010
- type: string
1011
- format: uri
1012
- description: URL to redirect after authentication
1013
- responses:
1014
- '200':
1015
- description: OAuth authorization URL
1016
- content:
1017
- application/json:
1018
- schema:
1019
- type: object
1020
- properties:
1021
- authUrl:
1022
- type: string
1023
- format: uri
1024
- '400':
1025
- description: Invalid request or provider not supported
1026
- '500':
1027
- description: OAuth not configured
1028
-
1029
- /api/auth/oauth/shared/callback/{state}:
1030
- get:
1031
- summary: Shared OAuth callback handler
1032
- description: Handles OAuth callbacks from InsForge Cloud shared OAuth
1033
- tags:
1034
- - Client
1035
- parameters:
1036
- - name: state
1037
- in: path
1038
- required: true
1039
- schema:
1040
- type: string
1041
- description: JWT state parameter
1042
- - name: success
1043
- in: query
1044
- schema:
1045
- type: string
1046
- description: Success flag
1047
- - name: error
1048
- in: query
1049
- schema:
1050
- type: string
1051
- description: Error message
1052
- - name: payload
1053
- in: query
1054
- schema:
1055
- type: string
1056
- description: Base64 encoded user payload
1057
- responses:
1058
- '302':
1059
- description: Redirect to application with access token or error
1060
- headers:
1061
- Location:
1062
- schema:
1063
- type: string
1064
- format: uri
1065
-
1066
- /api/auth/oauth/{provider}/callback:
1067
- get:
1068
- summary: Provider-specific OAuth callback
1069
- description: OAuth callback endpoint for provider-specific flows
1070
- tags:
1071
- - Client
1072
- parameters:
1073
- - name: provider
1074
- in: path
1075
- required: true
1076
- schema:
1077
- type: string
1078
- enum: [google, github, discord, linkedin, facebook, microsoft]
1079
- - name: code
1080
- in: query
1081
- schema:
1082
- type: string
1083
- description: Authorization code from OAuth provider
1084
- - name: state
1085
- in: query
1086
- required: true
1087
- schema:
1088
- type: string
1089
- description: JWT state with redirect URI
1090
- - name: token
1091
- in: query
1092
- schema:
1093
- type: string
1094
- description: Direct ID token (for some providers)
1095
- responses:
1096
- '302':
1097
- description: Redirect to application with access token
1098
- headers:
1099
- Location:
1100
- schema:
1101
- type: string
1102
- format: uri
1103
- description: Redirect URL with access_token, user_id, email, and name query params
1104
-
1105
- components:
1106
- securitySchemes:
1107
- bearerAuth:
1108
- type: http
1109
- scheme: bearer
1110
- bearerFormat: JWT
1111
- apiKey:
1112
- type: apiKey
1113
- in: header
1114
- name: x-api-key
1115
-
1116
- schemas:
1117
- UserResponse:
1118
- type: object
1119
- properties:
1120
- id:
1121
- type: string
1122
- format: uuid
1123
- email:
1124
- type: string
1125
- format: email
1126
- name:
1127
- type: string
1128
- emailVerified:
1129
- type: boolean
1130
- identities:
1131
- type: array
1132
- items:
1133
- type: object
1134
- properties:
1135
- provider:
1136
- type: string
1137
- providerType:
1138
- type: string
1139
- createdAt:
1140
- type: string
1141
- format: date-time
1142
- updatedAt:
1143
- type: string
1144
- format: date-time
1145
-
1146
- OAuthConfig:
1147
- type: object
1148
- properties:
1149
- id:
1150
- type: string
1151
- format: uuid
1152
- provider:
1153
- type: string
1154
- enum: [google, github, discord, linkedin, facebook, microsoft]
1155
- clientId:
1156
- type: string
1157
- nullable: true
1158
- redirectUri:
1159
- type: string
1160
- nullable: true
1161
- scopes:
1162
- type: array
1163
- items:
1164
- type: string
1165
- nullable: true
1166
- useSharedKey:
1167
- type: boolean
1168
- createdAt:
1169
- type: string
1170
- format: date-time
1171
- updatedAt:
1172
- type: string
1173
- format: date-time
1174
-
1175
- AuthRecord:
1176
- type: object
1177
- properties:
1178
- id:
1179
- type: string
1180
- format: uuid
1181
- email:
1182
- type: string
1183
- format: email
1184
- passwordHash:
1185
- type: string
1186
- description: SHA256 hash of password
1187
- createdAt:
1188
- type: string
1189
- format: date-time
1190
- updatedAt:
1191
- type: string
1192
- format: date-time
1193
-
1194
- ProfileRecord:
1195
- type: object
1196
- properties:
1197
- id:
1198
- type: string
1199
- format: uuid
1200
- authId:
1201
- type: string
1202
- format: uuid
1203
- description: Foreign key to auth table
1204
- name:
1205
- type: string
1206
- avatar_url:
1207
- type: string
1208
- nullable: true
1209
- bio:
1210
- type: string
1211
- nullable: true
1212
- metadata:
1213
- type: object
1214
- description: JSONB field for flexible data
1215
- createdAt:
1216
- type: string
1217
- format: date-time
1218
- updatedAt:
1219
- type: string
1220
- format: date-time
1221
-
1222
- ErrorResponse:
1223
- type: object
1224
- required:
1225
- - error
1226
- - message
1227
- - statusCode
1228
- properties:
1229
- error:
1230
- type: string
1231
- description: Error code for programmatic handling
1232
- example: "VALIDATION_ERROR"
1233
- message:
1234
- type: string
1235
- description: Human-readable error message
1236
- example: "Email is already in use"
1237
- statusCode:
1238
- type: integer
1239
- description: HTTP status code
1240
- example: 400
1241
- nextActions:
1242
- type: string
1243
- description: Suggested action to resolve the error
1244
- example: "Please use a different email address"
1
+ openapi: 3.0.3
2
+ info:
3
+ title: Insforge Authentication API
4
+ version: 2.0.0
5
+ description: Authentication endpoints with separated auth and profile tables
6
+
7
+ paths:
8
+ /api/auth/public-config:
9
+ get:
10
+ summary: Get public authentication configuration
11
+ description: Get all public authentication configuration including OAuth providers and email auth settings (public endpoint)
12
+ tags:
13
+ - Client
14
+ responses:
15
+ '200':
16
+ description: Public authentication configuration
17
+ content:
18
+ application/json:
19
+ schema:
20
+ type: object
21
+ properties:
22
+ oAuthProviders:
23
+ type: array
24
+ items:
25
+ type: object
26
+ properties:
27
+ provider:
28
+ type: string
29
+ enum: [google, github, discord, linkedin, facebook, instagram, tiktok, apple, x, spotify, microsoft]
30
+ useSharedKey:
31
+ type: boolean
32
+ requireEmailVerification:
33
+ type: boolean
34
+ passwordMinLength:
35
+ type: integer
36
+ minimum: 4
37
+ maximum: 128
38
+ requireNumber:
39
+ type: boolean
40
+ requireLowercase:
41
+ type: boolean
42
+ requireUppercase:
43
+ type: boolean
44
+ requireSpecialChar:
45
+ type: boolean
46
+ verifyEmailRedirectTo:
47
+ type: string
48
+ nullable: true
49
+ description: URL to redirect users after successful email verification (if not set, shows default success page)
50
+ resetPasswordRedirectTo:
51
+ type: string
52
+ nullable: true
53
+ description: URL to redirect users after successful password reset (if not set, shows default success page)
54
+ verifyEmailMethod:
55
+ type: string
56
+ enum: [code, link]
57
+ description: Method for email verification (code = 6-digit OTP, link = magic link)
58
+ resetPasswordMethod:
59
+ type: string
60
+ enum: [code, link]
61
+ description: Method for password reset (code = 6-digit OTP + exchange flow, link = magic link)
62
+
63
+ /api/auth/profiles/current:
64
+ patch:
65
+ summary: Update current user's profile
66
+ description: Update the profile of the currently authenticated user
67
+ tags:
68
+ - Client
69
+ security:
70
+ - bearerAuth: []
71
+ requestBody:
72
+ required: true
73
+ content:
74
+ application/json:
75
+ schema:
76
+ type: object
77
+ required:
78
+ - profile
79
+ properties:
80
+ profile:
81
+ type: object
82
+ additionalProperties: true
83
+ description: Profile data (name, avatar_url, and any custom fields)
84
+ properties:
85
+ name:
86
+ type: string
87
+ avatar_url:
88
+ type: string
89
+ format: uri
90
+ responses:
91
+ '200':
92
+ description: Profile updated successfully
93
+ content:
94
+ application/json:
95
+ schema:
96
+ $ref: '#/components/schemas/ProfileResponse'
97
+ '400':
98
+ description: Invalid request
99
+ '401':
100
+ description: Unauthorized - authentication required
101
+
102
+ /api/auth/profiles/{userId}:
103
+ get:
104
+ summary: Get user profile by ID
105
+ description: Get public profile information for a user by their ID (public endpoint)
106
+ tags:
107
+ - Client
108
+ parameters:
109
+ - name: userId
110
+ in: path
111
+ required: true
112
+ schema:
113
+ type: string
114
+ format: uuid
115
+ description: User ID
116
+ responses:
117
+ '200':
118
+ description: User profile
119
+ content:
120
+ application/json:
121
+ schema:
122
+ $ref: '#/components/schemas/ProfileResponse'
123
+ '400':
124
+ description: Invalid user ID format
125
+ '404':
126
+ description: User not found
127
+
128
+ /api/auth/config:
129
+ get:
130
+ summary: Get authentication configuration
131
+ description: Get current authentication settings including all configuration options (admin only)
132
+ tags:
133
+ - Admin
134
+ security:
135
+ - bearerAuth: []
136
+ responses:
137
+ '200':
138
+ description: Authentication configuration
139
+ content:
140
+ application/json:
141
+ schema:
142
+ type: object
143
+ properties:
144
+ id:
145
+ type: string
146
+ format: uuid
147
+ requireEmailVerification:
148
+ type: boolean
149
+ passwordMinLength:
150
+ type: integer
151
+ minimum: 4
152
+ maximum: 128
153
+ requireNumber:
154
+ type: boolean
155
+ requireLowercase:
156
+ type: boolean
157
+ requireUppercase:
158
+ type: boolean
159
+ requireSpecialChar:
160
+ type: boolean
161
+ verifyEmailRedirectTo:
162
+ type: string
163
+ nullable: true
164
+ description: URL to redirect users after successful email verification (if not set, shows default success page)
165
+ resetPasswordRedirectTo:
166
+ type: string
167
+ nullable: true
168
+ description: URL to redirect users after successful password reset (if not set, shows default success page)
169
+ verifyEmailMethod:
170
+ type: string
171
+ enum: [code, link]
172
+ description: Method for email verification (code = 6-digit OTP, link = magic link)
173
+ resetPasswordMethod:
174
+ type: string
175
+ enum: [code, link]
176
+ description: Method for password reset (code = 6-digit OTP + exchange flow, link = magic link)
177
+ signInRedirectTo:
178
+ type: string
179
+ nullable: true
180
+ description: URL to redirect users after successful sign in
181
+ createdAt:
182
+ type: string
183
+ format: date-time
184
+ updatedAt:
185
+ type: string
186
+ format: date-time
187
+ '401':
188
+ description: Unauthorized
189
+ '403':
190
+ description: Forbidden - Admin only
191
+
192
+ put:
193
+ summary: Update authentication configuration
194
+ description: Update authentication settings (admin only)
195
+ tags:
196
+ - Admin
197
+ security:
198
+ - bearerAuth: []
199
+ requestBody:
200
+ required: true
201
+ content:
202
+ application/json:
203
+ schema:
204
+ type: object
205
+ properties:
206
+ requireEmailVerification:
207
+ type: boolean
208
+ passwordMinLength:
209
+ type: integer
210
+ minimum: 4
211
+ maximum: 128
212
+ requireNumber:
213
+ type: boolean
214
+ requireLowercase:
215
+ type: boolean
216
+ requireUppercase:
217
+ type: boolean
218
+ requireSpecialChar:
219
+ type: boolean
220
+ verifyEmailRedirectTo:
221
+ type: string
222
+ nullable: true
223
+ description: URL to redirect users after successful email verification (if not set, shows default success page)
224
+ resetPasswordRedirectTo:
225
+ type: string
226
+ nullable: true
227
+ description: URL to redirect users after successful password reset (if not set, shows default success page)
228
+ verifyEmailMethod:
229
+ type: string
230
+ enum: [code, link]
231
+ description: Method for email verification (code = 6-digit OTP, link = magic link)
232
+ resetPasswordMethod:
233
+ type: string
234
+ enum: [code, link]
235
+ description: Method for password reset (code = 6-digit OTP + exchange flow, link = magic link)
236
+ signInRedirectTo:
237
+ type: string
238
+ nullable: true
239
+ description: URL to redirect users after successful sign in
240
+ responses:
241
+ '200':
242
+ description: Configuration updated successfully
243
+ content:
244
+ application/json:
245
+ schema:
246
+ type: object
247
+ properties:
248
+ id:
249
+ type: string
250
+ format: uuid
251
+ requireEmailVerification:
252
+ type: boolean
253
+ passwordMinLength:
254
+ type: integer
255
+ minimum: 4
256
+ maximum: 128
257
+ requireNumber:
258
+ type: boolean
259
+ requireLowercase:
260
+ type: boolean
261
+ requireUppercase:
262
+ type: boolean
263
+ requireSpecialChar:
264
+ type: boolean
265
+ verifyEmailRedirectTo:
266
+ type: string
267
+ nullable: true
268
+ description: URL to redirect users after successful email verification (if not set, shows default success page)
269
+ resetPasswordRedirectTo:
270
+ type: string
271
+ nullable: true
272
+ description: URL to redirect users after successful password reset (if not set, shows default success page)
273
+ verifyEmailMethod:
274
+ type: string
275
+ enum: [code, link]
276
+ resetPasswordMethod:
277
+ type: string
278
+ enum: [code, link]
279
+ signInRedirectTo:
280
+ type: string
281
+ nullable: true
282
+ createdAt:
283
+ type: string
284
+ format: date-time
285
+ updatedAt:
286
+ type: string
287
+ format: date-time
288
+ '400':
289
+ description: Invalid request
290
+ '401':
291
+ description: Unauthorized
292
+ '403':
293
+ description: Forbidden - Admin only
294
+
295
+ /api/auth/users:
296
+ post:
297
+ summary: Register new user
298
+ description: Creates a new user account
299
+ tags:
300
+ - Client
301
+ requestBody:
302
+ required: true
303
+ content:
304
+ application/json:
305
+ schema:
306
+ type: object
307
+ required:
308
+ - email
309
+ - password
310
+ properties:
311
+ email:
312
+ type: string
313
+ format: email
314
+ example: user@example.com
315
+ password:
316
+ type: string
317
+ description: Password meeting configured requirements (check /api/auth/email/config for current requirements)
318
+ example: securepassword123
319
+ name:
320
+ type: string
321
+ example: John Doe
322
+ responses:
323
+ '200':
324
+ description: User created successfully
325
+ content:
326
+ application/json:
327
+ schema:
328
+ type: object
329
+ properties:
330
+ user:
331
+ $ref: '#/components/schemas/UserResponse'
332
+ accessToken:
333
+ type: string
334
+ nullable: true
335
+ description: JWT authentication token (null if email verification required)
336
+ requireEmailVerification:
337
+ type: boolean
338
+ description: Whether email verification is required before login
339
+ redirectTo:
340
+ type: string
341
+ format: uri
342
+ description: Optional URL to redirect user after registration (only present if email verification not required)
343
+ '400':
344
+ description: Invalid request
345
+ '409':
346
+ description: User already exists
347
+
348
+ get:
349
+ summary: List all users (admin only)
350
+ description: Returns paginated list of users
351
+ tags:
352
+ - Admin
353
+ security:
354
+ - bearerAuth: []
355
+ parameters:
356
+ - name: offset
357
+ in: query
358
+ schema:
359
+ type: string
360
+ default: '0'
361
+ description: Number of records to skip
362
+ - name: limit
363
+ in: query
364
+ schema:
365
+ type: string
366
+ default: '10'
367
+ description: Maximum number of records to return
368
+ - name: search
369
+ in: query
370
+ schema:
371
+ type: string
372
+ description: Search by email or name
373
+ responses:
374
+ '200':
375
+ description: List of users
376
+ content:
377
+ application/json:
378
+ schema:
379
+ type: object
380
+ properties:
381
+ data:
382
+ type: array
383
+ items:
384
+ $ref: '#/components/schemas/UserResponse'
385
+ pagination:
386
+ type: object
387
+ properties:
388
+ offset:
389
+ type: integer
390
+ limit:
391
+ type: integer
392
+ total:
393
+ type: integer
394
+ '401':
395
+ description: Unauthorized
396
+ '403':
397
+ description: Forbidden - Admin only
398
+
399
+ delete:
400
+ summary: Delete users (admin only)
401
+ description: Delete multiple users by their IDs
402
+ tags:
403
+ - Admin
404
+ security:
405
+ - bearerAuth: []
406
+ requestBody:
407
+ required: true
408
+ content:
409
+ application/json:
410
+ schema:
411
+ type: object
412
+ properties:
413
+ userIds:
414
+ type: array
415
+ items:
416
+ type: string
417
+ required:
418
+ - userIds
419
+ responses:
420
+ '200':
421
+ description: Users deleted successfully
422
+ content:
423
+ application/json:
424
+ schema:
425
+ type: object
426
+ properties:
427
+ message:
428
+ type: string
429
+ deletedCount:
430
+ type: integer
431
+ '401':
432
+ description: Unauthorized
433
+ '403':
434
+ description: Forbidden - Admin only
435
+
436
+ /api/auth/users/{userId}:
437
+ get:
438
+ summary: Get specific user
439
+ description: Get user details by ID (admin only)
440
+ tags:
441
+ - Admin
442
+ security:
443
+ - bearerAuth: []
444
+ parameters:
445
+ - name: userId
446
+ in: path
447
+ required: true
448
+ schema:
449
+ type: string
450
+ format: uuid
451
+ description: User ID
452
+ responses:
453
+ '200':
454
+ description: User details
455
+ content:
456
+ application/json:
457
+ schema:
458
+ $ref: '#/components/schemas/UserResponse'
459
+ '400':
460
+ description: Invalid user ID format
461
+ '401':
462
+ description: Unauthorized
463
+ '403':
464
+ description: Forbidden - Admin only
465
+ '404':
466
+ description: User not found
467
+
468
+ /api/auth/sessions:
469
+ post:
470
+ summary: User login
471
+ description: Authenticates user and returns access token
472
+ tags:
473
+ - Client
474
+ requestBody:
475
+ required: true
476
+ content:
477
+ application/json:
478
+ schema:
479
+ type: object
480
+ required:
481
+ - email
482
+ - password
483
+ properties:
484
+ email:
485
+ type: string
486
+ format: email
487
+ password:
488
+ type: string
489
+ responses:
490
+ '200':
491
+ description: Login successful
492
+ content:
493
+ application/json:
494
+ schema:
495
+ type: object
496
+ properties:
497
+ user:
498
+ $ref: '#/components/schemas/UserResponse'
499
+ accessToken:
500
+ type: string
501
+ redirectTo:
502
+ type: string
503
+ format: uri
504
+ description: Optional URL to redirect user after login (if configured)
505
+ '401':
506
+ description: Invalid credentials
507
+ '403':
508
+ description: Email verification required
509
+
510
+ /api/auth/sessions/current:
511
+ get:
512
+ summary: Get current user
513
+ description: Returns the currently authenticated user's basic info from JWT token
514
+ tags:
515
+ - Client
516
+ security:
517
+ - bearerAuth: []
518
+ responses:
519
+ '200':
520
+ description: Current user info
521
+ content:
522
+ application/json:
523
+ schema:
524
+ type: object
525
+ properties:
526
+ user:
527
+ type: object
528
+ properties:
529
+ id:
530
+ type: string
531
+ format: uuid
532
+ email:
533
+ type: string
534
+ format: email
535
+ role:
536
+ type: string
537
+ enum: [authenticated, project_admin]
538
+ '401':
539
+ description: Unauthorized
540
+
541
+ /api/auth/admin/sessions:
542
+ post:
543
+ summary: Admin login
544
+ description: Authenticates admin user for dashboard access
545
+ tags:
546
+ - Admin
547
+ requestBody:
548
+ required: true
549
+ content:
550
+ application/json:
551
+ schema:
552
+ type: object
553
+ required:
554
+ - email
555
+ - password
556
+ properties:
557
+ email:
558
+ type: string
559
+ format: email
560
+ password:
561
+ type: string
562
+ responses:
563
+ '200':
564
+ description: Admin login successful
565
+ content:
566
+ application/json:
567
+ schema:
568
+ type: object
569
+ properties:
570
+ user:
571
+ $ref: '#/components/schemas/UserResponse'
572
+ accessToken:
573
+ type: string
574
+ '401':
575
+ description: Invalid credentials
576
+ '403':
577
+ description: User is not an admin
578
+
579
+ /api/auth/admin/sessions/exchange:
580
+ post:
581
+ summary: Exchange cloud provider authorization code for admin session
582
+ description: Verifies an authorization code/JWT from from Insforge Cloud platform and issues an internal admin session token with project_admin role
583
+ tags:
584
+ - Admin
585
+ requestBody:
586
+ required: true
587
+ content:
588
+ application/json:
589
+ schema:
590
+ type: object
591
+ required:
592
+ - code
593
+ properties:
594
+ code:
595
+ type: string
596
+ description: Authorization code or JWT from the Insforge
597
+ example: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
598
+ responses:
599
+ '200':
600
+ description: Cloud authorization verified, admin session created
601
+ content:
602
+ application/json:
603
+ schema:
604
+ type: object
605
+ properties:
606
+ user:
607
+ $ref: '#/components/schemas/UserResponse'
608
+ accessToken:
609
+ type: string
610
+ description: Internal JWT for admin authentication
611
+ '400':
612
+ description: Invalid authorization code or JWT verification failed
613
+ content:
614
+ application/json:
615
+ schema:
616
+ $ref: '#/components/schemas/ErrorResponse'
617
+
618
+ /api/auth/tokens/anon:
619
+ post:
620
+ summary: Generate anonymous token
621
+ description: Generate a non-expiring anonymous JWT token for public API access (admin only)
622
+ tags:
623
+ - Admin
624
+ security:
625
+ - bearerAuth: []
626
+ responses:
627
+ '200':
628
+ description: Anonymous token generated successfully
629
+ content:
630
+ application/json:
631
+ schema:
632
+ type: object
633
+ properties:
634
+ accessToken:
635
+ type: string
636
+ description: Non-expiring anonymous JWT token
637
+ example: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
638
+ message:
639
+ type: string
640
+ description: Success message
641
+ example: "Anonymous token generated successfully (never expires)"
642
+ '401':
643
+ description: Unauthorized - requires authentication
644
+ '403':
645
+ description: Forbidden - admin access required
646
+
647
+ /api/auth/email/send-verification:
648
+ post:
649
+ summary: Send email verification (code or link based on config)
650
+ description: Send email verification using the method configured in auth settings (verifyEmailMethod). When method is 'code', sends a 6-digit numeric code. When method is 'link', sends a magic link. Prevents user enumeration by returning success even if email doesn't exist.
651
+ tags:
652
+ - Client
653
+ requestBody:
654
+ required: true
655
+ content:
656
+ application/json:
657
+ schema:
658
+ type: object
659
+ required:
660
+ - email
661
+ properties:
662
+ email:
663
+ type: string
664
+ format: email
665
+ example: user@example.com
666
+ responses:
667
+ '202':
668
+ description: Verification email sent (if email exists). Message varies based on configured method.
669
+ content:
670
+ application/json:
671
+ schema:
672
+ type: object
673
+ properties:
674
+ success:
675
+ type: boolean
676
+ message:
677
+ type: string
678
+ example: "If your email is registered, we have sent you a verification code/link. Please check your inbox."
679
+ '400':
680
+ description: Invalid request
681
+
682
+ /api/auth/email/verify:
683
+ post:
684
+ summary: Verify email with code or link
685
+ description: |
686
+ Verify email address using the method configured in auth settings (verifyEmailMethod):
687
+ - Code verification: Provide both `email` and `otp` (6-digit numeric code)
688
+ - Link verification: Provide only `otp` (64-character hex token from magic link)
689
+
690
+ Successfully verified users will receive a session token.
691
+
692
+ The email verification link sent to users always points to the backend API endpoint.
693
+ If `verifyEmailRedirectTo` is configured, the backend will redirect to that URL after successful verification.
694
+ Otherwise, a default success page is displayed.
695
+ tags:
696
+ - Client
697
+ requestBody:
698
+ required: true
699
+ content:
700
+ application/json:
701
+ schema:
702
+ type: object
703
+ required:
704
+ - otp
705
+ properties:
706
+ email:
707
+ type: string
708
+ format: email
709
+ description: Required for numeric code verification, omit for magic link verification
710
+ example: user@example.com
711
+ otp:
712
+ type: string
713
+ description: Either a 6-digit numeric code or a 64-character hex token from magic link
714
+ example: "123456"
715
+ responses:
716
+ '200':
717
+ description: Email verified successfully, session created
718
+ content:
719
+ application/json:
720
+ schema:
721
+ type: object
722
+ properties:
723
+ user:
724
+ $ref: '#/components/schemas/UserResponse'
725
+ accessToken:
726
+ type: string
727
+ description: JWT authentication token
728
+ redirectTo:
729
+ type: string
730
+ format: uri
731
+ description: Optional URL to redirect user after verification (only present if configured)
732
+ '400':
733
+ description: Invalid verification code or token
734
+ '401':
735
+ description: Verification code/token expired or invalid
736
+
737
+ /api/auth/email/send-reset-password:
738
+ post:
739
+ summary: Send password reset (code or link based on config)
740
+ description: Send password reset email using the method configured in auth settings (resetPasswordMethod). When method is 'code', sends a 6-digit numeric code for two-step flow. When method is 'link', sends a magic link. Prevents user enumeration by returning success even if email doesn't exist.
741
+ tags:
742
+ - Client
743
+ requestBody:
744
+ required: true
745
+ content:
746
+ application/json:
747
+ schema:
748
+ type: object
749
+ required:
750
+ - email
751
+ properties:
752
+ email:
753
+ type: string
754
+ format: email
755
+ example: user@example.com
756
+ responses:
757
+ '202':
758
+ description: Password reset email sent (if email exists). Message varies based on configured method.
759
+ content:
760
+ application/json:
761
+ schema:
762
+ type: object
763
+ properties:
764
+ success:
765
+ type: boolean
766
+ message:
767
+ type: string
768
+ example: "If your email is registered, we have sent you a password reset code/link. Please check your inbox."
769
+ '400':
770
+ description: Invalid request
771
+
772
+ /api/auth/email/exchange-reset-password-token:
773
+ post:
774
+ summary: Exchange reset password code for reset token
775
+ description: |
776
+ Step 1 of two-step password reset flow (only used when resetPasswordMethod is 'code'):
777
+ 1. Verify the 6-digit code sent to user's email
778
+ 2. Return a reset token that can be used to actually reset the password
779
+
780
+ This endpoint is not used when resetPasswordMethod is 'link' (magic link flow is direct).
781
+ tags:
782
+ - Client
783
+ requestBody:
784
+ required: true
785
+ content:
786
+ application/json:
787
+ schema:
788
+ type: object
789
+ required:
790
+ - email
791
+ - code
792
+ properties:
793
+ email:
794
+ type: string
795
+ format: email
796
+ example: user@example.com
797
+ code:
798
+ type: string
799
+ description: 6-digit numeric code from email
800
+ example: "123456"
801
+ responses:
802
+ '200':
803
+ description: Code verified successfully, reset token returned
804
+ content:
805
+ application/json:
806
+ schema:
807
+ type: object
808
+ properties:
809
+ token:
810
+ type: string
811
+ description: Reset token to be used in reset-password endpoint
812
+ expiresAt:
813
+ type: string
814
+ format: date-time
815
+ description: Token expiration timestamp
816
+ '400':
817
+ description: Invalid request
818
+ '401':
819
+ description: Invalid or expired code
820
+
821
+ /api/auth/email/reset-password:
822
+ post:
823
+ summary: Reset password with token
824
+ description: |
825
+ Reset user password with a token. The token can be:
826
+ - Magic link token (64-character hex token from send-reset-password when method is 'link')
827
+ - Reset token (from exchange-reset-password-token after code verification when method is 'code')
828
+
829
+ Both token types use RESET_PASSWORD purpose and are verified the same way.
830
+
831
+ Flow summary:
832
+ - Code method: send-reset-password → exchange-reset-password-token → reset-password (with resetToken)
833
+ - Link method: send-reset-password reset-password (with link token directly)
834
+ tags:
835
+ - Client
836
+ requestBody:
837
+ required: true
838
+ content:
839
+ application/json:
840
+ schema:
841
+ type: object
842
+ required:
843
+ - newPassword
844
+ - otp
845
+ properties:
846
+ newPassword:
847
+ type: string
848
+ description: New password meeting configured requirements
849
+ example: newSecurePassword123
850
+ otp:
851
+ type: string
852
+ description: Reset token (either from magic link or from exchange-reset-password-token endpoint)
853
+ example: "a1b2c3d4..."
854
+ responses:
855
+ '200':
856
+ description: Password reset successfully
857
+ content:
858
+ application/json:
859
+ schema:
860
+ type: object
861
+ properties:
862
+ message:
863
+ type: string
864
+ example: "Password reset successfully"
865
+ '400':
866
+ description: Invalid request or password requirements not met
867
+ '401':
868
+ description: Verification code/token expired or invalid
869
+
870
+ /api/auth/oauth/configs:
871
+ get:
872
+ summary: List all OAuth configurations
873
+ description: Get all configured OAuth providers (admin only)
874
+ tags:
875
+ - Admin
876
+ security:
877
+ - bearerAuth: []
878
+ responses:
879
+ '200':
880
+ description: List of OAuth configurations
881
+ content:
882
+ application/json:
883
+ schema:
884
+ type: object
885
+ properties:
886
+ data:
887
+ type: array
888
+ items:
889
+ $ref: '#/components/schemas/OAuthConfig'
890
+ count:
891
+ type: integer
892
+ '401':
893
+ description: Unauthorized
894
+ '403':
895
+ description: Forbidden - Admin only
896
+
897
+ post:
898
+ summary: Create OAuth configuration
899
+ description: Create a new OAuth provider configuration (admin only)
900
+ tags:
901
+ - Admin
902
+ security:
903
+ - bearerAuth: []
904
+ requestBody:
905
+ required: true
906
+ content:
907
+ application/json:
908
+ schema:
909
+ type: object
910
+ required:
911
+ - provider
912
+ properties:
913
+ provider:
914
+ type: string
915
+ enum: [google, github, discord, linkedin, facebook, instagram, tiktok, apple, x, spotify, microsoft]
916
+ clientId:
917
+ type: string
918
+ clientSecret:
919
+ type: string
920
+ redirectUri:
921
+ type: string
922
+ scopes:
923
+ type: array
924
+ items:
925
+ type: string
926
+ useSharedKey:
927
+ type: boolean
928
+ responses:
929
+ '200':
930
+ description: OAuth configuration created
931
+ content:
932
+ application/json:
933
+ schema:
934
+ $ref: '#/components/schemas/OAuthConfig'
935
+ '400':
936
+ description: Invalid request
937
+ '401':
938
+ description: Unauthorized
939
+ '403':
940
+ description: Forbidden - Admin only
941
+
942
+ /api/auth/oauth/{provider}/config:
943
+ get:
944
+ summary: Get OAuth configuration for specific provider
945
+ description: Get OAuth configuration including client secret (admin only)
946
+ tags:
947
+ - Admin
948
+ security:
949
+ - bearerAuth: []
950
+ parameters:
951
+ - name: provider
952
+ in: path
953
+ required: true
954
+ schema:
955
+ type: string
956
+ enum: [google, github, discord, linkedin, facebook, instagram, tiktok, apple, x, spotify, microsoft]
957
+ responses:
958
+ '200':
959
+ description: OAuth configuration
960
+ content:
961
+ application/json:
962
+ schema:
963
+ allOf:
964
+ - $ref: '#/components/schemas/OAuthConfig'
965
+ - type: object
966
+ properties:
967
+ clientSecret:
968
+ type: string
969
+ '401':
970
+ description: Unauthorized
971
+ '403':
972
+ description: Forbidden - Admin only
973
+ '404':
974
+ description: Configuration not found
975
+
976
+ put:
977
+ summary: Update OAuth configuration
978
+ description: Update OAuth provider configuration (admin only)
979
+ tags:
980
+ - Admin
981
+ security:
982
+ - bearerAuth: []
983
+ parameters:
984
+ - name: provider
985
+ in: path
986
+ required: true
987
+ schema:
988
+ type: string
989
+ enum: [google, github, discord, linkedin, facebook, instagram, tiktok, apple, x, spotify, microsoft]
990
+ requestBody:
991
+ required: true
992
+ content:
993
+ application/json:
994
+ schema:
995
+ type: object
996
+ properties:
997
+ clientId:
998
+ type: string
999
+ clientSecret:
1000
+ type: string
1001
+ redirectUri:
1002
+ type: string
1003
+ scopes:
1004
+ type: array
1005
+ items:
1006
+ type: string
1007
+ useSharedKey:
1008
+ type: boolean
1009
+ responses:
1010
+ '200':
1011
+ description: Configuration updated
1012
+ content:
1013
+ application/json:
1014
+ schema:
1015
+ $ref: '#/components/schemas/OAuthConfig'
1016
+ '400':
1017
+ description: Invalid request
1018
+ '401':
1019
+ description: Unauthorized
1020
+ '403':
1021
+ description: Forbidden - Admin only
1022
+ '404':
1023
+ description: Configuration not found
1024
+
1025
+ delete:
1026
+ summary: Delete OAuth configuration
1027
+ description: Delete OAuth provider configuration (admin only)
1028
+ tags:
1029
+ - Admin
1030
+ security:
1031
+ - bearerAuth: []
1032
+ parameters:
1033
+ - name: provider
1034
+ in: path
1035
+ required: true
1036
+ schema:
1037
+ type: string
1038
+ enum: [google, github, discord, linkedin, facebook, instagram, tiktok, apple, x, spotify, microsoft]
1039
+ responses:
1040
+ '200':
1041
+ description: Configuration deleted
1042
+ content:
1043
+ application/json:
1044
+ schema:
1045
+ type: object
1046
+ properties:
1047
+ success:
1048
+ type: boolean
1049
+ message:
1050
+ type: string
1051
+ '401':
1052
+ description: Unauthorized
1053
+ '403':
1054
+ description: Forbidden - Admin only
1055
+ '404':
1056
+ description: Configuration not found
1057
+
1058
+ /api/auth/oauth/{provider}:
1059
+ get:
1060
+ summary: Initiate OAuth flow
1061
+ description: Generate OAuth authorization URL for any supported provider
1062
+ tags:
1063
+ - Client
1064
+ parameters:
1065
+ - name: provider
1066
+ in: path
1067
+ required: true
1068
+ schema:
1069
+ type: string
1070
+ enum: [google, github, discord, linkedin, facebook, instagram, tiktok, apple, x, spotify, microsoft]
1071
+ - name: redirect_uri
1072
+ in: query
1073
+ required: true
1074
+ schema:
1075
+ type: string
1076
+ format: uri
1077
+ description: URL to redirect after authentication
1078
+ responses:
1079
+ '200':
1080
+ description: OAuth authorization URL
1081
+ content:
1082
+ application/json:
1083
+ schema:
1084
+ type: object
1085
+ properties:
1086
+ authUrl:
1087
+ type: string
1088
+ format: uri
1089
+ '400':
1090
+ description: Invalid request or provider not supported
1091
+ '500':
1092
+ description: OAuth not configured
1093
+
1094
+ /api/auth/oauth/shared/callback/{state}:
1095
+ get:
1096
+ summary: Shared OAuth callback handler
1097
+ description: Handles OAuth callbacks from InsForge Cloud shared OAuth
1098
+ tags:
1099
+ - Client
1100
+ parameters:
1101
+ - name: state
1102
+ in: path
1103
+ required: true
1104
+ schema:
1105
+ type: string
1106
+ description: JWT state parameter
1107
+ - name: success
1108
+ in: query
1109
+ schema:
1110
+ type: string
1111
+ description: Success flag
1112
+ - name: error
1113
+ in: query
1114
+ schema:
1115
+ type: string
1116
+ description: Error message
1117
+ - name: payload
1118
+ in: query
1119
+ schema:
1120
+ type: string
1121
+ description: Base64 encoded user payload
1122
+ responses:
1123
+ '302':
1124
+ description: Redirect to application with access token or error
1125
+ headers:
1126
+ Location:
1127
+ schema:
1128
+ type: string
1129
+ format: uri
1130
+
1131
+ /api/auth/oauth/{provider}/callback:
1132
+ get:
1133
+ summary: Provider-specific OAuth callback
1134
+ description: OAuth callback endpoint for provider-specific flows
1135
+ tags:
1136
+ - Client
1137
+ parameters:
1138
+ - name: provider
1139
+ in: path
1140
+ required: true
1141
+ schema:
1142
+ type: string
1143
+ enum: [google, github, discord, linkedin, facebook, instagram, tiktok, apple, x, spotify, microsoft]
1144
+ - name: code
1145
+ in: query
1146
+ schema:
1147
+ type: string
1148
+ description: Authorization code from OAuth provider
1149
+ - name: state
1150
+ in: query
1151
+ required: true
1152
+ schema:
1153
+ type: string
1154
+ description: JWT state with redirect URI
1155
+ - name: token
1156
+ in: query
1157
+ schema:
1158
+ type: string
1159
+ description: Direct ID token (for some providers)
1160
+ responses:
1161
+ '302':
1162
+ description: Redirect to application with access token
1163
+ headers:
1164
+ Location:
1165
+ schema:
1166
+ type: string
1167
+ format: uri
1168
+ description: Redirect URL with access_token, user_id, email, and name query params
1169
+
1170
+ components:
1171
+ securitySchemes:
1172
+ bearerAuth:
1173
+ type: http
1174
+ scheme: bearer
1175
+ bearerFormat: JWT
1176
+ apiKey:
1177
+ type: apiKey
1178
+ in: header
1179
+ name: x-api-key
1180
+
1181
+ schemas:
1182
+ UserResponse:
1183
+ type: object
1184
+ properties:
1185
+ id:
1186
+ type: string
1187
+ format: uuid
1188
+ email:
1189
+ type: string
1190
+ format: email
1191
+ metadata:
1192
+ type: object
1193
+ additionalProperties: true
1194
+ emailVerified:
1195
+ type: boolean
1196
+ providers:
1197
+ type: array
1198
+ items:
1199
+ type: string
1200
+ createdAt:
1201
+ type: string
1202
+ format: date-time
1203
+ updatedAt:
1204
+ type: string
1205
+ format: date-time
1206
+
1207
+ ProfileResponse:
1208
+ type: object
1209
+ properties:
1210
+ id:
1211
+ type: string
1212
+ format: uuid
1213
+ description: User ID
1214
+ profile:
1215
+ type: object
1216
+ nullable: true
1217
+ additionalProperties: true
1218
+ description: User profile data (can contain custom fields)
1219
+ properties:
1220
+ name:
1221
+ type: string
1222
+ avatar_url:
1223
+ type: string
1224
+ format: uri
1225
+
1226
+ OAuthConfig:
1227
+ type: object
1228
+ properties:
1229
+ id:
1230
+ type: string
1231
+ format: uuid
1232
+ provider:
1233
+ type: string
1234
+ enum: [google, github, discord, linkedin, facebook, instagram, tiktok, apple, x, spotify, microsoft]
1235
+ clientId:
1236
+ type: string
1237
+ nullable: true
1238
+ redirectUri:
1239
+ type: string
1240
+ nullable: true
1241
+ scopes:
1242
+ type: array
1243
+ items:
1244
+ type: string
1245
+ nullable: true
1246
+ useSharedKey:
1247
+ type: boolean
1248
+ createdAt:
1249
+ type: string
1250
+ format: date-time
1251
+ updatedAt:
1252
+ type: string
1253
+ format: date-time
1254
+
1255
+ AuthRecord:
1256
+ type: object
1257
+ properties:
1258
+ id:
1259
+ type: string
1260
+ format: uuid
1261
+ email:
1262
+ type: string
1263
+ format: email
1264
+ passwordHash:
1265
+ type: string
1266
+ description: SHA256 hash of password
1267
+ createdAt:
1268
+ type: string
1269
+ format: date-time
1270
+ updatedAt:
1271
+ type: string
1272
+ format: date-time
1273
+
1274
+ ProfileRecord:
1275
+ type: object
1276
+ properties:
1277
+ id:
1278
+ type: string
1279
+ format: uuid
1280
+ authId:
1281
+ type: string
1282
+ format: uuid
1283
+ description: Foreign key to auth table
1284
+ name:
1285
+ type: string
1286
+ avatar_url:
1287
+ type: string
1288
+ nullable: true
1289
+ bio:
1290
+ type: string
1291
+ nullable: true
1292
+ metadata:
1293
+ type: object
1294
+ description: JSONB field for flexible data
1295
+ createdAt:
1296
+ type: string
1297
+ format: date-time
1298
+ updatedAt:
1299
+ type: string
1300
+ format: date-time
1301
+
1302
+ ErrorResponse:
1303
+ type: object
1304
+ required:
1305
+ - error
1306
+ - message
1307
+ - statusCode
1308
+ properties:
1309
+ error:
1310
+ type: string
1311
+ description: Error code for programmatic handling
1312
+ example: "VALIDATION_ERROR"
1313
+ message:
1314
+ type: string
1315
+ description: Human-readable error message
1316
+ example: "Email is already in use"
1317
+ statusCode:
1318
+ type: integer
1319
+ description: HTTP status code
1320
+ example: 400
1321
+ nextActions:
1322
+ type: string
1323
+ description: Suggested action to resolve the error
1324
+ example: "Please use a different email address"