insforge 0.3.3 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (635) hide show
  1. package/.claude-plugin/marketplace.json +20 -0
  2. package/.dockerignore +60 -57
  3. package/.env.example +84 -49
  4. package/.github/ISSUE_TEMPLATE/bug_report.yml +36 -83
  5. package/.github/ISSUE_TEMPLATE/config.yml +11 -11
  6. package/.github/ISSUE_TEMPLATE/feature_request.yml +26 -79
  7. package/.github/PULL_REQUEST_TEMPLATE.md +7 -0
  8. package/.github/copilot-instructions.md +146 -146
  9. package/.github/workflows/build-image.yml +66 -65
  10. package/.github/workflows/ci-premerge-check.yml +23 -23
  11. package/.github/workflows/e2e.yml +63 -0
  12. package/.github/workflows/lint-and-format.yml +32 -32
  13. package/.prettierignore +64 -64
  14. package/CHANGELOG.md +44 -3
  15. package/CLAUDE_PLUGIN.md +104 -0
  16. package/CODE_OF_CONDUCT.md +128 -0
  17. package/CONTRIBUTING.md +125 -125
  18. package/Dockerfile +30 -27
  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 -134
  23. package/assets/Dark.svg +23 -23
  24. package/assets/mcpInstallv2.png +0 -0
  25. package/assets/sampleResponse.png +0 -0
  26. package/auth/index.html +13 -0
  27. package/auth/package.json +28 -0
  28. package/auth/public/favicon.ico +0 -0
  29. package/auth/src/App.tsx +33 -0
  30. package/auth/src/components/ErrorCard.tsx +37 -0
  31. package/auth/src/components/Layout.tsx +13 -0
  32. package/auth/src/index.css +19 -0
  33. package/auth/src/lib/broadcastService.ts +117 -0
  34. package/auth/src/lib/utils.ts +11 -0
  35. package/auth/src/main.tsx +22 -0
  36. package/auth/src/pages/ForgotPasswordPage.tsx +11 -0
  37. package/auth/src/pages/ResetPasswordPage.tsx +11 -0
  38. package/auth/src/pages/SignInPage.tsx +60 -0
  39. package/auth/src/pages/SignUpPage.tsx +60 -0
  40. package/auth/src/pages/VerifyEmailPage.tsx +20 -0
  41. package/auth/src/vite-env.d.ts +10 -0
  42. package/auth/tsconfig.json +32 -0
  43. package/auth/tsconfig.node.json +11 -0
  44. package/auth/vite.config.ts +25 -0
  45. package/backend/package.json +78 -75
  46. package/backend/src/api/{middleware → middlewares}/auth.ts +8 -9
  47. package/backend/src/api/middlewares/rate-limiters.ts +127 -0
  48. package/backend/src/api/routes/{ai.ts → ai/index.routes.ts} +22 -26
  49. package/backend/src/api/routes/auth/index.routes.ts +667 -0
  50. package/backend/src/api/routes/auth/oauth.routes.ts +473 -0
  51. package/backend/src/api/routes/{database.advance.ts → database/advance.routes.ts} +128 -65
  52. package/backend/src/api/routes/database/index.routes.ts +90 -0
  53. package/backend/src/api/routes/{database.records.ts → database/records.routes.ts} +26 -12
  54. package/backend/src/api/routes/{database.tables.ts → database/tables.routes.ts} +6 -23
  55. package/backend/src/api/routes/docs/index.routes.ts +75 -0
  56. package/backend/src/api/routes/email/index.routes.ts +35 -0
  57. package/backend/src/api/routes/functions/index.routes.ts +194 -0
  58. package/backend/src/api/routes/{logs.ts → logs/index.routes.ts} +25 -30
  59. package/backend/src/api/routes/{metadata.ts → metadata/index.routes.ts} +33 -31
  60. package/backend/src/api/routes/realtime/channels.routes.ts +81 -0
  61. package/backend/src/api/routes/realtime/index.routes.ts +12 -0
  62. package/backend/src/api/routes/realtime/messages.routes.ts +48 -0
  63. package/backend/src/api/routes/realtime/permissions.routes.ts +19 -0
  64. package/backend/src/api/routes/{secrets.ts → secrets/index.routes.ts} +27 -22
  65. package/backend/src/api/routes/{storage.ts → storage/index.routes.ts} +48 -61
  66. package/backend/src/api/routes/usage/index.routes.ts +91 -0
  67. package/backend/src/infra/config/app.config.ts +51 -0
  68. package/backend/src/infra/database/database.manager.ts +182 -0
  69. package/backend/{migrations → src/infra/database/migrations}/000_create-base-tables.sql +141 -141
  70. package/backend/{migrations → src/infra/database/migrations}/001_create-helper-functions.sql +40 -40
  71. package/backend/{migrations → src/infra/database/migrations}/002_rename-auth-tables.sql +29 -29
  72. package/backend/{migrations → src/infra/database/migrations}/003_create-users-table.sql +55 -55
  73. package/backend/{migrations → src/infra/database/migrations}/004_add-reload-postgrest-func.sql +23 -23
  74. package/backend/{migrations → src/infra/database/migrations}/005_enable-project-admin-modify-users.sql +29 -29
  75. package/backend/{migrations → src/infra/database/migrations}/006_modify-ai-usage-table.sql +24 -24
  76. package/backend/{migrations → src/infra/database/migrations}/007_drop-metadata-table.sql +1 -1
  77. package/backend/{migrations → src/infra/database/migrations}/008_add-system-tables.sql +76 -76
  78. package/backend/{migrations → src/infra/database/migrations}/009_add-function-secrets.sql +23 -23
  79. package/backend/{migrations → src/infra/database/migrations}/010_modify-ai-config-modalities.sql +93 -93
  80. package/backend/{migrations → src/infra/database/migrations}/011_refactor-secrets-table.sql +15 -15
  81. package/backend/{migrations → src/infra/database/migrations}/012_add-storage-uploaded-by.sql +7 -7
  82. package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -0
  83. package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +8 -0
  84. package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +60 -0
  85. package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -0
  86. package/backend/src/infra/database/migrations/017_create-realtime-schema.sql +233 -0
  87. package/backend/src/infra/realtime/realtime.manager.ts +246 -0
  88. package/backend/src/infra/realtime/webhook-sender.ts +82 -0
  89. package/backend/src/{core/secrets/encryption.ts → infra/security/encryption.manager.ts} +3 -2
  90. package/backend/src/infra/security/token.manager.ts +219 -0
  91. package/backend/src/infra/socket/socket.manager.ts +522 -0
  92. package/backend/src/providers/ai/openrouter.provider.ts +380 -0
  93. package/backend/src/providers/email/base.provider.ts +38 -0
  94. package/backend/src/providers/email/cloud.provider.ts +271 -0
  95. package/backend/src/{core/logs/providers → providers/logs}/base.provider.ts +11 -11
  96. package/backend/src/{core/logs/providers → providers/logs}/cloudwatch.provider.ts +61 -38
  97. package/backend/src/providers/logs/local.provider.ts +185 -0
  98. package/backend/src/providers/oauth/apple.provider.ts +266 -0
  99. package/backend/src/providers/oauth/base.provider.ts +29 -0
  100. package/backend/src/providers/oauth/discord.provider.ts +195 -0
  101. package/backend/src/providers/oauth/facebook.provider.ts +194 -0
  102. package/backend/src/providers/oauth/github.provider.ts +208 -0
  103. package/backend/src/providers/oauth/google.provider.ts +249 -0
  104. package/backend/src/providers/oauth/index.ts +8 -0
  105. package/backend/src/providers/oauth/linkedin.provider.ts +240 -0
  106. package/backend/src/providers/oauth/microsoft.provider.ts +169 -0
  107. package/backend/src/providers/oauth/x.provider.ts +202 -0
  108. package/backend/src/providers/storage/base.provider.ts +29 -0
  109. package/backend/src/providers/storage/local.provider.ts +103 -0
  110. package/backend/src/providers/storage/s3.provider.ts +313 -0
  111. package/backend/src/server.ts +317 -288
  112. package/backend/src/{core/ai/config.ts → services/ai/ai-config.service.ts} +19 -24
  113. package/backend/src/services/ai/ai-model.service.ts +60 -0
  114. package/backend/src/{core/ai/usage.ts → services/ai/ai-usage.service.ts} +28 -35
  115. package/backend/src/{core/ai/chat.ts → services/ai/chat-completion.service.ts} +37 -24
  116. package/backend/src/services/ai/helpers.ts +64 -0
  117. package/backend/src/{core/ai/image.ts → services/ai/image-generation.service.ts} +17 -19
  118. package/backend/src/services/ai/index.ts +13 -0
  119. package/backend/src/services/auth/auth-config.service.ts +250 -0
  120. package/backend/src/services/auth/auth-otp.service.ts +424 -0
  121. package/backend/src/services/auth/auth.service.ts +1150 -0
  122. package/backend/src/services/auth/index.ts +4 -0
  123. package/backend/src/{core/auth/oauth.ts → services/auth/oauth-config.service.ts} +106 -52
  124. package/backend/src/{core/database/advance.ts → services/database/database-advance.service.ts} +97 -131
  125. package/backend/src/services/database/database-table.service.ts +802 -0
  126. package/backend/src/services/database/database.service.ts +127 -0
  127. package/backend/src/services/email/email.service.ts +73 -0
  128. package/backend/src/{core/functions/functions.ts → services/functions/function.service.ts} +95 -88
  129. package/backend/src/{core/logs/audit.ts → services/logs/audit.service.ts} +92 -75
  130. package/backend/src/services/logs/log.service.ts +73 -0
  131. package/backend/src/services/realtime/index.ts +3 -0
  132. package/backend/src/services/realtime/realtime-auth.service.ts +104 -0
  133. package/backend/src/services/realtime/realtime-channel.service.ts +237 -0
  134. package/backend/src/services/realtime/realtime-message.service.ts +260 -0
  135. package/backend/src/{core/secrets/secrets.ts → services/secrets/secret.service.ts} +48 -66
  136. package/backend/src/services/storage/storage.service.ts +617 -0
  137. package/backend/src/services/usage/usage.service.ts +149 -0
  138. package/backend/src/types/auth.ts +77 -2
  139. package/backend/src/types/email.ts +8 -0
  140. package/backend/src/types/error-constants.ts +4 -0
  141. package/backend/src/types/logs.ts +0 -29
  142. package/backend/src/types/realtime.ts +18 -0
  143. package/backend/src/{core/socket/types.ts → types/socket.ts} +11 -36
  144. package/backend/src/utils/cookies.ts +35 -0
  145. package/backend/src/utils/environment.ts +9 -3
  146. package/backend/src/utils/logger.ts +20 -2
  147. package/backend/src/utils/s3-config-loader.ts +64 -0
  148. package/backend/src/utils/seed.ts +301 -205
  149. package/backend/src/utils/sql-parser.ts +91 -1
  150. package/backend/src/utils/utils.ts +114 -0
  151. package/backend/src/utils/validations.ts +40 -4
  152. package/backend/tests/README.md +133 -133
  153. package/backend/tests/cleanup-all-test-data.sh +230 -230
  154. package/backend/tests/cloud/test-s3-multitenant.sh +131 -131
  155. package/backend/tests/local/comprehensive-curl-tests.sh +155 -155
  156. package/backend/tests/local/test-ai-config.sh +129 -0
  157. package/backend/tests/local/test-ai-usage.sh +80 -0
  158. package/backend/tests/local/test-auth-router.sh +143 -143
  159. package/backend/tests/local/test-database-router.sh +222 -222
  160. package/backend/tests/local/test-e2e.sh +240 -240
  161. package/backend/tests/local/test-fk-errors.sh +96 -96
  162. package/backend/tests/local/test-functions.sh +123 -0
  163. package/backend/tests/local/test-id-field.sh +200 -200
  164. package/backend/tests/local/test-logs.sh +132 -0
  165. package/backend/tests/local/test-public-bucket.sh +264 -264
  166. package/backend/tests/local/test-secrets.sh +249 -247
  167. package/backend/tests/local/test-serverless-functions.sh.disabled +325 -325
  168. package/backend/tests/local/test-traditional-rest.sh +208 -208
  169. package/backend/tests/manual/README.md +50 -50
  170. package/backend/tests/manual/create-large-table-simple.sql +10 -10
  171. package/backend/tests/manual/seed-large-table.sql +100 -100
  172. package/backend/tests/manual/setup-large-table-extras.sql +33 -33
  173. package/backend/tests/manual/test-bulk-upsert.sh +409 -409
  174. package/backend/tests/manual/test-database-advance.sh +296 -296
  175. package/backend/tests/manual/test-postgrest-stability.sh +191 -191
  176. package/backend/tests/manual/test-rawsql-export-import.sh +411 -411
  177. package/backend/tests/manual/test-rawsql-modes.sh +244 -0
  178. package/backend/tests/manual/test-universal-storage.sh +263 -263
  179. package/backend/tests/manual/test-users.sql +17 -17
  180. package/backend/tests/run-all-tests.sh +139 -139
  181. package/backend/tests/setup.ts +0 -0
  182. package/backend/tests/test-config.sh +338 -302
  183. package/backend/tests/unit/analyze-query.test.ts +697 -0
  184. package/backend/tests/unit/cloud-token.test.ts +48 -0
  185. package/backend/tests/unit/constant.test.ts +8 -0
  186. package/backend/tests/unit/email.test.ts +372 -0
  187. package/backend/tests/unit/environment.test.ts +59 -0
  188. package/backend/tests/unit/helpers.test.ts +63 -0
  189. package/backend/tests/unit/logger.test.ts +22 -0
  190. package/backend/tests/unit/rate-limit.test.ts +154 -0
  191. package/backend/tests/unit/response.test.ts +58 -0
  192. package/backend/tests/unit/sql-parser.test.ts +74 -0
  193. package/backend/tests/unit/uuid.test.ts +21 -0
  194. package/backend/tests/unit/validations.test.ts +80 -0
  195. package/backend/tsconfig.json +22 -22
  196. package/backend/vitest.config.ts +11 -0
  197. package/claude-plugin/.claude-plugin/plugin.json +24 -0
  198. package/claude-plugin/README.md +133 -0
  199. package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +270 -0
  200. package/docker-compose.prod.yml +204 -144
  201. package/docker-compose.yml +232 -167
  202. package/docker-init/db/db-init.sql +97 -125
  203. package/docker-init/db/jwt.sql +5 -5
  204. package/docker-init/db/postgresql.conf +16 -16
  205. package/docker-init/logs/vector.yml +236 -0
  206. package/docs/README.md +44 -0
  207. package/docs/agent-docs/real-time.md +269 -0
  208. package/docs/changelog.mdx +119 -0
  209. package/docs/core-concepts/ai/architecture.mdx +373 -0
  210. package/docs/core-concepts/ai/sdk.mdx +213 -0
  211. package/docs/core-concepts/authentication/architecture.mdx +278 -0
  212. package/docs/core-concepts/authentication/sdk.mdx +414 -0
  213. package/docs/core-concepts/authentication/ui-components/customization.mdx +529 -0
  214. package/docs/core-concepts/authentication/ui-components/nextjs.mdx +221 -0
  215. package/docs/core-concepts/authentication/ui-components/react-router.mdx +184 -0
  216. package/docs/core-concepts/authentication/ui-components/react.mdx +129 -0
  217. package/docs/core-concepts/database/architecture.mdx +256 -0
  218. package/docs/core-concepts/database/sdk.mdx +382 -0
  219. package/docs/core-concepts/email/architecture.mdx +101 -0
  220. package/docs/core-concepts/email/sdk.mdx +53 -0
  221. package/docs/core-concepts/functions/architecture.mdx +105 -0
  222. package/docs/core-concepts/functions/sdk.mdx +184 -0
  223. package/docs/core-concepts/realtime/architecture.mdx +446 -0
  224. package/docs/core-concepts/realtime/sdk.mdx +409 -0
  225. package/docs/core-concepts/storage/architecture.mdx +243 -0
  226. package/docs/core-concepts/storage/sdk.mdx +253 -0
  227. package/docs/deployment/README.md +94 -0
  228. package/docs/deployment/deploy-to-aws-ec2.md +565 -0
  229. package/docs/deployment/deploy-to-azure-virtual-machines.md +313 -0
  230. package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -0
  231. package/docs/deployment/deploy-to-render.md +441 -0
  232. package/docs/deprecated/insforge-auth-api.md +214 -214
  233. package/docs/deprecated/insforge-auth-sdk.md +99 -99
  234. package/docs/deprecated/insforge-db-api.md +358 -358
  235. package/docs/deprecated/insforge-db-sdk.md +139 -139
  236. package/docs/deprecated/insforge-debug-sdk.md +156 -156
  237. package/docs/deprecated/insforge-debug.md +64 -64
  238. package/docs/deprecated/insforge-instructions.md +123 -123
  239. package/docs/deprecated/insforge-project.md +117 -117
  240. package/docs/deprecated/insforge-storage-api.md +278 -278
  241. package/docs/deprecated/insforge-storage-sdk.md +158 -158
  242. package/docs/docs.json +232 -0
  243. package/docs/examples/framework-guides/nextjs.mdx +131 -0
  244. package/docs/examples/framework-guides/nuxt.mdx +165 -0
  245. package/docs/examples/framework-guides/react.mdx +165 -0
  246. package/docs/examples/framework-guides/svelte.mdx +153 -0
  247. package/docs/examples/framework-guides/vue.mdx +159 -0
  248. package/docs/examples/overview.mdx +67 -0
  249. package/docs/favicon.svg +19 -0
  250. package/docs/images/changelog/dec-2025/ai-integration.png +0 -0
  251. package/docs/images/changelog/dec-2025/ai-models.webp +0 -0
  252. package/docs/images/changelog/dec-2025/alipay-payment.webp +0 -0
  253. package/docs/images/changelog/dec-2025/apple-login.jpg +0 -0
  254. package/docs/images/changelog/dec-2025/mcp-installer.png +0 -0
  255. package/docs/images/changelog/dec-2025/realtime-module.jpg +0 -0
  256. package/docs/images/changelog/nov-2025/auth-components.webp +0 -0
  257. package/docs/images/changelog/nov-2025/database-metadata.webp +0 -0
  258. package/docs/images/changelog/nov-2025/quickstart-prompts.webp +0 -0
  259. package/docs/images/changelog/nov-2025/sql-editor.webp +0 -0
  260. package/docs/images/changelog/nov-2025/usage-page.webp +0 -0
  261. package/docs/images/changelog/october-2025/csv-upload.webp +0 -0
  262. package/docs/images/changelog/october-2025/logs-feature.webp +0 -0
  263. package/docs/images/changelog/october-2025/oauth-providers.webp +0 -0
  264. package/docs/images/checks-passed.png +0 -0
  265. package/docs/images/dashboard-connect-expanded.png +0 -0
  266. package/docs/images/dashboard-connect.png +0 -0
  267. package/docs/images/hero-dark.png +0 -0
  268. package/docs/images/hero-light.png +0 -0
  269. package/docs/images/icons/ai.svg +4 -0
  270. package/docs/images/icons/auth.svg +1 -0
  271. package/docs/images/icons/database.svg +1 -0
  272. package/docs/images/icons/function.svg +1 -0
  273. package/docs/images/icons/storage.svg +1 -0
  274. package/docs/images/logos/nextjs.svg +4 -0
  275. package/docs/images/logos/nuxt.svg +4 -0
  276. package/docs/images/logos/react.svg +5 -0
  277. package/docs/images/logos/svelte.svg +4 -0
  278. package/docs/images/logos/vue.svg +5 -0
  279. package/docs/images/mcp-install.png +0 -0
  280. package/docs/images/onboarding-mcp.png +0 -0
  281. package/docs/insforge-instructions-sdk.md +89 -407
  282. package/docs/introduction.mdx +45 -0
  283. package/docs/logo/dark.svg +22 -0
  284. package/docs/logo/light.svg +20 -0
  285. package/docs/partnership.mdx +652 -0
  286. package/docs/quickstart.mdx +83 -0
  287. package/docs/showcase/2048-arena.png +0 -0
  288. package/docs/showcase/framegen-cloud.png +0 -0
  289. package/docs/showcase/line-connect-race.png +0 -0
  290. package/docs/showcase/moment-vibe.png +0 -0
  291. package/docs/showcase/national-flags.png +0 -0
  292. package/docs/showcase/pokemon-vibe.png +0 -0
  293. package/docs/showcase/pure-browse-buy.png +0 -0
  294. package/docs/showcase.mdx +52 -0
  295. package/docs/snippets/sdk-installation.mdx +22 -0
  296. package/docs/snippets/service-icons.mdx +27 -0
  297. package/eslint.config.js +10 -3
  298. package/examples/oauth/frontend-oauth-example.html +250 -250
  299. package/examples/response-examples.md +443 -443
  300. package/frontend/components.json +17 -17
  301. package/frontend/package.json +69 -63
  302. package/frontend/src/App.tsx +13 -82
  303. package/frontend/src/assets/icons/checkbox_checked.svg +6 -6
  304. package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -6
  305. package/frontend/src/assets/icons/checked.svg +3 -3
  306. package/frontend/src/assets/icons/connected.svg +3 -0
  307. package/frontend/src/assets/icons/error.svg +3 -3
  308. package/frontend/src/assets/icons/loader.svg +9 -0
  309. package/frontend/src/assets/icons/pencil.svg +4 -4
  310. package/frontend/src/assets/icons/refresh.svg +4 -4
  311. package/frontend/src/assets/icons/step_active.svg +3 -3
  312. package/frontend/src/assets/icons/step_inactive.svg +11 -11
  313. package/frontend/src/assets/icons/warning.svg +3 -3
  314. package/frontend/src/assets/logos/apple.svg +4 -0
  315. package/frontend/src/assets/logos/claude_code.svg +3 -3
  316. package/frontend/src/assets/logos/cline.svg +6 -6
  317. package/frontend/src/assets/logos/cursor.svg +20 -20
  318. package/frontend/src/assets/logos/discord.svg +8 -8
  319. package/frontend/src/assets/logos/facebook.svg +3 -0
  320. package/frontend/src/assets/logos/gemini.svg +19 -19
  321. package/frontend/src/assets/logos/github.svg +5 -5
  322. package/frontend/src/assets/logos/google.svg +13 -13
  323. package/frontend/src/assets/logos/grok.svg +10 -10
  324. package/frontend/src/assets/logos/insforge_dark.svg +15 -15
  325. package/frontend/src/assets/logos/insforge_light.svg +15 -15
  326. package/frontend/src/assets/logos/instagram.svg +2 -0
  327. package/frontend/src/assets/logos/linkedin.svg +3 -0
  328. package/frontend/src/assets/logos/microsoft.svg +1 -0
  329. package/frontend/src/assets/logos/openai.svg +10 -10
  330. package/frontend/src/assets/logos/roo_code.svg +9 -9
  331. package/frontend/src/assets/logos/spotify.svg +17 -0
  332. package/frontend/src/assets/logos/tiktok.svg +6 -0
  333. package/frontend/src/assets/logos/trae.svg +3 -3
  334. package/frontend/src/assets/logos/windsurf.svg +10 -10
  335. package/frontend/src/assets/logos/x.svg +3 -0
  336. package/frontend/src/components/Checkbox.tsx +27 -29
  337. package/frontend/src/components/CodeBlock.tsx +55 -2
  338. package/frontend/src/components/CodeEditor.tsx +92 -0
  339. package/frontend/src/components/ConfirmDialog.tsx +1 -1
  340. package/frontend/src/components/ConnectCTA.tsx +38 -0
  341. package/frontend/src/components/CopyButton.tsx +52 -15
  342. package/frontend/src/components/ErrorState.tsx +1 -2
  343. package/frontend/src/components/FeatureSidebar.tsx +6 -6
  344. package/frontend/src/components/FeatureSidebarItem.tsx +2 -2
  345. package/frontend/src/components/JsonHighlight.tsx +21 -9
  346. package/frontend/src/components/ProjectInfoModal.tsx +128 -0
  347. package/frontend/src/components/PromptDialog.tsx +1 -4
  348. package/frontend/src/components/SearchInput.tsx +1 -2
  349. package/frontend/src/components/Stepper.tsx +53 -0
  350. package/frontend/src/components/ThemeToggle.tsx +3 -3
  351. package/frontend/src/components/datagrid/DataGrid.tsx +25 -32
  352. package/frontend/src/components/datagrid/cell-editors/DateCellEditor.tsx +1 -2
  353. package/frontend/src/components/datagrid/cell-editors/JsonCellEditor.tsx +2 -4
  354. package/frontend/src/components/datagrid/index.ts +23 -0
  355. package/frontend/src/components/index.ts +23 -30
  356. package/frontend/src/components/layout/AppHeader.tsx +131 -91
  357. package/frontend/src/components/layout/AppSidebar.tsx +80 -170
  358. package/frontend/src/components/layout/Layout.tsx +12 -23
  359. package/frontend/src/components/layout/PrimaryMenu.tsx +187 -0
  360. package/frontend/src/components/layout/SecondaryMenu.tsx +70 -0
  361. package/frontend/src/components/layout/index.ts +5 -0
  362. package/frontend/src/components/radix/Tooltip.tsx +24 -13
  363. package/frontend/src/components/radix/index.ts +22 -0
  364. package/frontend/src/features/ai/components/AIConfigCard.tsx +129 -83
  365. package/frontend/src/features/ai/components/AIEmptyState.tsx +12 -7
  366. package/frontend/src/features/ai/components/ModalityFilterSidebar.tsx +101 -0
  367. package/frontend/src/features/ai/components/ModelSelectionDialog.tsx +135 -0
  368. package/frontend/src/features/ai/components/ModelSelectionGrid.tsx +51 -0
  369. package/frontend/src/features/ai/components/SystemPromptDialog.tsx +118 -0
  370. package/frontend/src/features/ai/components/index.ts +6 -0
  371. package/frontend/src/features/ai/helpers.ts +57 -71
  372. package/frontend/src/features/ai/hooks/useAIConfigs.ts +39 -113
  373. package/frontend/src/features/ai/hooks/useAIUsage.ts +0 -2
  374. package/frontend/src/features/ai/pages/AIPage.tsx +166 -0
  375. package/frontend/src/features/ai/services/ai.service.ts +5 -5
  376. package/frontend/src/features/auth/components/AuthPreview.tsx +96 -0
  377. package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +54 -30
  378. package/frontend/src/features/auth/components/UserFormDialog.tsx +13 -6
  379. package/frontend/src/features/auth/components/UsersDataGrid.tsx +50 -14
  380. package/frontend/src/features/auth/components/index.ts +5 -0
  381. package/frontend/src/features/auth/helpers.tsx +208 -0
  382. package/frontend/src/features/auth/hooks/useAnonToken.ts +30 -0
  383. package/frontend/src/features/auth/hooks/useAuthConfig.ts +48 -0
  384. package/frontend/src/features/auth/hooks/useOAuthConfig.ts +14 -10
  385. package/frontend/src/features/auth/hooks/useUsers.ts +43 -5
  386. package/frontend/src/features/auth/index.ts +3 -2
  387. package/frontend/src/features/auth/pages/AuthMethodsPage.tsx +275 -0
  388. package/frontend/src/features/auth/pages/ConfigurationPage.tsx +395 -0
  389. package/frontend/src/features/auth/pages/UsersPage.tsx +257 -0
  390. package/frontend/src/features/auth/services/anonToken.service.ts +11 -0
  391. package/frontend/src/features/auth/services/config.service.ts +19 -0
  392. package/frontend/src/features/auth/services/{oauth.service.ts → oauth-config.service.ts} +4 -4
  393. package/frontend/src/features/auth/services/{auth.service.ts → user.service.ts} +7 -53
  394. package/frontend/src/features/dashboard/components/ConnectionSuccessBanner.tsx +35 -0
  395. package/frontend/src/features/dashboard/components/PromptCard.tsx +21 -0
  396. package/frontend/src/features/dashboard/components/PromptDialog.tsx +103 -0
  397. package/frontend/src/features/dashboard/components/StatsCard.tsx +50 -0
  398. package/frontend/src/features/dashboard/components/index.ts +4 -0
  399. package/frontend/src/features/dashboard/pages/DashboardPage.tsx +212 -0
  400. package/frontend/src/features/dashboard/prompts/ai-chatbot.ts +13 -0
  401. package/frontend/src/features/dashboard/prompts/crm-system.ts +13 -0
  402. package/frontend/src/features/dashboard/prompts/ecommerce-platform.ts +12 -0
  403. package/frontend/src/features/dashboard/prompts/index.ts +31 -0
  404. package/frontend/src/features/dashboard/prompts/instagram-clone.ts +11 -0
  405. package/frontend/src/features/dashboard/prompts/notion-clone.ts +14 -0
  406. package/frontend/src/features/dashboard/prompts/reddit-clone.ts +12 -0
  407. package/frontend/src/features/database/components/DatabaseDataGrid.tsx +48 -17
  408. package/frontend/src/features/database/components/ForeignKeyCell.tsx +15 -34
  409. package/frontend/src/features/database/components/ForeignKeyPopover.tsx +19 -20
  410. package/frontend/src/features/database/components/LinkRecordModal.tsx +120 -125
  411. package/frontend/src/features/database/components/RecordFormDialog.tsx +22 -33
  412. package/frontend/src/features/database/components/RecordFormField.tsx +45 -47
  413. package/frontend/src/features/database/components/SQLModal.tsx +75 -0
  414. package/frontend/src/features/database/components/TableEmptyState.tsx +6 -5
  415. package/frontend/src/features/database/components/TableForm.tsx +28 -19
  416. package/frontend/src/features/database/components/TableFormColumn.tsx +2 -3
  417. package/frontend/src/features/database/components/TableSidebar.tsx +1 -1
  418. package/frontend/src/features/database/components/TablesEmptyState.tsx +48 -0
  419. package/frontend/src/features/database/components/TemplateCard.tsx +37 -0
  420. package/frontend/src/features/database/components/TemplatePreview.tsx +92 -0
  421. package/frontend/src/features/database/components/index.ts +19 -0
  422. package/frontend/src/features/database/constants.ts +28 -2
  423. package/frontend/src/features/database/contexts/SQLEditorContext.tsx +188 -0
  424. package/frontend/src/features/database/helpers.ts +2 -2
  425. package/frontend/src/features/database/hooks/useCSVImport.ts +29 -0
  426. package/frontend/src/features/database/hooks/useDatabase.ts +66 -0
  427. package/frontend/src/features/database/hooks/useRawSQL.ts +55 -0
  428. package/frontend/src/features/database/hooks/useRecords.ts +139 -0
  429. package/frontend/src/features/database/hooks/useTables.ts +135 -0
  430. package/frontend/src/features/database/index.ts +7 -1
  431. package/frontend/src/features/database/pages/FunctionsPage.tsx +203 -0
  432. package/frontend/src/features/database/pages/IndexesPage.tsx +228 -0
  433. package/frontend/src/features/database/pages/PoliciesPage.tsx +237 -0
  434. package/frontend/src/features/database/pages/SQLEditorPage.tsx +382 -0
  435. package/frontend/src/features/database/{page/DatabasePage.tsx → pages/TablesPage.tsx} +168 -209
  436. package/frontend/src/features/database/pages/TemplatesPage.tsx +39 -0
  437. package/frontend/src/features/database/pages/TriggersPage.tsx +230 -0
  438. package/frontend/src/features/database/services/advance.service.ts +40 -0
  439. package/frontend/src/features/database/services/database.service.ts +33 -194
  440. package/frontend/src/features/database/services/record.service.ts +219 -0
  441. package/frontend/src/features/database/services/table.service.ts +58 -0
  442. package/frontend/src/features/database/templates/ai-chatbot.ts +402 -0
  443. package/frontend/src/features/database/templates/crm-system.ts +528 -0
  444. package/frontend/src/features/database/templates/ecommerce-platform.ts +553 -0
  445. package/frontend/src/features/database/templates/index.ts +34 -0
  446. package/frontend/src/features/database/templates/instagram-clone.ts +222 -0
  447. package/frontend/src/features/database/templates/notion-clone.ts +483 -0
  448. package/frontend/src/features/database/templates/reddit-clone.ts +526 -0
  449. package/frontend/src/features/functions/components/FunctionRow.tsx +2 -1
  450. package/frontend/src/features/functions/components/FunctionsSidebar.tsx +1 -1
  451. package/frontend/src/features/functions/components/SecretRow.tsx +1 -1
  452. package/frontend/src/features/functions/components/index.ts +5 -0
  453. package/frontend/src/features/functions/hooks/useFunctions.ts +4 -4
  454. package/frontend/src/features/{secrets → functions}/hooks/useSecrets.ts +5 -5
  455. package/frontend/src/features/functions/pages/FunctionsPage.tsx +148 -0
  456. package/frontend/src/features/functions/{components/SecretsContent.tsx → pages/SecretsPage.tsx} +19 -21
  457. package/frontend/src/features/functions/services/{functions.service.ts → function.service.ts} +2 -2
  458. package/frontend/src/features/{secrets/services/secrets.service.ts → functions/services/secret.service.ts} +2 -2
  459. package/frontend/src/features/login/hooks/usePartnerOrigin.ts +27 -0
  460. package/frontend/src/features/login/pages/CloudLoginPage.tsx +118 -0
  461. package/frontend/src/features/login/{page → pages}/LoginPage.tsx +16 -23
  462. package/frontend/src/features/login/services/partnership.service.ts +65 -0
  463. package/frontend/src/features/logs/components/LogsDataGrid.tsx +89 -0
  464. package/frontend/src/features/logs/components/SeverityBadge.tsx +18 -0
  465. package/frontend/src/features/logs/components/index.ts +2 -0
  466. package/frontend/src/features/logs/helpers.ts +24 -0
  467. package/frontend/src/features/logs/hooks/useAuditLogs.ts +4 -4
  468. package/frontend/src/features/logs/hooks/useLogSources.ts +137 -0
  469. package/frontend/src/features/logs/hooks/useLogs.ts +163 -0
  470. package/frontend/src/features/logs/hooks/useMcpUsage.ts +128 -0
  471. package/frontend/src/features/logs/index.ts +8 -2
  472. package/frontend/src/features/logs/{page → pages}/AuditsPage.tsx +91 -38
  473. package/frontend/src/features/logs/pages/LogsPage.tsx +152 -0
  474. package/frontend/src/features/logs/pages/MCPLogsPage.tsx +84 -0
  475. package/frontend/src/features/logs/services/audit.service.ts +63 -0
  476. package/frontend/src/features/logs/services/log.service.ts +15 -110
  477. package/frontend/src/features/logs/services/usage.service.ts +31 -0
  478. package/frontend/src/features/onboard/components/McpConnectionStatus.tsx +68 -0
  479. package/frontend/src/features/onboard/components/OnboardingModal.tsx +267 -0
  480. package/frontend/src/features/onboard/components/VideoDemoModal.tsx +38 -0
  481. package/frontend/src/features/onboard/components/index.ts +4 -0
  482. package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +2 -2
  483. package/frontend/src/features/onboard/components/mcp/{mcp-helper.tsx → helpers.tsx} +8 -8
  484. package/frontend/src/features/onboard/components/mcp/index.ts +2 -3
  485. package/frontend/src/features/onboard/index.ts +13 -3
  486. package/frontend/src/features/realtime/components/ChannelRow.tsx +83 -0
  487. package/frontend/src/features/realtime/components/EditChannelModal.tsx +246 -0
  488. package/frontend/src/features/realtime/components/MessageRow.tsx +85 -0
  489. package/frontend/src/features/realtime/components/RealtimeEmptyState.tsx +30 -0
  490. package/frontend/src/features/realtime/hooks/useRealtime.ts +218 -0
  491. package/frontend/src/features/realtime/index.ts +11 -0
  492. package/frontend/src/features/realtime/pages/RealtimeChannelsPage.tsx +172 -0
  493. package/frontend/src/features/realtime/pages/RealtimeMessagesPage.tsx +211 -0
  494. package/frontend/src/features/realtime/pages/RealtimePermissionsPage.tsx +191 -0
  495. package/frontend/src/features/realtime/services/realtime.service.ts +107 -0
  496. package/frontend/src/features/storage/components/BucketEmptyState.tsx +9 -6
  497. package/frontend/src/features/storage/components/BucketFormDialog.tsx +25 -41
  498. package/frontend/src/features/storage/components/FilePreviewDialog.tsx +20 -8
  499. package/frontend/src/features/storage/components/StorageDataGrid.tsx +4 -3
  500. package/frontend/src/features/storage/components/StorageManager.tsx +23 -34
  501. package/frontend/src/features/storage/components/index.ts +12 -0
  502. package/frontend/src/features/storage/hooks/useStorage.ts +208 -0
  503. package/frontend/src/features/storage/{page → pages}/StoragePage.tsx +41 -143
  504. package/frontend/src/features/storage/services/storage.service.ts +22 -1
  505. package/frontend/src/features/visualizer/components/AuthNode.tsx +72 -56
  506. package/frontend/src/features/visualizer/components/BucketNode.tsx +4 -4
  507. package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +108 -80
  508. package/frontend/src/features/visualizer/components/TableNode.tsx +34 -41
  509. package/frontend/src/features/visualizer/components/VisualizerSkeleton.tsx +12 -4
  510. package/frontend/src/features/visualizer/pages/VisualizerPage.tsx +97 -0
  511. package/frontend/src/index.css +1 -0
  512. package/frontend/src/lib/analytics/posthog.tsx +27 -0
  513. package/frontend/src/lib/contexts/AuthContext.tsx +38 -31
  514. package/frontend/src/lib/contexts/SocketContext.tsx +123 -80
  515. package/frontend/src/{features/metadata → lib}/hooks/useMetadata.ts +1 -1
  516. package/frontend/src/lib/hooks/useToast.tsx +6 -2
  517. package/frontend/src/lib/routing/AppRoutes.tsx +99 -0
  518. package/frontend/src/lib/routing/RequireAuth.tsx +27 -0
  519. package/frontend/src/lib/utils/cloudMessaging.ts +20 -0
  520. package/frontend/src/lib/utils/menuItems.ts +207 -0
  521. package/frontend/src/lib/utils/{validation-schemas.ts → schemaValidations.ts} +10 -5
  522. package/frontend/src/lib/utils/utils.ts +32 -1
  523. package/frontend/src/vite-env.d.ts +1 -0
  524. package/frontend/tsconfig.json +25 -25
  525. package/frontend/tsconfig.node.json +9 -9
  526. package/frontend/vite.config.ts +5 -3
  527. package/functions/deno.json +24 -24
  528. package/functions/server.ts +315 -290
  529. package/functions/worker-template.js +15 -4
  530. package/i18n/README.ar.md +130 -0
  531. package/i18n/README.de.md +130 -0
  532. package/i18n/README.es.md +154 -0
  533. package/i18n/README.fr.md +134 -0
  534. package/i18n/README.hi.md +129 -0
  535. package/i18n/README.ja.md +174 -0
  536. package/i18n/README.ko.md +137 -0
  537. package/i18n/README.pt-BR.md +131 -0
  538. package/i18n/README.ru.md +129 -0
  539. package/i18n/README.zh-CN.md +133 -0
  540. package/openapi/ai.yaml +715 -688
  541. package/openapi/auth.yaml +1244 -563
  542. package/openapi/email.yaml +158 -0
  543. package/openapi/functions.yaml +475 -475
  544. package/openapi/health.yaml +29 -29
  545. package/openapi/logs.yaml +223 -223
  546. package/openapi/metadata.yaml +177 -177
  547. package/openapi/realtime.yaml +699 -0
  548. package/openapi/records.yaml +381 -381
  549. package/openapi/secrets.yaml +370 -370
  550. package/openapi/storage.yaml +875 -875
  551. package/openapi/tables.yaml +463 -463
  552. package/package.json +97 -88
  553. package/shared-schemas/package.json +31 -31
  554. package/shared-schemas/src/ai-api.schema.ts +34 -58
  555. package/shared-schemas/src/ai.schema.ts +63 -54
  556. package/shared-schemas/src/auth-api.schema.ts +352 -193
  557. package/shared-schemas/src/auth.schema.ts +43 -7
  558. package/shared-schemas/src/cloud-events.schema.ts +57 -0
  559. package/shared-schemas/src/database-api.schema.ts +35 -4
  560. package/shared-schemas/src/database.schema.ts +40 -1
  561. package/shared-schemas/src/docs.schema.ts +26 -0
  562. package/shared-schemas/src/email-api.schema.ts +30 -0
  563. package/shared-schemas/src/index.ts +5 -0
  564. package/shared-schemas/src/logs-api.schema.ts +7 -1
  565. package/shared-schemas/src/logs.schema.ts +26 -0
  566. package/shared-schemas/src/metadata.schema.ts +18 -4
  567. package/shared-schemas/src/realtime-api.schema.ts +111 -0
  568. package/shared-schemas/src/realtime.schema.ts +143 -0
  569. package/shared-schemas/tsconfig.json +21 -21
  570. package/tsconfig.json +7 -7
  571. package/zeabur/README.md +13 -0
  572. package/zeabur/template.yml +1032 -0
  573. package/.github/workflows/deploy-aws.yml +0 -130
  574. package/backend/src/api/routes/agent.ts +0 -29
  575. package/backend/src/api/routes/auth.oauth.ts +0 -482
  576. package/backend/src/api/routes/auth.ts +0 -386
  577. package/backend/src/api/routes/docs.ts +0 -66
  578. package/backend/src/api/routes/functions.ts +0 -183
  579. package/backend/src/api/routes/openapi.ts +0 -82
  580. package/backend/src/api/routes/usage.ts +0 -96
  581. package/backend/src/core/ai/client.ts +0 -242
  582. package/backend/src/core/ai/model.ts +0 -117
  583. package/backend/src/core/auth/auth.ts +0 -780
  584. package/backend/src/core/database/manager.ts +0 -178
  585. package/backend/src/core/database/table.ts +0 -772
  586. package/backend/src/core/documentation/agent.ts +0 -689
  587. package/backend/src/core/documentation/openapi.ts +0 -856
  588. package/backend/src/core/logs/analytics.ts +0 -76
  589. package/backend/src/core/logs/providers/localdb.provider.ts +0 -246
  590. package/backend/src/core/socket/socket.ts +0 -388
  591. package/backend/src/core/storage/storage.ts +0 -923
  592. package/backend/src/utils/cloud-token.ts +0 -39
  593. package/backend/src/utils/helpers.ts +0 -49
  594. package/backend/src/utils/uuid.ts +0 -9
  595. package/backend/tests/manual/test-better-auth.sh +0 -303
  596. package/docker-init/db/logs.sql +0 -9
  597. package/frontend/README.md +0 -112
  598. package/frontend/src/components/datagrid/index.tsx +0 -20
  599. package/frontend/src/components/layout/CloudLayout.tsx +0 -95
  600. package/frontend/src/features/ai/components/AIConfigDialog.tsx +0 -76
  601. package/frontend/src/features/ai/components/AIConfigForm.tsx +0 -222
  602. package/frontend/src/features/ai/components/fields/ModalityField.tsx +0 -87
  603. package/frontend/src/features/ai/components/fields/ModelSelectionField.tsx +0 -134
  604. package/frontend/src/features/ai/components/fields/SystemPromptField.tsx +0 -33
  605. package/frontend/src/features/ai/page/AIPage.tsx +0 -178
  606. package/frontend/src/features/auth/components/AddOAuthDialog.tsx +0 -106
  607. package/frontend/src/features/auth/components/AuthMethodTab.tsx +0 -238
  608. package/frontend/src/features/auth/components/UsersTab.tsx +0 -114
  609. package/frontend/src/features/auth/page/AuthenticationPage.tsx +0 -169
  610. package/frontend/src/features/dashboard/page/DashboardPage.tsx +0 -194
  611. package/frontend/src/features/database/hooks/UseLinkModal.tsx +0 -78
  612. package/frontend/src/features/functions/components/FunctionViewer.tsx +0 -46
  613. package/frontend/src/features/functions/components/FunctionsContent.tsx +0 -88
  614. package/frontend/src/features/functions/page/FunctionsPage.tsx +0 -28
  615. package/frontend/src/features/login/components/AuthErrorBoundary.tsx +0 -87
  616. package/frontend/src/features/login/components/PrivateRoute.tsx +0 -24
  617. package/frontend/src/features/login/page/CloudLoginPage.tsx +0 -93
  618. package/frontend/src/features/logs/components/AnalyticsLogsTable.tsx +0 -313
  619. package/frontend/src/features/logs/components/LogsTable.tsx +0 -199
  620. package/frontend/src/features/logs/page/AnalyticsLogsPage.tsx +0 -530
  621. package/frontend/src/features/metadata/index.ts +0 -0
  622. package/frontend/src/features/metadata/page/MetadataPage.tsx +0 -136
  623. package/frontend/src/features/onboard/components/CompletionCard.tsx +0 -41
  624. package/frontend/src/features/onboard/components/OnboardButton.tsx +0 -84
  625. package/frontend/src/features/onboard/components/StepContent.tsx +0 -91
  626. package/frontend/src/features/onboard/components/TestConnectionStep.tsx +0 -53
  627. package/frontend/src/features/onboard/components/mcp/McpInstallation.tsx +0 -144
  628. package/frontend/src/features/onboard/page/OnBoardPage.tsx +0 -104
  629. package/frontend/src/features/onboard/types.ts +0 -8
  630. package/frontend/src/features/visualizer/page/VisualizerPage.tsx +0 -127
  631. package/frontend/src/lib/contexts/OnboardStepContext.tsx +0 -68
  632. package/frontend/src/lib/hooks/useOnboardingCompletion.ts +0 -29
  633. /package/backend/src/api/{middleware → middlewares}/error.ts +0 -0
  634. /package/backend/src/api/{middleware → middlewares}/upload.ts +0 -0
  635. /package/frontend/src/{features/metadata → lib}/services/metadata.service.ts +0 -0
