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
@@ -1,25 +1,25 @@
1
- -- Migration: 006 - Modify AI usage table
2
- -- This migration modifies the _ai_usage table to:
3
- -- 1. Change foreign key constraint on config_id to SET NULL
4
- -- 2. Make config_id nullable
5
- -- 3. Add model_id column
6
-
7
- -- Drop existing foreign key constraint
8
- ALTER TABLE _ai_usage
9
- DROP CONSTRAINT IF EXISTS _ai_usage_config_id_fkey;
10
-
11
- -- Make config_id nullable
12
- ALTER TABLE _ai_usage
13
- ALTER COLUMN config_id DROP NOT NULL;
14
-
15
- -- Add new foreign key constraint with SET NULL on delete
16
- ALTER TABLE _ai_usage
17
- ADD CONSTRAINT _ai_usage_config_id_fkey
18
- FOREIGN KEY (config_id) REFERENCES _ai_configs(id) ON DELETE SET NULL;
19
-
20
- -- Add new columns for model identification
21
- ALTER TABLE _ai_usage
22
- ADD COLUMN IF NOT EXISTS model_id VARCHAR(255);
23
-
24
- -- Create indexes for the new columns
1
+ -- Migration: 006 - Modify AI usage table
2
+ -- This migration modifies the _ai_usage table to:
3
+ -- 1. Change foreign key constraint on config_id to SET NULL
4
+ -- 2. Make config_id nullable
5
+ -- 3. Add model_id column
6
+
7
+ -- Drop existing foreign key constraint
8
+ ALTER TABLE _ai_usage
9
+ DROP CONSTRAINT IF EXISTS _ai_usage_config_id_fkey;
10
+
11
+ -- Make config_id nullable
12
+ ALTER TABLE _ai_usage
13
+ ALTER COLUMN config_id DROP NOT NULL;
14
+
15
+ -- Add new foreign key constraint with SET NULL on delete
16
+ ALTER TABLE _ai_usage
17
+ ADD CONSTRAINT _ai_usage_config_id_fkey
18
+ FOREIGN KEY (config_id) REFERENCES _ai_configs(id) ON DELETE SET NULL;
19
+
20
+ -- Add new columns for model identification
21
+ ALTER TABLE _ai_usage
22
+ ADD COLUMN IF NOT EXISTS model_id VARCHAR(255);
23
+
24
+ -- Create indexes for the new columns
25
25
  CREATE INDEX IF NOT EXISTS idx_ai_usage_model_id ON _ai_usage(model_id);
@@ -1,2 +1,2 @@
1
- -- Drop the _metadata table if it exists
1
+ -- Drop the _metadata table if it exists
2
2
  DROP TABLE IF EXISTS _metadata CASCADE;
