@budibase/server 1.0.49-alpha.9 → 1.0.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (379) hide show
  1. package/__mocks__/arangojs.ts +1 -1
  2. package/__mocks__/aws-sdk.ts +4 -4
  3. package/__mocks__/mongodb.ts +5 -4
  4. package/__mocks__/mssql.ts +3 -3
  5. package/__mocks__/node-fetch.ts +1 -2
  6. package/__mocks__/pg.ts +5 -3
  7. package/builder/assets/{index.ad5370ae.js → index.2c37968e.js} +246 -249
  8. package/builder/assets/index.39e01193.css +1 -0
  9. package/builder/assets/{vendor.d526bfe8.js → vendor.f9faf6ab.js} +12 -12
  10. package/builder/index.html +3 -3
  11. package/coverage/clover.xml +2827 -3117
  12. package/coverage/coverage-final.json +101 -106
  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 +152 -257
  16. package/coverage/lcov-report/api/controllers/auth.js.html +13 -22
  17. package/coverage/lcov-report/api/controllers/automation.js.html +69 -39
  18. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/cloud.js.html +11 -8
  20. package/coverage/lcov-report/api/controllers/component.js.html +16 -13
  21. package/coverage/lcov-report/api/controllers/datasource.js.html +51 -81
  22. package/coverage/lcov-report/api/controllers/dev.js.html +6 -6
  23. package/coverage/lcov-report/{utilities/usageQuota/usageQuoteReset.js.html → api/controllers/hosting.js.html} +48 -36
  24. package/coverage/lcov-report/api/controllers/index.html +76 -76
  25. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  26. package/coverage/lcov-report/api/controllers/layout.js.html +9 -9
  27. package/coverage/lcov-report/api/controllers/metadata.js.html +21 -6
  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 +35 -38
  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 +10 -7
  34. package/coverage/lcov-report/api/controllers/row/external.js.html +141 -48
  35. package/coverage/lcov-report/api/controllers/row/index.html +40 -55
  36. package/coverage/lcov-report/api/controllers/row/index.js.html +26 -26
  37. package/coverage/lcov-report/api/controllers/row/internal.js.html +226 -118
  38. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +34 -52
  39. package/coverage/lcov-report/api/controllers/row/utils.js.html +62 -47
  40. package/coverage/lcov-report/api/controllers/screen.js.html +21 -15
  41. package/coverage/lcov-report/api/controllers/script.js.html +4 -4
  42. package/coverage/lcov-report/api/controllers/table/external.js.html +34 -25
  43. package/coverage/lcov-report/api/controllers/table/index.html +43 -58
  44. package/coverage/lcov-report/api/controllers/table/index.js.html +82 -58
  45. package/coverage/lcov-report/api/controllers/table/internal.js.html +66 -81
  46. package/coverage/lcov-report/api/controllers/table/utils.js.html +110 -218
  47. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  48. package/coverage/lcov-report/api/controllers/user.js.html +50 -47
  49. package/coverage/lcov-report/api/controllers/view/exporters.js.html +4 -4
  50. package/coverage/lcov-report/api/controllers/view/index.html +16 -16
  51. package/coverage/lcov-report/api/controllers/view/index.js.html +33 -27
  52. package/coverage/lcov-report/api/controllers/view/utils.js.html +20 -35
  53. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +7 -7
  54. package/coverage/lcov-report/api/controllers/webhook.js.html +28 -34
  55. package/coverage/lcov-report/api/index.html +1 -1
  56. package/coverage/lcov-report/api/index.js.html +8 -8
  57. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/{migrations.js.html → hosting.js.html} +14 -17
  69. package/coverage/lcov-report/api/routes/index.html +18 -18
  70. package/coverage/lcov-report/api/routes/index.js.html +3 -3
  71. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  76. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  79. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  80. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  81. package/coverage/lcov-report/api/routes/static.js.html +2 -17
  82. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  83. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  84. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  85. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  86. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  87. package/coverage/lcov-report/automations/actions.js.html +24 -24
  88. package/coverage/lcov-report/automations/automationUtils.js.html +10 -7
  89. package/coverage/lcov-report/automations/bullboard.js.html +16 -16
  90. package/coverage/lcov-report/automations/index.html +18 -18
  91. package/coverage/lcov-report/automations/index.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/bash.js.html +6 -6
  93. package/coverage/lcov-report/automations/steps/createRow.js.html +22 -13
  94. package/coverage/lcov-report/automations/steps/delay.js.html +4 -4
  95. package/coverage/lcov-report/automations/steps/deleteRow.js.html +20 -11
  96. package/coverage/lcov-report/automations/steps/discord.js.html +7 -7
  97. package/coverage/lcov-report/automations/steps/executeQuery.js.html +6 -6
  98. package/coverage/lcov-report/automations/steps/executeScript.js.html +6 -6
  99. package/coverage/lcov-report/automations/steps/filter.js.html +7 -7
  100. package/coverage/lcov-report/automations/steps/index.html +13 -13
  101. package/coverage/lcov-report/automations/steps/integromat.js.html +5 -5
  102. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +8 -8
  103. package/coverage/lcov-report/automations/steps/queryRows.js.html +10 -10
  104. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +5 -5
  105. package/coverage/lcov-report/automations/steps/serverLog.js.html +3 -3
  106. package/coverage/lcov-report/automations/steps/slack.js.html +5 -5
  107. package/coverage/lcov-report/automations/steps/updateRow.js.html +7 -7
  108. package/coverage/lcov-report/automations/steps/utils.js.html +3 -3
  109. package/coverage/lcov-report/automations/steps/zapier.js.html +5 -5
  110. package/coverage/lcov-report/automations/triggerInfo/app.js.html +2 -2
  111. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +2 -2
  112. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  113. package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -8
  114. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +2 -2
  115. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +2 -2
  116. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +2 -2
  117. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +2 -2
  118. package/coverage/lcov-report/automations/triggers.js.html +55 -61
  119. package/coverage/lcov-report/automations/utils.js.html +42 -54
  120. package/coverage/lcov-report/constants/index.html +5 -5
  121. package/coverage/lcov-report/constants/index.js.html +26 -53
  122. package/coverage/lcov-report/constants/layouts.js.html +5 -5
  123. package/coverage/lcov-report/constants/screens.js.html +4 -4
  124. package/coverage/lcov-report/db/client.js.html +18 -18
  125. package/coverage/lcov-report/db/inMemoryView.js.html +7 -7
  126. package/coverage/lcov-report/db/index.html +15 -15
  127. package/coverage/lcov-report/db/index.js.html +3 -3
  128. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +37 -25
  129. package/coverage/lcov-report/db/linkedRows/index.html +27 -27
  130. package/coverage/lcov-report/db/linkedRows/index.js.html +96 -51
  131. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +42 -42
  132. package/coverage/lcov-report/db/newid.js.html +4 -4
  133. package/coverage/lcov-report/db/utils.js.html +87 -87
  134. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  135. package/coverage/lcov-report/events/index.html +1 -1
  136. package/coverage/lcov-report/events/index.js.html +5 -5
  137. package/coverage/lcov-report/events/utils.js.html +3 -3
  138. package/coverage/lcov-report/index.html +120 -135
  139. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  140. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  141. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  142. package/coverage/lcov-report/middleware/authorized.js.html +65 -173
  143. package/coverage/lcov-report/middleware/builder.js.html +10 -10
  144. package/coverage/lcov-report/middleware/currentapp.js.html +83 -95
  145. package/coverage/lcov-report/middleware/index.html +38 -38
  146. package/coverage/lcov-report/middleware/joi-validator.js.html +3 -3
  147. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  148. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  149. package/coverage/lcov-report/middleware/usageQuota.js.html +53 -281
  150. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  151. package/coverage/lcov-report/threads/automation.js.html +24 -30
  152. package/coverage/lcov-report/threads/index.html +26 -26
  153. package/coverage/lcov-report/threads/index.js.html +10 -10
  154. package/coverage/lcov-report/threads/query.js.html +24 -39
  155. package/coverage/lcov-report/threads/utils.js.html +14 -14
  156. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  157. package/coverage/lcov-report/utilities/budibaseDir.js.html +7 -7
  158. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  159. package/coverage/lcov-report/utilities/csvParser.js.html +6 -6
  160. package/coverage/lcov-report/utilities/global.js.html +49 -58
  161. package/coverage/lcov-report/utilities/index.html +37 -37
  162. package/coverage/lcov-report/utilities/index.js.html +73 -43
  163. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +8 -8
  164. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  165. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  166. package/coverage/lcov-report/utilities/routing/index.js.html +7 -7
  167. package/coverage/lcov-report/utilities/rowProcessor/index.html +27 -27
  168. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +103 -97
  169. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +27 -75
  170. package/coverage/lcov-report/utilities/scriptRunner.js.html +5 -5
  171. package/coverage/lcov-report/utilities/security.js.html +8 -8
  172. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  173. package/coverage/lcov-report/utilities/users.js.html +9 -9
  174. package/coverage/lcov-report/utilities/workerRequests.js.html +112 -43
  175. package/coverage/lcov.info +4431 -5013
  176. package/dist/api/controllers/application.js +60 -90
  177. package/dist/api/controllers/auth.js +5 -8
  178. package/dist/api/controllers/automation.js +19 -14
  179. package/dist/api/controllers/cloud.js +3 -2
  180. package/dist/api/controllers/component.js +4 -3
  181. package/dist/api/controllers/datasource.js +10 -20
  182. package/dist/api/controllers/deploy/Deployment.js +6 -3
  183. package/dist/api/controllers/deploy/index.js +13 -12
  184. package/dist/api/controllers/dev.js +5 -5
  185. package/dist/api/controllers/hosting.js +30 -0
  186. package/dist/api/controllers/layout.js +3 -3
  187. package/dist/api/controllers/metadata.js +4 -4
  188. package/dist/api/controllers/permission.js +4 -4
  189. package/dist/api/controllers/query/import/index.js +6 -4
  190. package/dist/api/controllers/query/index.js +10 -11
  191. package/dist/api/controllers/role.js +5 -5
  192. package/dist/api/controllers/routing.js +6 -5
  193. package/dist/api/controllers/row/ExternalRequest.js +67 -90
  194. package/dist/api/controllers/row/external.js +22 -14
  195. package/dist/api/controllers/row/internal.js +93 -55
  196. package/dist/api/controllers/row/internalSearch.js +17 -23
  197. package/dist/api/controllers/row/utils.js +14 -13
  198. package/dist/api/controllers/screen.js +7 -5
  199. package/dist/api/controllers/static/index.js +12 -61
  200. package/dist/api/controllers/table/external.js +10 -7
  201. package/dist/api/controllers/table/index.js +13 -16
  202. package/dist/api/controllers/table/internal.js +16 -22
  203. package/dist/api/controllers/table/utils.js +35 -62
  204. package/dist/api/controllers/user.js +20 -18
  205. package/dist/api/controllers/view/index.js +10 -8
  206. package/dist/api/controllers/view/utils.js +4 -9
  207. package/dist/api/controllers/webhook.js +8 -10
  208. package/dist/api/routes/hosting.js +11 -0
  209. package/dist/api/routes/index.js +2 -2
  210. package/dist/api/routes/static.js +1 -2
  211. package/dist/api/routes/tests/utilities/TestFunctions.js +17 -37
  212. package/dist/app.js +5 -35
  213. package/dist/automations/automationUtils.js +3 -2
  214. package/dist/automations/steps/createRow.js +5 -3
  215. package/dist/automations/steps/deleteRow.js +4 -1
  216. package/dist/automations/steps/updateRow.js +1 -1
  217. package/dist/automations/triggers.js +25 -27
  218. package/dist/automations/utils.js +5 -10
  219. package/dist/constants/index.js +0 -7
  220. package/dist/db/linkedRows/LinkController.js +7 -3
  221. package/dist/db/linkedRows/index.js +27 -16
  222. package/dist/db/linkedRows/linkUtils.js +6 -6
  223. package/dist/db/views/staticViews.js +10 -9
  224. package/dist/definitions/datasource.js +0 -1
  225. package/dist/environment.js +1 -4
  226. package/dist/integrations/base/sql.js +14 -56
  227. package/dist/integrations/index.js +0 -3
  228. package/dist/integrations/utils.js +9 -60
  229. package/dist/middleware/authorized.js +30 -57
  230. package/dist/middleware/builder.js +2 -2
  231. package/dist/middleware/currentapp.js +37 -41
  232. package/dist/middleware/usageQuota.js +15 -82
  233. package/dist/package.json +5 -8
  234. package/dist/tests/utilities/TestConfiguration.js +50 -80
  235. package/dist/threads/automation.js +11 -13
  236. package/dist/threads/query.js +11 -15
  237. package/dist/tsconfig.tsbuildinfo +1 -1
  238. package/dist/utilities/fileSystem/index.js +3 -4
  239. package/dist/utilities/global.js +12 -15
  240. package/dist/utilities/index.js +17 -7
  241. package/dist/utilities/routing/index.js +5 -5
  242. package/dist/utilities/rowProcessor/index.js +17 -23
  243. package/dist/utilities/rowProcessor/utils.js +4 -14
  244. package/dist/utilities/{usageQuota/index.js → usageQuota.js} +31 -45
  245. package/dist/utilities/users.js +3 -3
  246. package/dist/utilities/workerRequests.js +24 -4
  247. package/nodemon.json +1 -1
  248. package/package.json +6 -9
  249. package/scripts/integrations/postgres/init.sql +6 -11
  250. package/scripts/likeCypress.ts +1 -1
  251. package/src/api/controllers/application.js +50 -85
  252. package/src/api/controllers/auth.js +5 -8
  253. package/src/api/controllers/automation.js +23 -13
  254. package/src/api/controllers/cloud.js +3 -2
  255. package/src/api/controllers/component.js +4 -3
  256. package/src/api/controllers/datasource.js +11 -21
  257. package/src/api/controllers/deploy/Deployment.js +7 -3
  258. package/src/api/controllers/deploy/index.js +13 -20
  259. package/src/api/controllers/dev.js +5 -5
  260. package/src/api/controllers/hosting.js +22 -0
  261. package/src/api/controllers/layout.js +3 -3
  262. package/src/api/controllers/metadata.js +9 -4
  263. package/src/api/controllers/permission.js +4 -4
  264. package/src/api/controllers/query/import/index.ts +6 -4
  265. package/src/api/controllers/query/import/tests/index.spec.js +1 -2
  266. package/src/api/controllers/query/index.js +10 -11
  267. package/src/api/controllers/role.js +5 -5
  268. package/src/api/controllers/routing.js +6 -5
  269. package/src/api/controllers/row/ExternalRequest.ts +43 -67
  270. package/src/api/controllers/row/external.js +58 -27
  271. package/src/api/controllers/row/internal.js +90 -54
  272. package/src/api/controllers/row/internalSearch.js +17 -23
  273. package/src/api/controllers/row/utils.js +18 -13
  274. package/src/api/controllers/screen.js +7 -5
  275. package/src/api/controllers/static/index.js +12 -65
  276. package/src/api/controllers/table/external.js +10 -7
  277. package/src/api/controllers/table/index.js +28 -20
  278. package/src/api/controllers/table/internal.js +19 -24
  279. package/src/api/controllers/table/utils.js +42 -78
  280. package/src/api/controllers/user.js +20 -19
  281. package/src/api/controllers/view/index.js +10 -8
  282. package/src/api/controllers/view/utils.js +4 -9
  283. package/src/api/controllers/webhook.js +8 -10
  284. package/src/api/routes/hosting.js +13 -0
  285. package/src/api/routes/index.js +2 -2
  286. package/src/api/routes/static.js +0 -5
  287. package/src/api/routes/tests/application.spec.js +2 -2
  288. package/src/api/routes/tests/auth.spec.js +2 -1
  289. package/src/api/routes/tests/automation.spec.js +0 -1
  290. package/src/api/routes/tests/hosting.spec.js +36 -0
  291. package/src/api/routes/tests/misc.spec.js +1 -0
  292. package/src/api/routes/tests/routing.spec.js +12 -21
  293. package/src/api/routes/tests/row.spec.js +4 -7
  294. package/src/api/routes/tests/utilities/TestFunctions.js +17 -39
  295. package/src/app.ts +5 -18
  296. package/src/automations/automationUtils.js +3 -2
  297. package/src/automations/steps/createRow.js +5 -2
  298. package/src/automations/steps/deleteRow.js +4 -1
  299. package/src/automations/steps/updateRow.js +1 -1
  300. package/src/automations/triggers.js +31 -33
  301. package/src/automations/utils.js +5 -9
  302. package/src/constants/index.js +0 -9
  303. package/src/db/linkedRows/LinkController.js +7 -3
  304. package/src/db/linkedRows/index.js +31 -16
  305. package/src/db/linkedRows/linkUtils.js +6 -6
  306. package/src/db/tests/linkController.spec.js +1 -0
  307. package/src/db/tests/linkTests.spec.js +6 -5
  308. package/src/db/views/staticViews.js +10 -8
  309. package/src/definitions/common.ts +0 -3
  310. package/src/definitions/datasource.ts +0 -3
  311. package/src/environment.js +1 -4
  312. package/src/integrations/base/sql.ts +21 -69
  313. package/src/integrations/index.ts +0 -3
  314. package/src/integrations/tests/sql.spec.js +0 -16
  315. package/src/integrations/utils.ts +12 -75
  316. package/src/middleware/authorized.js +30 -66
  317. package/src/middleware/builder.js +2 -2
  318. package/src/middleware/currentapp.js +46 -50
  319. package/src/middleware/tests/authorized.spec.js +6 -13
  320. package/src/middleware/tests/currentapp.spec.js +0 -6
  321. package/src/middleware/tests/usageQuota.spec.js +24 -18
  322. package/src/middleware/usageQuota.js +17 -93
  323. package/src/tests/utilities/TestConfiguration.js +55 -82
  324. package/src/threads/automation.js +15 -17
  325. package/src/threads/query.js +12 -17
  326. package/src/utilities/fileSystem/index.js +3 -4
  327. package/src/utilities/global.js +12 -15
  328. package/src/utilities/index.js +17 -7
  329. package/src/utilities/routing/index.js +5 -5
  330. package/src/utilities/rowProcessor/index.js +27 -25
  331. package/src/utilities/rowProcessor/utils.js +7 -23
  332. package/src/utilities/usageQuota.js +73 -0
  333. package/src/utilities/users.js +3 -3
  334. package/src/utilities/workerRequests.js +27 -4
  335. package/tsconfig.json +1 -2
  336. package/builder/assets/index.83c0944f.css +0 -1
  337. package/coverage/lcov-report/api/controllers/migrations.js.html +0 -119
  338. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +0 -548
  339. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +0 -599
  340. package/coverage/lcov-report/utilities/usageQuota/index.html +0 -141
  341. package/coverage/lcov-report/utilities/usageQuota/index.js.html +0 -359
  342. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +0 -305
  343. package/dist/api/controllers/migrations.js +0 -21
  344. package/dist/api/controllers/row/staticFormula.js +0 -147
  345. package/dist/api/controllers/table/bulkFormula.js +0 -159
  346. package/dist/api/routes/migrations.js +0 -9
  347. package/dist/integrations/googlesheets.js +0 -340
  348. package/dist/migrations/functions/appUrls.js +0 -46
  349. package/dist/migrations/functions/quotas1.js +0 -50
  350. package/dist/migrations/functions/usageQuotas/index.js +0 -20
  351. package/dist/migrations/functions/usageQuotas/syncApps.js +0 -29
  352. package/dist/migrations/functions/usageQuotas/syncRows.js +0 -33
  353. package/dist/migrations/functions/userEmailViewCasing.js +0 -24
  354. package/dist/migrations/index.js +0 -62
  355. package/dist/utilities/usageQuota/rows.js +0 -78
  356. package/dist/utilities/usageQuota/usageQuoteReset.js +0 -16
  357. package/src/api/controllers/migrations.js +0 -13
  358. package/src/api/controllers/row/staticFormula.js +0 -156
  359. package/src/api/controllers/table/bulkFormula.js +0 -173
  360. package/src/api/routes/migrations.js +0 -14
  361. package/src/api/routes/tests/static.spec.js +0 -98
  362. package/src/integrations/googlesheets.ts +0 -353
  363. package/src/migrations/functions/appUrls.ts +0 -34
  364. package/src/migrations/functions/quotas1.ts +0 -20
  365. package/src/migrations/functions/tests/appUrls.spec.js +0 -29
  366. package/src/migrations/functions/tests/quotas1.spec.js +0 -27
  367. package/src/migrations/functions/tests/userEmailViewCasing.spec.js +0 -25
  368. package/src/migrations/functions/usageQuotas/index.ts +0 -8
  369. package/src/migrations/functions/usageQuotas/syncApps.ts +0 -18
  370. package/src/migrations/functions/usageQuotas/syncRows.ts +0 -22
  371. package/src/migrations/functions/usageQuotas/tests/syncApps.spec.js +0 -37
  372. package/src/migrations/functions/usageQuotas/tests/syncRows.spec.js +0 -43
  373. package/src/migrations/functions/userEmailViewCasing.ts +0 -13
  374. package/src/migrations/index.ts +0 -56
  375. package/src/module.d.ts +0 -3
  376. package/src/utilities/tests/usageQuota/usageQuota.spec.js +0 -72
  377. package/src/utilities/usageQuota/index.js +0 -93
  378. package/src/utilities/usageQuota/rows.js +0 -75
  379. package/src/utilities/usageQuota/usageQuoteReset.js +0 -18
