@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
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@budibase/server",
3
3
  "email": "hi@budibase.com",
4
- "version": "1.0.49",
4
+ "version": "1.0.50-alpha.0",
5
5
  "description": "Budibase Web Server",
6
6
  "main": "src/index.ts",
7
7
  "repository": {
@@ -70,9 +70,9 @@
70
70
  "license": "GPL-3.0",
71
71
  "dependencies": {
72
72
  "@apidevtools/swagger-parser": "^10.0.3",
73
- "@budibase/backend-core": "^1.0.49",
74
- "@budibase/client": "^1.0.49",
75
- "@budibase/string-templates": "^1.0.49",
73
+ "@budibase/backend-core": "^1.0.50-alpha.0",
74
+ "@budibase/client": "^1.0.50-alpha.0",
75
+ "@budibase/string-templates": "^1.0.50-alpha.0",
76
76
  "@bull-board/api": "^3.7.0",
77
77
  "@bull-board/koa": "^3.7.0",
78
78
  "@elastic/elasticsearch": "7.10.0",
@@ -92,6 +92,8 @@
92
92
  "fix-path": "3.0.0",
93
93
  "form-data": "^4.0.0",
94
94
  "fs-extra": "8.1.0",
95
+ "google-auth-library": "^7.11.0",
96
+ "google-spreadsheet": "^3.2.0",
95
97
  "jimp": "0.16.1",
96
98
  "joi": "17.2.1",
97
99
  "js-yaml": "^4.1.0",
@@ -110,7 +112,7 @@
110
112
  "mongodb": "3.6.3",
111
113
  "mssql": "6.2.3",
112
114
  "mysql2": "^2.3.1",
113
- "node-fetch": "2.6.0",
115
+ "node-fetch": "2.6.7",
114
116
  "open": "^8.4.0",
115
117
  "pg": "8.5.1",
116
118
  "pino-pretty": "4.0.0",
@@ -139,6 +141,7 @@
139
141
  "@jest/test-sequencer": "^24.8.0",
140
142
  "@types/apidoc": "^0.50.0",
141
143
  "@types/bull": "^3.15.1",
144
+ "@types/google-spreadsheet": "^3.1.5",
142
145
  "@types/jest": "^26.0.23",
143
146
  "@types/koa": "^2.13.3",
144
147
  "@types/koa-router": "^7.4.2",
@@ -165,5 +168,5 @@
165
168
  "optionalDependencies": {
166
169
  "oracledb": "^5.3.0"
167
170
  },
168
- "gitHead": "80ae9a30b112c1abf794bdad73da9257ba80d9d5"
171
+ "gitHead": "a076d7ccf1deab0d300ae229a1aa3f4ce92aa1ba"
169
172
  }
@@ -1,4 +1,4 @@
1
- FROM mcr.microsoft.com/mssql/server
1
+ FROM mcr.microsoft.com/mssql/server:2017-latest
2
2
 
3
3
  ENV ACCEPT_EULA=Y
4
4
  ENV SA_PASSWORD=Passw0rd
@@ -48,7 +48,20 @@ INSERT tasks
48
48
  VALUES
49
49
  ('Processing', 1);
50
50
 
51
- INSERT people
52
- (name, age)
53
- VALUES
54
- ('Bob', '30');
51
+ INSERT INTO people (name, age)
52
+ VALUES ('Bob', '30'),
53
+ ('Bert', '10'),
54
+ ('Jack', '12'),
55
+ ('Mike', '31'),
56
+ ('Dave', '44'),
57
+ ('Jim', '43'),
58
+ ('Kerry', '32'),
59
+ ('Julie', '12'),
60
+ ('Kim', '55'),
61
+ ('Andy', '33'),
62
+ ('John', '22'),
63
+ ('Ruth', '66'),
64
+ ('Robert', '88'),
65
+ ('Bobert', '99'),
66
+ ('Jan', '22'),
67
+ ('Megan', '11');
@@ -9,12 +9,16 @@ CREATE TABLE Persons (
9
9
  );
10
10
  CREATE TABLE Tasks (
11
11
  TaskID SERIAL PRIMARY KEY,
12
- PersonID INT,
12
+ ExecutorID INT,
13
+ QaID INT,
13
14
  Completed BOOLEAN,
14
15
  TaskName varchar(255),
15
- CONSTRAINT fkPersons
16
- FOREIGN KEY(PersonID)
17
- REFERENCES Persons(PersonID)
16
+ CONSTRAINT fkexecutor
17
+ FOREIGN KEY(ExecutorID)
18
+ REFERENCES Persons(PersonID),
19
+ CONSTRAINT fkqa
20
+ FOREIGN KEY(QaID)
21
+ REFERENCES Persons(PersonID)
18
22
  );
19
23
  CREATE TABLE Products (
20
24
  ProductID SERIAL PRIMARY KEY,
@@ -32,8 +36,9 @@ CREATE TABLE Products_Tasks (
32
36
  PRIMARY KEY (ProductID, TaskID)
33
37
  );
34
38
  INSERT INTO Persons (FirstName, LastName, Address, City) VALUES ('Mike', 'Hughes', '123 Fake Street', 'Belfast');
35
- INSERT INTO Tasks (PersonID, TaskName, Completed) VALUES (1, 'assembling', TRUE);
36
- INSERT INTO Tasks (PersonID, TaskName, Completed) VALUES (1, 'processing', FALSE);
39
+ INSERT INTO Persons (FirstName, LastName, Address, City) Values ('John', 'Smith', '64 Updown Road', 'Dublin');
40
+ INSERT INTO Tasks (ExecutorID, QaID, TaskName, Completed) VALUES (1, 2, 'assembling', TRUE);
41
+ INSERT INTO Tasks (ExecutorID, QaID, TaskName, Completed) VALUES (2, 1, 'processing', FALSE);
37
42
  INSERT INTO Products (ProductName) VALUES ('Computers');
38
43
  INSERT INTO Products (ProductName) VALUES ('Laptops');
39
44
  INSERT INTO Products (ProductName) VALUES ('Chairs');
@@ -30,4 +30,4 @@ process.env.ALLOW_DEV_AUTOMATIONS = "1"
30
30
  const server = require("../src/app")
31
31
  process.env.PORT = WORKER_PORT
32
32
  const worker = require("../../worker/src/index")
33
- process.env.PORT = MAIN_PORT
33
+ process.env.PORT = MAIN_PORT
@@ -1,4 +1,3 @@
1
- const CouchDB = require("../../db")
2
1
  const env = require("../../environment")
3
2
  const packageJson = require("../../../package.json")
4
3
  const {
@@ -29,14 +28,11 @@ const { processObject } = require("@budibase/string-templates")
29
28
  const {
30
29
  getAllApps,
31
30
  isDevAppID,
32
- getDeployedAppID,
31
+ getProdAppID,
33
32
  Replication,
34
33
  } = require("@budibase/backend-core/db")
35
34
  const { USERS_TABLE_SCHEMA } = require("../../constants")
36
- const {
37
- getDeployedApps,
38
- removeAppFromUserRoles,
39
- } = require("../../utilities/workerRequests")
35
+ const { removeAppFromUserRoles } = require("../../utilities/workerRequests")
40
36
  const { clientLibraryPath, stringToReadStream } = require("../../utilities")
41
37
  const { getAllLocks } = require("../../utilities/redis")
42
38
  const {
@@ -48,11 +44,17 @@ const { getTenantId, isMultiTenant } = require("@budibase/backend-core/tenancy")
48
44
  const { syncGlobalUsers } = require("./user")
49
45
  const { app: appCache } = require("@budibase/backend-core/cache")
50
46
  const { cleanupAutomations } = require("../../automations/utils")
47
+ const {
48
+ getAppDB,
49
+ getProdAppDB,
50
+ updateAppId,
51
+ } = require("@budibase/backend-core/context")
51
52
 
52
53
  const URL_REGEX_SLASH = /\/|\\/g
53
54
 
54
55
  // utility function, need to do away with this
55
- async function getLayouts(db) {
56
+ async function getLayouts() {
57
+ const db = getAppDB()
56
58
  return (
57
59
  await db.allDocs(
58
60
  getLayoutParams(null, {
@@ -62,7 +64,8 @@ async function getLayouts(db) {
62
64
  ).rows.map(row => row.doc)
63
65
  }
64
66
 
65
- async function getScreens(db) {
67
+ async function getScreens() {
68
+ const db = getAppDB()
66
69
  return (
67
70
  await db.allDocs(
68
71
  getScreenParams(null, {
@@ -78,37 +81,51 @@ function getUserRoleId(ctx) {
78
81
  : ctx.user.role._id
79
82
  }
80
83
 
81
- async function getAppUrlIfNotInUse(ctx) {
84
+ exports.getAppUrl = ctx => {
85
+ // construct the url
82
86
  let url
83
87
  if (ctx.request.body.url) {
88
+ // if the url is provided, use that
84
89
  url = encodeURI(ctx.request.body.url)
85
90
  } else if (ctx.request.body.name) {
91
+ // otherwise use the name
86
92
  url = encodeURI(`${ctx.request.body.name}`)
87
93
  }
88
94
  if (url) {
89
95
  url = `/${url.replace(URL_REGEX_SLASH, "")}`.toLowerCase()
90
96
  }
91
- if (!env.SELF_HOSTED) {
92
- return url
97
+ return url
98
+ }
99
+
100
+ const checkAppUrl = (ctx, apps, url, currentAppId) => {
101
+ if (currentAppId) {
102
+ apps = apps.filter(app => app.appId !== currentAppId)
93
103
  }
94
- const deployedApps = await getDeployedApps()
95
- if (
96
- url &&
97
- deployedApps[url] != null &&
98
- ctx.params != null &&
99
- deployedApps[url].appId !== ctx.params.appId
100
- ) {
101
- ctx.throw(400, "App name/URL is already in use.")
104
+ if (apps.some(app => app.url === url)) {
105
+ ctx.throw(400, "App URL is already in use.")
106
+ }
107
+ }
108
+
109
+ const checkAppName = (ctx, apps, name, currentAppId) => {
110
+ // TODO: Replace with Joi
111
+ if (!name) {
112
+ ctx.throw(400, "Name is required")
113
+ }
114
+ if (currentAppId) {
115
+ apps = apps.filter(app => app.appId !== currentAppId)
116
+ }
117
+ if (apps.some(app => app.name === name)) {
118
+ ctx.throw(400, "App name is already in use.")
102
119
  }
103
- return url
104
120
  }
105
121
 
106
122
  async function createInstance(template) {
107
123
  const tenantId = isMultiTenant() ? getTenantId() : null
108
124
  const baseAppId = generateAppID(tenantId)
109
125
  const appId = generateDevAppID(baseAppId)
126
+ updateAppId(appId)
110
127
 
111
- const db = new CouchDB(appId)
128
+ const db = getAppDB()
112
129
  await db.put({
113
130
  _id: "_design/database",
114
131
  // view collation information, read before writing any complex views:
@@ -118,9 +135,9 @@ async function createInstance(template) {
118
135
 
119
136
  // NOTE: indexes need to be created before any tables/templates
120
137
  // add view for linked rows
121
- await createLinkView(appId)
122
- await createRoutingView(appId)
123
- await createAllSearchIndex(appId)
138
+ await createLinkView()
139
+ await createRoutingView()
140
+ await createAllSearchIndex()
124
141
 
125
142
  // replicate the template data to the instance DB
126
143
  // this is currently very hard to test, downloading and importing template files
@@ -146,7 +163,7 @@ async function createInstance(template) {
146
163
  exports.fetch = async ctx => {
147
164
  const dev = ctx.query && ctx.query.status === AppStatus.DEV
148
165
  const all = ctx.query && ctx.query.status === AppStatus.ALL
149
- const apps = await getAllApps(CouchDB, { dev, all })
166
+ const apps = await getAllApps({ dev, all })
150
167
 
151
168
  // get the locks for all the dev apps
152
169
  if (dev || all) {
@@ -169,12 +186,11 @@ exports.fetch = async ctx => {
169
186
  }
170
187
 
171
188
  exports.fetchAppDefinition = async ctx => {
172
- const db = new CouchDB(ctx.params.appId)
173
- const layouts = await getLayouts(db)
189
+ const layouts = await getLayouts()
174
190
  const userRoleId = getUserRoleId(ctx)
175
- const accessController = new AccessController(ctx.params.appId)
191
+ const accessController = new AccessController()
176
192
  const screens = await accessController.checkScreensAccess(
177
- await getScreens(db),
193
+ await getScreens(),
178
194
  userRoleId
179
195
  )
180
196
  ctx.body = {
@@ -185,15 +201,15 @@ exports.fetchAppDefinition = async ctx => {
185
201
  }
186
202
 
187
203
  exports.fetchAppPackage = async ctx => {
188
- const db = new CouchDB(ctx.params.appId)
204
+ const db = getAppDB()
189
205
  const application = await db.get(DocumentTypes.APP_METADATA)
190
- const layouts = await getLayouts(db)
191
- let screens = await getScreens(db)
206
+ const layouts = await getLayouts()
207
+ let screens = await getScreens()
192
208
 
193
209
  // Only filter screens if the user is not a builder
194
210
  if (!(ctx.user.builder && ctx.user.builder.global)) {
195
211
  const userRoleId = getUserRoleId(ctx)
196
- const accessController = new AccessController(ctx.params.appId)
212
+ const accessController = new AccessController()
197
213
  screens = await accessController.checkScreensAccess(screens, userRoleId)
198
214
  }
199
215
 
@@ -206,6 +222,12 @@ exports.fetchAppPackage = async ctx => {
206
222
  }
207
223
 
208
224
  exports.create = async ctx => {
225
+ const apps = await getAllApps({ dev: true })
226
+ const name = ctx.request.body.name
227
+ checkAppName(ctx, apps, name)
228
+ const url = exports.getAppUrl(ctx)
229
+ checkAppUrl(ctx, apps, url)
230
+
209
231
  const { useTemplate, templateKey, templateString } = ctx.request.body
210
232
  const instanceConfig = {
211
233
  useTemplate,
@@ -218,8 +240,7 @@ exports.create = async ctx => {
218
240
  const instance = await createInstance(instanceConfig)
219
241
  const appId = instance._id
220
242
 
221
- const url = await getAppUrlIfNotInUse(ctx)
222
- const db = new CouchDB(appId)
243
+ const db = getAppDB()
223
244
  let _rev
224
245
  try {
225
246
  // if template there will be an existing doc
@@ -235,7 +256,7 @@ exports.create = async ctx => {
235
256
  type: "app",
236
257
  version: packageJson.version,
237
258
  componentLibraries: ["@budibase/standard-components"],
238
- name: ctx.request.body.name,
259
+ name: name,
239
260
  url: url,
240
261
  template: ctx.request.body.template,
241
262
  instance: instance,
@@ -262,15 +283,29 @@ exports.create = async ctx => {
262
283
  ctx.body = newApplication
263
284
  }
264
285
 
286
+ // This endpoint currently operates as a PATCH rather than a PUT
287
+ // Thus name and url fields are handled only if present
265
288
  exports.update = async ctx => {
266
- const data = await updateAppPackage(ctx, ctx.request.body, ctx.params.appId)
289
+ const apps = await getAllApps({ dev: true })
290
+ // validation
291
+ const name = ctx.request.body.name
292
+ if (name) {
293
+ checkAppName(ctx, apps, name, ctx.params.appId)
294
+ }
295
+ const url = await exports.getAppUrl(ctx)
296
+ if (url) {
297
+ checkAppUrl(ctx, apps, url, ctx.params.appId)
298
+ ctx.request.body.url = url
299
+ }
300
+
301
+ const data = await updateAppPackage(ctx.request.body, ctx.params.appId)
267
302
  ctx.status = 200
268
303
  ctx.body = data
269
304
  }
270
305
 
271
306
  exports.updateClient = async ctx => {
272
307
  // Get current app version
273
- const db = new CouchDB(ctx.params.appId)
308
+ const db = getAppDB()
274
309
  const application = await db.get(DocumentTypes.APP_METADATA)
275
310
  const currentVersion = application.version
276
311
 
@@ -285,14 +320,14 @@ exports.updateClient = async ctx => {
285
320
  version: packageJson.version,
286
321
  revertableVersion: currentVersion,
287
322
  }
288
- const data = await updateAppPackage(ctx, appPackageUpdates, ctx.params.appId)
323
+ const data = await updateAppPackage(appPackageUpdates, ctx.params.appId)
289
324
  ctx.status = 200
290
325
  ctx.body = data
291
326
  }
292
327
 
293
328
  exports.revertClient = async ctx => {
294
329
  // Check app can be reverted
295
- const db = new CouchDB(ctx.params.appId)
330
+ const db = getAppDB()
296
331
  const application = await db.get(DocumentTypes.APP_METADATA)
297
332
  if (!application.revertableVersion) {
298
333
  ctx.throw(400, "There is no version to revert to")
@@ -308,13 +343,13 @@ exports.revertClient = async ctx => {
308
343
  version: application.revertableVersion,
309
344
  revertableVersion: null,
310
345
  }
311
- const data = await updateAppPackage(ctx, appPackageUpdates, ctx.params.appId)
346
+ const data = await updateAppPackage(appPackageUpdates, ctx.params.appId)
312
347
  ctx.status = 200
313
348
  ctx.body = data
314
349
  }
315
350
 
316
351
  exports.delete = async ctx => {
317
- const db = new CouchDB(ctx.params.appId)
352
+ const db = getAppDB()
318
353
 
319
354
  const result = await db.destroy()
320
355
  /* istanbul ignore next */
@@ -339,10 +374,11 @@ exports.sync = async (ctx, next) => {
339
374
  }
340
375
 
341
376
  // replicate prod to dev
342
- const prodAppId = getDeployedAppID(appId)
377
+ const prodAppId = getProdAppID(appId)
343
378
 
344
379
  try {
345
- const prodDb = new CouchDB(prodAppId, { skip_setup: true })
380
+ // specific case, want to make sure setup is skipped
381
+ const prodDb = getProdAppDB({ skip_setup: true })
346
382
  const info = await prodDb.info()
347
383
  if (info.error) throw info.error
348
384
  } catch (err) {
@@ -370,7 +406,7 @@ exports.sync = async (ctx, next) => {
370
406
  }
371
407
 
372
408
  // sync the users
373
- await syncGlobalUsers(appId)
409
+ await syncGlobalUsers()
374
410
 
375
411
  if (error) {
376
412
  ctx.throw(400, error)
@@ -381,12 +417,11 @@ exports.sync = async (ctx, next) => {
381
417
  }
382
418
  }
383
419
 
384
- const updateAppPackage = async (ctx, appPackage, appId) => {
385
- const url = await getAppUrlIfNotInUse(ctx)
386
- const db = new CouchDB(appId)
420
+ const updateAppPackage = async (appPackage, appId) => {
421
+ const db = getAppDB()
387
422
  const application = await db.get(DocumentTypes.APP_METADATA)
388
423
 
389
- const newAppPackage = { ...application, ...appPackage, url }
424
+ const newAppPackage = { ...application, ...appPackage }
390
425
  if (appPackage._rev !== application._rev) {
391
426
  newAppPackage._rev = application._rev
392
427
  }
@@ -402,7 +437,7 @@ const updateAppPackage = async (ctx, appPackage, appId) => {
402
437
  }
403
438
 
404
439
  const createEmptyAppPackage = async (ctx, app) => {
405
- const db = new CouchDB(app.appId)
440
+ const db = getAppDB()
406
441
 
407
442
  let screensAndLayouts = []
408
443
  for (let layout of BASE_LAYOUTS) {
@@ -1,11 +1,10 @@
1
- const CouchDB = require("../../db")
2
1
  const { outputProcessing } = require("../../utilities/rowProcessor")
3
2
  const { InternalTables } = require("../../db/utils")
4
3
  const { getFullUser } = require("../../utilities/users")
5
4
  const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles")
5
+ const { getAppDB, getAppId } = require("@budibase/backend-core/context")
6
6
 
7
7
  exports.fetchSelf = async ctx => {
8
- const appId = ctx.appId
9
8
  let userId = ctx.user.userId || ctx.user._id
10
9
  /* istanbul ignore next */
11
10
  if (!userId) {
@@ -16,16 +15,20 @@ exports.fetchSelf = async ctx => {
16
15
  const user = await getFullUser(ctx, userId)
17
16
  // this shouldn't be returned by the app self
18
17
  delete user.roles
18
+ // forward the csrf token from the session
19
+ user.csrfToken = ctx.user.csrfToken
19
20
 
20
- if (appId) {
21
- const db = new CouchDB(appId)
21
+ if (getAppId()) {
22
+ const db = getAppDB()
22
23
  // remove the full roles structure
23
24
  delete user.roles
24
25
  try {
25
26
  const userTable = await db.get(InternalTables.USER_METADATA)
26
27
  const metadata = await db.get(userId)
28
+ // make sure there is never a stale csrf token
29
+ delete metadata.csrfToken
27
30
  // specifically needs to make sure is enriched
28
- ctx.body = await outputProcessing(ctx, userTable, {
31
+ ctx.body = await outputProcessing(userTable, {
29
32
  ...user,
30
33
  ...metadata,
31
34
  })
@@ -1,4 +1,3 @@
1
- const CouchDB = require("../../db")
2
1
  const actions = require("../../automations/actions")
3
2
  const triggers = require("../../automations/triggers")
4
3
  const { getAutomationParams, generateAutomationID } = require("../../db/utils")
@@ -10,6 +9,7 @@ const {
10
9
  const { deleteEntityMetadata } = require("../../utilities")
11
10
  const { MetadataTypes } = require("../../constants")
12
11
  const { setTestFlag, clearTestFlag } = require("../../utilities/redis")
12
+ const { getAppDB } = require("@budibase/backend-core/context")
13
13
 
14
14
  const ACTION_DEFS = removeDeprecated(actions.ACTION_DEFINITIONS)
15
15
  const TRIGGER_DEFS = removeDeprecated(triggers.TRIGGER_DEFINITIONS)
@@ -20,14 +20,9 @@ const TRIGGER_DEFS = removeDeprecated(triggers.TRIGGER_DEFINITIONS)
20
20
  * *
21
21
  *************************/
22
22
 
23
- async function cleanupAutomationMetadata(appId, automationId) {
23
+ async function cleanupAutomationMetadata(automationId) {
24
+ await deleteEntityMetadata(MetadataTypes.AUTOMATION_TEST_INPUT, automationId)
24
25
  await deleteEntityMetadata(
25
- appId,
26
- MetadataTypes.AUTOMATION_TEST_INPUT,
27
- automationId
28
- )
29
- await deleteEntityMetadata(
30
- appId,
31
26
  MetadataTypes.AUTOMATION_TEST_HISTORY,
32
27
  automationId
33
28
  )
@@ -58,7 +53,7 @@ function cleanAutomationInputs(automation) {
58
53
  }
59
54
 
60
55
  exports.create = async function (ctx) {
61
- const db = new CouchDB(ctx.appId)
56
+ const db = getAppDB()
62
57
  let automation = ctx.request.body
63
58
  automation.appId = ctx.appId
64
59
 
@@ -72,7 +67,6 @@ exports.create = async function (ctx) {
72
67
  automation.type = "automation"
73
68
  automation = cleanAutomationInputs(automation)
74
69
  automation = await checkForWebhooks({
75
- appId: ctx.appId,
76
70
  newAuto: automation,
77
71
  })
78
72
  const response = await db.put(automation)
@@ -89,13 +83,12 @@ exports.create = async function (ctx) {
89
83
  }
90
84
 
91
85
  exports.update = async function (ctx) {
92
- const db = new CouchDB(ctx.appId)
86
+ const db = getAppDB()
93
87
  let automation = ctx.request.body
94
88
  automation.appId = ctx.appId
95
89
  const oldAutomation = await db.get(automation._id)
96
90
  automation = cleanAutomationInputs(automation)
97
91
  automation = await checkForWebhooks({
98
- appId: ctx.appId,
99
92
  oldAuto: oldAutomation,
100
93
  newAuto: automation,
101
94
  })
@@ -131,7 +124,7 @@ exports.update = async function (ctx) {
131
124
  }
132
125
 
133
126
  exports.fetch = async function (ctx) {
134
- const db = new CouchDB(ctx.appId)
127
+ const db = getAppDB()
135
128
  const response = await db.allDocs(
136
129
  getAutomationParams(null, {
137
130
  include_docs: true,
@@ -141,20 +134,19 @@ exports.fetch = async function (ctx) {
141
134
  }
142
135
 
143
136
  exports.find = async function (ctx) {
144
- const db = new CouchDB(ctx.appId)
137
+ const db = getAppDB()
145
138
  ctx.body = await db.get(ctx.params.id)
146
139
  }
147
140
 
148
141
  exports.destroy = async function (ctx) {
149
- const db = new CouchDB(ctx.appId)
142
+ const db = getAppDB()
150
143
  const automationId = ctx.params.id
151
144
  const oldAutomation = await db.get(automationId)
152
145
  await checkForWebhooks({
153
- appId: ctx.appId,
154
146
  oldAuto: oldAutomation,
155
147
  })
156
148
  // delete metadata first
157
- await cleanupAutomationMetadata(ctx.appId, automationId)
149
+ await cleanupAutomationMetadata(automationId)
158
150
  ctx.body = await db.remove(automationId, ctx.params.rev)
159
151
  }
160
152
 
@@ -180,12 +172,11 @@ module.exports.getDefinitionList = async function (ctx) {
180
172
  *********************/
181
173
 
182
174
  exports.trigger = async function (ctx) {
183
- const appId = ctx.appId
184
- const db = new CouchDB(appId)
175
+ const db = getAppDB()
185
176
  let automation = await db.get(ctx.params.id)
186
177
  await triggers.externalTrigger(automation, {
187
178
  ...ctx.request.body,
188
- appId,
179
+ appId: ctx.appId,
189
180
  })
190
181
  ctx.body = {
191
182
  message: `Automation ${automation._id} has been triggered.`,
@@ -205,8 +196,7 @@ function prepareTestInput(input) {
205
196
  }
206
197
 
207
198
  exports.test = async function (ctx) {
208
- const appId = ctx.appId
209
- const db = new CouchDB(appId)
199
+ const db = getAppDB()
210
200
  let automation = await db.get(ctx.params.id)
211
201
  await setTestFlag(automation._id)
212
202
  const testInput = prepareTestInput(ctx.request.body)
@@ -214,7 +204,7 @@ exports.test = async function (ctx) {
214
204
  automation,
215
205
  {
216
206
  ...testInput,
217
- appId,
207
+ appId: ctx.appId,
218
208
  },
219
209
  { getResponses: true }
220
210
  )
@@ -1,6 +1,5 @@
1
1
  const env = require("../../environment")
2
2
  const { getAllApps } = require("@budibase/backend-core/db")
3
- const CouchDB = require("../../db")
4
3
  const {
5
4
  exportDB,
6
5
  sendTempFile,
@@ -30,7 +29,7 @@ exports.exportApps = async ctx => {
30
29
  if (env.SELF_HOSTED || !env.MULTI_TENANCY) {
31
30
  ctx.throw(400, "Exporting only allowed in multi-tenant cloud environments.")
32
31
  }
33
- const apps = await getAllApps(CouchDB, { all: true })
32
+ const apps = await getAllApps({ all: true })
34
33
  const globalDBString = await exportDB(getGlobalDBName(), {
35
34
  filter: doc => !doc._id.startsWith(DocumentTypes.USER),
36
35
  })
@@ -63,7 +62,7 @@ async function hasBeenImported() {
63
62
  if (!env.SELF_HOSTED || env.MULTI_TENANCY) {
64
63
  return true
65
64
  }
66
- const apps = await getAllApps(CouchDB, { all: true })
65
+ const apps = await getAllApps({ all: true })
67
66
  return apps.length !== 0
68
67
  }
69
68
 
@@ -1,15 +1,14 @@
1
- const CouchDB = require("../../db")
2
1
  const { DocumentTypes } = require("../../db/utils")
3
2
  const { getComponentLibraryManifest } = require("../../utilities/fileSystem")
3
+ const { getAppDB } = require("@budibase/backend-core/context")
4
4
 
5
5
  exports.fetchAppComponentDefinitions = async function (ctx) {
6
- const appId = ctx.params.appId || ctx.appId
7
- const db = new CouchDB(appId)
6
+ const db = getAppDB()
8
7
  const app = await db.get(DocumentTypes.APP_METADATA)
9
8
 
10
9
  let componentManifests = await Promise.all(
11
10
  app.componentLibraries.map(async library => {
12
- let manifest = await getComponentLibraryManifest(appId, library)
11
+ let manifest = await getComponentLibraryManifest(library)
13
12
 
14
13
  return {
15
14
  manifest,