@@ -1,77 +1,77 @@
1
- -- Migration: 008 - Create new system tables and rename OAuth connections table
2
-
3
- -- 1. Create _secrets table for storing application secrets
4
- CREATE TABLE IF NOT EXISTS _secrets (
5
- id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
6
- name TEXT UNIQUE NOT NULL,
7
- value_ciphertext TEXT NOT NULL,
8
- is_active BOOLEAN DEFAULT TRUE,
9
- last_used_at TIMESTAMPTZ,
10
- expires_at TIMESTAMPTZ,
11
- created_at TIMESTAMPTZ DEFAULT NOW(),
12
- updated_at TIMESTAMPTZ DEFAULT NOW()
13
- );
14
-
15
- -- 2. Create _oauth_configs table for OAuth provider configurations
16
- CREATE TABLE IF NOT EXISTS _oauth_configs (
17
- id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
18
- provider TEXT UNIQUE NOT NULL,
19
- client_id TEXT,
20
- secret_id UUID REFERENCES _secrets(id) ON DELETE RESTRICT,
21
- scopes TEXT[],
22
- redirect_uri TEXT,
23
- use_shared_key BOOLEAN DEFAULT FALSE,
24
- created_at TIMESTAMPTZ DEFAULT NOW(),
25
- updated_at TIMESTAMPTZ DEFAULT NOW()
26
- );
27
-
28
- -- 3. Create _audit_logs table for storing admin operation logs
29
- CREATE TABLE IF NOT EXISTS _audit_logs (
30
- id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
31
- actor TEXT NOT NULL,
32
- action TEXT NOT NULL,
33
- module TEXT NOT NULL,
34
- details JSONB,
35
- ip_address INET,
36
- created_at TIMESTAMPTZ DEFAULT NOW(),
37
- updated_at TIMESTAMPTZ DEFAULT NOW()
38
- );
39
-
40
- -- 4. Rename _oauth_connections to _account_providers
41
- DO $$
42
- BEGIN
43
- IF EXISTS (SELECT FROM information_schema.tables
44
- WHERE table_name = '_oauth_connections' AND table_schema = 'public') THEN
45
- IF EXISTS (SELECT FROM information_schema.tables
46
- WHERE table_name = '_account_providers' AND table_schema = 'public') THEN
47
- -- _account_providers already exists, just drop _oauth_connections
48
- DROP TABLE _oauth_connections CASCADE;
49
- ELSE
50
- -- _account_providers doesn't exist, rename _oauth_connections to _account_providers
51
- ALTER TABLE _oauth_connections RENAME TO _account_providers;
52
- END IF;
53
- END IF;
54
- END $$;
55
-
56
- -- 5. Drop the old _config system table
57
- DROP TABLE IF EXISTS _config CASCADE;
58
-
59
- -- Create indexes for better query performance
60
- CREATE INDEX IF NOT EXISTS idx_secrets_name ON _secrets(name);
61
- CREATE INDEX IF NOT EXISTS idx_oauth_configs_provider ON _oauth_configs(provider);
62
- CREATE INDEX IF NOT EXISTS idx_audit_logs_actor ON _audit_logs(actor);
63
- CREATE INDEX IF NOT EXISTS idx_audit_logs_module ON _audit_logs(module);
64
- CREATE INDEX IF NOT EXISTS idx_audit_logs_created_at ON _audit_logs(created_at DESC);
65
-
66
- -- Add triggers for updated_at
67
- DROP TRIGGER IF EXISTS update__secrets_updated_at ON _secrets;
68
- CREATE TRIGGER update__secrets_updated_at BEFORE UPDATE ON _secrets
69
- FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
70
-
71
- DROP TRIGGER IF EXISTS update__oauth_configs_updated_at ON _oauth_configs;
72
- CREATE TRIGGER update__oauth_configs_updated_at BEFORE UPDATE ON _oauth_configs
73
- FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
74
-
75
- DROP TRIGGER IF EXISTS update__audit_logs_updated_at ON _audit_logs;
76
- CREATE TRIGGER update__audit_logs_updated_at BEFORE UPDATE ON _audit_logs
1
+ -- Migration: 008 - Create new system tables and rename OAuth connections table
2
+
3
+ -- 1. Create _secrets table for storing application secrets
4
+ CREATE TABLE IF NOT EXISTS _secrets (
5
+ id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
6
+ name TEXT UNIQUE NOT NULL,
7
+ value_ciphertext TEXT NOT NULL,
8
+ is_active BOOLEAN DEFAULT TRUE,
9
+ last_used_at TIMESTAMPTZ,
10
+ expires_at TIMESTAMPTZ,
11
+ created_at TIMESTAMPTZ DEFAULT NOW(),
12
+ updated_at TIMESTAMPTZ DEFAULT NOW()
13
+ );
14
+
15
+ -- 2. Create _oauth_configs table for OAuth provider configurations
16
+ CREATE TABLE IF NOT EXISTS _oauth_configs (
17
+ id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
18
+ provider TEXT UNIQUE NOT NULL,
19
+ client_id TEXT,
20
+ secret_id UUID REFERENCES _secrets(id) ON DELETE RESTRICT,
21
+ scopes TEXT[],
22
+ redirect_uri TEXT,
23
+ use_shared_key BOOLEAN DEFAULT FALSE,
24
+ created_at TIMESTAMPTZ DEFAULT NOW(),
25
+ updated_at TIMESTAMPTZ DEFAULT NOW()
26
+ );
27
+
28
+ -- 3. Create _audit_logs table for storing admin operation logs
29
+ CREATE TABLE IF NOT EXISTS _audit_logs (
30
+ id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
31
+ actor TEXT NOT NULL,
32
+ action TEXT NOT NULL,
33
+ module TEXT NOT NULL,
34
+ details JSONB,
35
+ ip_address INET,
36
+ created_at TIMESTAMPTZ DEFAULT NOW(),
37
+ updated_at TIMESTAMPTZ DEFAULT NOW()
38
+ );
39
+
40
+ -- 4. Rename _oauth_connections to _account_providers
41
+ DO $$
42
+ BEGIN
43
+ IF EXISTS (SELECT FROM information_schema.tables
44
+ WHERE table_name = '_oauth_connections' AND table_schema = 'public') THEN
45
+ IF EXISTS (SELECT FROM information_schema.tables
46
+ WHERE table_name = '_account_providers' AND table_schema = 'public') THEN
47
+ -- _account_providers already exists, just drop _oauth_connections
48
+ DROP TABLE _oauth_connections CASCADE;
49
+ ELSE
50
+ -- _account_providers doesn't exist, rename _oauth_connections to _account_providers
51
+ ALTER TABLE _oauth_connections RENAME TO _account_providers;
52
+ END IF;
53
+ END IF;
54
+ END $$;
55
+
56
+ -- 5. Drop the old _config system table
57
+ DROP TABLE IF EXISTS _config CASCADE;
58
+
59
+ -- Create indexes for better query performance
60
+ CREATE INDEX IF NOT EXISTS idx_secrets_name ON _secrets(name);
61
+ CREATE INDEX IF NOT EXISTS idx_oauth_configs_provider ON _oauth_configs(provider);
62
+ CREATE INDEX IF NOT EXISTS idx_audit_logs_actor ON _audit_logs(actor);
63
+ CREATE INDEX IF NOT EXISTS idx_audit_logs_module ON _audit_logs(module);
64
+ CREATE INDEX IF NOT EXISTS idx_audit_logs_created_at ON _audit_logs(created_at DESC);
65
+
66
+ -- Add triggers for updated_at
67
+ DROP TRIGGER IF EXISTS update__secrets_updated_at ON _secrets;
68
+ CREATE TRIGGER update__secrets_updated_at BEFORE UPDATE ON _secrets
69
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
70
+
71
+ DROP TRIGGER IF EXISTS update__oauth_configs_updated_at ON _oauth_configs;
72
+ CREATE TRIGGER update__oauth_configs_updated_at BEFORE UPDATE ON _oauth_configs
73
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
74
+
75
+ DROP TRIGGER IF EXISTS update__audit_logs_updated_at ON _audit_logs;
76
+ CREATE TRIGGER update__audit_logs_updated_at BEFORE UPDATE ON _audit_logs
77
77
  FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
