insforge 0.3.2 → 1.2.10

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 (507) hide show
  1. package/.claude-plugin/marketplace.json +20 -0
  2. package/.cursor/rules/cursor-rules.mdc +94 -0
  3. package/.dockerignore +3 -0
  4. package/.env.example +33 -4
  5. package/.github/ISSUE_TEMPLATE/bug_report.yml +13 -60
  6. package/.github/ISSUE_TEMPLATE/config.yml +2 -2
  7. package/.github/ISSUE_TEMPLATE/feature_request.yml +10 -63
  8. package/.github/PULL_REQUEST_TEMPLATE.md +7 -0
  9. package/.github/workflows/build-image.yml +2 -1
  10. package/.github/workflows/e2e.yml +63 -0
  11. package/CHANGELOG.md +41 -0
  12. package/CLAUDE_PLUGIN.md +104 -0
  13. package/CODE_OF_CONDUCT.md +128 -0
  14. package/CONTRIBUTING.md +1 -1
  15. package/Dockerfile +4 -1
  16. package/README.md +66 -18
  17. package/assets/mcpInstallv2.png +0 -0
  18. package/assets/sampleResponse.png +0 -0
  19. package/auth/index.html +13 -0
  20. package/auth/package.json +28 -0
  21. package/auth/public/favicon.ico +0 -0
  22. package/auth/src/App.tsx +33 -0
  23. package/auth/src/components/ErrorCard.tsx +37 -0
  24. package/auth/src/components/Layout.tsx +13 -0
  25. package/auth/src/index.css +19 -0
  26. package/auth/src/lib/broadcastService.ts +115 -0
  27. package/auth/src/lib/utils.ts +11 -0
  28. package/auth/src/main.tsx +22 -0
  29. package/auth/src/pages/ForgotPasswordPage.tsx +11 -0
  30. package/auth/src/pages/ResetPasswordPage.tsx +11 -0
  31. package/auth/src/pages/SignInPage.tsx +57 -0
  32. package/auth/src/pages/SignUpPage.tsx +57 -0
  33. package/auth/src/pages/VerifyEmailPage.tsx +20 -0
  34. package/auth/src/vite-env.d.ts +10 -0
  35. package/auth/tsconfig.json +32 -0
  36. package/auth/tsconfig.node.json +11 -0
  37. package/auth/vite.config.ts +25 -0
  38. package/backend/package.json +9 -9
  39. package/backend/src/api/{middleware → middlewares}/auth.ts +8 -9
  40. package/backend/src/api/middlewares/rate-limiters.ts +127 -0
  41. package/backend/src/api/routes/{ai.ts → ai/index.routes.ts} +20 -24
  42. package/backend/src/api/routes/auth/index.routes.ts +570 -0
  43. package/backend/src/api/routes/auth/oauth.routes.ts +448 -0
  44. package/backend/src/api/routes/{database.advance.ts → database/advance.routes.ts} +107 -65
  45. package/backend/src/api/routes/database/index.routes.ts +13 -0
  46. package/backend/src/api/routes/{database.records.ts → database/records.routes.ts} +22 -8
  47. package/backend/src/api/routes/{database.tables.ts → database/tables.routes.ts} +20 -23
  48. package/backend/src/api/routes/docs/index.routes.ts +76 -0
  49. package/backend/src/api/routes/functions/index.routes.ts +188 -0
  50. package/backend/src/api/routes/{logs.ts → logs/index.routes.ts} +25 -30
  51. package/backend/src/api/routes/{metadata.ts → metadata/index.routes.ts} +21 -31
  52. package/backend/src/api/routes/{secrets.ts → secrets/index.routes.ts} +27 -22
  53. package/backend/src/api/routes/{storage.ts → storage/index.routes.ts} +34 -53
  54. package/backend/src/api/routes/usage/index.routes.ts +89 -0
  55. package/backend/src/infra/config/app.config.ts +51 -0
  56. package/backend/src/{core/database/manager.ts → infra/database/database.manager.ts} +76 -85
  57. package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -0
  58. package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +8 -0
  59. package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +60 -0
  60. package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -0
  61. package/backend/src/{core/secrets/encryption.ts → infra/security/encryption.manager.ts} +3 -2
  62. package/backend/src/infra/security/token.manager.ts +125 -0
  63. package/backend/src/{core/socket/socket.ts → infra/socket/socket.manager.ts} +15 -15
  64. package/backend/src/providers/ai/openrouter.provider.ts +377 -0
  65. package/backend/src/providers/email/base.provider.ts +41 -0
  66. package/backend/src/providers/email/cloud.provider.ts +187 -0
  67. package/backend/src/{core/logs/providers → providers/logs}/base.provider.ts +11 -11
  68. package/backend/src/{core/logs/providers → providers/logs}/cloudwatch.provider.ts +61 -38
  69. package/backend/src/providers/logs/local.provider.ts +185 -0
  70. package/backend/src/providers/oauth/base.provider.ts +29 -0
  71. package/backend/src/providers/oauth/discord.provider.ts +195 -0
  72. package/backend/src/providers/oauth/facebook.provider.ts +194 -0
  73. package/backend/src/providers/oauth/github.provider.ts +208 -0
  74. package/backend/src/providers/oauth/google.provider.ts +249 -0
  75. package/backend/src/providers/oauth/index.ts +7 -0
  76. package/backend/src/providers/oauth/linkedin.provider.ts +240 -0
  77. package/backend/src/providers/oauth/microsoft.provider.ts +169 -0
  78. package/backend/src/providers/oauth/x.provider.ts +202 -0
  79. package/backend/src/providers/storage/base.provider.ts +29 -0
  80. package/backend/src/providers/storage/local.provider.ts +103 -0
  81. package/backend/src/providers/storage/s3.provider.ts +313 -0
  82. package/backend/src/server.ts +70 -74
  83. package/backend/src/{core/ai/config.ts → services/ai/ai-config.service.ts} +19 -24
  84. package/backend/src/services/ai/ai-model.service.ts +60 -0
  85. package/backend/src/{core/ai/usage.ts → services/ai/ai-usage.service.ts} +28 -35
  86. package/backend/src/{core/ai/chat.ts → services/ai/chat-completion.service.ts} +37 -24
  87. package/backend/src/services/ai/helpers.ts +64 -0
  88. package/backend/src/{core/ai/image.ts → services/ai/image-generation.service.ts} +17 -19
  89. package/backend/src/services/ai/index.ts +13 -0
  90. package/backend/src/services/auth/auth-config.service.ts +250 -0
  91. package/backend/src/services/auth/auth-otp.service.ts +424 -0
  92. package/backend/src/services/auth/auth.service.ts +1136 -0
  93. package/backend/src/services/auth/index.ts +4 -0
  94. package/backend/src/{core/auth/oauth.ts → services/auth/oauth-config.service.ts} +106 -52
  95. package/backend/src/{core/database/advance.ts → services/database/database-advance.service.ts} +97 -131
  96. package/backend/src/services/database/database-table.service.ts +811 -0
  97. package/backend/src/services/email/email.service.ts +75 -0
  98. package/backend/src/{core/functions/functions.ts → services/functions/function.service.ts} +95 -88
  99. package/backend/src/{core/logs/audit.ts → services/logs/audit.service.ts} +92 -75
  100. package/backend/src/services/logs/log.service.ts +73 -0
  101. package/backend/src/{core/secrets/secrets.ts → services/secrets/secret.service.ts} +48 -66
  102. package/backend/src/services/storage/storage.service.ts +617 -0
  103. package/backend/src/services/usage/usage.service.ts +149 -0
  104. package/backend/src/types/auth.ts +66 -2
  105. package/backend/src/types/email.ts +8 -0
  106. package/backend/src/types/error-constants.ts +4 -0
  107. package/backend/src/types/logs.ts +0 -29
  108. package/backend/src/{core/socket/types.ts → types/socket.ts} +5 -6
  109. package/backend/src/utils/environment.ts +9 -3
  110. package/backend/src/utils/logger.ts +20 -2
  111. package/backend/src/utils/seed.ts +150 -57
  112. package/backend/src/utils/sql-parser.ts +1 -1
  113. package/backend/src/utils/utils.ts +114 -0
  114. package/backend/src/utils/validations.ts +40 -4
  115. package/backend/tests/local/test-ai-config.sh +129 -0
  116. package/backend/tests/local/test-ai-usage.sh +80 -0
  117. package/backend/tests/local/test-auth-router.sh +1 -1
  118. package/backend/tests/local/test-e2e.sh +1 -1
  119. package/backend/tests/local/test-functions.sh +123 -0
  120. package/backend/tests/local/test-logs.sh +132 -0
  121. package/backend/tests/local/test-public-bucket.sh +3 -3
  122. package/backend/tests/local/test-secrets.sh +14 -12
  123. package/backend/tests/local/test-traditional-rest.sh +2 -2
  124. package/backend/tests/manual/test-rawsql-modes.sh +244 -0
  125. package/backend/tests/test-config.sh +37 -1
  126. package/backend/tests/unit/cloud-token.test.ts +48 -0
  127. package/backend/tests/unit/constant.test.ts +8 -0
  128. package/backend/tests/unit/email.test.ts +372 -0
  129. package/backend/tests/unit/environment.test.ts +59 -0
  130. package/backend/tests/unit/helpers.test.ts +63 -0
  131. package/backend/tests/unit/logger.test.ts +22 -0
  132. package/backend/tests/unit/rate-limit.test.ts +154 -0
  133. package/backend/tests/unit/response.test.ts +58 -0
  134. package/backend/tests/unit/sql-parser.test.ts +74 -0
  135. package/backend/tests/unit/uuid.test.ts +21 -0
  136. package/backend/tests/unit/validations.test.ts +80 -0
  137. package/backend/tsconfig.json +1 -1
  138. package/backend/vitest.config.ts +11 -0
  139. package/claude-plugin/.claude-plugin/plugin.json +24 -0
  140. package/claude-plugin/README.md +133 -0
  141. package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +270 -0
  142. package/docker-compose.prod.yml +60 -4
  143. package/docker-compose.yml +65 -4
  144. package/docker-init/db/db-init.sql +6 -34
  145. package/docker-init/logs/vector.yml +236 -0
  146. package/docs/README.md +44 -0
  147. package/docs/changelog.mdx +67 -0
  148. package/docs/core-concepts/ai/architecture.mdx +373 -0
  149. package/docs/core-concepts/ai/sdk.mdx +213 -0
  150. package/docs/core-concepts/authentication/architecture.mdx +278 -0
  151. package/docs/core-concepts/authentication/sdk.mdx +414 -0
  152. package/docs/core-concepts/authentication/ui-components/customization.mdx +529 -0
  153. package/docs/core-concepts/authentication/ui-components/nextjs.mdx +221 -0
  154. package/docs/core-concepts/authentication/ui-components/react-router.mdx +184 -0
  155. package/docs/core-concepts/authentication/ui-components/react.mdx +129 -0
  156. package/docs/core-concepts/database/architecture.mdx +256 -0
  157. package/docs/core-concepts/database/sdk.mdx +382 -0
  158. package/docs/core-concepts/functions/architecture.mdx +105 -0
  159. package/docs/core-concepts/functions/sdk.mdx +184 -0
  160. package/docs/core-concepts/storage/architecture.mdx +243 -0
  161. package/docs/core-concepts/storage/sdk.mdx +253 -0
  162. package/docs/deployment/README.md +94 -0
  163. package/docs/deployment/deploy-to-aws-ec2.md +565 -0
  164. package/docs/deployment/deploy-to-azure-virtual-machines.md +313 -0
  165. package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -0
  166. package/docs/deployment/deploy-to-render.md +441 -0
  167. package/docs/docs.json +210 -0
  168. package/docs/examples/framework-guides/nextjs.mdx +131 -0
  169. package/docs/examples/framework-guides/nuxt.mdx +165 -0
  170. package/docs/examples/framework-guides/react.mdx +165 -0
  171. package/docs/examples/framework-guides/svelte.mdx +153 -0
  172. package/docs/examples/framework-guides/vue.mdx +159 -0
  173. package/docs/examples/overview.mdx +67 -0
  174. package/docs/favicon.svg +19 -0
  175. package/docs/images/changelog/nov-2025/auth-components.webp +0 -0
  176. package/docs/images/changelog/nov-2025/database-metadata.webp +0 -0
  177. package/docs/images/changelog/nov-2025/quickstart-prompts.webp +0 -0
  178. package/docs/images/changelog/nov-2025/sql-editor.webp +0 -0
  179. package/docs/images/changelog/nov-2025/usage-page.webp +0 -0
  180. package/docs/images/changelog/october-2025/csv-upload.webp +0 -0
  181. package/docs/images/changelog/october-2025/logs-feature.webp +0 -0
  182. package/docs/images/changelog/october-2025/oauth-providers.webp +0 -0
  183. package/docs/images/checks-passed.png +0 -0
  184. package/docs/images/dashboard-connect-expanded.png +0 -0
  185. package/docs/images/dashboard-connect.png +0 -0
  186. package/docs/images/hero-dark.png +0 -0
  187. package/docs/images/hero-light.png +0 -0
  188. package/docs/images/icons/ai.svg +4 -0
  189. package/docs/images/icons/auth.svg +1 -0
  190. package/docs/images/icons/database.svg +1 -0
  191. package/docs/images/icons/function.svg +1 -0
  192. package/docs/images/icons/storage.svg +1 -0
  193. package/docs/images/logos/nextjs.svg +4 -0
  194. package/docs/images/logos/nuxt.svg +4 -0
  195. package/docs/images/logos/react.svg +5 -0
  196. package/docs/images/logos/svelte.svg +4 -0
  197. package/docs/images/logos/vue.svg +5 -0
  198. package/docs/images/mcp-install.png +0 -0
  199. package/docs/images/onboarding-mcp.png +0 -0
  200. package/docs/insforge-instructions-sdk.md +55 -374
  201. package/docs/introduction.mdx +45 -0
  202. package/docs/logo/dark.svg +22 -0
  203. package/docs/logo/light.svg +20 -0
  204. package/docs/partnership.mdx +647 -0
  205. package/docs/quickstart.mdx +83 -0
  206. package/docs/showcase/2048-arena.png +0 -0
  207. package/docs/showcase/framegen-cloud.png +0 -0
  208. package/docs/showcase/line-connect-race.png +0 -0
  209. package/docs/showcase/moment-vibe.png +0 -0
  210. package/docs/showcase/national-flags.png +0 -0
  211. package/docs/showcase/pokemon-vibe.png +0 -0
  212. package/docs/showcase/pure-browse-buy.png +0 -0
  213. package/docs/showcase.mdx +52 -0
  214. package/docs/snippets/sdk-installation.mdx +22 -0
  215. package/docs/snippets/service-icons.mdx +27 -0
  216. package/eslint.config.js +10 -3
  217. package/frontend/package.json +10 -4
  218. package/frontend/src/App.tsx +13 -82
  219. package/frontend/src/assets/icons/connected.svg +3 -0
  220. package/frontend/src/assets/icons/loader.svg +9 -0
  221. package/frontend/src/assets/logos/apple.svg +4 -0
  222. package/frontend/src/assets/logos/discord.svg +1 -1
  223. package/frontend/src/assets/logos/facebook.svg +3 -0
  224. package/frontend/src/assets/logos/instagram.svg +2 -0
  225. package/frontend/src/assets/logos/linkedin.svg +3 -0
  226. package/frontend/src/assets/logos/microsoft.svg +1 -0
  227. package/frontend/src/assets/logos/spotify.svg +17 -0
  228. package/frontend/src/assets/logos/tiktok.svg +6 -0
  229. package/frontend/src/assets/logos/x.svg +3 -0
  230. package/frontend/src/components/Checkbox.tsx +27 -29
  231. package/frontend/src/components/CodeBlock.tsx +55 -2
  232. package/frontend/src/components/CodeEditor.tsx +92 -0
  233. package/frontend/src/components/ConfirmDialog.tsx +1 -1
  234. package/frontend/src/components/ConnectCTA.tsx +38 -0
  235. package/frontend/src/components/CopyButton.tsx +52 -15
  236. package/frontend/src/components/ErrorState.tsx +1 -2
  237. package/frontend/src/components/FeatureSidebar.tsx +6 -6
  238. package/frontend/src/components/FeatureSidebarItem.tsx +2 -2
  239. package/frontend/src/components/JsonHighlight.tsx +21 -9
  240. package/frontend/src/components/ProjectInfoModal.tsx +128 -0
  241. package/frontend/src/components/PromptDialog.tsx +1 -4
  242. package/frontend/src/components/SearchInput.tsx +1 -2
  243. package/frontend/src/components/Stepper.tsx +53 -0
  244. package/frontend/src/components/ThemeToggle.tsx +3 -3
  245. package/frontend/src/components/datagrid/DataGrid.tsx +25 -32
  246. package/frontend/src/components/datagrid/cell-editors/DateCellEditor.tsx +1 -2
  247. package/frontend/src/components/datagrid/cell-editors/JsonCellEditor.tsx +2 -4
  248. package/frontend/src/components/datagrid/index.ts +23 -0
  249. package/frontend/src/components/index.ts +23 -30
  250. package/frontend/src/components/layout/AppHeader.tsx +133 -92
  251. package/frontend/src/components/layout/AppSidebar.tsx +80 -170
  252. package/frontend/src/components/layout/Layout.tsx +12 -23
  253. package/frontend/src/components/layout/PrimaryMenu.tsx +187 -0
  254. package/frontend/src/components/layout/SecondaryMenu.tsx +70 -0
  255. package/frontend/src/components/layout/index.ts +5 -0
  256. package/frontend/src/components/radix/Tooltip.tsx +24 -13
  257. package/frontend/src/components/radix/index.ts +22 -0
  258. package/frontend/src/features/ai/components/AIConfigCard.tsx +129 -83
  259. package/frontend/src/features/ai/components/AIEmptyState.tsx +12 -7
  260. package/frontend/src/features/ai/components/ModalityFilterSidebar.tsx +101 -0
  261. package/frontend/src/features/ai/components/ModelSelectionDialog.tsx +135 -0
  262. package/frontend/src/features/ai/components/ModelSelectionGrid.tsx +51 -0
  263. package/frontend/src/features/ai/components/SystemPromptDialog.tsx +118 -0
  264. package/frontend/src/features/ai/components/index.ts +6 -0
  265. package/frontend/src/features/ai/helpers.ts +57 -71
  266. package/frontend/src/features/ai/hooks/useAIConfigs.ts +39 -113
  267. package/frontend/src/features/ai/hooks/useAIUsage.ts +0 -2
  268. package/frontend/src/features/ai/page/AIPage.tsx +67 -79
  269. package/frontend/src/features/ai/services/ai.service.ts +5 -5
  270. package/frontend/src/features/auth/components/AuthPreview.tsx +96 -0
  271. package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +53 -30
  272. package/frontend/src/features/auth/components/UserFormDialog.tsx +13 -6
  273. package/frontend/src/features/auth/components/UsersDataGrid.tsx +44 -14
  274. package/frontend/src/features/auth/components/index.ts +5 -0
  275. package/frontend/src/features/auth/helpers.tsx +200 -0
  276. package/frontend/src/features/auth/hooks/useAnonToken.ts +30 -0
  277. package/frontend/src/features/auth/hooks/useAuthConfig.ts +48 -0
  278. package/frontend/src/features/auth/hooks/useOAuthConfig.ts +14 -10
  279. package/frontend/src/features/auth/hooks/useUsers.ts +43 -5
  280. package/frontend/src/features/auth/index.ts +3 -2
  281. package/frontend/src/features/auth/page/AuthMethodsPage.tsx +275 -0
  282. package/frontend/src/features/auth/page/ConfigurationPage.tsx +395 -0
  283. package/frontend/src/features/auth/page/UsersPage.tsx +285 -0
  284. package/frontend/src/features/auth/services/anonToken.service.ts +11 -0
  285. package/frontend/src/features/auth/services/config.service.ts +19 -0
  286. package/frontend/src/features/auth/services/{oauth.service.ts → oauth-config.service.ts} +4 -4
  287. package/frontend/src/features/auth/services/{auth.service.ts → user.service.ts} +7 -53
  288. package/frontend/src/features/dashboard/components/ConnectionSuccessBanner.tsx +35 -0
  289. package/frontend/src/features/dashboard/components/PromptCard.tsx +21 -0
  290. package/frontend/src/features/dashboard/components/PromptDialog.tsx +103 -0
  291. package/frontend/src/features/dashboard/components/StatsCard.tsx +50 -0
  292. package/frontend/src/features/dashboard/components/index.ts +4 -0
  293. package/frontend/src/features/dashboard/page/DashboardPage.tsx +187 -169
  294. package/frontend/src/features/dashboard/prompts/ai-chatbot.ts +13 -0
  295. package/frontend/src/features/dashboard/prompts/crm-system.ts +13 -0
  296. package/frontend/src/features/dashboard/prompts/ecommerce-platform.ts +12 -0
  297. package/frontend/src/features/dashboard/prompts/index.ts +31 -0
  298. package/frontend/src/features/dashboard/prompts/instagram-clone.ts +11 -0
  299. package/frontend/src/features/dashboard/prompts/notion-clone.ts +14 -0
  300. package/frontend/src/features/dashboard/prompts/reddit-clone.ts +12 -0
  301. package/frontend/src/features/database/components/DatabaseDataGrid.tsx +48 -17
  302. package/frontend/src/features/database/components/ForeignKeyCell.tsx +15 -34
  303. package/frontend/src/features/database/components/ForeignKeyPopover.tsx +19 -20
  304. package/frontend/src/features/database/components/LinkRecordModal.tsx +120 -125
  305. package/frontend/src/features/database/components/RecordFormDialog.tsx +22 -33
  306. package/frontend/src/features/database/components/RecordFormField.tsx +45 -47
  307. package/frontend/src/features/database/components/TableEmptyState.tsx +6 -5
  308. package/frontend/src/features/database/components/TableForm.tsx +28 -15
  309. package/frontend/src/features/database/components/TableFormColumn.tsx +2 -3
  310. package/frontend/src/features/database/components/TableSidebar.tsx +1 -1
  311. package/frontend/src/features/database/components/TablesEmptyState.tsx +48 -0
  312. package/frontend/src/features/database/components/TemplateCard.tsx +37 -0
  313. package/frontend/src/features/database/components/TemplatePreview.tsx +92 -0
  314. package/frontend/src/features/database/components/index.ts +19 -0
  315. package/frontend/src/features/database/constants.ts +28 -2
  316. package/frontend/src/features/database/contexts/SQLEditorContext.tsx +188 -0
  317. package/frontend/src/features/database/helpers.ts +2 -2
  318. package/frontend/src/features/database/hooks/useCSVImport.ts +29 -0
  319. package/frontend/src/features/database/hooks/useFullMetadata.ts +18 -0
  320. package/frontend/src/features/database/hooks/useRawSQL.ts +55 -0
  321. package/frontend/src/features/database/hooks/useRecords.ts +139 -0
  322. package/frontend/src/features/database/hooks/useTables.ts +131 -0
  323. package/frontend/src/features/database/index.ts +6 -1
  324. package/frontend/src/features/database/page/FunctionsPage.tsx +211 -0
  325. package/frontend/src/features/database/page/IndexesPage.tsx +240 -0
  326. package/frontend/src/features/database/page/PoliciesPage.tsx +248 -0
  327. package/frontend/src/features/database/page/SQLEditorPage.tsx +382 -0
  328. package/frontend/src/features/database/page/{DatabasePage.tsx → TablesPage.tsx} +186 -185
  329. package/frontend/src/features/database/page/TemplatesPage.tsx +39 -0
  330. package/frontend/src/features/database/page/TriggersPage.tsx +242 -0
  331. package/frontend/src/features/database/services/advance.service.ts +66 -0
  332. package/frontend/src/features/database/services/{database.service.ts → record.service.ts} +67 -64
  333. package/frontend/src/features/database/services/table.service.ts +64 -0
  334. package/frontend/src/features/database/templates/ai-chatbot.ts +402 -0
  335. package/frontend/src/features/database/templates/crm-system.ts +528 -0
  336. package/frontend/src/features/database/templates/ecommerce-platform.ts +553 -0
  337. package/frontend/src/features/database/templates/index.ts +34 -0
  338. package/frontend/src/features/database/templates/instagram-clone.ts +222 -0
  339. package/frontend/src/features/database/templates/notion-clone.ts +483 -0
  340. package/frontend/src/features/database/templates/reddit-clone.ts +526 -0
  341. package/frontend/src/features/functions/components/FunctionRow.tsx +2 -1
  342. package/frontend/src/features/functions/components/FunctionsSidebar.tsx +1 -1
  343. package/frontend/src/features/functions/components/SecretRow.tsx +1 -1
  344. package/frontend/src/features/functions/components/index.ts +5 -0
  345. package/frontend/src/features/functions/hooks/useFunctions.ts +4 -4
  346. package/frontend/src/features/{secrets → functions}/hooks/useSecrets.ts +5 -5
  347. package/frontend/src/features/functions/page/FunctionsPage.tsx +160 -17
  348. package/frontend/src/features/functions/{components/SecretsContent.tsx → page/SecretsPage.tsx} +8 -12
  349. package/frontend/src/features/functions/services/{functions.service.ts → function.service.ts} +2 -2
  350. package/frontend/src/features/{secrets/services/secrets.service.ts → functions/services/secret.service.ts} +2 -2
  351. package/frontend/src/features/login/hooks/usePartnerOrigin.ts +27 -0
  352. package/frontend/src/features/login/page/CloudLoginPage.tsx +79 -54
  353. package/frontend/src/features/login/page/LoginPage.tsx +16 -23
  354. package/frontend/src/features/login/services/partnership.service.ts +65 -0
  355. package/frontend/src/features/logs/components/LogsDataGrid.tsx +89 -0
  356. package/frontend/src/features/logs/components/SeverityBadge.tsx +18 -0
  357. package/frontend/src/features/logs/components/index.ts +2 -0
  358. package/frontend/src/features/logs/helpers.ts +24 -0
  359. package/frontend/src/features/logs/hooks/useAuditLogs.ts +4 -4
  360. package/frontend/src/features/logs/hooks/useLogSources.ts +137 -0
  361. package/frontend/src/features/logs/hooks/useLogs.ts +163 -0
  362. package/frontend/src/features/logs/hooks/useMcpUsage.ts +181 -0
  363. package/frontend/src/features/logs/index.ts +8 -2
  364. package/frontend/src/features/logs/page/AuditsPage.tsx +91 -38
  365. package/frontend/src/features/logs/page/LogsPage.tsx +152 -0
  366. package/frontend/src/features/logs/page/MCPLogsPage.tsx +84 -0
  367. package/frontend/src/features/logs/services/audit.service.ts +63 -0
  368. package/frontend/src/features/logs/services/log.service.ts +15 -110
  369. package/frontend/src/features/logs/services/usage.service.ts +31 -0
  370. package/frontend/src/features/onboard/components/McpConnectionStatus.tsx +68 -0
  371. package/frontend/src/features/onboard/components/OnboardingModal.tsx +267 -0
  372. package/frontend/src/features/onboard/components/VideoDemoModal.tsx +38 -0
  373. package/frontend/src/features/onboard/components/index.ts +4 -0
  374. package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +2 -2
  375. package/frontend/src/features/onboard/components/mcp/{mcp-helper.tsx → helpers.tsx} +8 -8
  376. package/frontend/src/features/onboard/components/mcp/index.ts +2 -3
  377. package/frontend/src/features/onboard/index.ts +13 -3
  378. package/frontend/src/features/storage/components/BucketEmptyState.tsx +9 -6
  379. package/frontend/src/features/storage/components/BucketFormDialog.tsx +25 -41
  380. package/frontend/src/features/storage/components/FilePreviewDialog.tsx +20 -8
  381. package/frontend/src/features/storage/components/StorageDataGrid.tsx +4 -3
  382. package/frontend/src/features/storage/components/StorageManager.tsx +23 -34
  383. package/frontend/src/features/storage/components/index.ts +12 -0
  384. package/frontend/src/features/storage/hooks/useStorage.ts +208 -0
  385. package/frontend/src/features/storage/page/StoragePage.tsx +41 -115
  386. package/frontend/src/features/storage/services/storage.service.ts +22 -1
  387. package/frontend/src/features/visualizer/components/AuthNode.tsx +72 -56
  388. package/frontend/src/features/visualizer/components/BucketNode.tsx +4 -4
  389. package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +108 -80
  390. package/frontend/src/features/visualizer/components/TableNode.tsx +34 -41
  391. package/frontend/src/features/visualizer/components/VisualizerSkeleton.tsx +12 -4
  392. package/frontend/src/features/visualizer/page/VisualizerPage.tsx +33 -29
  393. package/frontend/src/index.css +1 -0
  394. package/frontend/src/lib/analytics/posthog.tsx +27 -0
  395. package/frontend/src/lib/contexts/AuthContext.tsx +38 -31
  396. package/frontend/src/lib/contexts/SocketContext.tsx +5 -6
  397. package/frontend/src/{features/metadata → lib}/hooks/useMetadata.ts +1 -1
  398. package/frontend/src/lib/hooks/useToast.tsx +6 -2
  399. package/frontend/src/lib/routing/AppRoutes.tsx +84 -0
  400. package/frontend/src/lib/routing/RequireAuth.tsx +27 -0
  401. package/frontend/src/lib/utils/cloudMessaging.ts +20 -0
  402. package/frontend/src/lib/utils/menuItems.ts +183 -0
  403. package/frontend/src/lib/utils/{validation-schemas.ts → schemaValidations.ts} +10 -5
  404. package/frontend/src/lib/utils/utils.ts +19 -1
  405. package/frontend/src/vite-env.d.ts +1 -0
  406. package/frontend/vite.config.ts +5 -3
  407. package/functions/server.ts +28 -3
  408. package/functions/worker-template.js +15 -4
  409. package/i18n/README.ar.md +130 -0
  410. package/i18n/README.de.md +130 -0
  411. package/i18n/README.es.md +154 -0
  412. package/i18n/README.fr.md +134 -0
  413. package/i18n/README.hi.md +129 -0
  414. package/i18n/README.ja.md +174 -0
  415. package/i18n/README.ko.md +137 -0
  416. package/i18n/README.pt-BR.md +131 -0
  417. package/i18n/README.ru.md +129 -0
  418. package/i18n/README.zh-CN.md +133 -0
  419. package/openapi/ai.yaml +31 -4
  420. package/openapi/auth.yaml +827 -146
  421. package/package.json +16 -7
  422. package/shared-schemas/package.json +1 -1
  423. package/shared-schemas/src/ai-api.schema.ts +34 -58
  424. package/shared-schemas/src/ai.schema.ts +5 -0
  425. package/shared-schemas/src/auth-api.schema.ts +154 -8
  426. package/shared-schemas/src/auth.schema.ts +42 -6
  427. package/shared-schemas/src/cloud-events.schema.ts +57 -0
  428. package/shared-schemas/src/database-api.schema.ts +3 -3
  429. package/shared-schemas/src/database.schema.ts +1 -1
  430. package/shared-schemas/src/index.ts +1 -0
  431. package/shared-schemas/src/logs-api.schema.ts +7 -1
  432. package/shared-schemas/src/logs.schema.ts +26 -0
  433. package/shared-schemas/src/metadata.schema.ts +9 -4
  434. package/test-gemini.sh +35 -0
  435. package/test-usage-admin.sh +57 -0
  436. package/test-usage.sh +50 -0
  437. package/zeabur/README.md +13 -0
  438. package/zeabur/template.yml +1032 -0
  439. package/.github/workflows/deploy-aws.yml +0 -130
  440. package/backend/src/api/routes/agent.ts +0 -29
  441. package/backend/src/api/routes/auth.oauth.ts +0 -482
  442. package/backend/src/api/routes/auth.ts +0 -386
  443. package/backend/src/api/routes/docs.ts +0 -66
  444. package/backend/src/api/routes/functions.ts +0 -183
  445. package/backend/src/api/routes/openapi.ts +0 -82
  446. package/backend/src/api/routes/usage.ts +0 -96
  447. package/backend/src/core/ai/client.ts +0 -242
  448. package/backend/src/core/ai/model.ts +0 -117
  449. package/backend/src/core/auth/auth.ts +0 -781
  450. package/backend/src/core/database/table.ts +0 -772
  451. package/backend/src/core/documentation/agent.ts +0 -689
  452. package/backend/src/core/documentation/openapi.ts +0 -856
  453. package/backend/src/core/logs/analytics.ts +0 -76
  454. package/backend/src/core/logs/providers/localdb.provider.ts +0 -246
  455. package/backend/src/core/storage/storage.ts +0 -923
  456. package/backend/src/utils/cloud-token.ts +0 -39
  457. package/backend/src/utils/helpers.ts +0 -49
  458. package/backend/src/utils/uuid.ts +0 -9
  459. package/backend/tests/manual/test-better-auth.sh +0 -303
  460. package/docker-init/db/logs.sql +0 -9
  461. package/frontend/README.md +0 -112
  462. package/frontend/src/components/datagrid/index.tsx +0 -20
  463. package/frontend/src/components/layout/CloudLayout.tsx +0 -95
  464. package/frontend/src/features/ai/components/AIConfigDialog.tsx +0 -76
  465. package/frontend/src/features/ai/components/AIConfigForm.tsx +0 -222
  466. package/frontend/src/features/ai/components/fields/ModalityField.tsx +0 -87
  467. package/frontend/src/features/ai/components/fields/ModelSelectionField.tsx +0 -134
  468. package/frontend/src/features/ai/components/fields/SystemPromptField.tsx +0 -33
  469. package/frontend/src/features/auth/components/AddOAuthDialog.tsx +0 -106
  470. package/frontend/src/features/auth/components/AuthMethodTab.tsx +0 -238
  471. package/frontend/src/features/auth/components/UsersTab.tsx +0 -114
  472. package/frontend/src/features/auth/page/AuthenticationPage.tsx +0 -169
  473. package/frontend/src/features/database/hooks/UseLinkModal.tsx +0 -78
  474. package/frontend/src/features/functions/components/FunctionViewer.tsx +0 -46
  475. package/frontend/src/features/functions/components/FunctionsContent.tsx +0 -88
  476. package/frontend/src/features/login/components/AuthErrorBoundary.tsx +0 -87
  477. package/frontend/src/features/login/components/PrivateRoute.tsx +0 -24
  478. package/frontend/src/features/logs/components/AnalyticsLogsTable.tsx +0 -313
  479. package/frontend/src/features/logs/components/LogsTable.tsx +0 -199
  480. package/frontend/src/features/logs/page/AnalyticsLogsPage.tsx +0 -530
  481. package/frontend/src/features/metadata/index.ts +0 -0
  482. package/frontend/src/features/metadata/page/MetadataPage.tsx +0 -136
  483. package/frontend/src/features/onboard/components/CompletionCard.tsx +0 -41
  484. package/frontend/src/features/onboard/components/OnboardButton.tsx +0 -84
  485. package/frontend/src/features/onboard/components/StepContent.tsx +0 -91
  486. package/frontend/src/features/onboard/components/TestConnectionStep.tsx +0 -53
  487. package/frontend/src/features/onboard/components/mcp/McpInstallation.tsx +0 -144
  488. package/frontend/src/features/onboard/page/OnBoardPage.tsx +0 -104
  489. package/frontend/src/features/onboard/types.ts +0 -8
  490. package/frontend/src/lib/contexts/OnboardStepContext.tsx +0 -68
  491. package/frontend/src/lib/hooks/useOnboardingCompletion.ts +0 -29
  492. /package/backend/src/api/{middleware → middlewares}/error.ts +0 -0
  493. /package/backend/src/api/{middleware → middlewares}/upload.ts +0 -0
  494. /package/backend/{migrations → src/infra/database/migrations}/000_create-base-tables.sql +0 -0
  495. /package/backend/{migrations → src/infra/database/migrations}/001_create-helper-functions.sql +0 -0
  496. /package/backend/{migrations → src/infra/database/migrations}/002_rename-auth-tables.sql +0 -0
  497. /package/backend/{migrations → src/infra/database/migrations}/003_create-users-table.sql +0 -0
  498. /package/backend/{migrations → src/infra/database/migrations}/004_add-reload-postgrest-func.sql +0 -0
  499. /package/backend/{migrations → src/infra/database/migrations}/005_enable-project-admin-modify-users.sql +0 -0
  500. /package/backend/{migrations → src/infra/database/migrations}/006_modify-ai-usage-table.sql +0 -0
  501. /package/backend/{migrations → src/infra/database/migrations}/007_drop-metadata-table.sql +0 -0
  502. /package/backend/{migrations → src/infra/database/migrations}/008_add-system-tables.sql +0 -0
  503. /package/backend/{migrations → src/infra/database/migrations}/009_add-function-secrets.sql +0 -0
  504. /package/backend/{migrations → src/infra/database/migrations}/010_modify-ai-config-modalities.sql +0 -0
  505. /package/backend/{migrations → src/infra/database/migrations}/011_refactor-secrets-table.sql +0 -0
  506. /package/backend/{migrations → src/infra/database/migrations}/012_add-storage-uploaded-by.sql +0 -0
  507. /package/frontend/src/{features/metadata → lib}/services/metadata.service.ts +0 -0
