insforge 0.3.1

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 (395) hide show
  1. package/.dockerignore +58 -0
  2. package/.env.example +49 -0
  3. package/.github/ISSUE_TEMPLATE/bug_report.yml +83 -0
  4. package/.github/ISSUE_TEMPLATE/config.yml +11 -0
  5. package/.github/ISSUE_TEMPLATE/feature_request.yml +79 -0
  6. package/.github/copilot-instructions.md +147 -0
  7. package/.github/workflows/build-image.yml +65 -0
  8. package/.github/workflows/ci-premerge-check.yml +24 -0
  9. package/.github/workflows/deploy-aws.yml +130 -0
  10. package/.github/workflows/lint-and-format.yml +33 -0
  11. package/.prettierignore +65 -0
  12. package/.prettierrc +9 -0
  13. package/CHANGELOG.md +3 -0
  14. package/CONTRIBUTING.md +126 -0
  15. package/Dockerfile +27 -0
  16. package/GITHUB_OAUTH_SETUP.md +49 -0
  17. package/GOOGLE_OAUTH_SETUP.md +148 -0
  18. package/LICENSE +201 -0
  19. package/README.md +134 -0
  20. package/assets/Dark.svg +23 -0
  21. package/assets/archDiagram.png +0 -0
  22. package/assets/banner.png +0 -0
  23. package/assets/mcpInstallv2.png +0 -0
  24. package/assets/sampleResponse.png +0 -0
  25. package/assets/signin.png +0 -0
  26. package/assets/userflow.png +0 -0
  27. package/backend/migrations/000_create-base-tables.sql +142 -0
  28. package/backend/migrations/001_create-helper-functions.sql +41 -0
  29. package/backend/migrations/002_rename-auth-tables.sql +30 -0
  30. package/backend/migrations/003_create-users-table.sql +56 -0
  31. package/backend/migrations/004_add-reload-postgrest-func.sql +24 -0
  32. package/backend/migrations/005_enable-project-admin-modify-users.sql +30 -0
  33. package/backend/migrations/006_modify-ai-usage-table.sql +25 -0
  34. package/backend/migrations/007_drop-metadata-table.sql +2 -0
  35. package/backend/migrations/008_add-system-tables.sql +77 -0
  36. package/backend/migrations/009_add-function-secrets.sql +24 -0
  37. package/backend/migrations/010_modify-ai-config-modalities.sql +93 -0
  38. package/backend/migrations/011_refactor-secrets-table.sql +15 -0
  39. package/backend/migrations/012_add-storage-uploaded-by.sql +8 -0
  40. package/backend/package.json +75 -0
  41. package/backend/src/api/middleware/auth.ts +240 -0
  42. package/backend/src/api/middleware/error.ts +231 -0
  43. package/backend/src/api/middleware/upload.ts +59 -0
  44. package/backend/src/api/routes/agent.ts +29 -0
  45. package/backend/src/api/routes/ai.ts +472 -0
  46. package/backend/src/api/routes/auth.oauth.ts +482 -0
  47. package/backend/src/api/routes/auth.ts +386 -0
  48. package/backend/src/api/routes/database.advance.ts +275 -0
  49. package/backend/src/api/routes/database.records.ts +246 -0
  50. package/backend/src/api/routes/database.tables.ts +161 -0
  51. package/backend/src/api/routes/docs.ts +66 -0
  52. package/backend/src/api/routes/functions.ts +183 -0
  53. package/backend/src/api/routes/logs.ts +150 -0
  54. package/backend/src/api/routes/metadata.ts +160 -0
  55. package/backend/src/api/routes/openapi.ts +82 -0
  56. package/backend/src/api/routes/secrets.ts +199 -0
  57. package/backend/src/api/routes/storage.ts +547 -0
  58. package/backend/src/api/routes/usage.ts +96 -0
  59. package/backend/src/core/ai/chat.ts +207 -0
  60. package/backend/src/core/ai/client.ts +242 -0
  61. package/backend/src/core/ai/config.ts +187 -0
  62. package/backend/src/core/ai/image.ts +156 -0
  63. package/backend/src/core/ai/model.ts +117 -0
  64. package/backend/src/core/ai/usage.ts +290 -0
  65. package/backend/src/core/auth/auth.ts +781 -0
  66. package/backend/src/core/auth/oauth.ts +398 -0
  67. package/backend/src/core/database/advance.ts +1074 -0
  68. package/backend/src/core/database/manager.ts +178 -0
  69. package/backend/src/core/database/table.ts +772 -0
  70. package/backend/src/core/documentation/agent.ts +689 -0
  71. package/backend/src/core/documentation/openapi.ts +856 -0
  72. package/backend/src/core/functions/functions.ts +310 -0
  73. package/backend/src/core/logs/analytics.ts +76 -0
  74. package/backend/src/core/logs/audit.ts +255 -0
  75. package/backend/src/core/logs/providers/base.provider.ts +83 -0
  76. package/backend/src/core/logs/providers/cloudwatch.provider.ts +510 -0
  77. package/backend/src/core/logs/providers/localdb.provider.ts +246 -0
  78. package/backend/src/core/secrets/encryption.ts +58 -0
  79. package/backend/src/core/secrets/secrets.ts +410 -0
  80. package/backend/src/core/socket/socket.ts +388 -0
  81. package/backend/src/core/socket/types.ts +79 -0
  82. package/backend/src/core/storage/storage.ts +923 -0
  83. package/backend/src/server.ts +288 -0
  84. package/backend/src/types/ai.ts +46 -0
  85. package/backend/src/types/auth.ts +90 -0
  86. package/backend/src/types/database.ts +136 -0
  87. package/backend/src/types/error-constants.ts +86 -0
  88. package/backend/src/types/logs.ts +47 -0
  89. package/backend/src/types/profile.ts +55 -0
  90. package/backend/src/types/storage.ts +23 -0
  91. package/backend/src/utils/cloud-token.ts +39 -0
  92. package/backend/src/utils/constants.ts +1 -0
  93. package/backend/src/utils/environment.ts +35 -0
  94. package/backend/src/utils/helpers.ts +49 -0
  95. package/backend/src/utils/logger.ts +13 -0
  96. package/backend/src/utils/response.ts +62 -0
  97. package/backend/src/utils/seed.ts +205 -0
  98. package/backend/src/utils/sql-parser.ts +63 -0
  99. package/backend/src/utils/uuid.ts +9 -0
  100. package/backend/src/utils/validations.ts +129 -0
  101. package/backend/tests/README.md +134 -0
  102. package/backend/tests/cleanup-all-test-data.sh +231 -0
  103. package/backend/tests/cloud/test-s3-multitenant.sh +132 -0
  104. package/backend/tests/local/comprehensive-curl-tests.sh +156 -0
  105. package/backend/tests/local/test-auth-router.sh +144 -0
  106. package/backend/tests/local/test-database-router.sh +222 -0
  107. package/backend/tests/local/test-e2e.sh +241 -0
  108. package/backend/tests/local/test-fk-errors.sh +97 -0
  109. package/backend/tests/local/test-id-field.sh +201 -0
  110. package/backend/tests/local/test-public-bucket.sh +265 -0
  111. package/backend/tests/local/test-secrets.sh +248 -0
  112. package/backend/tests/local/test-serverless-functions.sh.disabled +325 -0
  113. package/backend/tests/local/test-traditional-rest.sh +209 -0
  114. package/backend/tests/manual/README.md +51 -0
  115. package/backend/tests/manual/create-large-table-simple.sql +11 -0
  116. package/backend/tests/manual/seed-large-table.sql +101 -0
  117. package/backend/tests/manual/setup-large-table-extras.sql +34 -0
  118. package/backend/tests/manual/test-better-auth.sh +303 -0
  119. package/backend/tests/manual/test-bulk-upsert.sh +410 -0
  120. package/backend/tests/manual/test-database-advance.sh +297 -0
  121. package/backend/tests/manual/test-postgrest-stability.sh +192 -0
  122. package/backend/tests/manual/test-rawsql-export-import.sh +412 -0
  123. package/backend/tests/manual/test-universal-storage.sh +264 -0
  124. package/backend/tests/manual/test-users.sql +18 -0
  125. package/backend/tests/run-all-tests.sh +140 -0
  126. package/backend/tests/setup.ts +22 -0
  127. package/backend/tests/test-config.sh +303 -0
  128. package/backend/tsconfig.json +23 -0
  129. package/backend/tsup.config.ts +18 -0
  130. package/backend/vitest.config.ts +22 -0
  131. package/docker-compose.prod.yml +145 -0
  132. package/docker-compose.yml +167 -0
  133. package/docker-init/db/db-init.sql +125 -0
  134. package/docker-init/db/jwt.sql +5 -0
  135. package/docker-init/db/logs.sql +9 -0
  136. package/docker-init/db/postgresql.conf +17 -0
  137. package/docs/deprecated/insforge-auth-api.md +215 -0
  138. package/docs/deprecated/insforge-auth-sdk.md +100 -0
  139. package/docs/deprecated/insforge-db-api.md +359 -0
  140. package/docs/deprecated/insforge-db-sdk.md +140 -0
  141. package/docs/deprecated/insforge-debug-sdk.md +157 -0
  142. package/docs/deprecated/insforge-debug.md +65 -0
  143. package/docs/deprecated/insforge-instructions.md +124 -0
  144. package/docs/deprecated/insforge-project.md +118 -0
  145. package/docs/deprecated/insforge-storage-api.md +279 -0
  146. package/docs/deprecated/insforge-storage-sdk.md +159 -0
  147. package/docs/insforge-instructions-sdk.md +407 -0
  148. package/eslint.config.js +317 -0
  149. package/examples/oauth/frontend-oauth-example.html +251 -0
  150. package/examples/response-examples.md +444 -0
  151. package/frontend/README.md +112 -0
  152. package/frontend/components.json +17 -0
  153. package/frontend/index.html +13 -0
  154. package/frontend/package.json +63 -0
  155. package/frontend/public/favicon.ico +0 -0
  156. package/frontend/src/App.tsx +106 -0
  157. package/frontend/src/assets/icons/checkbox_checked.svg +6 -0
  158. package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -0
  159. package/frontend/src/assets/icons/checked.svg +3 -0
  160. package/frontend/src/assets/icons/error.svg +3 -0
  161. package/frontend/src/assets/icons/pencil.svg +4 -0
  162. package/frontend/src/assets/icons/refresh.svg +4 -0
  163. package/frontend/src/assets/icons/step_active.svg +3 -0
  164. package/frontend/src/assets/icons/step_inactive.svg +11 -0
  165. package/frontend/src/assets/icons/warning.svg +3 -0
  166. package/frontend/src/assets/logos/amazon.svg +1 -0
  167. package/frontend/src/assets/logos/claude_code.svg +3 -0
  168. package/frontend/src/assets/logos/cline.svg +6 -0
  169. package/frontend/src/assets/logos/cursor.svg +20 -0
  170. package/frontend/src/assets/logos/discord.svg +9 -0
  171. package/frontend/src/assets/logos/gemini.svg +19 -0
  172. package/frontend/src/assets/logos/github.svg +5 -0
  173. package/frontend/src/assets/logos/google.svg +13 -0
  174. package/frontend/src/assets/logos/grok.svg +10 -0
  175. package/frontend/src/assets/logos/insforge_dark.svg +15 -0
  176. package/frontend/src/assets/logos/insforge_light.svg +15 -0
  177. package/frontend/src/assets/logos/openai.svg +10 -0
  178. package/frontend/src/assets/logos/roo_code.svg +9 -0
  179. package/frontend/src/assets/logos/trae.svg +3 -0
  180. package/frontend/src/assets/logos/windsurf.svg +10 -0
  181. package/frontend/src/components/ButtonWithLoading.tsx +27 -0
  182. package/frontend/src/components/Checkbox.tsx +61 -0
  183. package/frontend/src/components/CodeBlock.tsx +32 -0
  184. package/frontend/src/components/ConfirmDialog.tsx +96 -0
  185. package/frontend/src/components/CopyButton.tsx +69 -0
  186. package/frontend/src/components/DeleteActionButton.tsx +42 -0
  187. package/frontend/src/components/EmptyState.tsx +41 -0
  188. package/frontend/src/components/ErrorState.tsx +35 -0
  189. package/frontend/src/components/FeatureSidebar.tsx +126 -0
  190. package/frontend/src/components/FeatureSidebarItem.tsx +101 -0
  191. package/frontend/src/components/JsonHighlight.tsx +61 -0
  192. package/frontend/src/components/LoadingState.tsx +16 -0
  193. package/frontend/src/components/PaginationControls.tsx +54 -0
  194. package/frontend/src/components/PromptDialog.tsx +68 -0
  195. package/frontend/src/components/SearchInput.tsx +90 -0
  196. package/frontend/src/components/SelectionClearButton.tsx +26 -0
  197. package/frontend/src/components/Stepper.tsx +139 -0
  198. package/frontend/src/components/ThemeToggle.tsx +58 -0
  199. package/frontend/src/components/TypeBadge.tsx +20 -0
  200. package/frontend/src/components/datagrid/DataGrid.tsx +264 -0
  201. package/frontend/src/components/datagrid/DefaultCellRenderer.tsx +114 -0
  202. package/frontend/src/components/datagrid/IdCell.tsx +44 -0
  203. package/frontend/src/components/datagrid/SortableHeader.tsx +74 -0
  204. package/frontend/src/components/datagrid/cell-editors/BooleanCellEditor.tsx +54 -0
  205. package/frontend/src/components/datagrid/cell-editors/DateCellEditor.tsx +483 -0
  206. package/frontend/src/components/datagrid/cell-editors/JsonCellEditor.tsx +362 -0
  207. package/frontend/src/components/datagrid/cell-editors/TextCellEditor.tsx +38 -0
  208. package/frontend/src/components/datagrid/cell-editors/index.ts +14 -0
  209. package/frontend/src/components/datagrid/cell-editors/types.ts +43 -0
  210. package/frontend/src/components/datagrid/datagridTypes.tsx +72 -0
  211. package/frontend/src/components/datagrid/index.tsx +20 -0
  212. package/frontend/src/components/index.ts +39 -0
  213. package/frontend/src/components/layout/AppHeader.tsx +146 -0
  214. package/frontend/src/components/layout/AppSidebar.tsx +190 -0
  215. package/frontend/src/components/layout/CloudLayout.tsx +95 -0
  216. package/frontend/src/components/layout/Layout.tsx +43 -0
  217. package/frontend/src/components/radix/Alert.tsx +45 -0
  218. package/frontend/src/components/radix/AlertDialog.tsx +115 -0
  219. package/frontend/src/components/radix/Avatar.tsx +45 -0
  220. package/frontend/src/components/radix/Badge.tsx +33 -0
  221. package/frontend/src/components/radix/Button.tsx +50 -0
  222. package/frontend/src/components/radix/Card.tsx +58 -0
  223. package/frontend/src/components/radix/Dialog.tsx +98 -0
  224. package/frontend/src/components/radix/DropdownMenu.tsx +185 -0
  225. package/frontend/src/components/radix/Form.tsx +167 -0
  226. package/frontend/src/components/radix/Input.tsx +22 -0
  227. package/frontend/src/components/radix/Label.tsx +19 -0
  228. package/frontend/src/components/radix/Popover.tsx +29 -0
  229. package/frontend/src/components/radix/ScrollArea.tsx +44 -0
  230. package/frontend/src/components/radix/Select.tsx +151 -0
  231. package/frontend/src/components/radix/Separator.tsx +26 -0
  232. package/frontend/src/components/radix/Sheet.tsx +119 -0
  233. package/frontend/src/components/radix/Skeleton.tsx +7 -0
  234. package/frontend/src/components/radix/Switch.tsx +29 -0
  235. package/frontend/src/components/radix/Tabs.tsx +50 -0
  236. package/frontend/src/components/radix/Textarea.tsx +21 -0
  237. package/frontend/src/components/radix/Tooltip.tsx +28 -0
  238. package/frontend/src/features/ai/components/AIConfigCard.tsx +154 -0
  239. package/frontend/src/features/ai/components/AIConfigDialog.tsx +76 -0
  240. package/frontend/src/features/ai/components/AIConfigForm.tsx +222 -0
  241. package/frontend/src/features/ai/components/AIEmptyState.tsx +18 -0
  242. package/frontend/src/features/ai/components/fields/ModalityField.tsx +87 -0
  243. package/frontend/src/features/ai/components/fields/ModelSelectionField.tsx +134 -0
  244. package/frontend/src/features/ai/components/fields/SystemPromptField.tsx +33 -0
  245. package/frontend/src/features/ai/helpers.ts +155 -0
  246. package/frontend/src/features/ai/hooks/useAIConfigs.ts +221 -0
  247. package/frontend/src/features/ai/hooks/useAIUsage.ts +77 -0
  248. package/frontend/src/features/ai/page/AIPage.tsx +178 -0
  249. package/frontend/src/features/ai/services/ai.service.ts +148 -0
  250. package/frontend/src/features/auth/components/AddOAuthDialog.tsx +106 -0
  251. package/frontend/src/features/auth/components/AuthMethodTab.tsx +238 -0
  252. package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +303 -0
  253. package/frontend/src/features/auth/components/OAuthEmptyState.tsx +15 -0
  254. package/frontend/src/features/auth/components/UserFormDialog.tsx +248 -0
  255. package/frontend/src/features/auth/components/UsersDataGrid.tsx +183 -0
  256. package/frontend/src/features/auth/components/UsersTab.tsx +114 -0
  257. package/frontend/src/features/auth/hooks/useOAuthConfig.ts +129 -0
  258. package/frontend/src/features/auth/hooks/useUsers.ts +57 -0
  259. package/frontend/src/features/auth/index.ts +9 -0
  260. package/frontend/src/features/auth/page/AuthenticationPage.tsx +169 -0
  261. package/frontend/src/features/auth/services/auth.service.ts +112 -0
  262. package/frontend/src/features/auth/services/oauth.service.ts +49 -0
  263. package/frontend/src/features/dashboard/page/DashboardPage.tsx +194 -0
  264. package/frontend/src/features/database/components/ColumnTypeSelect.tsx +64 -0
  265. package/frontend/src/features/database/components/DatabaseDataGrid.tsx +282 -0
  266. package/frontend/src/features/database/components/ForeignKeyCell.tsx +187 -0
  267. package/frontend/src/features/database/components/ForeignKeyPopover.tsx +378 -0
  268. package/frontend/src/features/database/components/LinkRecordModal.tsx +288 -0
  269. package/frontend/src/features/database/components/RecordFormDialog.tsx +164 -0
  270. package/frontend/src/features/database/components/RecordFormField.tsx +568 -0
  271. package/frontend/src/features/database/components/TableEmptyState.tsx +21 -0
  272. package/frontend/src/features/database/components/TableForm.tsx +656 -0
  273. package/frontend/src/features/database/components/TableFormColumn.tsx +137 -0
  274. package/frontend/src/features/database/components/TableListSkeleton.tsx +9 -0
  275. package/frontend/src/features/database/components/TableSidebar.tsx +47 -0
  276. package/frontend/src/features/database/constants.ts +26 -0
  277. package/frontend/src/features/database/helpers.ts +125 -0
  278. package/frontend/src/features/database/hooks/UseLinkModal.tsx +78 -0
  279. package/frontend/src/features/database/index.ts +12 -0
  280. package/frontend/src/features/database/page/DatabasePage.tsx +626 -0
  281. package/frontend/src/features/database/schema.ts +25 -0
  282. package/frontend/src/features/database/services/database.service.ts +216 -0
  283. package/frontend/src/features/functions/components/FunctionEmptyState.tsx +15 -0
  284. package/frontend/src/features/functions/components/FunctionRow.tsx +71 -0
  285. package/frontend/src/features/functions/components/FunctionViewer.tsx +46 -0
  286. package/frontend/src/features/functions/components/FunctionsContent.tsx +88 -0
  287. package/frontend/src/features/functions/components/FunctionsSidebar.tsx +56 -0
  288. package/frontend/src/features/functions/components/SecretEmptyState.tsx +23 -0
  289. package/frontend/src/features/functions/components/SecretRow.tsx +68 -0
  290. package/frontend/src/features/functions/components/SecretsContent.tsx +120 -0
  291. package/frontend/src/features/functions/hooks/useFunctions.ts +106 -0
  292. package/frontend/src/features/functions/page/FunctionsPage.tsx +28 -0
  293. package/frontend/src/features/functions/services/functions.service.ts +48 -0
  294. package/frontend/src/features/login/components/AuthErrorBoundary.tsx +87 -0
  295. package/frontend/src/features/login/components/PrivateRoute.tsx +24 -0
  296. package/frontend/src/features/login/page/CloudLoginPage.tsx +93 -0
  297. package/frontend/src/features/login/page/LoginPage.tsx +174 -0
  298. package/frontend/src/features/logs/components/AnalyticsLogsTable.tsx +313 -0
  299. package/frontend/src/features/logs/components/LogsTable.tsx +199 -0
  300. package/frontend/src/features/logs/hooks/useAuditLogs.ts +39 -0
  301. package/frontend/src/features/logs/index.ts +5 -0
  302. package/frontend/src/features/logs/page/AnalyticsLogsPage.tsx +530 -0
  303. package/frontend/src/features/logs/page/AuditsPage.tsx +192 -0
  304. package/frontend/src/features/logs/services/log.service.ts +171 -0
  305. package/frontend/src/features/metadata/hooks/useMetadata.ts +53 -0
  306. package/frontend/src/features/metadata/index.ts +0 -0
  307. package/frontend/src/features/metadata/page/MetadataPage.tsx +136 -0
  308. package/frontend/src/features/metadata/services/metadata.service.ts +17 -0
  309. package/frontend/src/features/onboard/components/CompletionCard.tsx +41 -0
  310. package/frontend/src/features/onboard/components/OnboardButton.tsx +84 -0
  311. package/frontend/src/features/onboard/components/StepContent.tsx +91 -0
  312. package/frontend/src/features/onboard/components/TestConnectionStep.tsx +53 -0
  313. package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +35 -0
  314. package/frontend/src/features/onboard/components/mcp/McpInstallation.tsx +144 -0
  315. package/frontend/src/features/onboard/components/mcp/index.ts +4 -0
  316. package/frontend/src/features/onboard/components/mcp/mcp-helper.tsx +98 -0
  317. package/frontend/src/features/onboard/index.ts +3 -0
  318. package/frontend/src/features/onboard/page/OnBoardPage.tsx +104 -0
  319. package/frontend/src/features/onboard/types.ts +8 -0
  320. package/frontend/src/features/secrets/hooks/useSecrets.ts +139 -0
  321. package/frontend/src/features/secrets/services/secrets.service.ts +57 -0
  322. package/frontend/src/features/storage/components/BucketEmptyState.tsx +19 -0
  323. package/frontend/src/features/storage/components/BucketFormDialog.tsx +194 -0
  324. package/frontend/src/features/storage/components/BucketListSkeleton.tsx +17 -0
  325. package/frontend/src/features/storage/components/FilePreviewDialog.tsx +287 -0
  326. package/frontend/src/features/storage/components/StorageDataGrid.tsx +239 -0
  327. package/frontend/src/features/storage/components/StorageManager.tsx +236 -0
  328. package/frontend/src/features/storage/components/StorageSidebar.tsx +44 -0
  329. package/frontend/src/features/storage/components/UploadToast.tsx +46 -0
  330. package/frontend/src/features/storage/index.ts +3 -0
  331. package/frontend/src/features/storage/page/StoragePage.tsx +553 -0
  332. package/frontend/src/features/storage/services/storage.service.ts +144 -0
  333. package/frontend/src/features/visualizer/components/AuthNode.tsx +107 -0
  334. package/frontend/src/features/visualizer/components/BucketNode.tsx +34 -0
  335. package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +359 -0
  336. package/frontend/src/features/visualizer/components/TableNode.tsx +152 -0
  337. package/frontend/src/features/visualizer/components/VisualizerSkeleton.tsx +24 -0
  338. package/frontend/src/features/visualizer/components/index.ts +5 -0
  339. package/frontend/src/features/visualizer/page/VisualizerPage.tsx +127 -0
  340. package/frontend/src/index.css +248 -0
  341. package/frontend/src/lib/api/client.ts +163 -0
  342. package/frontend/src/lib/contexts/AuthContext.tsx +157 -0
  343. package/frontend/src/lib/contexts/OnboardStepContext.tsx +68 -0
  344. package/frontend/src/lib/contexts/SocketContext.tsx +303 -0
  345. package/frontend/src/lib/contexts/ThemeContext.tsx +125 -0
  346. package/frontend/src/lib/hooks/useAuth.ts +4 -0
  347. package/frontend/src/lib/hooks/useConfirm.ts +55 -0
  348. package/frontend/src/lib/hooks/useInterval.ts +27 -0
  349. package/frontend/src/lib/hooks/useMediaQuery.ts +59 -0
  350. package/frontend/src/lib/hooks/useOnboardingCompletion.ts +29 -0
  351. package/frontend/src/lib/hooks/usePagination.ts +27 -0
  352. package/frontend/src/lib/hooks/useTimeout.ts +27 -0
  353. package/frontend/src/lib/hooks/useToast.tsx +229 -0
  354. package/frontend/src/lib/utils/constants.ts +38 -0
  355. package/frontend/src/lib/utils/utils.ts +165 -0
  356. package/frontend/src/lib/utils/validation-schemas.ts +126 -0
  357. package/frontend/src/main.tsx +16 -0
  358. package/frontend/src/rdg.css +194 -0
  359. package/frontend/src/vite-env.d.ts +12 -0
  360. package/frontend/tailwind.config.js +97 -0
  361. package/frontend/tsconfig.json +26 -0
  362. package/frontend/tsconfig.node.json +10 -0
  363. package/frontend/vite.config.ts +37 -0
  364. package/frontend/vitest.config.ts +36 -0
  365. package/functions/deno.json +25 -0
  366. package/functions/server.ts +290 -0
  367. package/functions/worker-template.js +126 -0
  368. package/openapi/ai.yaml +689 -0
  369. package/openapi/auth.yaml +563 -0
  370. package/openapi/functions.yaml +476 -0
  371. package/openapi/health.yaml +30 -0
  372. package/openapi/logs.yaml +224 -0
  373. package/openapi/metadata.yaml +178 -0
  374. package/openapi/records.yaml +382 -0
  375. package/openapi/secrets.yaml +371 -0
  376. package/openapi/storage.yaml +876 -0
  377. package/openapi/tables.yaml +464 -0
  378. package/package.json +88 -0
  379. package/shared-schemas/package.json +31 -0
  380. package/shared-schemas/src/ai-api.schema.ts +167 -0
  381. package/shared-schemas/src/ai.schema.ts +54 -0
  382. package/shared-schemas/src/auth-api.schema.ts +193 -0
  383. package/shared-schemas/src/auth.schema.ts +94 -0
  384. package/shared-schemas/src/database-api.schema.ts +259 -0
  385. package/shared-schemas/src/database.schema.ts +69 -0
  386. package/shared-schemas/src/functions-api.schema.ts +25 -0
  387. package/shared-schemas/src/functions.schema.ts +16 -0
  388. package/shared-schemas/src/index.ts +13 -0
  389. package/shared-schemas/src/logs-api.schema.ts +49 -0
  390. package/shared-schemas/src/logs.schema.ts +14 -0
  391. package/shared-schemas/src/metadata.schema.ts +56 -0
  392. package/shared-schemas/src/storage-api.schema.ts +65 -0
  393. package/shared-schemas/src/storage.schema.ts +19 -0
  394. package/shared-schemas/tsconfig.json +21 -0
  395. package/tsconfig.json +8 -0