@@ -1,24 +1,24 @@
1
- -- Migration: 009 - Create function secrets table for edge functions environment variables
2
- -- This table stores encrypted secrets that are injected into edge functions as Deno.env variables
3
-
4
- CREATE TABLE IF NOT EXISTS _function_secrets (
5
- id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
6
- key VARCHAR(255) UNIQUE NOT NULL,
7
- value_ciphertext TEXT NOT NULL, -- Encrypted value using AES-256-GCM
8
- is_reserved BOOLEAN DEFAULT FALSE, -- System-reserved keys that can't be modified/deleted
9
- created_at TIMESTAMPTZ DEFAULT NOW(),
10
- updated_at TIMESTAMPTZ DEFAULT NOW()
11
- );
12
-
13
- -- Create index for faster key lookups
14
- CREATE INDEX IF NOT EXISTS idx_function_secrets_key ON _function_secrets(key);
15
-
16
- -- Add trigger for updated_at
17
- DROP TRIGGER IF EXISTS update__function_secrets_updated_at ON _function_secrets;
18
- CREATE TRIGGER update__function_secrets_updated_at BEFORE UPDATE ON _function_secrets
19
- FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
20
-
21
- -- Note: Reserved system secrets will be initialized by the application on startup
22
-
23
- -- Rename _edge_functions table to functions
1
+ -- Migration: 009 - Create function secrets table for edge functions environment variables
2
+ -- This table stores encrypted secrets that are injected into edge functions as Deno.env variables
3
+
4
+ CREATE TABLE IF NOT EXISTS _function_secrets (
5
+ id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
6
+ key VARCHAR(255) UNIQUE NOT NULL,
7
+ value_ciphertext TEXT NOT NULL, -- Encrypted value using AES-256-GCM
8
+ is_reserved BOOLEAN DEFAULT FALSE, -- System-reserved keys that can't be modified/deleted
9
+ created_at TIMESTAMPTZ DEFAULT NOW(),
10
+ updated_at TIMESTAMPTZ DEFAULT NOW()
11
+ );
12
+
13
+ -- Create index for faster key lookups
14
+ CREATE INDEX IF NOT EXISTS idx_function_secrets_key ON _function_secrets(key);
15
+
16
+ -- Add trigger for updated_at
17
+ DROP TRIGGER IF EXISTS update__function_secrets_updated_at ON _function_secrets;
18
+ CREATE TRIGGER update__function_secrets_updated_at BEFORE UPDATE ON _function_secrets
19
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
20
+
21
+ -- Note: Reserved system secrets will be initialized by the application on startup
22
+
23
+ -- Rename _edge_functions table to functions
24
24
  ALTER TABLE IF EXISTS _edge_functions RENAME TO _functions;
