@budibase/server 1.0.47 → 1.0.49-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (379) hide show
  1. package/__mocks__/arangojs.ts +1 -1
  2. package/__mocks__/aws-sdk.ts +4 -4
  3. package/__mocks__/mongodb.ts +4 -5
  4. package/__mocks__/mssql.ts +3 -3
  5. package/__mocks__/node-fetch.ts +2 -1
  6. package/__mocks__/pg.ts +3 -5
  7. package/builder/assets/{index.937b2767.js → index.506eca43.js} +249 -246
  8. package/builder/assets/index.83c0944f.css +1 -0
  9. package/builder/assets/{vendor.f9faf6ab.js → vendor.d526bfe8.js} +12 -12
  10. package/builder/index.html +3 -3
  11. package/coverage/clover.xml +3069 -2773
  12. package/coverage/coverage-final.json +106 -101
  13. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/application.js.html +257 -152
  16. package/coverage/lcov-report/api/controllers/auth.js.html +22 -13
  17. package/coverage/lcov-report/api/controllers/automation.js.html +39 -69
  18. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/cloud.js.html +8 -11
  20. package/coverage/lcov-report/api/controllers/component.js.html +13 -16
  21. package/coverage/lcov-report/api/controllers/datasource.js.html +81 -51
  22. package/coverage/lcov-report/api/controllers/dev.js.html +6 -6
  23. package/coverage/lcov-report/api/controllers/index.html +76 -76
  24. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/layout.js.html +9 -9
  26. package/coverage/lcov-report/api/controllers/metadata.js.html +6 -21
  27. package/coverage/lcov-report/api/controllers/migrations.js.html +119 -0
  28. package/coverage/lcov-report/api/controllers/permission.js.html +19 -19
  29. package/coverage/lcov-report/api/controllers/query/index.html +10 -10
  30. package/coverage/lcov-report/api/controllers/query/index.js.html +38 -35
  31. package/coverage/lcov-report/api/controllers/query/validation.js.html +6 -6
  32. package/coverage/lcov-report/api/controllers/role.js.html +16 -16
  33. package/coverage/lcov-report/api/controllers/routing.js.html +7 -10
  34. package/coverage/lcov-report/api/controllers/row/external.js.html +48 -141
  35. package/coverage/lcov-report/api/controllers/row/index.html +55 -40
  36. package/coverage/lcov-report/api/controllers/row/index.js.html +26 -26
  37. package/coverage/lcov-report/api/controllers/row/internal.js.html +118 -226
  38. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +52 -34
  39. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +548 -0
  40. package/coverage/lcov-report/api/controllers/row/utils.js.html +47 -62
  41. package/coverage/lcov-report/api/controllers/screen.js.html +15 -21
  42. package/coverage/lcov-report/api/controllers/script.js.html +4 -4
  43. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +599 -0
  44. package/coverage/lcov-report/api/controllers/table/external.js.html +25 -34
  45. package/coverage/lcov-report/api/controllers/table/index.html +58 -43
  46. package/coverage/lcov-report/api/controllers/table/index.js.html +58 -82
  47. package/coverage/lcov-report/api/controllers/table/internal.js.html +81 -66
  48. package/coverage/lcov-report/api/controllers/table/utils.js.html +282 -111
  49. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  50. package/coverage/lcov-report/api/controllers/user.js.html +47 -50
  51. package/coverage/lcov-report/api/controllers/view/exporters.js.html +4 -4
  52. package/coverage/lcov-report/api/controllers/view/index.html +16 -16
  53. package/coverage/lcov-report/api/controllers/view/index.js.html +27 -33
  54. package/coverage/lcov-report/api/controllers/view/utils.js.html +35 -20
  55. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +7 -7
  56. package/coverage/lcov-report/api/controllers/webhook.js.html +34 -28
  57. package/coverage/lcov-report/api/index.html +1 -1
  58. package/coverage/lcov-report/api/index.js.html +8 -8
  59. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/index.html +18 -18
  71. package/coverage/lcov-report/api/routes/index.js.html +3 -3
  72. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/{hosting.js.html → migrations.js.html} +17 -14
  76. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  79. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  80. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  81. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  82. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  83. package/coverage/lcov-report/api/routes/static.js.html +17 -2
  84. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  85. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  86. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  87. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  88. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  89. package/coverage/lcov-report/automations/actions.js.html +24 -24
  90. package/coverage/lcov-report/automations/automationUtils.js.html +7 -10
  91. package/coverage/lcov-report/automations/bullboard.js.html +16 -16
  92. package/coverage/lcov-report/automations/index.html +18 -18
  93. package/coverage/lcov-report/automations/index.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/bash.js.html +6 -6
  95. package/coverage/lcov-report/automations/steps/createRow.js.html +13 -22
  96. package/coverage/lcov-report/automations/steps/delay.js.html +4 -4
  97. package/coverage/lcov-report/automations/steps/deleteRow.js.html +11 -20
  98. package/coverage/lcov-report/automations/steps/discord.js.html +7 -7
  99. package/coverage/lcov-report/automations/steps/executeQuery.js.html +6 -6
  100. package/coverage/lcov-report/automations/steps/executeScript.js.html +6 -6
  101. package/coverage/lcov-report/automations/steps/filter.js.html +7 -7
  102. package/coverage/lcov-report/automations/steps/index.html +13 -13
  103. package/coverage/lcov-report/automations/steps/integromat.js.html +5 -5
  104. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +8 -8
  105. package/coverage/lcov-report/automations/steps/queryRows.js.html +10 -10
  106. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +5 -5
  107. package/coverage/lcov-report/automations/steps/serverLog.js.html +3 -3
  108. package/coverage/lcov-report/automations/steps/slack.js.html +5 -5
  109. package/coverage/lcov-report/automations/steps/updateRow.js.html +7 -7
  110. package/coverage/lcov-report/automations/steps/utils.js.html +3 -3
  111. package/coverage/lcov-report/automations/steps/zapier.js.html +5 -5
  112. package/coverage/lcov-report/automations/triggerInfo/app.js.html +2 -2
  113. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +2 -2
  114. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  115. package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -8
  116. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +2 -2
  117. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +2 -2
  118. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +2 -2
  119. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +2 -2
  120. package/coverage/lcov-report/automations/triggers.js.html +61 -55
  121. package/coverage/lcov-report/automations/utils.js.html +54 -42
  122. package/coverage/lcov-report/constants/index.html +11 -11
  123. package/coverage/lcov-report/constants/index.js.html +68 -32
  124. package/coverage/lcov-report/constants/layouts.js.html +5 -5
  125. package/coverage/lcov-report/constants/screens.js.html +4 -4
  126. package/coverage/lcov-report/db/client.js.html +18 -18
  127. package/coverage/lcov-report/db/inMemoryView.js.html +7 -7
  128. package/coverage/lcov-report/db/index.html +15 -15
  129. package/coverage/lcov-report/db/index.js.html +3 -3
  130. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +25 -37
  131. package/coverage/lcov-report/db/linkedRows/index.html +27 -27
  132. package/coverage/lcov-report/db/linkedRows/index.js.html +51 -96
  133. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +42 -42
  134. package/coverage/lcov-report/db/newid.js.html +4 -4
  135. package/coverage/lcov-report/db/utils.js.html +87 -87
  136. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  137. package/coverage/lcov-report/events/index.html +1 -1
  138. package/coverage/lcov-report/events/index.js.html +5 -5
  139. package/coverage/lcov-report/events/utils.js.html +3 -3
  140. package/coverage/lcov-report/index.html +138 -123
  141. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  142. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  143. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  144. package/coverage/lcov-report/middleware/authorized.js.html +173 -65
  145. package/coverage/lcov-report/middleware/builder.js.html +10 -10
  146. package/coverage/lcov-report/middleware/currentapp.js.html +95 -83
  147. package/coverage/lcov-report/middleware/index.html +38 -38
  148. package/coverage/lcov-report/middleware/joi-validator.js.html +3 -3
  149. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  150. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  151. package/coverage/lcov-report/middleware/usageQuota.js.html +281 -53
  152. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  153. package/coverage/lcov-report/threads/automation.js.html +30 -24
  154. package/coverage/lcov-report/threads/index.html +26 -26
  155. package/coverage/lcov-report/threads/index.js.html +10 -10
  156. package/coverage/lcov-report/threads/query.js.html +36 -42
  157. package/coverage/lcov-report/threads/utils.js.html +14 -14
  158. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  159. package/coverage/lcov-report/utilities/budibaseDir.js.html +7 -7
  160. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  161. package/coverage/lcov-report/utilities/csvParser.js.html +6 -6
  162. package/coverage/lcov-report/utilities/global.js.html +58 -49
  163. package/coverage/lcov-report/utilities/index.html +37 -37
  164. package/coverage/lcov-report/utilities/index.js.html +43 -73
  165. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +8 -8
  166. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  167. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  168. package/coverage/lcov-report/utilities/routing/index.js.html +7 -7
  169. package/coverage/lcov-report/utilities/rowProcessor/index.html +27 -27
  170. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +97 -103
  171. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +75 -27
  172. package/coverage/lcov-report/utilities/scriptRunner.js.html +5 -5
  173. package/coverage/lcov-report/utilities/security.js.html +8 -8
  174. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  175. package/coverage/lcov-report/utilities/usageQuota/index.html +141 -0
  176. package/coverage/lcov-report/utilities/usageQuota/index.js.html +359 -0
  177. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +305 -0
  178. package/coverage/lcov-report/{api/controllers/hosting.js.html → utilities/usageQuota/usageQuoteReset.js.html} +36 -48
  179. package/coverage/lcov-report/utilities/users.js.html +9 -9
  180. package/coverage/lcov-report/utilities/workerRequests.js.html +43 -112
  181. package/coverage/lcov.info +4989 -4390
  182. package/dist/api/controllers/application.js +90 -60
  183. package/dist/api/controllers/auth.js +8 -5
  184. package/dist/api/controllers/automation.js +14 -19
  185. package/dist/api/controllers/cloud.js +2 -3
  186. package/dist/api/controllers/component.js +3 -4
  187. package/dist/api/controllers/datasource.js +20 -10
  188. package/dist/api/controllers/deploy/Deployment.js +3 -6
  189. package/dist/api/controllers/deploy/index.js +12 -13
  190. package/dist/api/controllers/dev.js +5 -5
  191. package/dist/api/controllers/layout.js +3 -3
  192. package/dist/api/controllers/metadata.js +4 -4
  193. package/dist/api/controllers/migrations.js +21 -0
  194. package/dist/api/controllers/permission.js +4 -4
  195. package/dist/api/controllers/query/import/index.js +4 -6
  196. package/dist/api/controllers/query/index.js +11 -10
  197. package/dist/api/controllers/role.js +5 -5
  198. package/dist/api/controllers/routing.js +5 -6
  199. package/dist/api/controllers/row/ExternalRequest.js +89 -65
  200. package/dist/api/controllers/row/external.js +14 -22
  201. package/dist/api/controllers/row/internal.js +55 -93
  202. package/dist/api/controllers/row/internalSearch.js +23 -17
  203. package/dist/api/controllers/row/staticFormula.js +147 -0
  204. package/dist/api/controllers/row/utils.js +13 -14
  205. package/dist/api/controllers/screen.js +5 -7
  206. package/dist/api/controllers/static/index.js +61 -12
  207. package/dist/api/controllers/table/bulkFormula.js +159 -0
  208. package/dist/api/controllers/table/external.js +7 -10
  209. package/dist/api/controllers/table/index.js +16 -13
  210. package/dist/api/controllers/table/internal.js +22 -16
  211. package/dist/api/controllers/table/utils.js +77 -37
  212. package/dist/api/controllers/user.js +18 -20
  213. package/dist/api/controllers/view/index.js +8 -10
  214. package/dist/api/controllers/view/utils.js +9 -4
  215. package/dist/api/controllers/webhook.js +10 -8
  216. package/dist/api/routes/index.js +2 -2
  217. package/dist/api/routes/migrations.js +9 -0
  218. package/dist/api/routes/static.js +2 -1
  219. package/dist/api/routes/tests/utilities/TestFunctions.js +37 -17
  220. package/dist/app.js +35 -5
  221. package/dist/automations/automationUtils.js +2 -3
  222. package/dist/automations/steps/createRow.js +3 -5
  223. package/dist/automations/steps/deleteRow.js +1 -4
  224. package/dist/automations/steps/updateRow.js +1 -1
  225. package/dist/automations/triggers.js +27 -25
  226. package/dist/automations/utils.js +10 -5
  227. package/dist/constants/index.js +12 -5
  228. package/dist/db/linkedRows/LinkController.js +3 -7
  229. package/dist/db/linkedRows/index.js +16 -27
  230. package/dist/db/linkedRows/linkUtils.js +6 -6
  231. package/dist/db/views/staticViews.js +9 -10
  232. package/dist/definitions/datasource.js +1 -0
  233. package/dist/environment.js +4 -1
  234. package/dist/integrations/base/sql.js +56 -14
  235. package/dist/integrations/googlesheets.js +340 -0
  236. package/dist/integrations/index.js +3 -0
  237. package/dist/integrations/utils.js +60 -8
  238. package/dist/middleware/authorized.js +57 -30
  239. package/dist/middleware/builder.js +2 -2
  240. package/dist/middleware/currentapp.js +41 -37
  241. package/dist/middleware/usageQuota.js +82 -15
  242. package/dist/migrations/functions/appUrls.js +46 -0
  243. package/dist/migrations/functions/quotas1.js +50 -0
  244. package/dist/migrations/functions/usageQuotas/index.js +20 -0
  245. package/dist/migrations/functions/usageQuotas/syncApps.js +29 -0
  246. package/dist/migrations/functions/usageQuotas/syncRows.js +33 -0
  247. package/dist/migrations/functions/userEmailViewCasing.js +24 -0
  248. package/dist/migrations/index.js +62 -0
  249. package/dist/package.json +8 -5
  250. package/dist/tests/utilities/TestConfiguration.js +80 -50
  251. package/dist/threads/automation.js +13 -11
  252. package/dist/threads/query.js +17 -19
  253. package/dist/tsconfig.tsbuildinfo +1 -1
  254. package/dist/utilities/fileSystem/index.js +4 -3
  255. package/dist/utilities/global.js +15 -12
  256. package/dist/utilities/index.js +7 -17
  257. package/dist/utilities/routing/index.js +5 -5
  258. package/dist/utilities/rowProcessor/index.js +23 -17
  259. package/dist/utilities/rowProcessor/utils.js +14 -4
  260. package/dist/utilities/{usageQuota.js → usageQuota/index.js} +45 -31
  261. package/dist/utilities/usageQuota/rows.js +78 -0
  262. package/dist/utilities/usageQuota/usageQuoteReset.js +16 -0
  263. package/dist/utilities/users.js +3 -3
  264. package/dist/utilities/workerRequests.js +4 -24
  265. package/nodemon.json +1 -1
  266. package/package.json +9 -6
  267. package/scripts/integrations/postgres/init.sql +11 -6
  268. package/scripts/likeCypress.ts +1 -1
  269. package/src/api/controllers/application.js +85 -50
  270. package/src/api/controllers/auth.js +8 -5
  271. package/src/api/controllers/automation.js +13 -23
  272. package/src/api/controllers/cloud.js +2 -3
  273. package/src/api/controllers/component.js +3 -4
  274. package/src/api/controllers/datasource.js +21 -11
  275. package/src/api/controllers/deploy/Deployment.js +3 -7
  276. package/src/api/controllers/deploy/index.js +20 -13
  277. package/src/api/controllers/dev.js +5 -5
  278. package/src/api/controllers/layout.js +3 -3
  279. package/src/api/controllers/metadata.js +4 -9
  280. package/src/api/controllers/migrations.js +13 -0
  281. package/src/api/controllers/permission.js +4 -4
  282. package/src/api/controllers/query/import/index.ts +4 -6
  283. package/src/api/controllers/query/import/tests/index.spec.js +2 -1
  284. package/src/api/controllers/query/index.js +11 -10
  285. package/src/api/controllers/role.js +5 -5
  286. package/src/api/controllers/routing.js +5 -6
  287. package/src/api/controllers/row/ExternalRequest.ts +66 -42
  288. package/src/api/controllers/row/external.js +27 -58
  289. package/src/api/controllers/row/internal.js +54 -90
  290. package/src/api/controllers/row/internalSearch.js +23 -17
  291. package/src/api/controllers/row/staticFormula.js +156 -0
  292. package/src/api/controllers/row/utils.js +13 -18
  293. package/src/api/controllers/screen.js +5 -7
  294. package/src/api/controllers/static/index.js +65 -12
  295. package/src/api/controllers/table/bulkFormula.js +173 -0
  296. package/src/api/controllers/table/external.js +7 -10
  297. package/src/api/controllers/table/index.js +20 -28
  298. package/src/api/controllers/table/internal.js +24 -19
  299. package/src/api/controllers/table/utils.js +101 -44
  300. package/src/api/controllers/user.js +19 -20
  301. package/src/api/controllers/view/index.js +8 -10
  302. package/src/api/controllers/view/utils.js +9 -4
  303. package/src/api/controllers/webhook.js +10 -8
  304. package/src/api/routes/index.js +2 -2
  305. package/src/api/routes/migrations.js +14 -0
  306. package/src/api/routes/static.js +5 -0
  307. package/src/api/routes/tests/application.spec.js +2 -2
  308. package/src/api/routes/tests/auth.spec.js +1 -2
  309. package/src/api/routes/tests/automation.spec.js +1 -0
  310. package/src/api/routes/tests/misc.spec.js +0 -1
  311. package/src/api/routes/tests/routing.spec.js +21 -12
  312. package/src/api/routes/tests/row.spec.js +7 -4
  313. package/src/api/routes/tests/static.spec.js +98 -0
  314. package/src/api/routes/tests/utilities/TestFunctions.js +39 -17
  315. package/src/app.ts +18 -5
  316. package/src/automations/automationUtils.js +2 -3
  317. package/src/automations/steps/createRow.js +2 -5
  318. package/src/automations/steps/deleteRow.js +1 -4
  319. package/src/automations/steps/updateRow.js +1 -1
  320. package/src/automations/triggers.js +33 -31
  321. package/src/automations/utils.js +9 -5
  322. package/src/constants/index.js +17 -5
  323. package/src/db/linkedRows/LinkController.js +3 -7
  324. package/src/db/linkedRows/index.js +16 -31
  325. package/src/db/linkedRows/linkUtils.js +6 -6
  326. package/src/db/tests/linkController.spec.js +0 -1
  327. package/src/db/tests/linkTests.spec.js +5 -6
  328. package/src/db/views/staticViews.js +8 -10
  329. package/src/definitions/common.ts +3 -0
  330. package/src/definitions/datasource.ts +3 -0
  331. package/src/environment.js +4 -1
  332. package/src/integrations/base/sql.ts +69 -21
  333. package/src/integrations/googlesheets.ts +353 -0
  334. package/src/integrations/index.ts +3 -0
  335. package/src/integrations/tests/sql.spec.js +16 -0
  336. package/src/integrations/utils.ts +75 -11
  337. package/src/middleware/authorized.js +66 -30
  338. package/src/middleware/builder.js +2 -2
  339. package/src/middleware/currentapp.js +50 -46
  340. package/src/middleware/tests/authorized.spec.js +13 -6
  341. package/src/middleware/tests/currentapp.spec.js +6 -0
  342. package/src/middleware/tests/usageQuota.spec.js +18 -24
  343. package/src/middleware/usageQuota.js +93 -17
  344. package/src/migrations/functions/appUrls.ts +34 -0
  345. package/src/migrations/functions/quotas1.ts +20 -0
  346. package/src/migrations/functions/tests/appUrls.spec.js +29 -0
  347. package/src/migrations/functions/tests/quotas1.spec.js +27 -0
  348. package/src/migrations/functions/tests/userEmailViewCasing.spec.js +25 -0
  349. package/src/migrations/functions/usageQuotas/index.ts +8 -0
  350. package/src/migrations/functions/usageQuotas/syncApps.ts +18 -0
  351. package/src/migrations/functions/usageQuotas/syncRows.ts +22 -0
  352. package/src/migrations/functions/usageQuotas/tests/syncApps.spec.js +37 -0
  353. package/src/migrations/functions/usageQuotas/tests/syncRows.spec.js +43 -0
  354. package/src/migrations/functions/userEmailViewCasing.ts +13 -0
  355. package/src/migrations/index.ts +56 -0
  356. package/src/module.d.ts +3 -0
  357. package/src/tests/utilities/TestConfiguration.js +82 -55
  358. package/src/threads/automation.js +17 -15
  359. package/src/threads/query.js +19 -21
  360. package/src/utilities/fileSystem/index.js +4 -3
  361. package/src/utilities/global.js +15 -12
  362. package/src/utilities/index.js +7 -17
  363. package/src/utilities/routing/index.js +5 -5
  364. package/src/utilities/rowProcessor/index.js +25 -27
  365. package/src/utilities/rowProcessor/utils.js +23 -7
  366. package/src/utilities/tests/usageQuota/usageQuota.spec.js +72 -0
  367. package/src/utilities/usageQuota/index.js +93 -0
  368. package/src/utilities/usageQuota/rows.js +75 -0
  369. package/src/utilities/usageQuota/usageQuoteReset.js +18 -0
  370. package/src/utilities/users.js +3 -3
  371. package/src/utilities/workerRequests.js +4 -27
  372. package/tsconfig.json +2 -1
  373. package/builder/assets/index.39e01193.css +0 -1
  374. package/dist/api/controllers/hosting.js +0 -30
  375. package/dist/api/routes/hosting.js +0 -11
  376. package/src/api/controllers/hosting.js +0 -22
  377. package/src/api/routes/hosting.js +0 -13
  378. package/src/api/routes/tests/hosting.spec.js +0 -36
  379. package/src/utilities/usageQuota.js +0 -73
