@budibase/server 1.0.49 → 1.0.50-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (381) 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.c0cc369d.css +6 -0
  8. package/builder/assets/{index.2c37968e.js → index.ff2bad21.js} +252 -249
  9. package/builder/assets/{vendor.f9faf6ab.js → vendor.5ad9695a.js} +202 -106
  10. package/builder/index.html +3 -3
  11. package/coverage/clover.xml +3105 -2814
  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 +78 -78
  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 +218 -110
  49. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  50. package/coverage/lcov-report/api/controllers/user.js.html +79 -76
  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 +5 -5
  123. package/coverage/lcov-report/constants/index.js.html +53 -26
  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 +135 -120
  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 +39 -24
  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 +5010 -4425
  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 +90 -67
  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 +62 -16
  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 +62 -35
  212. package/dist/api/controllers/user.js +43 -43
  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 +7 -0
  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 +62 -21
  235. package/dist/integrations/googlesheets.js +340 -0
  236. package/dist/integrations/index.js +3 -0
  237. package/dist/integrations/utils.js +60 -9
  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 +15 -11
  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/mssql/data/Dockerfile +1 -1
  268. package/scripts/integrations/mssql/data/setup.sql +17 -4
  269. package/scripts/integrations/postgres/init.sql +11 -6
  270. package/scripts/likeCypress.ts +1 -1
  271. package/src/api/controllers/application.js +85 -50
  272. package/src/api/controllers/auth.js +8 -5
  273. package/src/api/controllers/automation.js +13 -23
  274. package/src/api/controllers/cloud.js +2 -3
  275. package/src/api/controllers/component.js +3 -4
  276. package/src/api/controllers/datasource.js +21 -11
  277. package/src/api/controllers/deploy/Deployment.js +3 -7
  278. package/src/api/controllers/deploy/index.js +20 -13
  279. package/src/api/controllers/dev.js +5 -5
  280. package/src/api/controllers/layout.js +3 -3
  281. package/src/api/controllers/metadata.js +4 -9
  282. package/src/api/controllers/migrations.js +13 -0
  283. package/src/api/controllers/permission.js +4 -4
  284. package/src/api/controllers/query/import/index.ts +4 -6
  285. package/src/api/controllers/query/import/tests/index.spec.js +2 -1
  286. package/src/api/controllers/query/index.js +11 -10
  287. package/src/api/controllers/role.js +5 -5
  288. package/src/api/controllers/routing.js +5 -6
  289. package/src/api/controllers/row/ExternalRequest.ts +67 -43
  290. package/src/api/controllers/row/external.js +27 -58
  291. package/src/api/controllers/row/internal.js +54 -90
  292. package/src/api/controllers/row/internalSearch.js +23 -17
  293. package/src/api/controllers/row/staticFormula.js +156 -0
  294. package/src/api/controllers/row/utils.js +13 -18
  295. package/src/api/controllers/screen.js +5 -7
  296. package/src/api/controllers/static/index.js +66 -15
  297. package/src/api/controllers/table/bulkFormula.js +173 -0
  298. package/src/api/controllers/table/external.js +7 -10
  299. package/src/api/controllers/table/index.js +20 -28
  300. package/src/api/controllers/table/internal.js +24 -19
  301. package/src/api/controllers/table/utils.js +78 -42
  302. package/src/api/controllers/user.js +46 -45
  303. package/src/api/controllers/view/index.js +8 -10
  304. package/src/api/controllers/view/utils.js +9 -4
  305. package/src/api/controllers/webhook.js +10 -8
  306. package/src/api/routes/index.js +2 -2
  307. package/src/api/routes/migrations.js +14 -0
  308. package/src/api/routes/static.js +5 -0
  309. package/src/api/routes/tests/application.spec.js +2 -2
  310. package/src/api/routes/tests/auth.spec.js +1 -2
  311. package/src/api/routes/tests/automation.spec.js +1 -0
  312. package/src/api/routes/tests/misc.spec.js +0 -1
  313. package/src/api/routes/tests/routing.spec.js +21 -12
  314. package/src/api/routes/tests/row.spec.js +7 -4
  315. package/src/api/routes/tests/static.spec.js +98 -0
  316. package/src/api/routes/tests/utilities/TestFunctions.js +39 -17
  317. package/src/app.ts +18 -5
  318. package/src/automations/automationUtils.js +2 -3
  319. package/src/automations/steps/createRow.js +2 -5
  320. package/src/automations/steps/deleteRow.js +1 -4
  321. package/src/automations/steps/updateRow.js +1 -1
  322. package/src/automations/triggers.js +33 -31
  323. package/src/automations/utils.js +9 -5
  324. package/src/constants/index.js +9 -0
  325. package/src/db/linkedRows/LinkController.js +3 -7
  326. package/src/db/linkedRows/index.js +16 -31
  327. package/src/db/linkedRows/linkUtils.js +6 -6
  328. package/src/db/tests/linkController.spec.js +0 -1
  329. package/src/db/tests/linkTests.spec.js +5 -6
  330. package/src/db/views/staticViews.js +8 -10
  331. package/src/definitions/common.ts +3 -0
  332. package/src/definitions/datasource.ts +3 -0
  333. package/src/environment.js +4 -1
  334. package/src/integrations/base/sql.ts +75 -29
  335. package/src/integrations/googlesheets.ts +353 -0
  336. package/src/integrations/index.ts +3 -0
  337. package/src/integrations/tests/sql.spec.js +16 -0
  338. package/src/integrations/utils.ts +75 -12
  339. package/src/middleware/authorized.js +66 -30
  340. package/src/middleware/builder.js +2 -2
  341. package/src/middleware/currentapp.js +50 -46
  342. package/src/middleware/tests/authorized.spec.js +13 -6
  343. package/src/middleware/tests/currentapp.spec.js +6 -0
  344. package/src/middleware/tests/usageQuota.spec.js +18 -24
  345. package/src/middleware/usageQuota.js +93 -17
  346. package/src/migrations/functions/appUrls.ts +34 -0
  347. package/src/migrations/functions/quotas1.ts +20 -0
  348. package/src/migrations/functions/tests/appUrls.spec.js +29 -0
  349. package/src/migrations/functions/tests/quotas1.spec.js +27 -0
  350. package/src/migrations/functions/tests/userEmailViewCasing.spec.js +25 -0
  351. package/src/migrations/functions/usageQuotas/index.ts +8 -0
  352. package/src/migrations/functions/usageQuotas/syncApps.ts +18 -0
  353. package/src/migrations/functions/usageQuotas/syncRows.ts +22 -0
  354. package/src/migrations/functions/usageQuotas/tests/syncApps.spec.js +37 -0
  355. package/src/migrations/functions/usageQuotas/tests/syncRows.spec.js +43 -0
  356. package/src/migrations/functions/userEmailViewCasing.ts +13 -0
  357. package/src/migrations/index.ts +56 -0
  358. package/src/module.d.ts +3 -0
  359. package/src/tests/utilities/TestConfiguration.js +82 -55
  360. package/src/threads/automation.js +17 -15
  361. package/src/threads/query.js +17 -12
  362. package/src/utilities/fileSystem/index.js +4 -3
  363. package/src/utilities/global.js +15 -12
  364. package/src/utilities/index.js +7 -17
  365. package/src/utilities/routing/index.js +5 -5
  366. package/src/utilities/rowProcessor/index.js +25 -27
  367. package/src/utilities/rowProcessor/utils.js +23 -7
  368. package/src/utilities/tests/usageQuota/usageQuota.spec.js +72 -0
  369. package/src/utilities/usageQuota/index.js +93 -0
  370. package/src/utilities/usageQuota/rows.js +75 -0
  371. package/src/utilities/usageQuota/usageQuoteReset.js +18 -0
  372. package/src/utilities/users.js +3 -3
  373. package/src/utilities/workerRequests.js +4 -27
  374. package/tsconfig.json +2 -1
  375. package/builder/assets/index.39e01193.css +0 -1
  376. package/dist/api/controllers/hosting.js +0 -30
  377. package/dist/api/routes/hosting.js +0 -11
  378. package/src/api/controllers/hosting.js +0 -22
  379. package/src/api/routes/hosting.js +0 -13
  380. package/src/api/routes/tests/hosting.spec.js +0 -36
  381. 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],