@@ -1,93 +1,93 @@
1
- -- Migration: 010 - Modify AI configurations table to support input/output modalities
2
- -- This migration modifies the _ai_configs table to:
3
- -- 1. Add new columns: input_modality and output_modality (TEXT arrays)
4
- -- 2. Migrate existing modality data to input_modality
5
- -- 3. Set default output_modality based on existing modality
6
- -- 4. Drop the old modality column
7
-
8
- DO $$
9
- BEGIN
10
- -- Add new columns for input and output modalities
11
- ALTER TABLE _ai_configs
12
- ADD COLUMN IF NOT EXISTS input_modality TEXT[] DEFAULT '{text}';
13
-
14
- ALTER TABLE _ai_configs
15
- ADD COLUMN IF NOT EXISTS output_modality TEXT[] DEFAULT '{text}';
16
-
17
- -- Check if modality column exists and migrate data if it does
18
- IF EXISTS (
19
- SELECT 1
20
- FROM information_schema.columns
21
- WHERE table_schema = 'public'
22
- AND table_name = '_ai_configs'
23
- AND column_name = 'modality'
24
- ) THEN
25
- -- Migrate existing modality data to input_modality
26
- -- For most cases, we'll set input_modality to the existing modality
27
- -- and output_modality to the same value, only supporting text and image
28
- UPDATE _ai_configs
29
- SET
30
- input_modality = CASE
31
- WHEN modality = 'multi' THEN '{text,image}'::TEXT[]
32
- WHEN modality = 'image' THEN '{text,image}'::TEXT[]
33
- ELSE ARRAY[modality]::TEXT[]
34
- END,
35
- output_modality = CASE
36
- WHEN modality = 'multi' THEN '{text,image}'::TEXT[]
37
- WHEN modality = 'text' THEN '{text}'::TEXT[]
38
- WHEN modality = 'image' THEN '{text,image}'::TEXT[]
39
- ELSE '{text}'::TEXT[]
40
- END
41
- WHERE input_modality = '{text}' OR input_modality IS NULL;
42
- END IF;
43
-
44
- -- Make the new columns NOT NULL after migration
45
- ALTER TABLE _ai_configs
46
- ALTER COLUMN input_modality SET NOT NULL;
47
-
48
- ALTER TABLE _ai_configs
49
- ALTER COLUMN output_modality SET NOT NULL;
50
-
51
- -- Drop the old modality column
52
- ALTER TABLE _ai_configs
53
- DROP COLUMN IF EXISTS modality;
54
-
55
- -- Create indexes for the new TEXT array columns for better query performance
56
- CREATE INDEX IF NOT EXISTS idx_ai_configs_input_modality ON _ai_configs USING GIN (input_modality);
57
- CREATE INDEX IF NOT EXISTS idx_ai_configs_output_modality ON _ai_configs USING GIN (output_modality);
58
-
59
- -- Drop existing constraints if they exist, then add them
60
- ALTER TABLE _ai_configs
61
- DROP CONSTRAINT IF EXISTS check_input_modality_not_empty;
62
-
63
- ALTER TABLE _ai_configs
64
- ADD CONSTRAINT check_input_modality_not_empty
65
- CHECK (array_length(input_modality, 1) > 0);
66
-
67
- ALTER TABLE _ai_configs
68
- DROP CONSTRAINT IF EXISTS check_output_modality_not_empty;
69
-
70
- ALTER TABLE _ai_configs
71
- ADD CONSTRAINT check_output_modality_not_empty
72
- CHECK (array_length(output_modality, 1) > 0);
73
-
74
- -- Drop existing constraints if they exist, then add them
75
- ALTER TABLE _ai_configs
76
- DROP CONSTRAINT IF EXISTS check_input_modality_valid;
77
-
78
- ALTER TABLE _ai_configs
79
- ADD CONSTRAINT check_input_modality_valid
80
- CHECK (
81
- input_modality <@ '{text,image}'::TEXT[]
82
- );
83
-
84
- ALTER TABLE _ai_configs
85
- DROP CONSTRAINT IF EXISTS check_output_modality_valid;
86
-
87
- ALTER TABLE _ai_configs
88
- ADD CONSTRAINT check_output_modality_valid
89
- CHECK (
90
- output_modality <@ '{text,image}'::TEXT[]
91
- );
92
-
93
- END $$;
1
+ -- Migration: 010 - Modify AI configurations table to support input/output modalities
2
+ -- This migration modifies the _ai_configs table to:
3
+ -- 1. Add new columns: input_modality and output_modality (TEXT arrays)
4
+ -- 2. Migrate existing modality data to input_modality
5
+ -- 3. Set default output_modality based on existing modality
6
+ -- 4. Drop the old modality column
7
+
8
+ DO $$
9
+ BEGIN
10
+ -- Add new columns for input and output modalities
11
+ ALTER TABLE _ai_configs
12
+ ADD COLUMN IF NOT EXISTS input_modality TEXT[] DEFAULT '{text}';
13
+
14
+ ALTER TABLE _ai_configs
15
+ ADD COLUMN IF NOT EXISTS output_modality TEXT[] DEFAULT '{text}';
16
+
17
+ -- Check if modality column exists and migrate data if it does
18
+ IF EXISTS (
19
+ SELECT 1
20
+ FROM information_schema.columns
21
+ WHERE table_schema = 'public'
22
+ AND table_name = '_ai_configs'
23
+ AND column_name = 'modality'
24
+ ) THEN
25
+ -- Migrate existing modality data to input_modality
26
+ -- For most cases, we'll set input_modality to the existing modality
27
+ -- and output_modality to the same value, only supporting text and image
28
+ UPDATE _ai_configs
29
+ SET
30
+ input_modality = CASE
31
+ WHEN modality = 'multi' THEN '{text,image}'::TEXT[]
32
+ WHEN modality = 'image' THEN '{text,image}'::TEXT[]
33
+ ELSE ARRAY[modality]::TEXT[]
34
+ END,
35
+ output_modality = CASE
36
+ WHEN modality = 'multi' THEN '{text,image}'::TEXT[]
37
+ WHEN modality = 'text' THEN '{text}'::TEXT[]
38
+ WHEN modality = 'image' THEN '{text,image}'::TEXT[]
39
+ ELSE '{text}'::TEXT[]
40
+ END
41
+ WHERE input_modality = '{text}' OR input_modality IS NULL;
42
+ END IF;
43
+
44
+ -- Make the new columns NOT NULL after migration
45
+ ALTER TABLE _ai_configs
46
+ ALTER COLUMN input_modality SET NOT NULL;
47
+
48
+ ALTER TABLE _ai_configs
49
+ ALTER COLUMN output_modality SET NOT NULL;
50
+
51
+ -- Drop the old modality column
52
+ ALTER TABLE _ai_configs
53
+ DROP COLUMN IF EXISTS modality;
54
+
55
+ -- Create indexes for the new TEXT array columns for better query performance
56
+ CREATE INDEX IF NOT EXISTS idx_ai_configs_input_modality ON _ai_configs USING GIN (input_modality);
57
+ CREATE INDEX IF NOT EXISTS idx_ai_configs_output_modality ON _ai_configs USING GIN (output_modality);
58
+
59
+ -- Drop existing constraints if they exist, then add them
60
+ ALTER TABLE _ai_configs
61
+ DROP CONSTRAINT IF EXISTS check_input_modality_not_empty;
62
+
63
+ ALTER TABLE _ai_configs
64
+ ADD CONSTRAINT check_input_modality_not_empty
65
+ CHECK (array_length(input_modality, 1) > 0);
66
+
67
+ ALTER TABLE _ai_configs
68
+ DROP CONSTRAINT IF EXISTS check_output_modality_not_empty;
69
+
70
+ ALTER TABLE _ai_configs
71
+ ADD CONSTRAINT check_output_modality_not_empty
72
+ CHECK (array_length(output_modality, 1) > 0);
73
+
74
+ -- Drop existing constraints if they exist, then add them
75
+ ALTER TABLE _ai_configs
76
+ DROP CONSTRAINT IF EXISTS check_input_modality_valid;
77
+
78
+ ALTER TABLE _ai_configs
79
+ ADD CONSTRAINT check_input_modality_valid
80
+ CHECK (
81
+ input_modality <@ '{text,image}'::TEXT[]
82
+ );
83
+
84
+ ALTER TABLE _ai_configs
85
+ DROP CONSTRAINT IF EXISTS check_output_modality_valid;
86
+
87
+ ALTER TABLE _ai_configs
88
+ ADD CONSTRAINT check_output_modality_valid
89
+ CHECK (
90
+ output_modality <@ '{text,image}'::TEXT[]
91
+ );
92
+
93
+ END $$;
@@ -1,15 +1,15 @@
1
- -- Migration: 011 - Drop function secrets table and update main secrets table
2
- -- This migration is part of the refactoring to unify all secrets management
3
-
4
- -- 1. Drop the _function_secrets table (replaced by main _secrets table)
5
- DROP TRIGGER IF EXISTS update__function_secrets_updated_at ON _function_secrets;
6
- DROP INDEX IF EXISTS idx_function_secrets_key;
7
- DROP TABLE IF EXISTS _function_secrets;
8
-
9
- -- 2. Add is_reserved column to _secrets table
10
- ALTER TABLE _secrets
11
- ADD COLUMN IF NOT EXISTS is_reserved BOOLEAN DEFAULT FALSE;
12
-
13
- -- 3. Rename name column to key
14
- ALTER TABLE _secrets
15
- RENAME COLUMN name TO key;
1
+ -- Migration: 011 - Drop function secrets table and update main secrets table
2
+ -- This migration is part of the refactoring to unify all secrets management
3
+
4
+ -- 1. Drop the _function_secrets table (replaced by main _secrets table)
5
+ DROP TRIGGER IF EXISTS update__function_secrets_updated_at ON _function_secrets;
6
+ DROP INDEX IF EXISTS idx_function_secrets_key;
7
+ DROP TABLE IF EXISTS _function_secrets;
8
+
9
+ -- 2. Add is_reserved column to _secrets table
10
+ ALTER TABLE _secrets
11
+ ADD COLUMN IF NOT EXISTS is_reserved BOOLEAN DEFAULT FALSE;
12
+
13
+ -- 3. Rename name column to key
14
+ ALTER TABLE _secrets
15
+ RENAME COLUMN name TO key;
@@ -1,8 +1,8 @@
1
- -- Migration: 012 - Add uploaded_by column to _storage table
2
- -- This migration adds a foreign key relationship to track which account uploaded each file
3
-
4
- ALTER TABLE _storage
5
- ADD COLUMN uploaded_by UUID REFERENCES _accounts(id) ON DELETE SET NULL;
6
-
7
- -- Create an index for better query performance when filtering by uploader
1
+ -- Migration: 012 - Add uploaded_by column to _storage table
2
+ -- This migration adds a foreign key relationship to track which account uploaded each file
3
+
4
+ ALTER TABLE _storage
5
+ ADD COLUMN uploaded_by UUID REFERENCES _accounts(id) ON DELETE SET NULL;
6
+
7
+ -- Create an index for better query performance when filtering by uploader
8
8
  CREATE INDEX IF NOT EXISTS idx_storage_uploaded_by ON _storage(uploaded_by);