@@ -0,0 +1,219 @@
1
+ import { ConvertedValue } from '@/components/datagrid/datagridTypes';
2
+ import { apiClient } from '@/lib/api/client';
3
+ import { ColumnSchema } from '@insforge/shared-schemas';
4
+ import { tableService } from './table.service';
5
+
6
+ export interface CSVImportResponse {
7
+ success: boolean;
8
+ message?: string;
9
+ data?: {
10
+ rowCount: number;
11
+ };
12
+ error?: string; // For backend error messages
13
+ }
14
+
15
+ export class RecordService {
16
+ /**
17
+ * Data fetching method with built-in search, sorting, and pagination for UI components.
18
+ *
19
+ * @param tableName - Name of the table
20
+ * @param limit - Number of records to fetch
21
+ * @param offset - Number of records to skip
22
+ * @param searchQuery - Search term to filter text columns
23
+ * @param sortColumns - Sorting configuration
24
+ * @returns Structured response with records and pagination info
25
+ */
26
+ async getTableRecords(
27
+ tableName: string,
28
+ limit = 10,
29
+ offset = 0,
30
+ searchQuery?: string,
31
+ sortColumns?: { columnKey: string; direction: string }[]
32
+ ) {
33
+ const params = new URLSearchParams();
34
+ params.set('limit', limit.toString());
35
+ params.set('offset', offset.toString());
36
+
37
+ // Construct PostgREST filter directly in frontend if search query is provided
38
+ if (searchQuery && searchQuery.trim()) {
39
+ const searchValue = searchQuery.trim();
40
+
41
+ // Get table schema to identify text columns
42
+ const schema = await tableService.getTableSchema(tableName);
43
+ const textColumns = schema.columns
44
+ .filter((col: ColumnSchema) => {
45
+ const type = col.type.toLowerCase();
46
+ return type === 'string';
47
+ })
48
+ .map((col: ColumnSchema) => col.columnName);
49
+
50
+ if (textColumns.length) {
51
+ // Create PostgREST OR filter for text columns
52
+ const orFilters = textColumns
53
+ .map((column: string) => `${column}.ilike.*${searchValue}*`)
54
+ .join(',');
55
+ params.set('or', `(${orFilters})`);
56
+ }
57
+ }
58
+
59
+ // Add sorting if provided - PostgREST uses "order" parameter
60
+ if (sortColumns && sortColumns.length) {
61
+ const orderParam = sortColumns
62
+ .map((col) => `${col.columnKey}.${col.direction.toLowerCase()}`)
63
+ .join(',');
64
+ params.set('order', orderParam);
65
+ }
66
+
67
+ const response: {
68
+ data: { [key: string]: ConvertedValue }[];
69
+ pagination: { offset: number; limit: number; total: number };
70
+ } = await apiClient.request(`/database/records/${tableName}?${params.toString()}`, {
71
+ headers: {
72
+ Prefer: 'count=exact',
73
+ },
74
+ });
75
+
76
+ return {
77
+ records: response.data,
78
+ pagination: response.pagination,
79
+ };
80
+ }
81
+
82
+ /**
83
+ * Get a single record by foreign key value.
84
+ * Specifically designed for foreign key lookups.
85
+ *
86
+ * @param tableName - Name of the table to search in
87
+ * @param columnName - Name of the column to filter by
88
+ * @param value - Value to match
89
+ * @returns Single record or null if not found
90
+ */
91
+ async getRecordByForeignKeyValue(tableName: string, columnName: string, value: string) {
92
+ const queryParams = `${columnName}=eq.${encodeURIComponent(value)}&limit=1`;
93
+ const response = await this.getRecords(tableName, queryParams);
94
+
95
+ // Return the first record if found, or null if not found
96
+ if (response.records && response.records.length) {
97
+ return response.records[0];
98
+ }
99
+ return null;
100
+ }
101
+
102
+ async getRecords(tableName: string, queryParams: string = '') {
103
+ const url = `/database/records/${tableName}${queryParams ? `?${queryParams}` : ''}`;
104
+ const response = await apiClient.request(url, {
105
+ headers: apiClient.withAccessToken(),
106
+ });
107
+
108
+ // Traditional REST: check if response is array (direct data) or wrapped
109
+ if (Array.isArray(response)) {
110
+ return {
111
+ records: response,
112
+ total: response.length,
113
+ };
114
+ }
115
+
116
+ // If backend returns wrapped format for this endpoint
117
+ if (response.data && Array.isArray(response.data)) {
118
+ return {
119
+ records: response.data,
120
+ total: response.data.length,
121
+ };
122
+ }
123
+
124
+ return {
125
+ records: response,
126
+ total: response.length,
127
+ };
128
+ }
129
+
130
+ createRecords(table: string, records: { [key: string]: ConvertedValue }[]) {
131
+ // if data is json and data[id] == "" then remove id from data, because can't assign '' to uuid
132
+ records = records.map((record) => {
133
+ if (typeof record === 'object' && record.id === '') {
134
+ delete record.id;
135
+ }
136
+ return record;
137
+ });
138
+ return apiClient.request(`/database/records/${table}`, {
139
+ method: 'POST',
140
+ headers: apiClient.withAccessToken({
141
+ 'Content-Type': 'application/json',
142
+ }),
143
+ body: JSON.stringify(records),
144
+ });
145
+ }
146
+
147
+ createRecord(table: string, data: { [key: string]: ConvertedValue }) {
148
+ if (typeof data === 'object' && data.id === '') {
149
+ // can't assign '' to uuid, so we need to remove it
150
+ delete data.id;
151
+ }
152
+ return this.createRecords(table, [data]);
153
+ }
154
+
155
+ updateRecord(
156
+ table: string,
157
+ pkColumn: string,
158
+ pkValue: string,
159
+ data: { [key: string]: ConvertedValue }
160
+ ) {
161
+ return apiClient.request(`/database/records/${table}?${pkColumn}=eq.${pkValue}`, {
162
+ method: 'PATCH',
163
+ headers: apiClient.withAccessToken({
164
+ 'Content-Type': 'application/json',
165
+ }),
166
+ body: JSON.stringify(data),
167
+ });
168
+ }
169
+
170
+ // PostgREST supports bulk deletes via in.() filter
171
+ deleteRecords(table: string, pkColumn: string, pkValues: string[]) {
172
+ if (!pkValues.length) {
173
+ return Promise.resolve();
174
+ }
175
+ const pkFilter = `in.(${pkValues.join(',')})`;
176
+ return apiClient.request(`/database/records/${table}?${pkColumn}=${pkFilter}`, {
177
+ method: 'DELETE',
178
+ headers: apiClient.withAccessToken(),
179
+ });
180
+ }
181
+
182
+ validateCSVFile(file: File): { valid: boolean; error?: string } {
183
+ if (file.type !== 'text/csv' && !file.name.endsWith('.csv')) {
184
+ return { valid: false, error: 'Invalid file type. Please upload a CSV file.' };
185
+ }
186
+ const maxSizeInBytes = 50 * 1024 * 1024;
187
+ if (file.size > maxSizeInBytes) {
188
+ return { valid: false, error: `File size exceeds the limit of ${maxSizeInBytes} bytes.` };
189
+ }
190
+ return { valid: true };
191
+ }
192
+
193
+ async importCSV(tableName: string, file: File): Promise<CSVImportResponse> {
194
+ const validation = this.validateCSVFile(file);
195
+ if (!validation.valid) {
196
+ throw new Error(validation.error || 'Invalid CSV file.');
197
+ }
198
+
199
+ const formData = new FormData();
200
+ formData.append('file', file);
201
+ formData.append('table', tableName);
202
+
203
+ const response = await apiClient.request(`/database/advance/bulk-upsert`, {
204
+ method: 'POST',
205
+ headers: apiClient.withAccessToken(),
206
+ body: formData,
207
+ });
208
+ return {
209
+ success: response.success,
210
+ message: response.message,
211
+ data: {
212
+ rowCount: response.rowsAffected,
213
+ },
214
+ error: response.error,
215
+ };
216
+ }
217
+ }
218
+
219
+ export const recordService = new RecordService();
@@ -0,0 +1,58 @@
1
+ import { apiClient } from '@/lib/api/client';
2
+ import {
3
+ ColumnSchema,
4
+ GetTableSchemaResponse,
5
+ CreateTableRequest,
6
+ UpdateTableSchemaResponse,
7
+ UpdateTableSchemaRequest,
8
+ } from '@insforge/shared-schemas';
9
+
10
+ export class TableService {
11
+ async listTables(): Promise<string[]> {
12
+ const data = await apiClient.request('/database/tables', {
13
+ headers: apiClient.withAccessToken(),
14
+ });
15
+ // data is already unwrapped by request method and should be an array
16
+ // Filter out the 'users' table
17
+ return Array.isArray(data) ? data.filter((table) => table !== 'users') : [];
18
+ }
19
+
20
+ getTableSchema(tableName: string): Promise<GetTableSchemaResponse> {
21
+ return apiClient.request(`/database/tables/${tableName}/schema`, {
22
+ headers: apiClient.withAccessToken(),
23
+ });
24
+ }
25
+
26
+ createTable(tableName: string, columns: ColumnSchema[]) {
27
+ const body: CreateTableRequest = { tableName: tableName, columns, rlsEnabled: true };
28
+ return apiClient.request('/database/tables', {
29
+ method: 'POST',
30
+ headers: apiClient.withAccessToken({
31
+ 'Content-Type': 'application/json',
32
+ }),
33
+ body: JSON.stringify(body),
34
+ });
35
+ }
36
+
37
+ deleteTable(tableName: string) {
38
+ return apiClient.request(`/database/tables/${tableName}`, {
39
+ method: 'DELETE',
40
+ headers: apiClient.withAccessToken(),
41
+ });
42
+ }
43
+
44
+ updateTableSchema(
45
+ tableName: string,
46
+ operations: UpdateTableSchemaRequest
47
+ ): Promise<UpdateTableSchemaResponse | void> {
48
+ return apiClient.request(`/database/tables/${tableName}/schema`, {
49
+ method: 'PATCH',
50
+ headers: apiClient.withAccessToken({
51
+ 'Content-Type': 'application/json',
52
+ }),
53
+ body: JSON.stringify(operations),
54
+ });
55
+ }
56
+ }
57
+
58
+ export const tableService = new TableService();
@@ -0,0 +1,402 @@
1
+ import { DatabaseTemplate } from './index';
2
+
3
+ export const aiChatbotTemplate: DatabaseTemplate = {
4
+ id: 'ai-chatbot',
5
+ title: 'AI Chatbot',
6
+ description:
7
+ 'A chatbot app with conversations, message history, image uploads, and user specific data',
8
+ tableCount: 4,
9
+ visualizerSchema: [
10
+ {
11
+ tableName: 'conversations',
12
+ columns: [
13
+ { columnName: 'id', type: 'uuid', isPrimaryKey: true, isNullable: false, isUnique: true },
14
+ {
15
+ columnName: 'user_id',
16
+ type: 'uuid',
17
+ isPrimaryKey: false,
18
+ isNullable: true,
19
+ isUnique: false,
20
+ foreignKey: {
21
+ referenceTable: 'users',
22
+ referenceColumn: 'id',
23
+ onDelete: 'CASCADE',
24
+ onUpdate: 'CASCADE',
25
+ },
26
+ },
27
+ {
28
+ columnName: 'title',
29
+ type: 'varchar',
30
+ isPrimaryKey: false,
31
+ isNullable: true,
32
+ isUnique: false,
33
+ },
34
+ {
35
+ columnName: 'model',
36
+ type: 'varchar',
37
+ isPrimaryKey: false,
38
+ isNullable: true,
39
+ isUnique: false,
40
+ },
41
+ {
42
+ columnName: 'created_at',
43
+ type: 'timestamp',
44
+ isPrimaryKey: false,
45
+ isNullable: true,
46
+ isUnique: false,
47
+ },
48
+ {
49
+ columnName: 'updated_at',
50
+ type: 'timestamp',
51
+ isPrimaryKey: false,
52
+ isNullable: true,
53
+ isUnique: false,
54
+ },
55
+ ],
56
+ },
57
+ {
58
+ tableName: 'messages',
59
+ columns: [
60
+ { columnName: 'id', type: 'uuid', isPrimaryKey: true, isNullable: false, isUnique: true },
61
+ {
62
+ columnName: 'conversation_id',
63
+ type: 'uuid',
64
+ isPrimaryKey: false,
65
+ isNullable: true,
66
+ isUnique: false,
67
+ foreignKey: {
68
+ referenceTable: 'conversations',
69
+ referenceColumn: 'id',
70
+ onDelete: 'CASCADE',
71
+ onUpdate: 'CASCADE',
72
+ },
73
+ },
74
+ {
75
+ columnName: 'role',
76
+ type: 'varchar',
77
+ isPrimaryKey: false,
78
+ isNullable: false,
79
+ isUnique: false,
80
+ },
81
+ {
82
+ columnName: 'content',
83
+ type: 'text',
84
+ isPrimaryKey: false,
85
+ isNullable: false,
86
+ isUnique: false,
87
+ },
88
+ {
89
+ columnName: 'tokens_used',
90
+ type: 'integer',
91
+ isPrimaryKey: false,
92
+ isNullable: true,
93
+ isUnique: false,
94
+ },
95
+ {
96
+ columnName: 'created_at',
97
+ type: 'timestamp',
98
+ isPrimaryKey: false,
99
+ isNullable: true,
100
+ isUnique: false,
101
+ },
102
+ ],
103
+ },
104
+ {
105
+ tableName: 'feedback',
106
+ columns: [
107
+ { columnName: 'id', type: 'uuid', isPrimaryKey: true, isNullable: false, isUnique: true },
108
+ {
109
+ columnName: 'message_id',
110
+ type: 'uuid',
111
+ isPrimaryKey: false,
112
+ isNullable: true,
113
+ isUnique: false,
114
+ foreignKey: {
115
+ referenceTable: 'messages',
116
+ referenceColumn: 'id',
117
+ onDelete: 'CASCADE',
118
+ onUpdate: 'CASCADE',
119
+ },
120
+ },
121
+ {
122
+ columnName: 'user_id',
123
+ type: 'uuid',
124
+ isPrimaryKey: false,
125
+ isNullable: true,
126
+ isUnique: false,
127
+ foreignKey: {
128
+ referenceTable: 'users',
129
+ referenceColumn: 'id',
130
+ onDelete: 'CASCADE',
131
+ onUpdate: 'CASCADE',
132
+ },
133
+ },
134
+ {
135
+ columnName: 'rating',
136
+ type: 'integer',
137
+ isPrimaryKey: false,
138
+ isNullable: true,
139
+ isUnique: false,
140
+ },
141
+ {
142
+ columnName: 'comment',
143
+ type: 'text',
144
+ isPrimaryKey: false,
145
+ isNullable: true,
146
+ isUnique: false,
147
+ },
148
+ {
149
+ columnName: 'created_at',
150
+ type: 'timestamp',
151
+ isPrimaryKey: false,
152
+ isNullable: true,
153
+ isUnique: false,
154
+ },
155
+ ],
156
+ },
157
+ {
158
+ tableName: 'prompts',
159
+ columns: [
160
+ { columnName: 'id', type: 'uuid', isPrimaryKey: true, isNullable: false, isUnique: true },
161
+ {
162
+ columnName: 'user_id',
163
+ type: 'uuid',
164
+ isPrimaryKey: false,
165
+ isNullable: true,
166
+ isUnique: false,
167
+ foreignKey: {
168
+ referenceTable: 'users',
169
+ referenceColumn: 'id',
170
+ onDelete: 'CASCADE',
171
+ onUpdate: 'CASCADE',
172
+ },
173
+ },
174
+ {
175
+ columnName: 'title',
176
+ type: 'varchar',
177
+ isPrimaryKey: false,
178
+ isNullable: false,
179
+ isUnique: false,
180
+ },
181
+ {
182
+ columnName: 'content',
183
+ type: 'text',
184
+ isPrimaryKey: false,
185
+ isNullable: false,
186
+ isUnique: false,
187
+ },
188
+ {
189
+ columnName: 'category',
190
+ type: 'varchar',
191
+ isPrimaryKey: false,
192
+ isNullable: true,
193
+ isUnique: false,
194
+ },
195
+ {
196
+ columnName: 'is_public',
197
+ type: 'boolean',
198
+ isPrimaryKey: false,
199
+ isNullable: true,
200
+ isUnique: false,
201
+ },
202
+ {
203
+ columnName: 'usage_count',
204
+ type: 'integer',
205
+ isPrimaryKey: false,
206
+ isNullable: true,
207
+ isUnique: false,
208
+ },
209
+ {
210
+ columnName: 'created_at',
211
+ type: 'timestamp',
212
+ isPrimaryKey: false,
213
+ isNullable: true,
214
+ isUnique: false,
215
+ },
216
+ {
217
+ columnName: 'updated_at',
218
+ type: 'timestamp',
219
+ isPrimaryKey: false,
220
+ isNullable: true,
221
+ isUnique: false,
222
+ },
223
+ ],
224
+ },
225
+ ],
226
+ sql: `-- AI Chatbot Database Schema
227
+ -- A comprehensive AI chatbot system with conversations, messages, feedback, and prompt library
228
+
229
+ -- Conversations table
230
+ CREATE TABLE conversations (
231
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
232
+ user_id UUID REFERENCES users(id) ON UPDATE CASCADE ON DELETE CASCADE,
233
+ title VARCHAR(255),
234
+ model VARCHAR(100) DEFAULT 'gpt-4',
235
+ created_at TIMESTAMP DEFAULT NOW(),
236
+ updated_at TIMESTAMP DEFAULT NOW()
237
+ );
238
+
239
+ -- Messages table
240
+ CREATE TABLE messages (
241
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
242
+ conversation_id UUID REFERENCES conversations(id) ON UPDATE CASCADE ON DELETE CASCADE,
243
+ role VARCHAR(50) NOT NULL CHECK (role IN ('user', 'assistant', 'system')),
244
+ content TEXT NOT NULL,
245
+ tokens_used INTEGER,
246
+ created_at TIMESTAMP DEFAULT NOW()
247
+ );
248
+
249
+ -- Feedback table
250
+ CREATE TABLE feedback (
251
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
252
+ message_id UUID REFERENCES messages(id) ON UPDATE CASCADE ON DELETE CASCADE,
253
+ user_id UUID REFERENCES users(id) ON UPDATE CASCADE ON DELETE CASCADE,
254
+ rating INTEGER CHECK (rating >= 1 AND rating <= 5),
255
+ comment TEXT,
256
+ created_at TIMESTAMP DEFAULT NOW()
257
+ );
258
+
259
+ -- Prompts library table
260
+ CREATE TABLE prompts (
261
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
262
+ user_id UUID REFERENCES users(id) ON UPDATE CASCADE ON DELETE CASCADE,
263
+ title VARCHAR(255) NOT NULL,
264
+ content TEXT NOT NULL,
265
+ category VARCHAR(100),
266
+ is_public BOOLEAN DEFAULT FALSE,
267
+ usage_count INTEGER DEFAULT 0,
268
+ created_at TIMESTAMP DEFAULT NOW(),
269
+ updated_at TIMESTAMP DEFAULT NOW()
270
+ );
271
+
272
+ -- Indexes for better performance
273
+ CREATE INDEX idx_conversations_user ON conversations(user_id);
274
+ CREATE INDEX idx_conversations_updated ON conversations(updated_at DESC);
275
+ CREATE INDEX idx_messages_conversation ON messages(conversation_id);
276
+ CREATE INDEX idx_messages_role ON messages(role);
277
+ CREATE INDEX idx_messages_created ON messages(created_at DESC);
278
+ CREATE INDEX idx_feedback_message ON feedback(message_id);
279
+ CREATE INDEX idx_feedback_user ON feedback(user_id);
280
+ CREATE INDEX idx_feedback_rating ON feedback(rating);
281
+ CREATE INDEX idx_prompts_user ON prompts(user_id);
282
+ CREATE INDEX idx_prompts_category ON prompts(category);
283
+ CREATE INDEX idx_prompts_public ON prompts(is_public) WHERE is_public = TRUE;
284
+
285
+ -- =======================
286
+ -- ROW LEVEL SECURITY (RLS)
287
+ -- =======================
288
+
289
+ -- Enable RLS on all tables
290
+ ALTER TABLE conversations ENABLE ROW LEVEL SECURITY;
291
+ ALTER TABLE messages ENABLE ROW LEVEL SECURITY;
292
+ ALTER TABLE feedback ENABLE ROW LEVEL SECURITY;
293
+ ALTER TABLE prompts ENABLE ROW LEVEL SECURITY;
294
+
295
+ -- Policies for conversations (users can only see their own)
296
+ CREATE POLICY "Users can view their own conversations"
297
+ ON conversations FOR SELECT
298
+ TO authenticated
299
+ USING (user_id = auth.uid());
300
+
301
+ CREATE POLICY "Users can create their own conversations"
302
+ ON conversations FOR INSERT
303
+ TO authenticated
304
+ WITH CHECK (user_id = auth.uid());
305
+
306
+ CREATE POLICY "Users can update their own conversations"
307
+ ON conversations FOR UPDATE
308
+ TO authenticated
309
+ USING (user_id = auth.uid())
310
+ WITH CHECK (user_id = auth.uid());
311
+
312
+ CREATE POLICY "Users can delete their own conversations"
313
+ ON conversations FOR DELETE
314
+ TO authenticated
315
+ USING (user_id = auth.uid());
316
+
317
+ -- Policies for messages (users can only see messages from their conversations)
318
+ CREATE POLICY "Users can view messages from their conversations"
319
+ ON messages FOR SELECT
320
+ TO authenticated
321
+ USING (
322
+ conversation_id IN (
323
+ SELECT id FROM conversations WHERE user_id = auth.uid()
324
+ )
325
+ );
326
+
327
+ CREATE POLICY "Users can create messages in their conversations"
328
+ ON messages FOR INSERT
329
+ TO authenticated
330
+ WITH CHECK (
331
+ conversation_id IN (
332
+ SELECT id FROM conversations WHERE user_id = auth.uid()
333
+ )
334
+ );
335
+
336
+ CREATE POLICY "Users can update messages in their conversations"
337
+ ON messages FOR UPDATE
338
+ TO authenticated
339
+ USING (
340
+ conversation_id IN (
341
+ SELECT id FROM conversations WHERE user_id = auth.uid()
342
+ )
343
+ )
344
+ WITH CHECK (
345
+ conversation_id IN (
346
+ SELECT id FROM conversations WHERE user_id = auth.uid()
347
+ )
348
+ );
349
+
350
+ CREATE POLICY "Users can delete messages from their conversations"
351
+ ON messages FOR DELETE
352
+ TO authenticated
353
+ USING (
354
+ conversation_id IN (
355
+ SELECT id FROM conversations WHERE user_id = auth.uid()
356
+ )
357
+ );
358
+
359
+ -- Policies for feedback
360
+ CREATE POLICY "Users can view their own feedback"
361
+ ON feedback FOR SELECT
362
+ TO authenticated
363
+ USING (user_id = auth.uid());
364
+
365
+ CREATE POLICY "Users can create their own feedback"
366
+ ON feedback FOR INSERT
367
+ TO authenticated
368
+ WITH CHECK (user_id = auth.uid());
369
+
370
+ CREATE POLICY "Users can update their own feedback"
371
+ ON feedback FOR UPDATE
372
+ TO authenticated
373
+ USING (user_id = auth.uid())
374
+ WITH CHECK (user_id = auth.uid());
375
+
376
+ CREATE POLICY "Users can delete their own feedback"
377
+ ON feedback FOR DELETE
378
+ TO authenticated
379
+ USING (user_id = auth.uid());
380
+
381
+ -- Policies for prompts (users can see their own and public prompts)
382
+ CREATE POLICY "Users can view their own and public prompts"
383
+ ON prompts FOR SELECT
384
+ TO authenticated
385
+ USING (user_id = auth.uid() OR is_public = TRUE);
386
+
387
+ CREATE POLICY "Users can create their own prompts"
388
+ ON prompts FOR INSERT
389
+ TO authenticated
390
+ WITH CHECK (user_id = auth.uid());
391
+
392
+ CREATE POLICY "Users can update their own prompts"
393
+ ON prompts FOR UPDATE
394
+ TO authenticated
395
+ USING (user_id = auth.uid())
396
+ WITH CHECK (user_id = auth.uid());
397
+
398
+ CREATE POLICY "Users can delete their own prompts"
399
+ ON prompts FOR DELETE
400
+ TO authenticated
401
+ USING (user_id = auth.uid());`,
402
+ };