@@ -431,26 +447,27 @@ var External;
431
447
  * all and then re-create, as theres no chance of losing data (e.g. delete succeed, but write fail).
432
448
  */
433
449
  handleManyRelationships(mainTableId, row, relationships) {
434
- var _a;
435
450
  return __awaiter(this, void 0, void 0, function* () {
436
- const { appId } = this;
437
451
  // if we're creating (in a through table) need to wipe the existing ones first
438
452
  const promises = [];
439
453
  const related = yield this.lookupRelations(mainTableId, row);
440
454
  for (let relationship of relationships) {
441
455
  const { key, tableId, isUpdate, id } = relationship, rest = __rest(relationship, ["key", "tableId", "isUpdate", "id"]);
442
- const body = processObjectSync(rest, row);
456
+ const body = string_templates_1.processObjectSync(rest, row, {});
443
457
  const linkTable = this.getTable(tableId);
444
458
  // @ts-ignore
445
- const linkPrimary = linkTable.primary[0];
446
- const rows = ((_a = related[key]) === null || _a === void 0 ? void 0 : _a.rows) || [];
459
+ const linkPrimary = linkTable === null || linkTable === void 0 ? void 0 : linkTable.primary[0];
460
+ if (!linkTable || !linkPrimary) {
461
+ return;
462
+ }
463
+ const rows = related[key].rows || [];
447
464
  const found = rows.find((row) => row[linkPrimary] === relationship.id ||
448
- row[linkPrimary] === body[linkPrimary]);
465
+ row[linkPrimary] === (body === null || body === void 0 ? void 0 : body[linkPrimary]));
449
466
  const operation = isUpdate
450
- ? DataSourceOperation.UPDATE
451
- : DataSourceOperation.CREATE;
467
+ ? constants_1.DataSourceOperation.UPDATE
468
+ : constants_1.DataSourceOperation.CREATE;
452
469
  if (!found) {
453
- promises.push(getDatasourceAndQuery(appId, {
470
+ promises.push(utils_2.getDatasourceAndQuery({
454
471
  endpoint: getEndpoint(tableId, operation),
455
472
  // if we're doing many relationships then we're writing, only one response
456
473
  body,
@@ -466,7 +483,8 @@ var External;
466
483
  for (let [colName, { isMany, rows, tableId }] of Object.entries(related)) {
467
484
  const table = this.getTable(tableId);
468
485
  // if its not the foreign key skip it, nothing to do
469
- if (table.primary && table.primary.indexOf(colName) !== -1) {
486
+ if (!table ||
487
+ (table.primary && table.primary.indexOf(colName) !== -1)) {
470
488
  continue;
471
489
  }
472
490
  for (let row of rows) {
@@ -474,10 +492,10 @@ var External;
474
492
  // safety check, if there are no filters on deletion bad things happen
475
493
  if (Object.keys(filters).length !== 0) {
476
494
  const op = isMany
477
- ? DataSourceOperation.DELETE
478
- : DataSourceOperation.UPDATE;
495
+ ? constants_1.DataSourceOperation.DELETE
496
+ : constants_1.DataSourceOperation.UPDATE;
479
497
  const body = isMany ? null : { [colName]: null };
480
- promises.push(getDatasourceAndQuery(this.appId, {
498
+ promises.push(utils_2.getDatasourceAndQuery({
481
499
  endpoint: getEndpoint(tableId, op),
482
500
  body,
483
501
  filters,
@@ -498,31 +516,36 @@ var External;
498
516
  buildFields(table, includeRelations = datasource_1.IncludeRelationships.INCLUDE) {
499
517
  function extractRealFields(table, existing = []) {
500
518
  return Object.entries(table.schema)
501
- .filter(column => column[1].type !== FieldTypes.LINK &&
502
- column[1].type !== FieldTypes.FORMULA &&
519
+ .filter(column => column[1].type !== constants_1.FieldTypes.LINK &&
520
+ column[1].type !== constants_1.FieldTypes.FORMULA &&
503
521
  !existing.find((field) => field === column[0]))
504
522
  .map(column => `${table.name}.${column[0]}`);
505
523
  }
506
524
  let fields = extractRealFields(table);
507
525
  for (let field of Object.values(table.schema)) {
508
- if (field.type !== FieldTypes.LINK || !includeRelations) {
526
+ if (field.type !== constants_1.FieldTypes.LINK || !includeRelations) {
509
527
  continue;
510
528
  }
511
- const { tableName: linkTableName } = breakExternalTableId(field.tableId);
512
- const linkTable = this.tables[linkTableName];
513
- if (linkTable) {
514
- const linkedFields = extractRealFields(linkTable, fields);
515
- 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
+ }
516
536
  }
517
537
  }
518
538
  return fields;
519
539
  }
520
540
  run(config) {
521
541
  return __awaiter(this, void 0, void 0, function* () {
522
- const { appId, operation, tableId } = this;
523
- 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
+ }
524
547
  if (!this.datasource) {
525
- const db = new CouchDB(appId);
548
+ const db = context_1.getAppDB();
526
549
  this.datasource = yield db.get(datasourceId);
527
550
  if (!this.datasource || !this.datasource.entities) {
528
551
  throw "No tables found, fetch tables before query.";
@@ -530,7 +553,7 @@ var External;
530
553
  this.tables = this.datasource.entities;
531
554
  }
532
555
  const table = this.tables[tableName];
533
- let isSql = isSQL(this.datasource);
556
+ let isSql = utils_3.isSQL(this.datasource);
534
557
  if (!table) {
535
558
  throw `Unable to process query, table "${tableName}" not defined.`;
536
559
  }
@@ -541,7 +564,7 @@ var External;
541
564
  // clean up row on ingress using schema
542
565
  const processed = this.inputProcessing(row, table);
543
566
  row = processed.row;
544
- if (operation === DataSourceOperation.DELETE &&
567
+ if (operation === constants_1.DataSourceOperation.DELETE &&
545
568
  (filters == null || Object.keys(filters).length === 0)) {
546
569
  throw "Deletion must be filtered";
547
570
  }
@@ -569,15 +592,15 @@ var External;
569
592
  },
570
593
  };
571
594
  // can't really use response right now
572
- const response = yield getDatasourceAndQuery(appId, json);
595
+ const response = yield utils_2.getDatasourceAndQuery(json);
573
596
  // handle many to many relationships now if we know the ID (could be auto increment)
574
- if (operation !== DataSourceOperation.READ &&
597
+ if (operation !== constants_1.DataSourceOperation.READ &&
575
598
  processed.manyRelationships) {
576
599
  yield this.handleManyRelationships(table._id || "", response[0], processed.manyRelationships);
577
600
  }
578
601
  const output = this.outputProcessing(response, table, relationships);
579
602
  // if reading it'll just be an array of rows, return whole thing
580
- return operation === DataSourceOperation.READ && Array.isArray(response)
603
+ return operation === constants_1.DataSourceOperation.READ && Array.isArray(response)
581
604
  ? output
582
605
  : { row: output[0], table };
583
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: {