@@ -0,0 +1,44 @@
1
+ -- Migration: 013 - Create auth schema and copy helper functions
2
+ -- Creates auth schema if it doesn't exist and copies JWT helper functions
3
+
4
+ -- Create auth schema if not exists
5
+ CREATE SCHEMA IF NOT EXISTS auth;
6
+
7
+ -- Function to get current user ID from JWT (in auth schema)
8
+ CREATE OR REPLACE FUNCTION auth.uid()
9
+ RETURNS uuid
10
+ LANGUAGE sql STABLE
11
+ AS $$
12
+ SELECT
13
+ nullif(
14
+ coalesce(
15
+ current_setting('request.jwt.claim.sub', true),
16
+ (current_setting('request.jwt.claims', true)::jsonb ->> 'sub')
17
+ ),
18
+ ''
19
+ )::uuid
20
+ $$;
21
+
22
+ -- Function to get current user role from JWT (in auth schema)
23
+ CREATE OR REPLACE FUNCTION auth.role()
24
+ RETURNS text
25
+ LANGUAGE sql STABLE
26
+ AS $$
27
+ SELECT
28
+ coalesce(
29
+ current_setting('request.jwt.claim.role', true),
30
+ (current_setting('request.jwt.claims', true)::jsonb ->> 'role')
31
+ )::text
32
+ $$;
33
+
34
+ -- Function to get current user email from JWT (in auth schema)
35
+ CREATE OR REPLACE FUNCTION auth.email()
36
+ RETURNS text
37
+ LANGUAGE sql STABLE
38
+ AS $$
39
+ SELECT
40
+ coalesce(
41
+ current_setting('request.jwt.claim.email', true),
42
+ (current_setting('request.jwt.claims', true)::jsonb ->> 'email')
43
+ )::text
44
+ $$;
@@ -0,0 +1,8 @@
1
+ -- Migration: 014 - Add updated_at trigger to users table
2
+ -- Adds the updated_at trigger to the users table for automatic timestamp management
3
+
4
+
5
+ DROP TRIGGER IF EXISTS update_users_updated_at ON users;
6
+ CREATE TRIGGER update_users_updated_at
7
+ BEFORE UPDATE ON users
8
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
@@ -0,0 +1,60 @@
1
+ -- Migration: 015 - Create email OTP verification table and email auth configs
2
+ -- This migration creates:
3
+ -- 1. _email_otps: Stores one-time tokens for email verification purposes
4
+ -- - Supports both short numeric codes (6 digits) for manual entry
5
+ -- - Supports long cryptographic tokens (64 chars) for magic links
6
+ -- - Uses dual hashing strategy:
7
+ -- * NUMERIC_CODE (6 digits): Bcrypt hash (slow, defense against brute force)
8
+ -- * LINK_TOKEN (64 hex chars): SHA-256 hash (fast, enables direct O(1) lookup)
9
+ -- 2. _auth_configs: Stores email authentication configuration (single-row table)
10
+
11
+ -- 1. Create email OTP verification table
12
+ CREATE TABLE IF NOT EXISTS _email_otps (
13
+ id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
14
+ email TEXT NOT NULL,
15
+ purpose TEXT NOT NULL,
16
+ otp_hash TEXT NOT NULL, -- Hash of OTP: bcrypt for NUMERIC_CODE, SHA-256 for LINK_TOKEN
17
+ expires_at TIMESTAMPTZ NOT NULL,
18
+ consumed_at TIMESTAMPTZ,
19
+ attempts_count INTEGER DEFAULT 0 NOT NULL,
20
+ created_at TIMESTAMPTZ DEFAULT NOW(),
21
+ updated_at TIMESTAMPTZ DEFAULT NOW(),
22
+ UNIQUE (email, purpose) -- Only one active token per email/purpose combination
23
+ );
24
+
25
+ -- Create indexes for better query performance
26
+ CREATE INDEX IF NOT EXISTS idx_email_otps_email_purpose ON _email_otps(email, purpose);
27
+ CREATE INDEX IF NOT EXISTS idx_email_otps_expires_at ON _email_otps(expires_at);
28
+ CREATE INDEX IF NOT EXISTS idx_email_otps_otp_hash ON _email_otps(otp_hash); -- For direct LINK_TOKEN lookup
29
+
30
+ -- Add trigger for updated_at
31
+ DROP TRIGGER IF EXISTS update__email_otps_updated_at ON _email_otps;
32
+ CREATE TRIGGER update__email_otps_updated_at
33
+ BEFORE UPDATE ON _email_otps
34
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
35
+
36
+ -- 2. Create email authentication configuration table (single-row design)
37
+ -- This table stores global email authentication settings for the project
38
+ CREATE TABLE IF NOT EXISTS _auth_configs (
39
+ id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
40
+ require_email_verification BOOLEAN DEFAULT FALSE NOT NULL,
41
+ password_min_length INTEGER DEFAULT 6 NOT NULL CHECK (password_min_length >= 4 AND password_min_length <= 128),
42
+ require_number BOOLEAN DEFAULT FALSE NOT NULL,
43
+ require_lowercase BOOLEAN DEFAULT FALSE NOT NULL,
44
+ require_uppercase BOOLEAN DEFAULT FALSE NOT NULL,
45
+ require_special_char BOOLEAN DEFAULT FALSE NOT NULL,
46
+ verify_email_redirect_to TEXT, -- Custom URL to redirect after successful email verification (defaults to no redirect if NULL)
47
+ reset_password_redirect_to TEXT, -- Custom URL to redirect after successful password reset (defaults to no redirect if NULL)
48
+ created_at TIMESTAMPTZ DEFAULT NOW(),
49
+ updated_at TIMESTAMPTZ DEFAULT NOW()
50
+ );
51
+
52
+ -- Ensure only one row exists (singleton pattern)
53
+ -- This constraint prevents multiple configuration rows
54
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_auth_configs_singleton ON _auth_configs ((1));
55
+
56
+ -- Add trigger for updated_at
57
+ DROP TRIGGER IF EXISTS update__auth_configs_updated_at ON _auth_configs;
58
+ CREATE TRIGGER update__auth_configs_updated_at
59
+ BEFORE UPDATE ON _auth_configs
60
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
@@ -0,0 +1,24 @@
1
+ -- Migration 016: Update _email_otps and _auth_configs tables
2
+ --
3
+ -- Changes:
4
+ -- 1. _email_otps table:
5
+ -- - Remove attempts_count column (brute force protection moved to API rate limiter)
6
+ -- 2. _auth_configs table:
7
+ -- - Remove verify_email_redirect_to and reset_password_redirect_to columns
8
+ -- - Add verify_email_method and reset_password_method columns (code or link)
9
+ -- - Add sign_in_redirect_to column
10
+
11
+ -- Update _email_otps: Remove attempts_count column
12
+ ALTER TABLE _email_otps DROP COLUMN IF EXISTS attempts_count;
13
+
14
+ -- Update _auth_configs: Remove old redirect columns
15
+ ALTER TABLE _auth_configs
16
+ DROP COLUMN IF EXISTS verify_email_redirect_to,
17
+ DROP COLUMN IF EXISTS reset_password_redirect_to;
18
+
19
+ -- Add new columns to _auth_configs
20
+ -- Note: DEFAULT 'code' NOT NULL ensures existing rows automatically get 'code' value
21
+ ALTER TABLE _auth_configs
22
+ ADD COLUMN IF NOT EXISTS verify_email_method TEXT DEFAULT 'code' NOT NULL CHECK (verify_email_method IN ('code', 'link')),
23
+ ADD COLUMN IF NOT EXISTS reset_password_method TEXT DEFAULT 'code' NOT NULL CHECK (reset_password_method IN ('code', 'link')),
24
+ ADD COLUMN IF NOT EXISTS sign_in_redirect_to TEXT;