@@ -22,19 +22,21 @@ var __rest = (this && this.__rest) || function (s, e) {
22
22
  Object.defineProperty(exports, "__esModule", { value: true });
23
23
  const datasource_1 = require("../../../definitions/datasource");
24
24
  const utils_1 = require("../../../integrations/utils");
25
+ const utils_2 = require("./utils");
26
+ const constants_1 = require("../../../constants");
27
+ const utils_3 = require("../../../integrations/utils");
28
+ const string_templates_1 = require("@budibase/string-templates");
29
+ // @ts-ignore
30
+ const fp_1 = require("lodash/fp");
31
+ const utils_4 = require("../../../utilities/rowProcessor/utils");
32
+ // @ts-ignore
33
+ const context_1 = require("@budibase/backend-core/context");
25
34
  var External;
26
35
  (function (External) {
27
- const { getDatasourceAndQuery } = require("./utils");
28
- const { DataSourceOperation, FieldTypes, RelationshipTypes, } = require("../../../constants");
29
- const { breakExternalTableId, isSQL } = require("../../../integrations/utils");
30
- const { processObjectSync } = require("@budibase/string-templates");
31
- const { cloneDeep } = require("lodash/fp");
32
- const CouchDB = require("../../../db");
33
- const { processFormulas } = require("../../../utilities/rowProcessor/utils");
34
36
  function buildFilters(id, filters, table) {
35
37
  const primary = table.primary;
36
38
  // if passed in array need to copy for shifting etc
37
- let idCopy = cloneDeep(id);
39
+ let idCopy = fp_1.cloneDeep(id);
38
40
  if (filters) {
39
41
  // need to map over the filters and make sure the _id field isn't present
40
42
  for (let filter of Object.values(filters)) {
@@ -77,10 +79,10 @@ var External;
77
79
  */
78
80
  function cleanupConfig(config, table) {
79
81
  const primaryOptions = [
80
- FieldTypes.STRING,
81
- FieldTypes.LONGFORM,
82
- FieldTypes.OPTIONS,
83
- FieldTypes.NUMBER,
82
+ constants_1.FieldTypes.STRING,
83
+ constants_1.FieldTypes.LONGFORM,
84
+ constants_1.FieldTypes.OPTIONS,
85
+ constants_1.FieldTypes.NUMBER,
84
86
  ];
85
87
  // filter out fields which cannot be keys
86
88
  const fieldNames = Object.entries(table.schema)
@@ -133,7 +135,7 @@ var External;
133
135
  if (!tableId) {
134
136
  return {};
135
137
  }
136
- const { datasourceId, tableName } = breakExternalTableId(tableId);
138
+ const { datasourceId, tableName } = utils_3.breakExternalTableId(tableId);
137
139
  return {
138
140
  datasourceId,
139
141
  entityId: tableName,
@@ -153,11 +155,11 @@ var External;
153
155
  thisRow._id = generateIdForRow(row, table);
154
156
  thisRow.tableId = table._id;
155
157
  thisRow._rev = "rev";
156
- return thisRow;
158
+ return utils_4.processFormulas(table, thisRow);
157
159
  }
158
160
  function fixArrayTypes(row, table) {
159
161
  for (let [fieldName, schema] of Object.entries(table.schema)) {
160
- if (schema.type === FieldTypes.ARRAY &&
162
+ if (schema.type === constants_1.FieldTypes.ARRAY &&
161
163
  typeof row[fieldName] === "string") {
162
164
  try {
163
165
  row[fieldName] = JSON.parse(row[fieldName]);
@@ -174,9 +176,8 @@ var External;
174
176
  return (field.relationshipType && field.relationshipType.split("-")[0] === "one");
175
177
  }
176
178
  class ExternalRequest {
177
- constructor(appId, operation, tableId, datasource) {
179
+ constructor(operation, tableId, datasource) {
178
180
  this.tables = {};
179
- this.appId = appId;
180
181
  this.operation = operation;
181
182
  this.tableId = tableId;
182
183
  this.datasource = datasource;
@@ -188,8 +189,10 @@ var External;
188
189
  if (!tableId) {
189
190
  throw "Table ID is unknown, cannot find table";
190
191
  }
191
- const { tableName } = breakExternalTableId(tableId);
192
- return this.tables[tableName];
192
+ const { tableName } = utils_3.breakExternalTableId(tableId);
193
+ if (tableName) {
194
+ return this.tables[tableName];
195
+ }
193
196
  }
194
197
  inputProcessing(row, table) {
195
198
  if (!row) {
@@ -204,7 +207,7 @@ var External;
204
207
  if (row[key] == null ||
205
208
  newRow[key] ||
206
209
  field.autocolumn ||
207
- field.type === FieldTypes.FORMULA) {
210
+ field.type === constants_1.FieldTypes.FORMULA) {
208
211
  continue;
209
212
  }
210
213
  // if its an empty string then it means return the column to null (if possible)
@@ -213,17 +216,17 @@ var External;
213
216
  continue;
214
217
  }
215
218
  // parse floats/numbers
216
- if (field.type === FieldTypes.NUMBER && !isNaN(parseFloat(row[key]))) {
219
+ if (field.type === constants_1.FieldTypes.NUMBER && !isNaN(parseFloat(row[key]))) {
217
220
  newRow[key] = parseFloat(row[key]);
218
221
  }
219
222
  // if its not a link then just copy it over
220
- if (field.type !== FieldTypes.LINK) {
223
+ if (field.type !== constants_1.FieldTypes.LINK) {
221
224
  newRow[key] = row[key];
222
225
  continue;
223
226
  }
224
- const { tableName: linkTableName } = breakExternalTableId(field.tableId);
227
+ const { tableName: linkTableName } = utils_3.breakExternalTableId(field === null || field === void 0 ? void 0 : field.tableId);
225
228
  // table has to exist for many to many
226
- if (!this.tables[linkTableName]) {
229
+ if (!linkTableName || !this.tables[linkTableName]) {
227
230
  continue;
228
231
  }
229
232
  const linkTable = this.tables[linkTableName];
@@ -275,14 +278,24 @@ var External;
275
278
  * This iterates through the returned rows and works out what elements of the rows
276
279
  * actually match up to another row (based on primary keys) - this is pretty specific
277
280
  * to SQL and the way that SQL relationships are returned based on joins.
281
+ * This is complicated, but the idea is that when a SQL query returns all the relations
282
+ * will be separate rows, with all of the data in each row. We have to decipher what comes
283
+ * from where (which tables) and how to convert that into budibase columns.
278
284
  */
279
- updateRelationshipColumns(row, rows, relationships) {
285
+ updateRelationshipColumns(table, row, rows, relationships) {
280
286
  const columns = {};
281
287
  for (let relationship of relationships) {
282
288
  const linkedTable = this.tables[relationship.tableName];
283
289
  if (!linkedTable) {
284
290
  continue;
285
291
  }
292
+ const fromColumn = `${table.name}.${relationship.from}`;
293
+ const toColumn = `${linkedTable.name}.${relationship.to}`;
294
+ // this is important when working with multiple relationships
295
+ // between the same tables, don't want to overlap/multiply the relations
296
+ if (!relationship.through && row[fromColumn] !== row[toColumn]) {
297
+ continue;
298
+ }
286
299
  let linked = basicProcessing(row, linkedTable);
287
300
  if (!linked._id) {
288
301
  continue;
@@ -320,7 +333,7 @@ var External;
320
333
  row._id = rowId;
321
334
  // this is a relationship of some sort
322
335
  if (finalRows[rowId]) {
323
- finalRows = this.updateRelationshipColumns(row, finalRows, relationships);
336
+ finalRows = this.updateRelationshipColumns(table, row, finalRows, relationships);
324
337
  continue;
325
338
  }
326
339
  const thisRow = fixArrayTypes(basicProcessing(row, table), table);
@@ -329,9 +342,9 @@ var External;
329
342
  }
330
343
  finalRows[thisRow._id] = thisRow;
331
344
  // do this at end once its been added to the final rows
332
- finalRows = this.updateRelationshipColumns(row, finalRows, relationships);
345
+ finalRows = this.updateRelationshipColumns(table, row, finalRows, relationships);
333
346
  }
334
- return processFormulas(table, Object.values(finalRows));
347
+ return utils_4.processFormulas(table, Object.values(finalRows));
335
348
  }
336
349
  /**
337
350
  * Gets the list of relationship JSON structures based on the columns in the table,
@@ -341,12 +354,12 @@ var External;
341
354
  buildRelationships(table) {
342
355
  const relationships = [];
343
356
  for (let [fieldName, field] of Object.entries(table.schema)) {
344
- if (field.type !== FieldTypes.LINK) {
357
+ if (field.type !== constants_1.FieldTypes.LINK) {
345
358
  continue;
346
359
  }
347
- const { tableName: linkTableName } = breakExternalTableId(field.tableId);
360
+ const { tableName: linkTableName } = utils_3.breakExternalTableId(field.tableId);
348
361
  // no table to link to, this is not a valid relationships
349
- if (!this.tables[linkTableName]) {
362
+ if (!linkTableName || !this.tables[linkTableName]) {
350
363
  continue;
351
364
  }
352
365
  const linkTable = this.tables[linkTableName];
@@ -362,7 +375,7 @@ var External;
362
375
  column: fieldName,
363
376
  };
364
377
  if (field.through) {
365
- const { tableName: throughTableName } = breakExternalTableId(field.through);
378
+ const { tableName: throughTableName } = utils_3.breakExternalTableId(field.through);
366
379
  definition.through = throughTableName;
367
380
  // don't support composite keys for relationships
368
381
  definition.from = field.throughTo || table.primary[0];
@@ -381,21 +394,24 @@ var External;
381
394
  lookupRelations(tableId, row) {
382
395
  return __awaiter(this, void 0, void 0, function* () {
383
396
  const related = {};
384
- const { tableName } = breakExternalTableId(tableId);
397
+ const { tableName } = utils_3.breakExternalTableId(tableId);
398
+ if (!tableName) {
399
+ return related;
400
+ }
385
401
  const table = this.tables[tableName];
386
402
  // @ts-ignore
387
403
  const primaryKey = table.primary[0];
388
404
  // make a new request to get the row with all its relationships
389
405
  // we need this to work out if any relationships need removed
390
406
  for (let field of Object.values(table.schema)) {
391
- if (field.type !== FieldTypes.LINK ||
407
+ if (field.type !== constants_1.FieldTypes.LINK ||
392
408
  !field.fieldName ||
393
409
  isOneSide(field)) {
394
410
  continue;
395
411
  }
396
- const isMany = field.relationshipType === RelationshipTypes.MANY_TO_MANY;
412
+ const isMany = field.relationshipType === constants_1.RelationshipTypes.MANY_TO_MANY;
397
413
  const tableId = isMany ? field.through : field.tableId;
398
- const { tableName: relatedTableName } = breakExternalTableId(tableId);
414
+ const { tableName: relatedTableName } = utils_3.breakExternalTableId(tableId);
399
415
  // @ts-ignore
400
416
  const linkPrimaryKey = this.tables[relatedTableName].primary[0];
401
417
  const manyKey = field.throughTo || primaryKey;
@@ -404,8 +420,8 @@ var External;
404
420
  if (!lookupField || !row[lookupField]) {
405
421
  continue;
406
422
  }
407
- const response = yield getDatasourceAndQuery(this.appId, {
408
- endpoint: getEndpoint(tableId, DataSourceOperation.READ),
423
+ const response = yield utils_2.getDatasourceAndQuery({
424
+ endpoint: getEndpoint(tableId, constants_1.DataSourceOperation.READ),
409
425
  filters: {
410
426
  equal: {
411
427
  [fieldName]: row[lookupField],
@@ -432,24 +448,26 @@ var External;
432
448
  */
433
449
  handleManyRelationships(mainTableId, row, relationships) {
434
450
  return __awaiter(this, void 0, void 0, function* () {
435
- const { appId } = this;
436
451
  // if we're creating (in a through table) need to wipe the existing ones first
437
452
  const promises = [];
438
453
  const related = yield this.lookupRelations(mainTableId, row);
439
454
  for (let relationship of relationships) {
440
455
  const { key, tableId, isUpdate, id } = relationship, rest = __rest(relationship, ["key", "tableId", "isUpdate", "id"]);
441
- const body = processObjectSync(rest, row);
456
+ const body = string_templates_1.processObjectSync(rest, row, {});
442
457
  const linkTable = this.getTable(tableId);
443
458
  // @ts-ignore
444
- const linkPrimary = linkTable.primary[0];
459
+ const linkPrimary = linkTable === null || linkTable === void 0 ? void 0 : linkTable.primary[0];
460
+ if (!linkTable || !linkPrimary) {
461
+ return;
462
+ }
445
463
  const rows = related[key].rows || [];
446
464
  const found = rows.find((row) => row[linkPrimary] === relationship.id ||
447
- row[linkPrimary] === body[linkPrimary]);
465
+ row[linkPrimary] === (body === null || body === void 0 ? void 0 : body[linkPrimary]));
448
466
  const operation = isUpdate
449
- ? DataSourceOperation.UPDATE
450
- : DataSourceOperation.CREATE;
467
+ ? constants_1.DataSourceOperation.UPDATE
468
+ : constants_1.DataSourceOperation.CREATE;
451
469
  if (!found) {
452
- promises.push(getDatasourceAndQuery(appId, {
470
+ promises.push(utils_2.getDatasourceAndQuery({
453
471
  endpoint: getEndpoint(tableId, operation),
454
472
  // if we're doing many relationships then we're writing, only one response
455
473
  body,
@@ -465,7 +483,8 @@ var External;
465
483
  for (let [colName, { isMany, rows, tableId }] of Object.entries(related)) {
466
484
  const table = this.getTable(tableId);
467
485
  // if its not the foreign key skip it, nothing to do
468
- if (table.primary && table.primary.indexOf(colName) !== -1) {
486
+ if (!table ||
487
+ (table.primary && table.primary.indexOf(colName) !== -1)) {
469
488
  continue;
470
489
  }
471
490
  for (let row of rows) {
@@ -473,10 +492,10 @@ var External;
473
492
  // safety check, if there are no filters on deletion bad things happen
474
493
  if (Object.keys(filters).length !== 0) {
475
494
  const op = isMany
476
- ? DataSourceOperation.DELETE
477
- : DataSourceOperation.UPDATE;
495
+ ? constants_1.DataSourceOperation.DELETE
496
+ : constants_1.DataSourceOperation.UPDATE;
478
497
  const body = isMany ? null : { [colName]: null };
479
- promises.push(getDatasourceAndQuery(this.appId, {
498
+ promises.push(utils_2.getDatasourceAndQuery({
480
499
  endpoint: getEndpoint(tableId, op),
481
500
  body,
482
501
  filters,
@@ -497,31 +516,36 @@ var External;
497
516
  buildFields(table, includeRelations = datasource_1.IncludeRelationships.INCLUDE) {
498
517
  function extractRealFields(table, existing = []) {
499
518
  return Object.entries(table.schema)
500
- .filter(column => column[1].type !== FieldTypes.LINK &&
501
- column[1].type !== FieldTypes.FORMULA &&
519
+ .filter(column => column[1].type !== constants_1.FieldTypes.LINK &&
520
+ column[1].type !== constants_1.FieldTypes.FORMULA &&
502
521
  !existing.find((field) => field === column[0]))
503
522
  .map(column => `${table.name}.${column[0]}`);
504
523
  }
505
524
  let fields = extractRealFields(table);
506
525
  for (let field of Object.values(table.schema)) {
507
- if (field.type !== FieldTypes.LINK || !includeRelations) {
526
+ if (field.type !== constants_1.FieldTypes.LINK || !includeRelations) {
508
527
  continue;
509
528
  }
510
- const { tableName: linkTableName } = breakExternalTableId(field.tableId);
511
- const linkTable = this.tables[linkTableName];
512
- if (linkTable) {
513
- const linkedFields = extractRealFields(linkTable, fields);
514
- fields = fields.concat(linkedFields);
529
+ const { tableName: linkTableName } = utils_3.breakExternalTableId(field.tableId);
530
+ if (linkTableName) {
531
+ const linkTable = this.tables[linkTableName];
532
+ if (linkTable) {
533
+ const linkedFields = extractRealFields(linkTable, fields);
534
+ fields = fields.concat(linkedFields);
535
+ }
515
536
  }
516
537
  }
517
538
  return fields;
518
539
  }
519
540
  run(config) {
520
541
  return __awaiter(this, void 0, void 0, function* () {
521
- const { appId, operation, tableId } = this;
522
- let { datasourceId, tableName } = breakExternalTableId(tableId);
542
+ const { operation, tableId } = this;
543
+ let { datasourceId, tableName } = utils_3.breakExternalTableId(tableId);
544
+ if (!tableName) {
545
+ throw "Unable to run without a table name";
546
+ }
523
547
  if (!this.datasource) {
524
- const db = new CouchDB(appId);
548
+ const db = context_1.getAppDB();
525
549
  this.datasource = yield db.get(datasourceId);
526
550
  if (!this.datasource || !this.datasource.entities) {
527
551
  throw "No tables found, fetch tables before query.";
@@ -529,7 +553,7 @@ var External;
529
553
  this.tables = this.datasource.entities;
530
554
  }
531
555
  const table = this.tables[tableName];
532
- let isSql = isSQL(this.datasource);
556
+ let isSql = utils_3.isSQL(this.datasource);
533
557
  if (!table) {
534
558
  throw `Unable to process query, table "${tableName}" not defined.`;
535
559
  }
@@ -540,7 +564,7 @@ var External;
540
564
  // clean up row on ingress using schema
541
565
  const processed = this.inputProcessing(row, table);
542
566
  row = processed.row;
543
- if (operation === DataSourceOperation.DELETE &&
567
+ if (operation === constants_1.DataSourceOperation.DELETE &&
544
568
  (filters == null || Object.keys(filters).length === 0)) {
545
569
  throw "Deletion must be filtered";
546
570
  }
@@ -568,15 +592,15 @@ var External;
568
592
  },
569
593
  };
570
594
  // can't really use response right now
571
- const response = yield getDatasourceAndQuery(appId, json);
595
+ const response = yield utils_2.getDatasourceAndQuery(json);
572
596
  // handle many to many relationships now if we know the ID (could be auto increment)
573
- if (operation !== DataSourceOperation.READ &&
597
+ if (operation !== constants_1.DataSourceOperation.READ &&
574
598
  processed.manyRelationships) {
575
599
  yield this.handleManyRelationships(table._id || "", response[0], processed.manyRelationships);
576
600
  }
577
601
  const output = this.outputProcessing(response, table, relationships);
578
602
  // if reading it'll just be an array of rows, return whole thing
579
- return operation === DataSourceOperation.READ && Array.isArray(response)
603
+ return operation === constants_1.DataSourceOperation.READ && Array.isArray(response)
580
604
  ? output
581
605
  : { row: output[0], table };
582
606
  });
@@ -22,8 +22,8 @@ var __rest = (this && this.__rest) || function (s, e) {
22
22
  const { DataSourceOperation, SortDirection, FieldTypes, NoEmptyFilterStrings, } = require("../../../constants");
23
23
  const { breakExternalTableId, breakRowIdField, } = require("../../../integrations/utils");
24
24
  const ExternalRequest = require("./ExternalRequest");
25
- const CouchDB = require("../../../db");
26
- function handleRequest(appId, operation, tableId, opts = {}) {
25
+ const { getAppDB } = require("@budibase/backend-core/context");
26
+ function handleRequest(operation, tableId, opts = {}) {
27
27
  return __awaiter(this, void 0, void 0, function* () {
28
28
  // make sure the filters are cleaned up, no empty strings for equals, fuzzy or string
29
29
  if (opts && opts.filters) {
@@ -38,27 +38,25 @@ function handleRequest(appId, operation, tableId, opts = {}) {
38
38
  }
39
39
  }
40
40
  }
41
- return new ExternalRequest(appId, operation, tableId, opts.datasource).run(opts);
41
+ return new ExternalRequest(operation, tableId, opts.datasource).run(opts);
42
42
  });
43
43
  }
44
44
  exports.handleRequest = handleRequest;
45
45
  exports.patch = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
46
- const appId = ctx.appId;
47
46
  const inputs = ctx.request.body;
48
47
  const tableId = ctx.params.tableId;
49
48
  const id = breakRowIdField(inputs._id);
50
49
  // don't save the ID to db
51
50
  delete inputs._id;
52
- return handleRequest(appId, DataSourceOperation.UPDATE, tableId, {
51
+ return handleRequest(DataSourceOperation.UPDATE, tableId, {
53
52
  id,
54
53
  row: inputs,
55
54
  });
56
55
  });
57
56
  exports.save = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
58
- const appId = ctx.appId;
59
57
  const inputs = ctx.request.body;
60
58
  const tableId = ctx.params.tableId;
61
- return handleRequest(appId, DataSourceOperation.CREATE, tableId, {
59
+ return handleRequest(DataSourceOperation.CREATE, tableId, {
62
60
  row: inputs,
63
61
  });
64
62
  });
@@ -70,35 +68,31 @@ exports.fetchView = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
70
68
  return exports.fetch(ctx);
71
69
  });
72
70
  exports.fetch = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
73
- const appId = ctx.appId;
74
71
  const tableId = ctx.params.tableId;
75
- return handleRequest(appId, DataSourceOperation.READ, tableId);
72
+ return handleRequest(DataSourceOperation.READ, tableId);
76
73
  });
77
74
  exports.find = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
78
- const appId = ctx.appId;
79
75
  const id = ctx.params.rowId;
80
76
  const tableId = ctx.params.tableId;
81
- const response = yield handleRequest(appId, DataSourceOperation.READ, tableId, {
77
+ const response = yield handleRequest(DataSourceOperation.READ, tableId, {
82
78
  id,
83
79
  });
84
80
  return response ? response[0] : response;
85
81
  });
86
82
  exports.destroy = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
87
- const appId = ctx.appId;
88
83
  const tableId = ctx.params.tableId;
89
84
  const id = ctx.request.body._id;
90
- const { row } = yield handleRequest(appId, DataSourceOperation.DELETE, tableId, {
85
+ const { row } = yield handleRequest(DataSourceOperation.DELETE, tableId, {
91
86
  id,
92
87
  });
93
88
  return { response: { ok: true }, row };
94
89
  });
95
90
  exports.bulkDestroy = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
96
- const appId = ctx.appId;
97
91
  const { rows } = ctx.request.body;
98
92
  const tableId = ctx.params.tableId;
99
93
  let promises = [];
100
94
  for (let row of rows) {
101
- promises.push(handleRequest(appId, DataSourceOperation.DELETE, tableId, {
95
+ promises.push(handleRequest(DataSourceOperation.DELETE, tableId, {
102
96
  id: breakRowIdField(row._id),
103
97
  }));
104
98
  }
@@ -106,7 +100,6 @@ exports.bulkDestroy = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
106
100
  return { response: { ok: true }, rows: responses.map(resp => resp.row) };
107
101
  });
108
102
  exports.search = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
109
- const appId = ctx.appId;
110
103
  const tableId = ctx.params.tableId;
111
104
  const _a = ctx.request.body, { paginate, query } = _a, params = __rest(_a, ["paginate", "query"]);
112
105
  let { bookmark, limit } = params;
@@ -135,14 +128,14 @@ exports.search = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
135
128
  [params.sort]: direction,
136
129
  };
137
130
  }
138
- const rows = yield handleRequest(appId, DataSourceOperation.READ, tableId, {
131
+ const rows = yield handleRequest(DataSourceOperation.READ, tableId, {
139
132
  filters: query,
140
133
  sort,
141
134
  paginate: paginateObj,
142
135
  });
143
136
  let hasNextPage = false;
144
137
  if (paginate && rows.length === limit) {
145
- const nextRows = yield handleRequest(appId, DataSourceOperation.READ, tableId, {
138
+ const nextRows = yield handleRequest(DataSourceOperation.READ, tableId, {
146
139
  filters: query,
147
140
  sort,
148
141
  paginate: {
@@ -160,17 +153,16 @@ exports.validate = () => __awaiter(void 0, void 0, void 0, function* () {
160
153
  return { valid: true };
161
154
  });
162
155
  exports.fetchEnrichedRow = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
163
- const appId = ctx.appId;
164
156
  const id = ctx.params.rowId;
165
157
  const tableId = ctx.params.tableId;
166
158
  const { datasourceId, tableName } = breakExternalTableId(tableId);
167
- const db = new CouchDB(appId);
159
+ const db = getAppDB();
168
160
  const datasource = yield db.get(datasourceId);
169
161
  if (!datasource || !datasource.entities) {
170
162
  ctx.throw(400, "Datasource has not been configured for plus API.");
171
163
  }
172
164
  const tables = datasource.entities;
173
- const response = yield handleRequest(appId, DataSourceOperation.READ, tableId, {
165
+ const response = yield handleRequest(DataSourceOperation.READ, tableId, {
174
166
  id,
175
167
  datasource,
176
168
  });
@@ -189,7 +181,7 @@ exports.fetchEnrichedRow = (ctx) => __awaiter(void 0, void 0, void 0, function*
189
181
  const linkedTable = tables[breakExternalTableId(linkedTableId).tableName];
190
182
  // don't support composite keys right now
191
183
  const linkedIds = links.map(link => breakRowIdField(link._id)[0]);
192
- row[fieldName] = yield handleRequest(appId, DataSourceOperation.READ, linkedTableId, {
184
+ row[fieldName] = yield handleRequest(DataSourceOperation.READ, linkedTableId, {
193
185
  tables,
194
186
  filters: {
195
187
  oneOf: {