@@ -1,7 +1,8 @@
1
+ const CouchDB = require("../../../db")
1
2
  const linkRows = require("../../../db/linkedRows")
2
3
  const {
3
- generateRowID,
4
4
  getRowParams,
5
+ generateRowID,
5
6
  DocumentTypes,
6
7
  InternalTables,
7
8
  } = require("../../../db/utils")
@@ -9,9 +10,11 @@ const userController = require("../user")
9
10
  const {
10
11
  inputProcessing,
11
12
  outputProcessing,
13
+ processAutoColumn,
12
14
  cleanupAttachments,
13
15
  } = require("../../../utilities/rowProcessor")
14
16
  const { FieldTypes } = require("../../../constants")
17
+ const { isEqual } = require("lodash")
15
18
  const { validate, findRow } = require("./utils")
16
19
  const { fullSearch, paginatedSearch } = require("./internalSearch")
17
20
  const { getGlobalUsersFromMetadata } = require("../../../utilities/global")
@@ -24,8 +27,6 @@ const {
24
27
  getFromMemoryDoc,
25
28
  } = require("../view/utils")
26
29
  const { cloneDeep } = require("lodash/fp")
27
- const { getAppDB } = require("@budibase/backend-core/context")
28
- const { finaliseRow, updateRelatedFormula } = require("./staticFormula")
29
30
 