@@ -0,0 +1,134 @@
1
+ # Insforge Backend Tests
2
+
3
+ This directory contains all test scripts for the Insforge backend.
4
+
5
+ ## Prerequisites
6
+
7
+ - Backend server running on `http://localhost:7130`
8
+ - Admin credentials: `admin@example.com` / `change-this-password`
9
+ - API key for storage operations
10
+
11
+ ## Environment Variables
12
+
13
+ Set these before running tests:
14
+
15
+ ```bash
16
+ # Required for API authentication
17
+ export ACCESS_API_KEY="your_api_key_here"
18
+
19
+ # Optional - defaults shown
20
+ export ADMIN_EMAIL="admin@example.com"
21
+ export ADMIN_PASSWORD="change-this-password"
22
+ export TEST_API_BASE="http://localhost:7130/api"
23
+
24
+ # Required for cloud/S3 tests
25
+ export AWS_S3_BUCKET="your-s3-bucket"
26
+ export AWS_REGION="us-east-1"
27
+ export AWS_ACCESS_KEY_ID="your-access-key"
28
+ export AWS_SECRET_ACCESS_KEY="your-secret-key"
29
+ export APP_KEY="app12345" # 7-9 character tenant identifier
30
+ ```
31
+
32
+ ## Test Organization
33
+
34
+ Tests are organized into two categories:
35
+
36
+ ### Local Tests (`./local/`)
37
+ Tests for local Docker deployment with local file storage:
38
+ - `test-auth-router.sh` - Authentication and JWT tests
39
+ - `test-database-router.sh` - Database CRUD operations
40
+ - `test-e2e.sh` - End-to-end workflows
41
+ - `test-public-bucket.sh` - Local storage bucket tests
42
+ - `test-config.sh` - Configuration management
43
+ - `test-oauth-config.sh` - OAuth configuration
44
+ - `comprehensive-curl-tests.sh` - Comprehensive API tests
45
+
46
+ ### Cloud Tests (`./cloud/`)
47
+ Tests for cloud deployment with S3 multi-tenant storage:
48
+ - `test-s3-multitenant.sh` - S3 storage with APP_KEY folder structure
49
+
50
+ ## Running Tests
51
+
52
+ ### Run all tests
53
+ ```bash
54
+ ./run-all-tests.sh
55
+ ```
56
+
57
+ ### Run local tests only
58
+ ```bash
59
+ cd local && for test in test-*.sh; do ./$test; done
60
+ ```
61
+
62
+ ### Run cloud tests only
63
+ ```bash
64
+ cd cloud && for test in test-*.sh; do ./$test; done
65
+ ```
66
+
67
+ ### Run individual test
68
+ ```bash
69
+ ./local/test-auth-router.sh
70
+ ./cloud/test-s3-multitenant.sh
71
+ ```
72
+
73
+ ## Test Data Cleanup
74
+
75
+ All tests automatically clean up after themselves by:
76
+ - Deleting test users (email prefix: `testuser_`)
77
+ - Removing test tables
78
+ - Deleting test storage buckets
79
+
80
+ ### Manual cleanup
81
+
82
+ To remove ALL test data from the system:
83
+
84
+ ```bash
85
+ ./cleanup-all-test-data.sh
86
+ ```
87
+
88
+ This will prompt for confirmation and then delete:
89
+ - All users with email prefix `testuser_`
90
+ - All tables containing `test_`, `temp_`, `_test`, `_temp`
91
+ - All buckets containing `test`, `temp`, `public-images-`, `private-docs-`
92
+ - All API keys with "test" in their name
93
+
94
+ ## Test Configuration
95
+
96
+ All tests source `test-config.sh` which provides:
97
+ - Shared configuration and environment variables
98
+ - Color output utilities
99
+ - Automatic cleanup functions
100
+ - Error tracking
101
+
102
+ ## Writing New Tests
103
+
104
+ 1. Create a new shell script in the appropriate subdirectory (`local/` or `cloud/`)
105
+ 2. Source the test configuration:
106
+ ```bash
107
+ source "$SCRIPT_DIR/test-config.sh"
108
+ ```
109
+ 3. Register resources for cleanup:
110
+ ```bash
111
+ register_test_user "$email"
112
+ register_test_table "$table_name"
113
+ register_test_bucket "$bucket_name"
114
+ ```
115
+ 4. Use utility functions:
116
+ ```bash
117
+ print_success "Test passed"
118
+ print_fail "Test failed"
119
+ print_info "Running test..."
120
+ ```
121
+ 5. Tests will automatically clean up on exit
122
+
123
+ ## Authentication
124
+
125
+ - **Auth endpoints** (users, profiles): Use JWT tokens via `Authorization: Bearer $token`
126
+ - **Database endpoints**: Use JWT tokens via `Authorization: Bearer $token`
127
+ - **Storage endpoints**: Use API keys via `x-api-key: $api_key`
128
+
129
+ ## Exit Codes
130
+
131
+ - `0`: All tests passed
132
+ - `1`: One or more tests failed
133
+
134
+ Tests track failures and return appropriate exit codes for CI/CD integration.
@@ -0,0 +1,231 @@
1
+ #!/bin/bash
2
+
3
+ # Comprehensive cleanup script for all test data
4
+ # This script removes ALL test data from the system including:
5
+ # - Test users (with email prefix "testuser_")
6
+ # - Test tables
7
+ # - Test buckets
8
+ # - Test API keys
9
+
10
+ # Get the directory where this script is located
11
+ SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
12
+
13
+ # Source the test configuration for utilities
14
+ source "$SCRIPT_DIR/test-config.sh"
15
+
16
+ echo "=================================================="
17
+ echo "๐Ÿงน COMPREHENSIVE TEST DATA CLEANUP"
18
+ echo "=================================================="
19
+ echo ""
20
+ echo "โš ๏ธ WARNING: This will delete ALL test data!"
21
+ echo " - All users with email prefix: ${TEST_USER_EMAIL_PREFIX}"
22
+ echo " - All tables with test prefixes"
23
+ echo " - All test buckets"
24
+ echo ""
25
+ read -p "Are you sure you want to continue? (yes/no): " -n 3 -r
26
+ echo ""
27
+
28
+ if [[ ! $REPLY =~ ^[Yy][Ee][Ss]$ ]]; then
29
+ echo "Cleanup cancelled."
30
+ exit 0
31
+ fi
32
+
33
+ # Get admin credentials
34
+ admin_token=$(get_admin_token)
35
+ if [ -z "$admin_token" ]; then
36
+ print_fail "Could not authenticate as admin. Please check admin credentials."
37
+ exit 1
38
+ fi
39
+
40
+ print_success "Admin authentication successful"
41
+
42
+ # Get API key for storage operations
43
+ api_key=$(get_admin_api_key)
44
+ if [ -z "$api_key" ]; then
45
+ print_info "No API key available for storage operations"
46
+ fi
47
+
48
+ # 1. Clean up test users
49
+ print_info "๐Ÿง‘ Searching for test users..."
50
+ users_response=$(curl -s -X GET "$TEST_API_BASE/auth/users?limit=100" \
51
+ -H "Authorization: Bearer $admin_token" \
52
+ -H "Content-Type: application/json")
53
+
54
+ if echo "$users_response" | grep -q '\['; then
55
+ # Find all test users
56
+ test_user_ids=()
57
+ test_user_emails=()
58
+
59
+ # Parse users and find test users
60
+ while IFS= read -r line; do
61
+ if [[ $line =~ \"email\":\"($TEST_USER_EMAIL_PREFIX[^\"]+)\" ]]; then
62
+ email="${BASH_REMATCH[1]}"
63
+ # Get the ID for this user
64
+ id_line=$(echo "$users_response" | grep -B5 "\"email\":\"$email\"" | grep '"id"' | head -1)
65
+ if [[ $id_line =~ \"id\":\"([^\"]+)\" ]]; then
66
+ id="${BASH_REMATCH[1]}"
67
+ test_user_ids+=("$id")
68
+ test_user_emails+=("$email")
69
+ print_info " Found test user: $email (ID: $id)"
70
+ fi
71
+ fi
72
+ done <<< "$users_response"
73
+
74
+ if [ ${#test_user_ids[@]} -gt 0 ]; then
75
+ print_info "Found ${#test_user_ids[@]} test users to delete"
76
+
77
+ # Bulk delete test users
78
+ delete_response=$(curl -s -X DELETE "$TEST_API_BASE/auth/users/bulk-delete" \
79
+ -H "Authorization: Bearer $admin_token" \
80
+ -H "Content-Type: application/json" \
81
+ -d "{\"userIds\": [$(printf '"%s",' "${test_user_ids[@]}" | sed 's/,$//' )]}")
82
+
83
+ if ! echo "$delete_response" | grep -q '"error"'; then
84
+ print_success "โœ… Deleted ${#test_user_ids[@]} test users"
85
+ else
86
+ print_fail "Failed to delete test users"
87
+ echo "Response: $delete_response"
88
+ fi
89
+ else
90
+ print_info "No test users found"
91
+ fi
92
+ else
93
+ print_fail "Could not list users"
94
+ fi
95
+
96
+ # 2. Clean up test tables
97
+ print_info "๐Ÿ“‹ Searching for test tables..."
98
+ tables_response=$(curl -s -X GET "$TEST_API_BASE/database/tables" \
99
+ -H "Authorization: Bearer $admin_token" \
100
+ -H "Content-Type: application/json")
101
+
102
+ if echo "$tables_response" | grep -q '\['; then
103
+ # Find test tables (common patterns)
104
+ test_tables=()
105
+ test_patterns=("test_" "temp_" "_test" "_temp")
106
+
107
+ while IFS= read -r line; do
108
+ if [[ $line =~ \"table_name\":\"([^\"]+)\" ]]; then
109
+ table="${BASH_REMATCH[1]}"
110
+ # Check if table matches any test pattern
111
+ for pattern in "${test_patterns[@]}"; do
112
+ if [[ $table == *"$pattern"* ]]; then
113
+ test_tables+=("$table")
114
+ print_info " Found test table: $table"
115
+ break
116
+ fi
117
+ done
118
+ fi
119
+ done <<< "$tables_response"
120
+
121
+ if [ ${#test_tables[@]} -gt 0 ]; then
122
+ print_info "Found ${#test_tables[@]} test tables to delete"
123
+
124
+ for table in "${test_tables[@]}"; do
125
+ print_info " Deleting table: $table"
126
+ curl -s -X DELETE "$TEST_API_BASE/database/tables/$table" \
127
+ -H "Authorization: Bearer $admin_token" \
128
+ -H "Content-Type: application/json" > /dev/null 2>&1
129
+ done
130
+
131
+ print_success "โœ… Deleted ${#test_tables[@]} test tables"
132
+ else
133
+ print_info "No test tables found"
134
+ fi
135
+ else
136
+ print_fail "Could not list tables"
137
+ fi
138
+
139
+ # 3. Clean up test buckets
140
+ if [ -n "$api_key" ]; then
141
+ print_info "๐Ÿชฃ Searching for test buckets..."
142
+ buckets_response=$(curl -s -X GET "$TEST_API_BASE/storage/buckets" \
143
+ -H "x-api-key: $api_key" \
144
+ -H "Content-Type: application/json")
145
+
146
+ if echo "$buckets_response" | grep -q '\['; then
147
+ # Find test buckets
148
+ test_buckets=()
149
+ bucket_patterns=("test" "temp" "public-images-" "private-docs-")
150
+
151
+ while IFS= read -r line; do
152
+ if [[ $line =~ \"name\":\"([^\"]+)\" ]]; then
153
+ bucket="${BASH_REMATCH[1]}"
154
+ # Check if bucket matches any test pattern
155
+ for pattern in "${bucket_patterns[@]}"; do
156
+ if [[ $bucket == *"$pattern"* ]]; then
157
+ test_buckets+=("$bucket")
158
+ print_info " Found test bucket: $bucket"
159
+ break
160
+ fi
161
+ done
162
+ fi
163
+ done <<< "$buckets_response"
164
+
165
+ if [ ${#test_buckets[@]} -gt 0 ]; then
166
+ print_info "Found ${#test_buckets[@]} test buckets to delete"
167
+
168
+ for bucket in "${test_buckets[@]}"; do
169
+ print_info " Deleting bucket: $bucket"
170
+ delete_response=$(curl -s -w "\n%{http_code}" -X DELETE "$TEST_API_BASE/storage/$bucket" \
171
+ -H "x-api-key: $api_key")
172
+ status=$(echo "$delete_response" | tail -n 1)
173
+ if [ "$status" -ge 200 ] && [ "$status" -lt 300 ]; then
174
+ echo " โœ“ Deleted"
175
+ else
176
+ echo " โœ— Failed (status: $status)"
177
+ fi
178
+ done
179
+
180
+ print_success "โœ… Deleted ${#test_buckets[@]} test buckets"
181
+ else
182
+ print_info "No test buckets found"
183
+ fi
184
+ else
185
+ print_fail "Could not list buckets"
186
+ fi
187
+ else
188
+ print_info "Skipping bucket cleanup (no API key available)"
189
+ fi
190
+
191
+ # 4. Clean up test API keys
192
+ print_info "๐Ÿ”‘ Searching for test API keys..."
193
+ api_keys_response=$(curl -s -X GET "$TEST_API_BASE/auth/api-keys" \
194
+ -H "Authorization: Bearer $admin_token" \
195
+ -H "Content-Type: application/json")
196
+
197
+ if echo "$api_keys_response" | grep -q '\['; then
198
+ # Find test API keys
199
+ test_key_ids=()
200
+
201
+ while IFS= read -r line; do
202
+ if [[ $line =~ \"name\":\"([^\"]*[Tt]est[^\"]*)\".+\"id\":\"([^\"]+)\" ]]; then
203
+ name="${BASH_REMATCH[1]}"
204
+ id="${BASH_REMATCH[2]}"
205
+ test_key_ids+=("$id")
206
+ print_info " Found test API key: $name (ID: $id)"
207
+ fi
208
+ done <<< "$api_keys_response"
209
+
210
+ if [ ${#test_key_ids[@]} -gt 0 ]; then
211
+ print_info "Found ${#test_key_ids[@]} test API keys to delete"
212
+
213
+ for key_id in "${test_key_ids[@]}"; do
214
+ print_info " Deleting API key: $key_id"
215
+ curl -s -X DELETE "$TEST_API_BASE/auth/api-keys/$key_id" \
216
+ -H "Authorization: Bearer $admin_token" \
217
+ -H "Content-Type: application/json" > /dev/null 2>&1
218
+ done
219
+
220
+ print_success "โœ… Deleted ${#test_key_ids[@]} test API keys"
221
+ else
222
+ print_info "No test API keys found"
223
+ fi
224
+ else
225
+ print_fail "Could not list API keys"
226
+ fi
227
+
228
+ echo ""
229
+ echo "=================================================="
230
+ print_success "๐ŸŽ‰ Cleanup completed!"
231
+ echo "=================================================="
@@ -0,0 +1,132 @@
1
+ #!/bin/bash
2
+
3
+ # Test script for multi-tenant S3 storage
4
+ # This script tests the storage API with S3 backend and app key folder structure
5
+
6
+ # Get the directory where this script is located
7
+ SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
8
+ PROJECT_ROOT="$(dirname "$(dirname "$SCRIPT_DIR")")"
9
+
10
+ # Load .env file if AWS variables not already set
11
+ if [ -z "$AWS_S3_BUCKET" ] && [ -f "$PROJECT_ROOT/.env" ]; then
12
+ echo "Loading environment from .env file..."
13
+ set -a # automatically export all variables
14
+ source "$PROJECT_ROOT/.env"
15
+ set +a # turn off automatic export
16
+ fi
17
+
18
+ # Source test configuration
19
+ source "$SCRIPT_DIR/../test-config.sh"
20
+
21
+ API_KEY="${ACCESS_API_KEY:-}"
22
+ # Use TEST_API_BASE if set, otherwise default to localhost
23
+ if [ -n "$TEST_API_BASE" ]; then
24
+ # TEST_API_BASE already includes /api
25
+ BASE_URL="$TEST_API_BASE"
26
+ else
27
+ BASE_URL="http://localhost:7130/api"
28
+ fi
29
+
30
+ echo "=== Testing Multi-tenant S3 Storage ==="
31
+ echo "Note: Ensure AWS_S3_BUCKET and APP_KEY are set in your .env file"
32
+ echo "Base URL: $BASE_URL"
33
+ echo "API Key: ${API_KEY:0:10}..." # Show first 10 chars only
34
+ echo "AWS Bucket: ${AWS_S3_BUCKET:-not set}"
35
+ echo "App Key: ${APP_KEY:-not set}"
36
+ echo ""
37
+
38
+ # Create a test bucket
39
+ echo "1. Creating test bucket..."
40
+ curl -X POST "$BASE_URL/storage/buckets" \
41
+ -H "Content-Type: application/json" \
42
+ -H "x-api-key: $API_KEY" \
43
+ -d '{"bucketName": "test-bucket", "isPublic": true}' | jq .
44
+
45
+ echo ""
46
+
47
+ # List buckets
48
+ echo "2. Listing buckets..."
49
+ curl "$BASE_URL/storage/buckets" \
50
+ -H "x-api-key: $API_KEY" | jq .
51
+
52
+ echo ""
53
+
54
+ # Upload a file with specific key
55
+ echo "3. Uploading file with specific key..."
56
+ echo "Test content for S3" > test-file.txt
57
+ curl -X PUT "$BASE_URL/storage/test-bucket/test-file.txt" \
58
+ -H "x-api-key: $API_KEY" \
59
+ -F "file=@test-file.txt" | jq .
60
+
61
+ echo ""
62
+
63
+ # Upload a file with auto-generated key
64
+ echo "4. Uploading file with auto-generated key..."
65
+ curl -X POST "$BASE_URL/storage/test-bucket" \
66
+ -H "x-api-key: $API_KEY" \
67
+ -F "file=@test-file.txt" | jq .
68
+
69
+ echo ""
70
+
71
+ # List objects in bucket
72
+ echo "5. Listing objects in bucket..."
73
+ curl "$BASE_URL/storage/test-bucket" \
74
+ -H "x-api-key: $API_KEY" | jq .
75
+
76
+ echo ""
77
+
78
+ # Download a file (public bucket, no auth needed)
79
+ echo "6. Downloading file from public bucket..."
80
+ curl "$BASE_URL/storage/test-bucket/test-file.txt" \
81
+ -o downloaded-file.txt
82
+ echo "Downloaded content:"
83
+ cat downloaded-file.txt
84
+ echo ""
85
+
86
+ # Update bucket visibility to private
87
+ echo "7. Making bucket private..."
88
+ curl -X PATCH "$BASE_URL/storage/buckets/test-bucket" \
89
+ -H "Content-Type: application/json" \
90
+ -H "x-api-key: $API_KEY" \
91
+ -d '{"isPublic": false}' | jq .
92
+
93
+ echo ""
94
+
95
+ # Try downloading from private bucket without auth (should fail)
96
+ echo "8. Trying to download from private bucket without auth (should fail)..."
97
+ curl -v "$BASE_URL/api/storage/test-bucket/test-file.txt" 2>&1 | grep "< HTTP"
98
+
99
+ echo ""
100
+
101
+ # Download from private bucket with auth
102
+ echo "9. Downloading from private bucket with auth..."
103
+ curl "$BASE_URL/storage/test-bucket/test-file.txt" \
104
+ -H "x-api-key: $API_KEY" \
105
+ -o downloaded-private.txt
106
+ echo "Downloaded content:"
107
+ cat downloaded-private.txt
108
+ echo ""
109
+
110
+ # Delete a file
111
+ echo "10. Deleting a file..."
112
+ curl -X DELETE "$BASE_URL/storage/test-bucket/test-file.txt" \
113
+ -H "x-api-key: $API_KEY" | jq .
114
+
115
+ echo ""
116
+
117
+ # Delete the bucket
118
+ echo "11. Deleting the bucket..."
119
+ curl -X DELETE "$BASE_URL/storage/test-bucket" \
120
+ -H "x-api-key: $API_KEY" | jq .
121
+
122
+ echo ""
123
+
124
+ # Clean up
125
+ rm -f test-file.txt downloaded-file.txt downloaded-private.txt
126
+
127
+ echo "=== S3 Multi-tenant Storage Test Complete ==="
128
+ echo ""
129
+ echo "When AWS_S3_BUCKET is set, files are stored in S3 with structure:"
130
+ echo " s3://\${AWS_S3_BUCKET}/\${APP_KEY}/\${bucket}/\${key}"
131
+ echo ""
132
+ echo "Example: s3://my-bucket/app12345/test-bucket/test-file.txt"
@@ -0,0 +1,156 @@
1
+ #!/bin/bash
2
+
3
+ # Comprehensive curl tests for Traditional REST format
4
+ # Tests all major endpoints to verify response formats
5
+
6
+ BASE_URL="http://localhost:7130/api"
7
+ GREEN='\033[0;32m'
8
+ RED='\033[0;31m'
9
+ BLUE='\033[0;34m'
10
+ NC='\033[0m'
11
+
12
+ echo "๐Ÿงช Comprehensive Traditional REST Format Tests"
13
+ echo "============================================="
14
+
15
+ # 1. Health Check - Returns object directly
16
+ echo -e "\n${BLUE}1. Health Check (Object Response)${NC}"
17
+ echo "curl -s $BASE_URL/health"
18
+ curl -s "$BASE_URL/health" | jq '.'
19
+ echo -e "${GREEN}โœ“ Returns object directly (no wrapper)${NC}"
20
+
21
+ # 2. Authentication - Returns object with user and token
22
+ echo -e "\n${BLUE}2. Authentication Tests${NC}"
23
+ EMAIL="test-$(date +%s)@example.com"
24
+ echo "Creating test user: $EMAIL"
25
+
26
+ # Register
27
+ echo -e "\n${BLUE}2a. Register (Object Response)${NC}"
28
+ REGISTER_RESPONSE=$(curl -s -X POST "$BASE_URL/auth/users" \
29
+ -H "Content-Type: application/json" \
30
+ -d "{\"email\": \"$EMAIL\", \"password\": \"Test123!\", \"name\": \"Test User\"}")
31
+ echo "$REGISTER_RESPONSE" | jq '.'
32
+ TOKEN=$(echo "$REGISTER_RESPONSE" | jq -r '.accessToken')
33
+ echo -e "${GREEN}โœ“ Returns user object with token (no wrapper)${NC}"
34
+
35
+ # Login
36
+ echo -e "\n${BLUE}2b. Login (Object Response)${NC}"
37
+ curl -s -X POST "$BASE_URL/auth/sessions" \
38
+ -H "Content-Type: application/json" \
39
+ -d "{\"email\": \"$EMAIL\", \"password\": \"Test123!\"}" | jq '.'
40
+ echo -e "${GREEN}โœ“ Returns user object with token (no wrapper)${NC}"
41
+
42
+ # Get current user
43
+ echo -e "\n${BLUE}2c. Get Current User (Object Response)${NC}"
44
+ curl -s "$BASE_URL/auth/sessions/current" \
45
+ -H "Authorization: Bearer $TOKEN" | jq '.'
46
+ echo -e "${GREEN}โœ“ Returns user object directly${NC}"
47
+
48
+ # 3. Error Response
49
+ echo -e "\n${BLUE}3. Error Response Format${NC}"
50
+ echo "Testing with invalid credentials:"
51
+ curl -s -X POST "$BASE_URL/auth/sessions" \
52
+ -H "Content-Type: application/json" \
53
+ -d '{"email": "nonexistent@example.com", "password": "wrong"}' | jq '.'
54
+ echo -e "${GREEN}โœ“ Error format: {error, message, statusCode, nextActions}${NC}"
55
+
56
+ # 4. Database Tables - Returns array
57
+ echo -e "\n${BLUE}4. Database Tables (Array Response)${NC}"
58
+ curl -s "$BASE_URL/database/tables" \
59
+ -H "Authorization: Bearer $TOKEN" | jq '.'
60
+ echo -e "${GREEN}โœ“ Returns array directly${NC}"
61
+
62
+ # 5. Create a test table
63
+ echo -e "\n${BLUE}5. Create Table (Object Response)${NC}"
64
+ TABLE_NAME="test_products_$(date +%s)"
65
+ CREATE_TABLE_RESPONSE=$(curl -s -X POST "$BASE_URL/database/tables" \
66
+ -H "Authorization: Bearer $TOKEN" \
67
+ -H "Content-Type: application/json" \
68
+ -d "{
69
+ \"tableName\": \"$TABLE_NAME\",
70
+ \"columns\": [
71
+ {\"columnName\": \"name\", \"type\": \"string\", \"isNullable\": false, \"isUnique\": false},
72
+ {\"columnName\": \"price\", \"type\": \"float\", \"isNullable\": false, \"isUnique\": false}
73
+ ]
74
+ }")
75
+ echo "$CREATE_TABLE_RESPONSE" | jq '.'
76
+ echo -e "${GREEN}โœ“ Returns table info object directly${NC}"
77
+
78
+ # 6. Database Records - PostgREST returns array
79
+ echo -e "\n${BLUE}6. Database Records (PostgREST Array)${NC}"
80
+
81
+ # Insert a record
82
+ echo -e "\n${BLUE}6a. Insert Record${NC}"
83
+ curl -s -X POST "$BASE_URL/database/records/$TABLE_NAME" \
84
+ -H "Authorization: Bearer $TOKEN" \
85
+ -H "Content-Type: application/json" \
86
+ -d '[{"name": "Test Product", "price": 99.99}]' | jq '.'
87
+ echo -e "${GREEN}โœ“ PostgREST returns empty array for INSERT${NC}"
88
+
89
+ # Get records
90
+ echo -e "\n${BLUE}6b. Get Records (Array Response)${NC}"
91
+ curl -s "$BASE_URL/database/records/$TABLE_NAME" \
92
+ -H "Authorization: Bearer $TOKEN" | jq '.'
93
+ echo -e "${GREEN}โœ“ PostgREST returns array of records${NC}"
94
+
95
+ # 7. Storage endpoints
96
+ echo -e "\n${BLUE}7. Storage Endpoints${NC}"
97
+
98
+ # Get API key first
99
+ echo "Getting API key..."
100
+ API_KEY_RESPONSE=$(curl -s -X POST "$BASE_URL/config/apikey" \
101
+ -H "Authorization: Bearer $TOKEN" \
102
+ -H "Content-Type: application/json" \
103
+ -d '{"name": "test-key"}')
104
+ API_KEY=$(echo "$API_KEY_RESPONSE" | jq -r '.key' 2>/dev/null || echo "")
105
+
106
+ if [ -n "$API_KEY" ] && [ "$API_KEY" != "null" ]; then
107
+ # List buckets
108
+ echo -e "\n${BLUE}7a. List Buckets (Array Response)${NC}"
109
+ curl -s "$BASE_URL/storage/buckets" \
110
+ -H "Authorization: Bearer $API_KEY" | jq '.'
111
+ echo -e "${GREEN}โœ“ Returns array of buckets${NC}"
112
+ else
113
+ echo -e "${RED}โœ— Could not get API key for storage tests${NC}"
114
+ fi
115
+
116
+ # 8. Logs with pagination
117
+ echo -e "\n${BLUE}8. Logs with Pagination Headers${NC}"
118
+ echo "Request: curl -s -i \"$BASE_URL/logs?limit=5\""
119
+ LOGS_RESPONSE=$(curl -s -i "$BASE_URL/logs?limit=5" \
120
+ -H "Authorization: Bearer $TOKEN")
121
+ echo "$LOGS_RESPONSE" | head -20
122
+ echo -e "${GREEN}โœ“ Returns array with pagination in headers${NC}"
123
+
124
+ # 9. Documentation
125
+ echo -e "\n${BLUE}9. Documentation Endpoints${NC}"
126
+
127
+ # List docs
128
+ echo -e "\n${BLUE}9a. List Documentation (Array Response)${NC}"
129
+ curl -s "$BASE_URL/docs" | jq '.'
130
+ echo -e "${GREEN}โœ“ Returns array of available docs${NC}"
131
+
132
+ # Get specific doc
133
+ echo -e "\n${BLUE}9b. Get Specific Doc (Object Response)${NC}"
134
+ curl -s "$BASE_URL/docs/db-api" | jq '.type'
135
+ echo -e "${GREEN}โœ“ Returns doc object directly${NC}"
136
+
137
+ # 10. 404 Error
138
+ echo -e "\n${BLUE}10. 404 Not Found${NC}"
139
+ curl -s "$BASE_URL/nonexistent" | jq '.'
140
+ echo -e "${GREEN}โœ“ Traditional error format${NC}"
141
+
142
+ # Cleanup
143
+ echo -e "\n${BLUE}Cleanup${NC}"
144
+ if [ -n "$TOKEN" ]; then
145
+ # Delete test table
146
+ curl -s -X DELETE "$BASE_URL/database/tables/$TABLE_NAME" \
147
+ -H "Authorization: Bearer $TOKEN" > /dev/null
148
+ echo "โœ“ Deleted test table: $TABLE_NAME"
149
+ fi
150
+
151
+ echo -e "\n${GREEN}โœ… All tests completed!${NC}"
152
+ echo -e "\n${BLUE}Summary of Response Formats:${NC}"
153
+ echo "โ€ข Objects: health, auth, table info, specific doc"
154
+ echo "โ€ข Arrays: database tables, database records (PostgREST), storage buckets, docs list"
155
+ echo "โ€ข Errors: Consistent format with error, message, statusCode, nextActions"
156
+ echo "โ€ข Pagination: Via HTTP headers (X-Total-Count, X-Page, etc.)"