@@ -1,856 +0,0 @@
1
- import {
2
- OpenAPIRegistry,
3
- OpenApiGeneratorV3,
4
- extendZodWithOpenApi,
5
- } from '@asteasolutions/zod-to-openapi';
6
- import { z } from 'zod';
7
- import { TableSchema, ColumnSchema, ColumnType } from '@insforge/shared-schemas';
8
- import logger from '@/utils/logger.js';
9
- import { DatabaseTableService } from '../database/table';
10
- import { DatabaseManager } from '../database/manager';
11
-
12
- // Extend Zod with OpenAPI functionality
13
- extendZodWithOpenApi(z);
14
-
15
- export class OpenAPIService {
16
- private static instance: OpenAPIService;
17
-
18
- private constructor() {}
19
-
20
- static getInstance(): OpenAPIService {
21
- if (!OpenAPIService.instance) {
22
- OpenAPIService.instance = new OpenAPIService();
23
- }
24
- return OpenAPIService.instance;
25
- }
26
-
27
- /**
28
- * Convert column type to Zod schema
29
- */
30
- private columnToZodType(column: ColumnSchema): z.ZodTypeAny {
31
- let baseType: z.ZodTypeAny;
32
-
33
- switch (column.type) {
34
- case ColumnType.STRING:
35
- baseType = z.string();
36
- break;
37
- case ColumnType.INTEGER:
38
- baseType = z.number().int();
39
- break;
40
- case ColumnType.FLOAT:
41
- baseType = z.number();
42
- break;
43
- case ColumnType.BOOLEAN:
44
- baseType = z.boolean();
45
- break;
46
- case ColumnType.DATE:
47
- baseType = z.string().date();
48
- break;
49
- case ColumnType.DATETIME:
50
- baseType = z.string().datetime();
51
- break;
52
- case ColumnType.UUID:
53
- baseType = z.string().uuid();
54
- break;
55
- case ColumnType.JSON:
56
- baseType = z.record(z.unknown());
57
- break;
58
- default:
59
- baseType = z.unknown();
60
- }
61
-
62
- // Apply nullable/optional modifiers
63
- if (column.isNullable) {
64
- baseType = baseType.nullable();
65
- }
66
-
67
- // Apply default values
68
- if (column.defaultValue !== undefined) {
69
- baseType = baseType.optional();
70
- }
71
-
72
- return baseType;
73
- }
74
-
75
- /**
76
- * Generate Zod schema for a table
77
- */
78
- private generateTableSchema(table: TableSchema): z.ZodObject<Record<string, z.ZodTypeAny>> {
79
- const schemaFields: Record<string, z.ZodTypeAny> = {};
80
-
81
- for (const column of table.columns) {
82
- schemaFields[column.columnName] = this.columnToZodType(column);
83
- }
84
-
85
- return z.object(schemaFields);
86
- }
87
-
88
- /**
89
- * Generate filter schema for query parameters
90
- */
91
- private generateFilterSchema(table: TableSchema): z.ZodObject<Record<string, z.ZodTypeAny>> {
92
- const filterFields: Record<string, z.ZodTypeAny> = {};
93
-
94
- // Standard PostgREST query parameters
95
- filterFields['select'] = z.string().optional().describe('Columns to select');
96
- filterFields['order'] = z.string().optional().describe('Column to order by');
97
- filterFields['limit'] = z.string().optional().describe('Maximum number of rows to return');
98
- filterFields['offset'] = z.string().optional().describe('Number of rows to skip');
99
-
100
- // Add column-specific filters
101
- for (const column of table.columns) {
102
- const columnName = column.columnName;
103
-
104
- // Basic equality filter
105
- filterFields[columnName] = z.string().optional().describe(`Filter by ${columnName}`);
106
-
107
- // PostgREST operators
108
- filterFields[`${columnName}.eq`] = z.string().optional().describe(`${columnName} equals`);
109
- filterFields[`${columnName}.neq`] = z
110
- .string()
111
- .optional()
112
- .describe(`${columnName} not equals`);
113
- filterFields[`${columnName}.gt`] = z
114
- .string()
115
- .optional()
116
- .describe(`${columnName} greater than`);
117
- filterFields[`${columnName}.gte`] = z
118
- .string()
119
- .optional()
120
- .describe(`${columnName} greater than or equal`);
121
- filterFields[`${columnName}.lt`] = z.string().optional().describe(`${columnName} less than`);
122
- filterFields[`${columnName}.lte`] = z
123
- .string()
124
- .optional()
125
- .describe(`${columnName} less than or equal`);
126
- filterFields[`${columnName}.like`] = z
127
- .string()
128
- .optional()
129
- .describe(`${columnName} LIKE pattern`);
130
- filterFields[`${columnName}.ilike`] = z
131
- .string()
132
- .optional()
133
- .describe(`${columnName} ILIKE pattern (case insensitive)`);
134
- filterFields[`${columnName}.is`] = z
135
- .string()
136
- .optional()
137
- .describe(`${columnName} IS (for null checks)`);
138
- filterFields[`${columnName}.in`] = z.string().optional().describe(`${columnName} IN list`);
139
- }
140
-
141
- return z.object(filterFields);
142
- }
143
-
144
- /**
145
- * Register authentication endpoints
146
- */
147
- private registerAuthenticationEndpoints(registry: OpenAPIRegistry) {
148
- // User registration endpoint
149
- registry.registerPath({
150
- method: 'post',
151
- path: '/api/auth/users',
152
- summary: 'Register new user',
153
- description: 'Create a new user account',
154
- tags: ['Authentication'],
155
- request: {
156
- body: {
157
- content: {
158
- 'application/json': {
159
- schema: z
160
- .object({
161
- email: z.string().email().describe('Valid email address'),
162
- password: z.string().min(8).describe('User password (min 8 characters)'),
163
- name: z.string().optional().describe('User display name'),
164
- })
165
- .openapi('UserRegistration'),
166
- },
167
- },
168
- },
169
- },
170
- responses: {
171
- 200: {
172
- description: 'User registered successfully',
173
- content: {
174
- 'application/json': {
175
- schema: z
176
- .object({
177
- user: z.object({
178
- id: z.string(),
179
- email: z.string(),
180
- name: z.string().nullable(),
181
- }),
182
- accessToken: z.string().describe('JWT token for authentication'),
183
- })
184
- .openapi('AuthResponse'),
185
- },
186
- },
187
- },
188
- 400: {
189
- description: 'Invalid request',
190
- },
191
- 409: {
192
- description: 'User already exists',
193
- },
194
- },
195
- });
196
-
197
- // User login endpoint
198
- registry.registerPath({
199
- method: 'post',
200
- path: '/api/auth/sessions',
201
- summary: 'User login',
202
- description: 'Authenticate user and create session',
203
- tags: ['Authentication'],
204
- request: {
205
- body: {
206
- content: {
207
- 'application/json': {
208
- schema: z
209
- .object({
210
- email: z.string().email().describe('User email address'),
211
- password: z.string().describe('User password'),
212
- })
213
- .openapi('UserLogin'),
214
- },
215
- },
216
- },
217
- },
218
- responses: {
219
- 200: {
220
- description: 'Login successful',
221
- content: {
222
- 'application/json': {
223
- schema: z
224
- .object({
225
- user: z.object({
226
- id: z.string(),
227
- email: z.string(),
228
- name: z.string().nullable(),
229
- }),
230
- accessToken: z.string().describe('JWT token for authentication'),
231
- })
232
- .openapi('AuthResponse'),
233
- },
234
- },
235
- },
236
- 401: {
237
- description: 'Invalid credentials',
238
- },
239
- 400: {
240
- description: 'Invalid request',
241
- },
242
- },
243
- });
244
-
245
- // Get current user endpoint
246
- registry.registerPath({
247
- method: 'get',
248
- path: '/api/auth/sessions/current',
249
- summary: 'Get current user',
250
- description: 'Get information about the currently authenticated user',
251
- tags: ['Authentication'],
252
- security: [{ BearerAuth: [] }],
253
- responses: {
254
- 200: {
255
- description: 'Current user information',
256
- content: {
257
- 'application/json': {
258
- schema: z
259
- .object({
260
- user: z.object({
261
- id: z.string(),
262
- email: z.string(),
263
- role: z.string(),
264
- }),
265
- })
266
- .openapi('CurrentUserResponse'),
267
- },
268
- },
269
- },
270
- 401: {
271
- description: 'Unauthorized',
272
- },
273
- },
274
- });
275
-
276
- // Google OAuth endpoint
277
- registry.registerPath({
278
- method: 'get',
279
- path: '/api/auth/oauth/google',
280
- summary: 'Google OAuth',
281
- description: 'Initiate Google OAuth authentication',
282
- tags: ['Authentication'],
283
- request: {
284
- query: z
285
- .object({
286
- redirect_uri: z.string().optional().describe('URL to redirect after OAuth completion'),
287
- })
288
- .openapi('OAuthRequest'),
289
- },
290
- responses: {
291
- 200: {
292
- description: 'OAuth URL generated',
293
- content: {
294
- 'application/json': {
295
- schema: z
296
- .object({
297
- authUrl: z.string().describe('Google OAuth authorization URL'),
298
- })
299
- .openapi('OAuthUrlResponse'),
300
- },
301
- },
302
- },
303
- 500: {
304
- description: 'Internal server error',
305
- },
306
- },
307
- });
308
-
309
- // GitHub OAuth endpoint
310
- registry.registerPath({
311
- method: 'get',
312
- path: '/api/auth/oauth/github',
313
- summary: 'GitHub OAuth',
314
- description: 'Initiate GitHub OAuth authentication',
315
- tags: ['Authentication'],
316
- request: {
317
- query: z
318
- .object({
319
- redirect_uri: z.string().optional().describe('URL to redirect after OAuth completion'),
320
- })
321
- .openapi('OAuthRequest'),
322
- },
323
- responses: {
324
- 200: {
325
- description: 'OAuth URL generated',
326
- content: {
327
- 'application/json': {
328
- schema: z
329
- .object({
330
- authUrl: z.string().describe('GitHub OAuth authorization URL'),
331
- })
332
- .openapi('OAuthUrlResponse'),
333
- },
334
- },
335
- },
336
- 500: {
337
- description: 'Internal server error',
338
- },
339
- },
340
- });
341
-
342
- // OAuth callback endpoint
343
- registry.registerPath({
344
- method: 'get',
345
- path: '/api/auth/oauth/{provider}/callback',
346
- summary: 'OAuth callback',
347
- description: 'OAuth callback endpoint - handled automatically by OAuth flow',
348
- tags: ['Authentication'],
349
- request: {
350
- params: z
351
- .object({
352
- provider: z.enum(['google', 'github']).describe('OAuth provider'),
353
- })
354
- .openapi('OAuthProvider'),
355
- query: z
356
- .object({
357
- code: z.string().describe('Authorization code from OAuth provider'),
358
- state: z.string().describe('State parameter for security'),
359
- token: z.string().optional().describe('ID token for some flows'),
360
- })
361
- .openapi('OAuthCallback'),
362
- },
363
- responses: {
364
- 302: {
365
- description: 'Redirects to redirect_uri with authentication details or error',
366
- },
367
- },
368
- });
369
- }
370
-
371
- /**
372
- * Register storage endpoints
373
- */
374
- private registerStorageEndpoints(registry: OpenAPIRegistry) {
375
- // Upload object with specific key
376
- registry.registerPath({
377
- method: 'put',
378
- path: '/api/storage/buckets/{bucketName}/objects/{objectKey}',
379
- summary: 'Upload object',
380
- description: 'Upload a file to storage with a specific key',
381
- tags: ['Storage'],
382
- security: [{ BearerAuth: [] }],
383
- request: {
384
- params: z
385
- .object({
386
- bucketName: z.string().describe('Name of the bucket'),
387
- objectKey: z.string().describe('Full object key/path (e.g., "images/photo.jpg")'),
388
- })
389
- .openapi('StorageParams'),
390
- body: {
391
- content: {
392
- 'multipart/form-data': {
393
- schema: z
394
- .object({
395
- file: z.instanceof(File).describe('File to upload'),
396
- })
397
- .openapi('FileUpload'),
398
- },
399
- },
400
- },
401
- },
402
- responses: {
403
- 201: {
404
- description: 'File uploaded successfully',
405
- content: {
406
- 'application/json': {
407
- schema: z
408
- .object({
409
- key: z.string(),
410
- bucket: z.string(),
411
- size: z.number(),
412
- mimeType: z.string().optional(),
413
- uploadedAt: z.string(),
414
- url: z.string(),
415
- })
416
- .openapi('StorageFile'),
417
- },
418
- },
419
- },
420
- 400: {
421
- description: 'Bad request',
422
- },
423
- 401: {
424
- description: 'Unauthorized',
425
- },
426
- 409: {
427
- description: 'Conflict - file already exists',
428
- },
429
- },
430
- });
431
-
432
- // Upload object with auto-generated key
433
- registry.registerPath({
434
- method: 'post',
435
- path: '/api/storage/buckets/{bucketName}/objects',
436
- summary: 'Upload object with auto-key',
437
- description: 'Upload a file to storage with an auto-generated key',
438
- tags: ['Storage'],
439
- security: [{ BearerAuth: [] }],
440
- request: {
441
- params: z
442
- .object({
443
- bucketName: z.string().describe('Name of the bucket'),
444
- })
445
- .openapi('BucketParam'),
446
- body: {
447
- content: {
448
- 'multipart/form-data': {
449
- schema: z
450
- .object({
451
- file: z.instanceof(File).describe('File to upload'),
452
- })
453
- .openapi('FileUpload'),
454
- },
455
- },
456
- },
457
- },
458
- responses: {
459
- 201: {
460
- description: 'File uploaded successfully',
461
- content: {
462
- 'application/json': {
463
- schema: z
464
- .object({
465
- key: z.string(),
466
- bucket: z.string(),
467
- size: z.number(),
468
- mimeType: z.string().optional(),
469
- uploadedAt: z.string(),
470
- url: z.string(),
471
- })
472
- .openapi('StorageFile'),
473
- },
474
- },
475
- },
476
- 400: {
477
- description: 'Bad request',
478
- },
479
- 401: {
480
- description: 'Unauthorized',
481
- },
482
- 404: {
483
- description: 'Bucket not found',
484
- },
485
- },
486
- });
487
-
488
- // Download object
489
- registry.registerPath({
490
- method: 'get',
491
- path: '/api/storage/buckets/{bucketName}/objects/{objectKey}',
492
- summary: 'Download object',
493
- description: 'Download a file from storage',
494
- tags: ['Storage'],
495
- request: {
496
- params: z
497
- .object({
498
- bucketName: z.string().describe('Name of the bucket'),
499
- objectKey: z.string().describe('Full object key/path'),
500
- })
501
- .openapi('StorageParams'),
502
- },
503
- responses: {
504
- 200: {
505
- description: 'File content',
506
- content: {
507
- 'application/octet-stream': {
508
- schema: z.instanceof(Buffer).describe('Binary file data'),
509
- },
510
- },
511
- },
512
- 404: {
513
- description: 'File not found',
514
- },
515
- 401: {
516
- description: 'Unauthorized (for private buckets)',
517
- },
518
- },
519
- });
520
-
521
- // Delete object
522
- registry.registerPath({
523
- method: 'delete',
524
- path: '/api/storage/buckets/{bucketName}/objects/{objectKey}',
525
- summary: 'Delete object',
526
- description: 'Delete a file from storage',
527
- tags: ['Storage'],
528
- security: [{ BearerAuth: [] }],
529
- request: {
530
- params: z
531
- .object({
532
- bucketName: z.string().describe('Name of the bucket'),
533
- objectKey: z.string().describe('Full object key/path'),
534
- })
535
- .openapi('StorageParams'),
536
- },
537
- responses: {
538
- 200: {
539
- description: 'File deleted successfully',
540
- content: {
541
- 'application/json': {
542
- schema: z
543
- .object({
544
- message: z.string(),
545
- })
546
- .openapi('DeleteResponse'),
547
- },
548
- },
549
- },
550
- 404: {
551
- description: 'File not found',
552
- },
553
- 401: {
554
- description: 'Unauthorized',
555
- },
556
- },
557
- });
558
- }
559
-
560
- /**
561
- * Register CRUD endpoints for a table
562
- */
563
- private registerTableEndpoints(registry: OpenAPIRegistry, table: TableSchema) {
564
- const tableName = table.tableName;
565
- const recordSchema = this.generateTableSchema(table);
566
- const filterSchema = this.generateFilterSchema(table);
567
-
568
- // Create schemas with OpenAPI metadata
569
- const singleRecordSchema = recordSchema.openapi(`${tableName}Record`);
570
- const recordArraySchema = z.array(recordSchema).openapi(`${tableName}RecordArray`);
571
- const createRecordSchema = recordSchema.partial().openapi(`Create${tableName}Record`);
572
- const updateRecordSchema = recordSchema.partial().openapi(`Update${tableName}Record`);
573
-
574
- // GET /api/database/records/{tableName} - List records
575
- registry.registerPath({
576
- method: 'get',
577
- path: `/api/database/records/${tableName}`,
578
- summary: `List ${tableName} records`,
579
- description: `Retrieve a list of records from the ${tableName} table with optional filtering`,
580
- tags: [tableName],
581
- request: {
582
- query: filterSchema,
583
- },
584
- responses: {
585
- 200: {
586
- description: `List of ${tableName} records`,
587
- content: {
588
- 'application/json': {
589
- schema: recordArraySchema,
590
- },
591
- },
592
- },
593
- 400: {
594
- description: 'Bad request',
595
- },
596
- 401: {
597
- description: 'Unauthorized',
598
- },
599
- },
600
- });
601
-
602
- // POST /api/database/records/{tableName} - Create record
603
- registry.registerPath({
604
- method: 'post',
605
- path: `/api/database/records/${tableName}`,
606
- summary: `Create ${tableName} record`,
607
- description: `Create a new record in the ${tableName} table`,
608
- tags: [tableName],
609
- request: {
610
- body: {
611
- content: {
612
- 'application/json': {
613
- schema: createRecordSchema,
614
- },
615
- },
616
- },
617
- },
618
- responses: {
619
- 201: {
620
- description: `Created ${tableName} record`,
621
- content: {
622
- 'application/json': {
623
- schema: singleRecordSchema,
624
- },
625
- },
626
- },
627
- 400: {
628
- description: 'Bad request',
629
- },
630
- 401: {
631
- description: 'Unauthorized',
632
- },
633
- },
634
- });
635
-
636
- // GET /api/database/records/{tableName}/{id} - Get single record
637
- const primaryKeyColumn = table.columns.find((col) => col.isPrimaryKey);
638
- if (primaryKeyColumn) {
639
- registry.registerPath({
640
- method: 'get',
641
- path: `/api/database/records/${tableName}/{id}`,
642
- summary: `Get ${tableName} record by ID`,
643
- description: `Retrieve a single record from the ${tableName} table by its primary key`,
644
- tags: [tableName],
645
- request: {
646
- params: z.object({
647
- id: z.string().describe(`Primary key value`),
648
- }),
649
- },
650
- responses: {
651
- 200: {
652
- description: `${tableName} record`,
653
- content: {
654
- 'application/json': {
655
- schema: singleRecordSchema,
656
- },
657
- },
658
- },
659
- 404: {
660
- description: 'Record not found',
661
- },
662
- 401: {
663
- description: 'Unauthorized',
664
- },
665
- },
666
- });
667
-
668
- // PATCH /api/database/records/{tableName}/{id} - Update record
669
- registry.registerPath({
670
- method: 'patch',
671
- path: `/api/database/records/${tableName}/{id}`,
672
- summary: `Update ${tableName} record`,
673
- description: `Update a record in the ${tableName} table`,
674
- tags: [tableName],
675
- request: {
676
- params: z.object({
677
- id: z.string().describe(`Primary key value`),
678
- }),
679
- body: {
680
- content: {
681
- 'application/json': {
682
- schema: updateRecordSchema,
683
- },
684
- },
685
- },
686
- },
687
- responses: {
688
- 200: {
689
- description: `Updated ${tableName} record`,
690
- content: {
691
- 'application/json': {
692
- schema: singleRecordSchema,
693
- },
694
- },
695
- },
696
- 404: {
697
- description: 'Record not found',
698
- },
699
- 401: {
700
- description: 'Unauthorized',
701
- },
702
- },
703
- });
704
-
705
- // DELETE /api/database/records/{tableName}/{id} - Delete record
706
- registry.registerPath({
707
- method: 'delete',
708
- path: `/api/database/records/${tableName}/{id}`,
709
- summary: `Delete ${tableName} record`,
710
- description: `Delete a record from the ${tableName} table`,
711
- tags: [tableName],
712
- request: {
713
- params: z.object({
714
- id: z.string().describe(`Primary key value`),
715
- }),
716
- },
717
- responses: {
718
- 204: {
719
- description: 'Record deleted successfully',
720
- },
721
- 404: {
722
- description: 'Record not found',
723
- },
724
- 401: {
725
- description: 'Unauthorized',
726
- },
727
- },
728
- });
729
- }
730
-
731
- // PATCH /api/database/records/{tableName} - Bulk update
732
- registry.registerPath({
733
- method: 'patch',
734
- path: `/api/database/records/${tableName}`,
735
- summary: `Bulk update ${tableName} records`,
736
- description: `Update multiple records in the ${tableName} table based on filters`,
737
- tags: [tableName],
738
- request: {
739
- query: filterSchema,
740
- body: {
741
- content: {
742
- 'application/json': {
743
- schema: updateRecordSchema,
744
- },
745
- },
746
- },
747
- },
748
- responses: {
749
- 200: {
750
- description: `Updated ${tableName} records`,
751
- content: {
752
- 'application/json': {
753
- schema: recordArraySchema,
754
- },
755
- },
756
- },
757
- 400: {
758
- description: 'Bad request',
759
- },
760
- 401: {
761
- description: 'Unauthorized',
762
- },
763
- },
764
- });
765
-
766
- // DELETE /api/database/records/{tableName} - Bulk delete
767
- registry.registerPath({
768
- method: 'delete',
769
- path: `/api/database/records/${tableName}`,
770
- summary: `Bulk delete ${tableName} records`,
771
- description: `Delete multiple records from the ${tableName} table based on filters`,
772
- tags: [tableName],
773
- request: {
774
- query: filterSchema,
775
- },
776
- responses: {
777
- 204: {
778
- description: 'Records deleted successfully',
779
- },
780
- 400: {
781
- description: 'Bad request',
782
- },
783
- 401: {
784
- description: 'Unauthorized',
785
- },
786
- },
787
- });
788
- }
789
-
790
- /**
791
- * Generate OpenAPI document
792
- */
793
- async generateOpenAPIDocument() {
794
- try {
795
- // Create new registry
796
- const registry = new OpenAPIRegistry();
797
-
798
- // Register security scheme
799
- registry.registerComponent('securitySchemes', 'ApiKeyAuth', {
800
- type: 'apiKey',
801
- in: 'header',
802
- name: 'x-api-key',
803
- description: 'API key for authentication',
804
- });
805
-
806
- registry.registerComponent('securitySchemes', 'BearerAuth', {
807
- type: 'http',
808
- scheme: 'bearer',
809
- bearerFormat: 'JWT',
810
- description: 'JWT token for authentication',
811
- });
812
-
813
- // Register authentication endpoints
814
- this.registerAuthenticationEndpoints(registry);
815
-
816
- // Register storage endpoints
817
- this.registerStorageEndpoints(registry);
818
-
819
- const tableService = new DatabaseTableService();
820
- const dbManager = DatabaseManager.getInstance();
821
- const allTables = await dbManager.getUserTables();
822
-
823
- // Register endpoints for each table
824
- for (const table of allTables) {
825
- const tableSchema = await tableService.getTableSchema(table);
826
- this.registerTableEndpoints(registry, tableSchema);
827
- }
828
-
829
- // Generate OpenAPI document
830
- const generator = new OpenApiGeneratorV3(registry.definitions);
831
- const document = generator.generateDocument({
832
- openapi: '3.0.0',
833
- info: {
834
- title: 'InsForge Dynamic API',
835
- version: process.env.npm_package_version || '1.0.0',
836
- description: 'Automatically generated API documentation for InsForge database tables',
837
- },
838
- servers: [
839
- {
840
- url: process.env.API_BASE_URL || 'http://localhost:7130',
841
- description: 'API server',
842
- },
843
- ],
844
- security: [{ ApiKeyAuth: [] }, { BearerAuth: [] }],
845
- });
846
-
847
- return document;
848
- } catch (error) {
849
- logger.error('Failed to generate OpenAPI document', {
850
- error: error instanceof Error ? error.message : String(error),
851
- });
852
- console.error(error);
853
- throw error;
854
- }
855
- }
856
- }