30
31
  const CALCULATION_TYPES = {
31
32
  SUM: "sum",
@@ -33,6 +34,51 @@ const CALCULATION_TYPES = {
33
34
  STATS: "stats",
34
35
  }
35
36
 
37
+ async function storeResponse(ctx, db, row, oldTable, table) {
38
+ row.type = "row"
39
+ // don't worry about rev, tables handle rev/lastID updates
40
+ // if another row has been written since processing this will
41
+ // handle the auto ID clash
42
+ if (!isEqual(oldTable, table)) {
43
+ try {
44
+ await db.put(table)
45
+ } catch (err) {
46
+ if (err.status === 409) {
47
+ const updatedTable = await db.get(table._id)
48
+ let response = processAutoColumn(null, updatedTable, row, {
49
+ reprocessing: true,
50
+ })
51
+ await db.put(response.table)
52
+ row = response.row
53
+ } else {
54
+ throw err
55
+ }
56
+ }
57
+ }
58
+ const response = await db.put(row)
59
+ row._rev = response.rev
60
+ // process the row before return, to include relationships
61
+ row = await outputProcessing(ctx, table, row, { squash: false })
62
+ return { row, table }
63
+ }
64
+
65
+ // doesn't do the outputProcessing
66
+ async function getRawTableData(ctx, db, tableId) {
67
+ let rows
68
+ if (tableId === InternalTables.USER_METADATA) {
69
+ await userController.fetchMetadata(ctx)
70
+ rows = ctx.body
71
+ } else {
72
+ const response = await db.allDocs(
73
+ getRowParams(tableId, null, {
74
+ include_docs: true,
75
+ })
76
+ )
77
+ rows = response.rows.map(row => row.doc)
78
+ }
79
+ return rows
80
+ }
81
+
36
82
  async function getView(db, viewName) {
37
83
  let mainGetter = env.SELF_HOSTED ? getFromDesignDoc : getFromMemoryDoc
38
84
  let secondaryGetter = env.SELF_HOSTED ? getFromMemoryDoc : getFromDesignDoc
@@ -59,24 +105,9 @@ async function getView(db, viewName) {
59
105
  return viewInfo
60
106
  }
61
107
 
62
- async function getRawTableData(ctx, db, tableId) {
63
- let rows
64
- if (tableId === InternalTables.USER_METADATA) {
65
- await userController.fetchMetadata(ctx)
66
- rows = ctx.body
67
- } else {
68
- const response = await db.allDocs(
69
- getRowParams(tableId, null, {
70
- include_docs: true,
71
- })
72
- )
73
- rows = response.rows.map(row => row.doc)
74
- }
75
- return rows
76
- }
77
-
78
108
  exports.patch = async ctx => {
79
- const db = getAppDB()
109
+ const appId = ctx.appId
110
+ const db = new CouchDB(appId)
80
111
  const inputs = ctx.request.body
81
112
  const tableId = inputs.tableId
82
113
  const isUserTable = tableId === InternalTables.USER_METADATA
@@ -115,13 +146,14 @@ exports.patch = async ctx => {
115
146
 
116
147
  // returned row is cleaned and prepared for writing to DB
117
148
  row = await linkRows.updateLinks({
149
+ appId,
118
150
  eventType: linkRows.EventType.ROW_UPDATE,
119
151
  row,
120
152
  tableId: row.tableId,
121
153
  table,
122
154
  })
123
155
  // check if any attachments removed
124
- await cleanupAttachments(table, { oldRow, row })
156
+ await cleanupAttachments(appId, table, { oldRow, row })
125
157
 
126
158
  if (isUserTable) {
127
159
  // the row has been updated, need to put it into the ctx
@@ -130,14 +162,12 @@ exports.patch = async ctx => {
130
162
  return { row: ctx.body, table }
131
163
  }
132
164
 
133
- return finaliseRow(table, row, {
134
- oldTable: dbTable,
135
- updateFormula: true,
136
- })
165
+ return storeResponse(ctx, db, row, dbTable, table)
137
166
  }
138
167
 
139
168
  exports.save = async function (ctx) {
140
- const db = getAppDB()
169
+ const appId = ctx.appId
170
+ const db = new CouchDB(appId)
141
171
  let inputs = ctx.request.body
142
172
  inputs.tableId = ctx.params.tableId
143
173
 
@@ -159,19 +189,18 @@ exports.save = async function (ctx) {
159
189
 
160
190
  // make sure link rows are up to date
161
191
  row = await linkRows.updateLinks({
192
+ appId,
162
193
  eventType: linkRows.EventType.ROW_SAVE,
163
194
  row,
164
195
  tableId: row.tableId,
165
196
  table,
166
197
  })
167
198
 
168
- return finaliseRow(table, row, {
169
- oldTable: dbTable,
170
- updateFormula: true,
171
- })
199
+ return storeResponse(ctx, db, row, dbTable, table)
172
200
  }
173
201
 
174
202
  exports.fetchView = async ctx => {
203
+ const appId = ctx.appId
175
204
  const viewName = ctx.params.viewName
176
205
 
177
206
  // if this is a table view being looked for just transfer to that
@@ -180,7 +209,7 @@ exports.fetchView = async ctx => {
180
209
  return exports.fetch(ctx)
181
210
  }
182
211
 
183
- const db = getAppDB()
212
+ const db = new CouchDB(appId)
184
213
  const { calculation, group, field } = ctx.query
185
214
  const viewInfo = await getView(db, viewName)
186
215
  let response
@@ -207,7 +236,7 @@ exports.fetchView = async ctx => {
207
236
  schema: {},
208
237
  }
209
238
  }
210
- rows = await outputProcessing(table, response.rows)
239
+ rows = await outputProcessing(ctx, table, response.rows)
211
240
  }
212
241
 
213
242
  if (calculation === CALCULATION_TYPES.STATS) {
@@ -234,24 +263,27 @@ exports.fetchView = async ctx => {
234
263
  }
235
264
 
236
265
  exports.fetch = async ctx => {
237
- const db = getAppDB()
266
+ const appId = ctx.appId
267
+ const db = new CouchDB(appId)
238
268
 
239
269
  const tableId = ctx.params.tableId
240
270
  let table = await db.get(tableId)
241
271
  let rows = await getRawTableData(ctx, db, tableId)
242
- return outputProcessing(table, rows)
272
+ return outputProcessing(ctx, table, rows)
243
273
  }
244
274
 
245
275
  exports.find = async ctx => {
246
- const db = getAppDB()
276
+ const appId = ctx.appId
277
+ const db = new CouchDB(appId)
247
278
  const table = await db.get(ctx.params.tableId)
248
- let row = await findRow(ctx, ctx.params.tableId, ctx.params.rowId)
249
- row = await outputProcessing(table, row)
279
+ let row = await findRow(ctx, db, ctx.params.tableId, ctx.params.rowId)
280
+ row = await outputProcessing(ctx, table, row)
250
281
  return row
251
282
  }
252
283
 
253
284
  exports.destroy = async function (ctx) {
254
- const db = getAppDB()
285
+ const appId = ctx.appId
286
+ const db = new CouchDB(appId)
255
287
  const { _id, _rev } = ctx.request.body
256
288
  let row = await db.get(_id)
257
289
 
@@ -260,17 +292,16 @@ exports.destroy = async function (ctx) {
260
292
  }
261
293
  const table = await db.get(row.tableId)
262
294
  // update the row to include full relationships before deleting them
263
- row = await outputProcessing(table, row, { squash: false })
295
+ row = await outputProcessing(ctx, table, row, { squash: false })
264
296
  // now remove the relationships
265
297
  await linkRows.updateLinks({
298
+ appId,
266
299
  eventType: linkRows.EventType.ROW_DELETE,
267
300
  row,
268
301
  tableId: row.tableId,
269
302
  })
270
303
  // remove any attachments that were on the row from object storage
271
- await cleanupAttachments(table, { row })
272
- // remove any static formula
273
- await updateRelatedFormula(table, row)
304
+ await cleanupAttachments(appId, table, { row })
274
305
 
275
306
  let response
276
307
  if (ctx.params.tableId === InternalTables.USER_METADATA) {
@@ -286,18 +317,20 @@ exports.destroy = async function (ctx) {
286
317
  }
287
318
 
288
319
  exports.bulkDestroy = async ctx => {
289
- const db = getAppDB()
320
+ const appId = ctx.appId
321
+ const db = new CouchDB(appId)
290
322
  const tableId = ctx.params.tableId
291
323
  const table = await db.get(tableId)
292
324
  let { rows } = ctx.request.body
293
325
 
294
326
  // before carrying out any updates, make sure the rows are ready to be returned
295
327
  // they need to be the full rows (including previous relationships) for automations
296
- rows = await outputProcessing(table, rows, { squash: false })
328
+ rows = await outputProcessing(ctx, table, rows, { squash: false })
297
329
 
298
330
  // remove the relationships first
299
331
  let updates = rows.map(row =>
300
332
  linkRows.updateLinks({
333
+ appId,
301
334
  eventType: linkRows.EventType.ROW_DELETE,
302
335
  row,
303
336
  tableId: row.tableId,
@@ -316,8 +349,7 @@ exports.bulkDestroy = async ctx => {
316
349
  await db.bulkDocs(rows.map(row => ({ ...row, _deleted: true })))
317
350
  }
318
351
  // remove any attachments that were on the rows from object storage
319
- await cleanupAttachments(table, { rows })
320
- await updateRelatedFormula(table, rows)
352
+ await cleanupAttachments(appId, table, { rows })
321
353
  await Promise.all(updates)
322
354
  return { response: { ok: true }, rows }
323
355
  }
@@ -328,27 +360,28 @@ exports.search = async ctx => {
328
360
  return { rows: await exports.fetch(ctx) }
329
361
  }
330
362
 
363
+ const appId = ctx.appId
331
364
  const { tableId } = ctx.params
332
- const db = getAppDB()
365
+ const db = new CouchDB(appId)
333
366
  const { paginate, query, ...params } = ctx.request.body
334
367
  params.version = ctx.version
335
368
  params.tableId = tableId
336
369
 
337
370
  let response
338
371
  if (paginate) {
339
- response = await paginatedSearch(query, params)
372
+ response = await paginatedSearch(appId, query, params)
340
373
  } else {
341
- response = await fullSearch(query, params)
374
+ response = await fullSearch(appId, query, params)
342
375
  }
343
376
 
344
377
  // Enrich search results with relationships
345
378
  if (response.rows && response.rows.length) {
346
379
  // enrich with global users if from users table
347
380
  if (tableId === InternalTables.USER_METADATA) {
348
- response.rows = await getGlobalUsersFromMetadata(response.rows)
381
+ response.rows = await getGlobalUsersFromMetadata(appId, response.rows)
349
382
  }
350
383
  const table = await db.get(tableId)
351
- response.rows = await outputProcessing(table, response.rows)
384
+ response.rows = await outputProcessing(ctx, table, response.rows)
352
385
  }
353
386
 
354
387
  return response
@@ -356,22 +389,25 @@ exports.search = async ctx => {
356
389
 
357
390
  exports.validate = async ctx => {
358
391
  return validate({
392
+ appId: ctx.appId,
359
393
  tableId: ctx.params.tableId,
360
394
  row: ctx.request.body,
361
395
  })
362
396
  }
363
397
 
364
398
  exports.fetchEnrichedRow = async ctx => {
365
- const db = getAppDB()
399
+ const appId = ctx.appId
400
+ const db = new CouchDB(appId)
366
401
  const tableId = ctx.params.tableId
367
402
  const rowId = ctx.params.rowId
368
403
  // need table to work out where links go in row
369
404
  let [table, row] = await Promise.all([
370
405
  db.get(tableId),
371
- findRow(ctx, tableId, rowId),
406
+ findRow(ctx, db, tableId, rowId),
372
407
  ])
373
408
  // get the link docs
374
409
  const linkVals = await linkRows.getLinkDocuments({
410
+ appId,
375
411
  tableId,
376
412
  rowId,
377
413
  })
@@ -398,7 +434,7 @@ exports.fetchEnrichedRow = async ctx => {
398
434
  for (let [tableId, rows] of Object.entries(groups)) {
399
435
  // need to include the IDs in these rows for any links they may have
400
436
  linkedRows = linkedRows.concat(
401
- await outputProcessing(tables[tableId], rows)
437
+ await outputProcessing(ctx, tables[tableId], rows)
402
438
  )
403
439
  }
404
440
 
@@ -1,14 +1,14 @@
1
1
  const { SearchIndexes } = require("../../../db/utils")
2
2
  const fetch = require("node-fetch")
3
3
  const { getCouchUrl } = require("@budibase/backend-core/db")
4
- const { getAppId } = require("@budibase/backend-core/context")
5
4
 
6
5
  /**
7
6
  * Class to build lucene query URLs.
8
7
  * Optionally takes a base lucene query object.
9
8
  */
10
9
  class QueryBuilder {
11
- constructor(base) {
10
+ constructor(appId, base) {
11
+ this.appId = appId
12
12
  this.query = {
13
13
  string: {},
14
14
  fuzzy: {},
@@ -37,30 +37,22 @@ class QueryBuilder {
37
37
  }
38
38
 
39
39
  setLimit(limit) {
40
- if (limit != null) {
41
- this.limit = limit
42
- }
40
+ this.limit = limit
43
41
  return this
44
42
  }
45
43
 
46
44
  setSort(sort) {
47
- if (sort != null) {
48
- this.sort = sort
49
- }
45
+ this.sort = sort
50
46
  return this
51
47
  }
52
48
 
53
49
  setSortOrder(sortOrder) {
54
- if (sortOrder != null) {
55
- this.sortOrder = sortOrder
56
- }
50
+ this.sortOrder = sortOrder
57
51
  return this
58
52
  }
59
53
 
60
54
  setSortType(sortType) {
61
- if (sortType != null) {
62
- this.sortType = sortType
63
- }
55
+ this.sortType = sortType
64
56
  return this
65
57
  }
66
58
 
@@ -241,8 +233,7 @@ class QueryBuilder {
241
233
  }
242
234
 
243
235
  async run() {
244
- const appId = getAppId()
245
- const url = `${getCouchUrl()}/${appId}/_design/database/_search/${
236
+ const url = `${getCouchUrl()}/${this.appId}/_design/database/_search/${
246
237
  SearchIndexes.ROWS
247
238
  }`
248
239
  const body = this.buildSearchBody()
@@ -279,6 +270,7 @@ const runQuery = async (url, body) => {
279
270
  * Gets round the fixed limit of 200 results from a query by fetching as many
280
271
  * pages as required and concatenating the results. This recursively operates
281
272
  * until enough results have been found.
273
+ * @param appId {string} The app ID to search
282
274
  * @param query {object} The JSON query structure
283
275
  * @param params {object} The search params including:
284
276
  * tableId {string} The table ID to search
@@ -291,7 +283,7 @@ const runQuery = async (url, body) => {
291
283
  * rows {array|null} Current results in the recursive search
292
284
  * @returns {Promise<*[]|*>}
293
285
  */
294
- const recursiveSearch = async (query, params) => {
286
+ const recursiveSearch = async (appId, query, params) => {
295
287
  const bookmark = params.bookmark
296
288
  const rows = params.rows || []
297
289
  if (rows.length >= params.limit) {
@@ -301,7 +293,7 @@ const recursiveSearch = async (query, params) => {
301
293
  if (rows.length > params.limit - 200) {
302
294
  pageSize = params.limit - rows.length
303
295
  }
304
- const page = await new QueryBuilder(query)
296
+ const page = await new QueryBuilder(appId, query)
305
297
  .setVersion(params.version)
306
298
  .setTable(params.tableId)
307
299
  .setBookmark(bookmark)
@@ -321,13 +313,14 @@ const recursiveSearch = async (query, params) => {
321
313
  bookmark: page.bookmark,
322
314
  rows: [...rows, ...page.rows],
323
315
  }
324
- return await recursiveSearch(query, newParams)
316
+ return await recursiveSearch(appId, query, newParams)
325
317
  }
326
318
 
327
319
  /**
328
320
  * Performs a paginated search. A bookmark will be returned to allow the next
329
321
  * page to be fetched. There is a max limit off 200 results per page in a
330
322
  * paginated search.
323
+ * @param appId {string} The app ID to search
331
324
  * @param query {object} The JSON query structure
332
325
  * @param params {object} The search params including:
333
326
  * tableId {string} The table ID to search
@@ -339,13 +332,13 @@ const recursiveSearch = async (query, params) => {
339
332
  * bookmark {string} The bookmark to resume from
340
333
  * @returns {Promise<{hasNextPage: boolean, rows: *[]}>}
341
334
  */
342
- exports.paginatedSearch = async (query, params) => {
335
+ exports.paginatedSearch = async (appId, query, params) => {
343
336
  let limit = params.limit
344
337
  if (limit == null || isNaN(limit) || limit < 0) {
345
338
  limit = 50
346
339
  }
347
340
  limit = Math.min(limit, 200)
348
- const search = new QueryBuilder(query)
341
+ const search = new QueryBuilder(appId, query)
349
342
  .setVersion(params.version)
350
343
  .setTable(params.tableId)
351
344
  .setSort(params.sort)
@@ -374,6 +367,7 @@ exports.paginatedSearch = async (query, params) => {
374
367
  * desired amount of results. There is a limit of 1000 results to avoid
375
368
  * heavy performance hits, and to avoid client components breaking from
376
369
  * handling too much data.
370
+ * @param appId {string} The app ID to search
377
371
  * @param query {object} The JSON query structure
378
372
  * @param params {object} The search params including:
379
373
  * tableId {string} The table ID to search
@@ -384,12 +378,12 @@ exports.paginatedSearch = async (query, params) => {
384
378
  * limit {number} The desired number of results
385
379
  * @returns {Promise<{rows: *}>}
386
380
  */
387
- exports.fullSearch = async (query, params) => {
381
+ exports.fullSearch = async (appId, query, params) => {
388
382
  let limit = params.limit
389
383
  if (limit == null || isNaN(limit) || limit < 0) {
390
384
  limit = 1000
391
385
  }
392
386
  params.limit = Math.min(limit, 1000)
393
- const rows = await recursiveSearch(query, params)
387
+ const rows = await recursiveSearch(appId, query, params)
394
388
  return { rows }
395
389
  }
@@ -1,11 +1,11 @@
1
1
  const validateJs = require("validate.js")
2
2
  const { cloneDeep } = require("lodash/fp")
3
+ const CouchDB = require("../../../db")
3
4
  const { InternalTables } = require("../../../db/utils")
4
5
  const userController = require("../user")
5
6
  const { FieldTypes } = require("../../../constants")
6
7
  const { processStringSync } = require("@budibase/string-templates")
7
8
  const { makeExternalQuery } = require("../../../integrations/base/utils")
8
- const { getAppDB } = require("@budibase/backend-core/context")
9
9
 
10
10
  validateJs.extend(validateJs.validators.datetime, {
11
11
  parse: function (value) {
@@ -17,15 +17,14 @@ validateJs.extend(validateJs.validators.datetime, {
17
17
  },
18
18
  })
19
19
 
20
- exports.getDatasourceAndQuery = async json => {
20
+ exports.getDatasourceAndQuery = async (appId, json) => {
21
21
  const datasourceId = json.endpoint.datasourceId
22
- const db = getAppDB()
22
+ const db = new CouchDB(appId)
23
23
  const datasource = await db.get(datasourceId)
24
24
  return makeExternalQuery(datasource, json)
25
25
  }
26
26
 
27
- exports.findRow = async (ctx, tableId, rowId) => {
28
- const db = getAppDB()
27
+ exports.findRow = async (ctx, db, tableId, rowId) => {
29
28
  let row
30
29
  // TODO remove special user case in future
31
30
  if (tableId === InternalTables.USER_METADATA) {
@@ -43,9 +42,9 @@ exports.findRow = async (ctx, tableId, rowId) => {
43
42
  return row
44
43
  }
45
44
 
46
- exports.validate = async ({ tableId, row, table }) => {
45
+ exports.validate = async ({ appId, tableId, row, table }) => {
47
46
  if (!table) {
48
- const db = getAppDB()
47
+ const db = new CouchDB(appId)
49
48
  table = await db.get(tableId)
50
49
  }
51
50
  const errors = {}
@@ -59,16 +58,22 @@ exports.validate = async ({ tableId, row, table }) => {
59
58
  let res
60
59
 
61
60
  // Validate.js doesn't seem to handle array
62
- if (type === FieldTypes.ARRAY && row[fieldName]) {
63
- if (row[fieldName].length) {
61
+ if (type === FieldTypes.ARRAY) {
62
+ const hasValues =
63
+ Array.isArray(row[fieldName]) && row[fieldName].length > 0
64
+
65
+ // Check values are valid if values are specified
66
+ if (hasValues) {
64
67
  row[fieldName].map(val => {
65
68
  if (!constraints.inclusion.includes(val)) {
66
- errors[fieldName] = "Field not in list"
69
+ errors[fieldName] = "Value not in list"
67
70
  }
68
71
  })
69
- } else if (constraints.presence && row[fieldName].length === 0) {
70
- // non required MultiSelect creates an empty array, which should not throw errors
71
- errors[fieldName] = [`${fieldName} is required`]
72
+ }
73
+
74
+ // Check for required constraint
75
+ if (constraints.presence === true && !hasValues) {
76
+ errors[fieldName] = "Required field"
72
77
  }
73
78
  } else if (type === FieldTypes.JSON && typeof row[fieldName] === "string") {
74
79
  // this should only happen if there is an error
@@ -1,9 +1,10 @@
1
+ const CouchDB = require("../../db")
1
2
  const { getScreenParams, generateScreenID } = require("../../db/utils")
2
3
  const { AccessController } = require("@budibase/backend-core/roles")
3
- const { getAppDB } = require("@budibase/backend-core/context")
4
4
 
5
5
  exports.fetch = async ctx => {
6
- const db = getAppDB()
6
+ const appId = ctx.appId
7
+ const db = new CouchDB(appId)
7
8
 
8
9
  const screens = (
9
10
  await db.allDocs(
@@ -13,14 +14,15 @@ exports.fetch = async ctx => {
13
14
  )
14
15
  ).rows.map(element => element.doc)
15
16
 
16
- ctx.body = await new AccessController().checkScreensAccess(
17
+ ctx.body = await new AccessController(appId).checkScreensAccess(
17
18
  screens,
18
19
  ctx.user.role._id
19
20
  )
20
21
  }
21
22
 
22
23
  exports.save = async ctx => {
23
- const db = getAppDB()
24
+ const appId = ctx.appId
25
+ const db = new CouchDB(appId)
24
26
  let screen = ctx.request.body
25
27
 
26
28
  if (!screen._id) {
@@ -37,7 +39,7 @@ exports.save = async ctx => {
37
39
  }
38
40
 
39
41
  exports.destroy = async ctx => {
40
- const db = getAppDB()
42
+ const db = new CouchDB(ctx.appId)
41
43
  await db.remove(ctx.params.screenId, ctx.params.screenRev)
42
44
  ctx.body = {
43
45
  message: "Screen deleted successfully",