@budibase/server 1.0.49-alpha.1 → 1.0.49-alpha.13

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 (353) 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.ba78c49d.css → index.83c0944f.css} +1 -1
  8. package/builder/assets/{index.ed1cf508.js → index.f686d3cd.js} +184 -184
  9. package/builder/index.html +2 -2
  10. package/coverage/clover.xml +2656 -2712
  11. package/coverage/coverage-final.json +104 -105
  12. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  13. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/application.js.html +157 -136
  15. package/coverage/lcov-report/api/controllers/auth.js.html +11 -14
  16. package/coverage/lcov-report/api/controllers/automation.js.html +39 -69
  17. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  18. package/coverage/lcov-report/api/controllers/cloud.js.html +8 -11
  19. package/coverage/lcov-report/api/controllers/component.js.html +10 -13
  20. package/coverage/lcov-report/api/controllers/datasource.js.html +31 -37
  21. package/coverage/lcov-report/api/controllers/dev.js.html +6 -6
  22. package/coverage/lcov-report/api/controllers/index.html +69 -54
  23. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  24. package/coverage/lcov-report/api/controllers/layout.js.html +9 -9
  25. package/coverage/lcov-report/api/controllers/metadata.js.html +6 -21
  26. package/coverage/lcov-report/{migrations/usageQuotas/syncApps.js.html → api/controllers/migrations.js.html} +30 -45
  27. package/coverage/lcov-report/api/controllers/permission.js.html +19 -19
  28. package/coverage/lcov-report/api/controllers/query/index.html +10 -10
  29. package/coverage/lcov-report/api/controllers/query/index.js.html +38 -35
  30. package/coverage/lcov-report/api/controllers/query/validation.js.html +6 -6
  31. package/coverage/lcov-report/api/controllers/role.js.html +16 -16
  32. package/coverage/lcov-report/api/controllers/routing.js.html +7 -10
  33. package/coverage/lcov-report/api/controllers/row/external.js.html +48 -141
  34. package/coverage/lcov-report/api/controllers/row/index.html +28 -28
  35. package/coverage/lcov-report/api/controllers/row/index.js.html +13 -13
  36. package/coverage/lcov-report/api/controllers/row/internal.js.html +60 -105
  37. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +25 -31
  38. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +21 -24
  39. package/coverage/lcov-report/api/controllers/row/utils.js.html +27 -24
  40. package/coverage/lcov-report/api/controllers/screen.js.html +15 -21
  41. package/coverage/lcov-report/api/controllers/script.js.html +4 -4
  42. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +27 -57
  43. package/coverage/lcov-report/api/controllers/table/external.js.html +25 -34
  44. package/coverage/lcov-report/api/controllers/table/index.html +37 -37
  45. package/coverage/lcov-report/api/controllers/table/index.js.html +20 -20
  46. package/coverage/lcov-report/api/controllers/table/internal.js.html +45 -54
  47. package/coverage/lcov-report/api/controllers/table/utils.js.html +67 -103
  48. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  49. package/coverage/lcov-report/api/controllers/user.js.html +43 -52
  50. package/coverage/lcov-report/api/controllers/view/exporters.js.html +4 -4
  51. package/coverage/lcov-report/api/controllers/view/index.html +16 -16
  52. package/coverage/lcov-report/api/controllers/view/index.js.html +27 -33
  53. package/coverage/lcov-report/api/controllers/view/utils.js.html +35 -20
  54. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +7 -7
  55. package/coverage/lcov-report/api/controllers/webhook.js.html +34 -28
  56. package/coverage/lcov-report/api/index.html +1 -1
  57. package/coverage/lcov-report/api/index.js.html +3 -3
  58. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/index.html +22 -7
  70. package/coverage/lcov-report/api/routes/index.js.html +10 -4
  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/{migrations/usageQuotas/index.js.html → api/routes/migrations.js.html} +25 -55
  75. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  76. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  79. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  80. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  81. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  82. package/coverage/lcov-report/api/routes/static.js.html +1 -1
  83. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  84. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  85. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  86. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  87. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  88. package/coverage/lcov-report/automations/actions.js.html +24 -24
  89. package/coverage/lcov-report/automations/automationUtils.js.html +7 -10
  90. package/coverage/lcov-report/automations/bullboard.js.html +16 -16
  91. package/coverage/lcov-report/automations/index.html +18 -18
  92. package/coverage/lcov-report/automations/index.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/bash.js.html +6 -6
  94. package/coverage/lcov-report/automations/steps/createRow.js.html +7 -10
  95. package/coverage/lcov-report/automations/steps/delay.js.html +4 -4
  96. package/coverage/lcov-report/automations/steps/deleteRow.js.html +7 -7
  97. package/coverage/lcov-report/automations/steps/discord.js.html +7 -7
  98. package/coverage/lcov-report/automations/steps/executeQuery.js.html +6 -6
  99. package/coverage/lcov-report/automations/steps/executeScript.js.html +6 -6
  100. package/coverage/lcov-report/automations/steps/filter.js.html +7 -7
  101. package/coverage/lcov-report/automations/steps/index.html +1 -1
  102. package/coverage/lcov-report/automations/steps/integromat.js.html +5 -5
  103. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +8 -8
  104. package/coverage/lcov-report/automations/steps/queryRows.js.html +10 -10
  105. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +5 -5
  106. package/coverage/lcov-report/automations/steps/serverLog.js.html +3 -3
  107. package/coverage/lcov-report/automations/steps/slack.js.html +5 -5
  108. package/coverage/lcov-report/automations/steps/updateRow.js.html +7 -7
  109. package/coverage/lcov-report/automations/steps/utils.js.html +3 -3
  110. package/coverage/lcov-report/automations/steps/zapier.js.html +5 -5
  111. package/coverage/lcov-report/automations/triggerInfo/app.js.html +2 -2
  112. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +2 -2
  113. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  114. package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -8
  115. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +2 -2
  116. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +2 -2
  117. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +2 -2
  118. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +2 -2
  119. package/coverage/lcov-report/automations/triggers.js.html +61 -55
  120. package/coverage/lcov-report/automations/utils.js.html +54 -42
  121. package/coverage/lcov-report/constants/index.html +1 -1
  122. package/coverage/lcov-report/constants/index.js.html +26 -26
  123. package/coverage/lcov-report/constants/layouts.js.html +5 -5
  124. package/coverage/lcov-report/constants/screens.js.html +4 -4
  125. package/coverage/lcov-report/db/client.js.html +18 -18
  126. package/coverage/lcov-report/db/inMemoryView.js.html +7 -7
  127. package/coverage/lcov-report/db/index.html +1 -1
  128. package/coverage/lcov-report/db/index.js.html +3 -3
  129. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +15 -27
  130. package/coverage/lcov-report/db/linkedRows/index.html +27 -27
  131. package/coverage/lcov-report/db/linkedRows/index.js.html +40 -82
  132. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +40 -40
  133. package/coverage/lcov-report/db/newid.js.html +4 -4
  134. package/coverage/lcov-report/db/utils.js.html +74 -74
  135. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  136. package/coverage/lcov-report/events/index.html +1 -1
  137. package/coverage/lcov-report/events/index.js.html +5 -5
  138. package/coverage/lcov-report/events/utils.js.html +3 -3
  139. package/coverage/lcov-report/index.html +97 -112
  140. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  141. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  142. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  143. package/coverage/lcov-report/middleware/authorized.js.html +21 -15
  144. package/coverage/lcov-report/middleware/builder.js.html +3 -3
  145. package/coverage/lcov-report/middleware/currentapp.js.html +72 -60
  146. package/coverage/lcov-report/middleware/index.html +28 -28
  147. package/coverage/lcov-report/middleware/joi-validator.js.html +3 -3
  148. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  149. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  150. package/coverage/lcov-report/middleware/usageQuota.js.html +29 -35
  151. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  152. package/coverage/lcov-report/threads/automation.js.html +30 -24
  153. package/coverage/lcov-report/threads/index.html +25 -25
  154. package/coverage/lcov-report/threads/index.js.html +10 -10
  155. package/coverage/lcov-report/threads/query.js.html +26 -47
  156. package/coverage/lcov-report/threads/utils.js.html +14 -14
  157. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  158. package/coverage/lcov-report/utilities/budibaseDir.js.html +7 -7
  159. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  160. package/coverage/lcov-report/utilities/csvParser.js.html +6 -6
  161. package/coverage/lcov-report/utilities/global.js.html +57 -48
  162. package/coverage/lcov-report/utilities/index.html +27 -27
  163. package/coverage/lcov-report/utilities/index.js.html +42 -72
  164. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +8 -8
  165. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  166. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  167. package/coverage/lcov-report/utilities/routing/index.js.html +7 -7
  168. package/coverage/lcov-report/utilities/rowProcessor/index.html +11 -11
  169. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +32 -74
  170. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +4 -4
  171. package/coverage/lcov-report/utilities/scriptRunner.js.html +5 -5
  172. package/coverage/lcov-report/utilities/security.js.html +8 -8
  173. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  174. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  175. package/coverage/lcov-report/utilities/usageQuota/index.js.html +13 -10
  176. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +5 -2
  177. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  178. package/coverage/lcov-report/utilities/users.js.html +9 -9
  179. package/coverage/lcov-report/utilities/workerRequests.js.html +16 -16
  180. package/coverage/lcov.info +4018 -4092
  181. package/dist/api/controllers/application.js +49 -48
  182. package/dist/api/controllers/auth.js +4 -5
  183. package/dist/api/controllers/automation.js +14 -19
  184. package/dist/api/controllers/cloud.js +2 -3
  185. package/dist/api/controllers/component.js +3 -4
  186. package/dist/api/controllers/datasource.js +9 -10
  187. package/dist/api/controllers/deploy/Deployment.js +3 -6
  188. package/dist/api/controllers/deploy/index.js +12 -13
  189. package/dist/api/controllers/dev.js +5 -5
  190. package/dist/api/controllers/layout.js +3 -3
  191. package/dist/api/controllers/metadata.js +4 -4
  192. package/dist/api/controllers/migrations.js +21 -0
  193. package/dist/api/controllers/permission.js +4 -4
  194. package/dist/api/controllers/query/import/index.js +4 -6
  195. package/dist/api/controllers/query/index.js +11 -10
  196. package/dist/api/controllers/role.js +5 -5
  197. package/dist/api/controllers/routing.js +5 -6
  198. package/dist/api/controllers/row/ExternalRequest.js +90 -67
  199. package/dist/api/controllers/row/external.js +14 -22
  200. package/dist/api/controllers/row/internal.js +29 -44
  201. package/dist/api/controllers/row/internalSearch.js +11 -13
  202. package/dist/api/controllers/row/staticFormula.js +11 -11
  203. package/dist/api/controllers/row/utils.js +7 -6
  204. package/dist/api/controllers/screen.js +5 -7
  205. package/dist/api/controllers/static/index.js +4 -4
  206. package/dist/api/controllers/table/bulkFormula.js +14 -15
  207. package/dist/api/controllers/table/external.js +7 -10
  208. package/dist/api/controllers/table/index.js +5 -5
  209. package/dist/api/controllers/table/internal.js +16 -19
  210. package/dist/api/controllers/table/utils.js +29 -31
  211. package/dist/api/controllers/user.js +16 -20
  212. package/dist/api/controllers/view/index.js +8 -10
  213. package/dist/api/controllers/view/utils.js +9 -4
  214. package/dist/api/controllers/webhook.js +10 -8
  215. package/dist/api/routes/index.js +2 -0
  216. package/dist/api/routes/migrations.js +9 -0
  217. package/dist/api/routes/tests/utilities/TestFunctions.js +37 -17
  218. package/dist/app.js +35 -5
  219. package/dist/automations/automationUtils.js +2 -3
  220. package/dist/automations/steps/createRow.js +1 -1
  221. package/dist/automations/steps/updateRow.js +1 -1
  222. package/dist/automations/triggers.js +27 -25
  223. package/dist/automations/utils.js +10 -5
  224. package/dist/db/linkedRows/LinkController.js +3 -7
  225. package/dist/db/linkedRows/index.js +16 -26
  226. package/dist/db/linkedRows/linkUtils.js +6 -6
  227. package/dist/db/views/staticViews.js +9 -10
  228. package/dist/environment.js +3 -1
  229. package/dist/integrations/base/sql.js +49 -15
  230. package/dist/integrations/utils.js +3 -0
  231. package/dist/middleware/authorized.js +5 -3
  232. package/dist/middleware/builder.js +2 -2
  233. package/dist/middleware/currentapp.js +41 -37
  234. package/dist/middleware/usageQuota.js +2 -4
  235. package/dist/migrations/functions/appUrls.js +46 -0
  236. package/dist/migrations/functions/quotas1.js +50 -0
  237. package/dist/migrations/{usageQuotas → functions/usageQuotas}/index.js +6 -10
  238. package/dist/migrations/{usageQuotas → functions/usageQuotas}/syncApps.js +12 -9
  239. package/dist/migrations/{usageQuotas → functions/usageQuotas}/syncRows.js +16 -12
  240. package/dist/migrations/functions/userEmailViewCasing.js +24 -0
  241. package/dist/migrations/index.js +62 -0
  242. package/dist/package.json +4 -4
  243. package/dist/tests/utilities/TestConfiguration.js +70 -44
  244. package/dist/threads/automation.js +13 -11
  245. package/dist/threads/query.js +13 -19
  246. package/dist/tsconfig.tsbuildinfo +1 -1
  247. package/dist/utilities/fileSystem/index.js +4 -3
  248. package/dist/utilities/global.js +15 -12
  249. package/dist/utilities/index.js +7 -17
  250. package/dist/utilities/routing/index.js +5 -5
  251. package/dist/utilities/rowProcessor/index.js +9 -10
  252. package/dist/utilities/usageQuota/index.js +1 -0
  253. package/dist/utilities/usageQuota/rows.js +1 -0
  254. package/dist/utilities/users.js +3 -3
  255. package/dist/utilities/workerRequests.js +4 -4
  256. package/package.json +5 -5
  257. package/scripts/integrations/mssql/data/Dockerfile +1 -1
  258. package/scripts/integrations/mssql/data/setup.sql +17 -4
  259. package/scripts/integrations/postgres/init.sql +11 -6
  260. package/scripts/likeCypress.ts +1 -1
  261. package/src/api/controllers/application.js +38 -31
  262. package/src/api/controllers/auth.js +4 -5
  263. package/src/api/controllers/automation.js +13 -23
  264. package/src/api/controllers/cloud.js +2 -3
  265. package/src/api/controllers/component.js +3 -4
  266. package/src/api/controllers/datasource.js +9 -11
  267. package/src/api/controllers/deploy/Deployment.js +3 -7
  268. package/src/api/controllers/deploy/index.js +20 -13
  269. package/src/api/controllers/dev.js +5 -5
  270. package/src/api/controllers/layout.js +3 -3
  271. package/src/api/controllers/metadata.js +4 -9
  272. package/src/api/controllers/migrations.js +13 -0
  273. package/src/api/controllers/permission.js +4 -4
  274. package/src/api/controllers/query/import/index.ts +4 -6
  275. package/src/api/controllers/query/import/tests/index.spec.js +2 -1
  276. package/src/api/controllers/query/index.js +11 -10
  277. package/src/api/controllers/role.js +5 -5
  278. package/src/api/controllers/routing.js +5 -6
  279. package/src/api/controllers/row/ExternalRequest.ts +67 -43
  280. package/src/api/controllers/row/external.js +27 -58
  281. package/src/api/controllers/row/internal.js +29 -44
  282. package/src/api/controllers/row/internalSearch.js +11 -13
  283. package/src/api/controllers/row/staticFormula.js +10 -11
  284. package/src/api/controllers/row/utils.js +7 -6
  285. package/src/api/controllers/screen.js +5 -7
  286. package/src/api/controllers/static/index.js +4 -4
  287. package/src/api/controllers/table/bulkFormula.js +13 -23
  288. package/src/api/controllers/table/external.js +7 -10
  289. package/src/api/controllers/table/index.js +5 -5
  290. package/src/api/controllers/table/internal.js +18 -21
  291. package/src/api/controllers/table/utils.js +29 -41
  292. package/src/api/controllers/user.js +17 -20
  293. package/src/api/controllers/view/index.js +8 -10
  294. package/src/api/controllers/view/utils.js +9 -4
  295. package/src/api/controllers/webhook.js +10 -8
  296. package/src/api/routes/index.js +2 -0
  297. package/src/api/routes/migrations.js +14 -0
  298. package/src/api/routes/tests/automation.spec.js +1 -0
  299. package/src/api/routes/tests/misc.spec.js +0 -1
  300. package/src/api/routes/tests/routing.spec.js +21 -12
  301. package/src/api/routes/tests/row.spec.js +7 -4
  302. package/src/api/routes/tests/utilities/TestFunctions.js +39 -17
  303. package/src/app.ts +18 -5
  304. package/src/automations/automationUtils.js +2 -3
  305. package/src/automations/steps/createRow.js +0 -1
  306. package/src/automations/steps/updateRow.js +1 -1
  307. package/src/automations/triggers.js +33 -31
  308. package/src/automations/utils.js +9 -5
  309. package/src/db/linkedRows/LinkController.js +3 -7
  310. package/src/db/linkedRows/index.js +16 -30
  311. package/src/db/linkedRows/linkUtils.js +6 -6
  312. package/src/db/tests/linkController.spec.js +0 -1
  313. package/src/db/tests/linkTests.spec.js +5 -6
  314. package/src/db/views/staticViews.js +8 -10
  315. package/src/environment.js +3 -1
  316. package/src/integrations/base/sql.ts +61 -22
  317. package/src/integrations/utils.ts +4 -1
  318. package/src/middleware/authorized.js +5 -3
  319. package/src/middleware/builder.js +2 -2
  320. package/src/middleware/currentapp.js +50 -46
  321. package/src/middleware/tests/authorized.spec.js +7 -2
  322. package/src/middleware/tests/currentapp.spec.js +6 -0
  323. package/src/middleware/usageQuota.js +2 -4
  324. package/src/migrations/functions/appUrls.ts +34 -0
  325. package/src/migrations/functions/quotas1.ts +20 -0
  326. package/src/migrations/functions/tests/appUrls.spec.js +29 -0
  327. package/src/migrations/{tests/usageQuotas/index.spec.js → functions/tests/quotas1.spec.js} +5 -5
  328. package/src/migrations/functions/tests/userEmailViewCasing.spec.js +25 -0
  329. package/src/migrations/functions/usageQuotas/index.ts +8 -0
  330. package/src/migrations/{usageQuotas/syncApps.js → functions/usageQuotas/syncApps.ts} +6 -6
  331. package/src/migrations/functions/usageQuotas/syncRows.ts +22 -0
  332. package/src/migrations/{tests/usageQuotas → functions/usageQuotas/tests}/syncApps.spec.js +4 -4
  333. package/src/migrations/{tests/usageQuotas → functions/usageQuotas/tests}/syncRows.spec.js +4 -4
  334. package/src/migrations/functions/userEmailViewCasing.ts +13 -0
  335. package/src/migrations/index.ts +56 -0
  336. package/src/module.d.ts +3 -0
  337. package/src/tests/utilities/TestConfiguration.js +73 -50
  338. package/src/threads/automation.js +17 -15
  339. package/src/threads/query.js +14 -21
  340. package/src/utilities/fileSystem/index.js +4 -3
  341. package/src/utilities/global.js +15 -12
  342. package/src/utilities/index.js +7 -17
  343. package/src/utilities/routing/index.js +5 -5
  344. package/src/utilities/rowProcessor/index.js +9 -23
  345. package/src/utilities/usageQuota/index.js +1 -0
  346. package/src/utilities/usageQuota/rows.js +1 -0
  347. package/src/utilities/users.js +3 -3
  348. package/src/utilities/workerRequests.js +4 -4
  349. package/tsconfig.json +2 -1
  350. package/coverage/lcov-report/migrations/usageQuotas/index.html +0 -141
  351. package/coverage/lcov-report/migrations/usageQuotas/syncRows.js.html +0 -143
  352. package/src/migrations/usageQuotas/index.js +0 -24
  353. package/src/migrations/usageQuotas/syncRows.js +0 -21
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ const Router = require("@koa/router");
3
+ const migrationsController = require("../controllers/migrations");
4
+ const router = Router();
5
+ const { internalApi } = require("@budibase/backend-core/auth");
6
+ router
7
+ .post("/api/migrations/run", internalApi, migrationsController.migrate)
8
+ .get("/api/migrations/definitions", internalApi, migrationsController.fetchDefinitions);
9
+ module.exports = router;
@@ -10,18 +10,24 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  };
11
11
  const rowController = require("../../../controllers/row");
12
12
  const appController = require("../../../controllers/application");
13
- const CouchDB = require("../../../../db");
14
13
  const { AppStatus } = require("../../../../db/utils");
15
14
  const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles");
16
15
  const { TENANT_ID } = require("../../../../tests/utilities/structures");
16
+ const { getAppDB, doInAppContext } = require("@budibase/backend-core/context");
17
+ const env = require("../../../../environment");
17
18
  function Request(appId, params) {
18
19
  this.appId = appId;
19
20
  this.params = params;
20
21
  this.request = {};
21
22
  }
23
+ function runRequest(appId, controlFunc, request) {
24
+ return doInAppContext(appId, () => __awaiter(this, void 0, void 0, function* () {
25
+ return controlFunc(request);
26
+ }));
27
+ }
22
28
  exports.getAllTableRows = (config) => __awaiter(void 0, void 0, void 0, function* () {
23
29
  const req = new Request(config.appId, { tableId: config.table._id });
24
- yield rowController.fetch(req);
30
+ yield runRequest(config.appId, rowController.fetch, req);
25
31
  return req.body;
26
32
  });
27
33
  exports.clearAllApps = (tenantId = TENANT_ID) => __awaiter(void 0, void 0, void 0, function* () {
@@ -33,13 +39,16 @@ exports.clearAllApps = (tenantId = TENANT_ID) => __awaiter(void 0, void 0, void
33
39
  }
34
40
  for (let app of apps) {
35
41
  const { appId } = app;
36
- yield appController.delete(new Request(null, { appId }));
42
+ const req = new Request(null, { appId });
43
+ yield runRequest(appId, appController.delete, req);
37
44
  }
38
45
  });
39
46
  exports.clearAllAutomations = (config) => __awaiter(void 0, void 0, void 0, function* () {
40
47
  const automations = yield config.getAllAutomations();
41
48
  for (let auto of automations) {
42
- yield config.deleteAutomation(auto);
49
+ yield doInAppContext(config.appId, () => __awaiter(void 0, void 0, void 0, function* () {
50
+ yield config.deleteAutomation(auto);
51
+ }));
43
52
  }
44
53
  });
45
54
  exports.createRequest = (request, method, url, body) => {
@@ -92,19 +101,30 @@ exports.checkPermissionsEndpoint = ({ config, method, url, body, passRole, failR
92
101
  .set(failHeader)
93
102
  .expect(403);
94
103
  });
95
- exports.getDB = config => {
96
- return new CouchDB(config.getAppId());
104
+ exports.getDB = () => {
105
+ return getAppDB();
97
106
  };
98
107
  exports.testAutomation = (config, automation) => __awaiter(void 0, void 0, void 0, function* () {
99
- return yield config.request
100
- .post(`/api/automations/${automation._id}/test`)
101
- .send({
102
- row: {
103
- name: "Test",
104
- description: "TEST",
105
- },
106
- })
107
- .set(config.defaultHeaders())
108
- .expect("Content-Type", /json/)
109
- .expect(200);
108
+ return runRequest(automation.appId, () => __awaiter(void 0, void 0, void 0, function* () {
109
+ return yield config.request
110
+ .post(`/api/automations/${automation._id}/test`)
111
+ .send({
112
+ row: {
113
+ name: "Test",
114
+ description: "TEST",
115
+ },
116
+ })
117
+ .set(config.defaultHeaders())
118
+ .expect("Content-Type", /json/)
119
+ .expect(200);
120
+ }));
121
+ });
122
+ exports.runInProd = (func) => __awaiter(void 0, void 0, void 0, function* () {
123
+ const nodeEnv = env.NODE_ENV;
124
+ const workerId = env.JEST_WORKER_ID;
125
+ env._set("NODE_ENV", "PRODUCTION");
126
+ env._set("JEST_WORKER_ID", null);
127
+ yield func();
128
+ env._set("NODE_ENV", nodeEnv);
129
+ env._set("JEST_WORKER_ID", workerId);
110
130
  });
package/dist/app.js CHANGED
@@ -1,4 +1,23 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
2
21
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
22
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
23
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -9,7 +28,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
28
  });
10
29
  };
11
30
  Object.defineProperty(exports, "__esModule", { value: true });
12
- const env = require("./environment");
31
+ const env = __importStar(require("./environment"));
13
32
  const CouchDB = require("./db");
14
33
  require("@budibase/backend-core").init(CouchDB);
15
34
  const Koa = require("koa");
@@ -24,6 +43,7 @@ const Sentry = require("@sentry/node");
24
43
  const fileSystem = require("./utilities/fileSystem");
25
44
  const bullboard = require("./automations/bullboard");
26
45
  const redis = require("./utilities/redis");
46
+ const migrations = __importStar(require("./migrations"));
27
47
  const app = new Koa();
28
48
  // set up top level koa middleware
29
49
  app.use(koaBody({
@@ -76,12 +96,22 @@ module.exports = server.listen(env.PORT || 0, () => __awaiter(void 0, void 0, vo
76
96
  yield redis.init();
77
97
  yield automations.init();
78
98
  }));
79
- process.on("uncaughtException", err => {
80
- console.error(err);
99
+ const shutdown = () => {
81
100
  server.close();
82
101
  server.destroy();
102
+ };
103
+ process.on("uncaughtException", err => {
104
+ console.error(err);
105
+ shutdown();
83
106
  });
84
107
  process.on("SIGTERM", () => {
85
- server.close();
86
- server.destroy();
108
+ shutdown();
87
109
  });
110
+ // run migrations on startup if not done via http
111
+ // not recommended in a clustered environment
112
+ if (!env.HTTP_MIGRATIONS) {
113
+ migrations.migrate().catch(err => {
114
+ console.error("Error performing migrations. Exiting.\n", err);
115
+ shutdown();
116
+ });
117
+ }
@@ -61,13 +61,12 @@ exports.cleanInputValues = (inputs, schema) => {
61
61
  * the automation but is instead part of the Table/Table. This function will get the table schema and use it to instead
62
62
  * perform the cleanInputValues function on the input row.
63
63
  *
64
- * @param {string} appId The instance which the Table/Table is contained under.
65
64
  * @param {string} tableId The ID of the Table/Table which the schema is to be retrieved for.
66
65
  * @param {object} row The input row structure which requires clean-up after having been through template statements.
67
66
  * @returns {Promise<Object>} The cleaned up rows object, will should now have all the required primitive types.
68
67
  */
69
- exports.cleanUpRow = (appId, tableId, row) => __awaiter(void 0, void 0, void 0, function* () {
70
- let table = yield getTable(appId, tableId);
68
+ exports.cleanUpRow = (tableId, row) => __awaiter(void 0, void 0, void 0, function* () {
69
+ let table = yield getTable(tableId);
71
70
  return exports.cleanInputValues(row, { properties: table.schema });
72
71
  });
73
72
  exports.getError = err => {
@@ -85,7 +85,7 @@ exports.run = function ({ inputs, appId, emitter }) {
85
85
  },
86
86
  });
87
87
  try {
88
- inputs.row = yield automationUtils.cleanUpRow(appId, inputs.row.tableId, inputs.row);
88
+ inputs.row = yield automationUtils.cleanUpRow(inputs.row.tableId, inputs.row);
89
89
  yield usage.update(usage.Properties.ROW, 1, { dryRun: true });
90
90
  yield rowController.save(ctx);
91
91
  yield usage.update(usage.Properties.ROW, 1);
@@ -90,7 +90,7 @@ exports.run = function ({ inputs, appId, emitter }) {
90
90
  });
91
91
  try {
92
92
  if (tableId) {
93
- inputs.row = yield automationUtils.cleanUpRow(appId, tableId, inputs.row);
93
+ inputs.row = yield automationUtils.cleanUpRow(tableId, inputs.row);
94
94
  }
95
95
  yield rowController.patch(ctx);
96
96
  return {
@@ -8,7 +8,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
9
  });
10
10
  };
11
- const CouchDB = require("../db");
12
11
  const emitter = require("../events/index");
13
12
  const { getAutomationParams } = require("../db/utils");
14
13
  const { coerce } = require("../utilities/rowProcessor");
@@ -19,6 +18,7 @@ const { queue } = require("./bullboard");
19
18
  const { checkTestFlag } = require("../utilities/redis");
20
19
  const utils = require("./utils");
21
20
  const env = require("../environment");
21
+ const { doInAppContext, getAppDB } = require("@budibase/backend-core/context");
22
22
  const TRIGGER_DEFINITIONS = definitions;
23
23
  const JOB_OPTS = {
24
24
  removeOnComplete: true,
@@ -29,31 +29,33 @@ function queueRelevantRowAutomations(event, eventType) {
29
29
  if (event.appId == null) {
30
30
  throw `No appId specified for ${eventType} - check event emitters.`;
31
31
  }
32
- const db = new CouchDB(event.appId);
33
- let automations = yield db.allDocs(getAutomationParams(null, { include_docs: true }));
34
- // filter down to the correct event type
35
- automations = automations.rows
36
- .map(automation => automation.doc)
37
- .filter(automation => {
38
- const trigger = automation.definition.trigger;
39
- return trigger && trigger.event === eventType;
40
- });
41
- for (let automation of automations) {
42
- let automationDef = automation.definition;
43
- let automationTrigger = automationDef ? automationDef.trigger : {};
44
- // don't queue events which are for dev apps, only way to test automations is
45
- // running tests on them, in production the test flag will never
46
- // be checked due to lazy evaluation (first always false)
47
- if (!env.ALLOW_DEV_AUTOMATIONS &&
48
- isDevAppID(event.appId) &&
49
- !(yield checkTestFlag(automation._id))) {
50
- continue;
32
+ doInAppContext(event.appId, () => __awaiter(this, void 0, void 0, function* () {
33
+ const db = getAppDB();
34
+ let automations = yield db.allDocs(getAutomationParams(null, { include_docs: true }));
35
+ // filter down to the correct event type
36
+ automations = automations.rows
37
+ .map(automation => automation.doc)
38
+ .filter(automation => {
39
+ const trigger = automation.definition.trigger;
40
+ return trigger && trigger.event === eventType;
41
+ });
42
+ for (let automation of automations) {
43
+ let automationDef = automation.definition;
44
+ let automationTrigger = automationDef ? automationDef.trigger : {};
45
+ // don't queue events which are for dev apps, only way to test automations is
46
+ // running tests on them, in production the test flag will never
47
+ // be checked due to lazy evaluation (first always false)
48
+ if (!env.ALLOW_DEV_AUTOMATIONS &&
49
+ isDevAppID(event.appId) &&
50
+ !(yield checkTestFlag(automation._id))) {
51
+ continue;
52
+ }
53
+ if (automationTrigger.inputs &&
54
+ automationTrigger.inputs.tableId === event.row.tableId) {
55
+ yield queue.add({ automation, event }, JOB_OPTS);
56
+ }
51
57
  }
52
- if (automationTrigger.inputs &&
53
- automationTrigger.inputs.tableId === event.row.tableId) {
54
- yield queue.add({ automation, event }, JOB_OPTS);
55
- }
56
- }
58
+ }));
57
59
  });
58
60
  }
59
61
  emitter.on("row:save", function (event) {
@@ -16,8 +16,9 @@ const { queue } = require("./bullboard");
16
16
  const newid = require("../db/newid");
17
17
  const { updateEntityMetadata } = require("../utilities");
18
18
  const { MetadataTypes } = require("../constants");
19
- const { getDeployedAppID } = require("@budibase/backend-core/db");
19
+ const { getProdAppID } = require("@budibase/backend-core/db");
20
20
  const { cloneDeep } = require("lodash/fp");
21
+ const { getAppDB, getAppId } = require("@budibase/backend-core/context");
21
22
  const WH_STEP_ID = definitions.WEBHOOK.stepId;
22
23
  const CRON_STEP_ID = definitions.CRON.stepId;
23
24
  const Runner = new Thread(ThreadType.AUTOMATION);
@@ -32,7 +33,7 @@ exports.processEvent = (job) => __awaiter(void 0, void 0, void 0, function* () {
32
33
  }
33
34
  });
34
35
  exports.updateTestHistory = (appId, automation, history) => __awaiter(void 0, void 0, void 0, function* () {
35
- return updateEntityMetadata(appId, MetadataTypes.AUTOMATION_TEST_HISTORY, automation._id, metadata => {
36
+ return updateEntityMetadata(MetadataTypes.AUTOMATION_TEST_HISTORY, automation._id, metadata => {
36
37
  if (metadata && Array.isArray(metadata.history)) {
37
38
  metadata.history.push(history);
38
39
  }
@@ -87,6 +88,9 @@ exports.enableCronTrigger = (appId, automation) => __awaiter(void 0, void 0, voi
87
88
  }, { repeat: { cron: trigger.inputs.cron }, jobId });
88
89
  // Assign cron job ID from bull so we can remove it later if the cron trigger is removed
89
90
  trigger.cronJobId = job.id;
91
+ // can't use getAppDB here as this is likely to be called from dev app,
92
+ // but this call could be for dev app or prod app, need to just use what
93
+ // was passed in
90
94
  const db = new CouchDB(appId);
91
95
  const response = yield db.put(automation);
92
96
  automation._id = response.id;
@@ -102,7 +106,8 @@ exports.enableCronTrigger = (appId, automation) => __awaiter(void 0, void 0, voi
102
106
  * @returns {Promise<object|undefined>} After this is complete the new automation object may have been updated and should be
103
107
  * written to DB (this does not write to DB as it would be wasteful to repeat).
104
108
  */
105
- exports.checkForWebhooks = ({ appId, oldAuto, newAuto }) => __awaiter(void 0, void 0, void 0, function* () {
109
+ exports.checkForWebhooks = ({ oldAuto, newAuto }) => __awaiter(void 0, void 0, void 0, function* () {
110
+ const appId = getAppId();
106
111
  const oldTrigger = oldAuto ? oldAuto.definition.trigger : null;
107
112
  const newTrigger = newAuto ? newAuto.definition.trigger : null;
108
113
  const triggerChanged = oldTrigger && newTrigger && oldTrigger.id !== newTrigger.id;
@@ -116,7 +121,7 @@ exports.checkForWebhooks = ({ appId, oldAuto, newAuto }) => __awaiter(void 0, vo
116
121
  (!isWebhookTrigger(newAuto) || triggerChanged) &&
117
122
  oldTrigger.webhookId) {
118
123
  try {
119
- let db = new CouchDB(appId);
124
+ let db = getAppDB();
120
125
  // need to get the webhook to get the rev
121
126
  const webhook = yield db.get(oldTrigger.webhookId);
122
127
  const ctx = {
@@ -149,7 +154,7 @@ exports.checkForWebhooks = ({ appId, oldAuto, newAuto }) => __awaiter(void 0, vo
149
154
  // the app ID has to be development for this endpoint
150
155
  // it can only be used when building the app
151
156
  // but the trigger endpoint will always be used in production
152
- const prodAppId = getDeployedAppID(appId);
157
+ const prodAppId = getProdAppID(appId);
153
158
  newTrigger.inputs = {
154
159
  schemaUrl: `api/webhooks/schema/${appId}/${id}`,
155
160
  triggerUrl: `api/webhooks/trigger/${prodAppId}/${id}`,
@@ -8,11 +8,11 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
9
  });
10
10
  };
11
- const CouchDB = require("../index");
12
11
  const { IncludeDocs, getLinkDocuments } = require("./linkUtils");
13
12
  const { generateLinkID, InternalTables, getUserMetadataParams, } = require("../utils");
14
13
  const Sentry = require("@sentry/node");
15
14
  const { FieldTypes, RelationshipTypes } = require("../../constants");
15
+ const { getAppDB } = require("@budibase/backend-core/context");
16
16
  /**
17
17
  * Creates a new link document structure which can be put to the database. It is important to
18
18
  * note that while this talks about linker/linked the link is bi-directional and for all intent
@@ -42,9 +42,8 @@ function LinkDocument(tableId1, fieldName1, rowId1, tableId2, fieldName2, rowId2
42
42
  };
43
43
  }
44
44
  class LinkController {
45
- constructor({ appId, tableId, row, table, oldTable }) {
46
- this._appId = appId;
47
- this._db = new CouchDB(appId);
45
+ constructor({ tableId, row, table, oldTable }) {
46
+ this._db = getAppDB();
48
47
  this._tableId = tableId;
49
48
  this._row = row;
50
49
  this._table = table;
@@ -90,7 +89,6 @@ class LinkController {
90
89
  */
91
90
  getRowLinkDocs(rowId) {
92
91
  return getLinkDocuments({
93
- appId: this._appId,
94
92
  tableId: this._tableId,
95
93
  rowId,
96
94
  includeDocs: IncludeDocs.INCLUDE,
@@ -101,7 +99,6 @@ class LinkController {
101
99
  */
102
100
  getTableLinkDocs() {
103
101
  return getLinkDocuments({
104
- appId: this._appId,
105
102
  tableId: this._tableId,
106
103
  includeDocs: IncludeDocs.INCLUDE,
107
104
  });
@@ -203,7 +200,6 @@ class LinkController {
203
200
  for (let linkId of rowField) {
204
201
  if (linkedSchema.relationshipType === RelationshipTypes.ONE_TO_MANY) {
205
202
  let links = (yield getLinkDocuments({
206
- appId: this._appId,
207
203
  tableId: field.tableId,
208
204
  rowId: linkId,
209
205
  includeDocs: IncludeDocs.EXCLUDE,
@@ -11,12 +11,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
11
11
  const LinkController = require("./LinkController");
12
12
  const { IncludeDocs, getLinkDocuments, createLinkView, getUniqueByProp, getRelatedTableForField, getLinkedTableIDs, getLinkedTable, } = require("./linkUtils");
13
13
  const { flatten } = require("lodash");
14
- const CouchDB = require("../../db");
15
14
  const { FieldTypes } = require("../../constants");
16
15
  const { getMultiIDParams, USER_METDATA_PREFIX } = require("../../db/utils");
17
16
  const { partition } = require("lodash");
18
17
  const { getGlobalUsersFromMetadata } = require("../../utilities/global");
19
18
  const { processFormulas } = require("../../utilities/rowProcessor/utils");
19
+ const { getAppDB } = require("@budibase/backend-core/context");
20
20
  /**
21
21
  * This functionality makes sure that when rows with links are created, updated or deleted they are processed
22
22
  * correctly - making sure that no stale links are left around and that all links have been made successfully.
@@ -45,12 +45,11 @@ function clearRelationshipFields(table, rows) {
45
45
  }
46
46
  return rows;
47
47
  }
48
- function getLinksForRows(appId, rows) {
48
+ function getLinksForRows(rows) {
49
49
  return __awaiter(this, void 0, void 0, function* () {
50
50
  const tableIds = [...new Set(rows.map(el => el.tableId))];
51
51
  // start by getting all the link values for performance reasons
52
52
  const responses = flatten(yield Promise.all(tableIds.map(tableId => getLinkDocuments({
53
- appId,
54
53
  tableId: tableId,
55
54
  includeDocs: IncludeDocs.EXCLUDE,
56
55
  }))));
@@ -61,10 +60,10 @@ function getLinksForRows(appId, rows) {
61
60
  .map(el => (Object.assign(Object.assign({}, el), { unique: el.id + el.thisId + el.fieldName }))), "unique");
62
61
  });
63
62
  }
64
- function getFullLinkedDocs(appId, links) {
63
+ function getFullLinkedDocs(links) {
65
64
  return __awaiter(this, void 0, void 0, function* () {
66
65
  // create DBs
67
- const db = new CouchDB(appId);
66
+ const db = getAppDB();
68
67
  const linkedRowIds = links.map(link => link.id);
69
68
  const uniqueRowIds = [...new Set(linkedRowIds)];
70
69
  let dbRows = (yield db.allDocs(getMultiIDParams(uniqueRowIds))).rows.map(row => row.doc);
@@ -74,7 +73,7 @@ function getFullLinkedDocs(appId, links) {
74
73
  .filter(row => row != null);
75
74
  // need to handle users as specific cases
76
75
  let [users, other] = partition(linked, linkRow => linkRow._id.startsWith(USER_METDATA_PREFIX));
77
- users = yield getGlobalUsersFromMetadata(appId, users);
76
+ users = yield getGlobalUsersFromMetadata(users);
78
77
  return [...other, ...users];
79
78
  });
80
79
  }
@@ -82,21 +81,17 @@ function getFullLinkedDocs(appId, links) {
82
81
  * Update link documents for a row or table - this is to be called by the API controller when a change is occurring.
83
82
  * @param {string} args.eventType states what type of change which is occurring, means this can be expanded upon in the
84
83
  * future quite easily (all updates go through one function).
85
- * @param {string} args.appId The ID of the instance in which the change is occurring.
86
84
  * @param {string} args.tableId The ID of the of the table which is being changed.
87
- * @param {object|null} args.row The row which is changing, e.g. created, updated or deleted.
88
- * @param {object|null} args.table If the table has already been retrieved this can be used to reduce database gets.
89
- * @param {object|null} args.oldTable If the table is being updated then the old table can be provided for differencing.
85
+ * @param {object|undefined} args.row The row which is changing, e.g. created, updated or deleted.
86
+ * @param {object|undefined} args.table If the table has already been retrieved this can be used to reduce database gets.
87
+ * @param {object|undefined} args.oldTable If the table is being updated then the old table can be provided for differencing.
90
88
  * @returns {Promise<object>} When the update is complete this will respond successfully. Returns the row for
91
89
  * row operations and the table for table operations.
92
90
  */
93
91
  exports.updateLinks = function (args) {
94
92
  return __awaiter(this, void 0, void 0, function* () {
95
- const { eventType, appId, row, tableId, table, oldTable } = args;
93
+ const { eventType, row, tableId, table, oldTable } = args;
96
94
  const baseReturnObj = row == null ? table : row;
97
- if (appId == null) {
98
- throw "Cannot operate without an instance ID.";
99
- }
100
95
  // make sure table ID is set
101
96
  if (tableId == null && table != null) {
102
97
  args.tableId = table._id;
@@ -132,24 +127,21 @@ exports.updateLinks = function (args) {
132
127
  /**
133
128
  * Given a table and a list of rows this will retrieve all of the attached docs and enrich them into the row.
134
129
  * This is required for formula fields, this may only be utilised internally (for now).
135
- * @param {string} appId The ID of the app which this request is in the context of.
136
130
  * @param {object} table The table from which the rows originated.
137
131
  * @param {array<object>} rows The rows which are to be enriched.
138
132
  * @return {Promise<*>} returns the rows with all of the enriched relationships on it.
139
133
  */
140
- exports.attachFullLinkedDocs = (appId, table, rows) => __awaiter(void 0, void 0, void 0, function* () {
134
+ exports.attachFullLinkedDocs = (table, rows) => __awaiter(void 0, void 0, void 0, function* () {
141
135
  const linkedTableIds = getLinkedTableIDs(table);
142
136
  if (linkedTableIds.length === 0) {
143
137
  return rows;
144
138
  }
145
- // create DBs
146
- const db = new CouchDB(appId);
147
139
  // get all the links
148
- const links = (yield getLinksForRows(appId, rows)).filter(link => rows.some(row => row._id === link.thisId));
140
+ const links = (yield getLinksForRows(rows)).filter(link => rows.some(row => row._id === link.thisId));
149
141
  // clear any existing links that could be dupe'd
150
142
  rows = clearRelationshipFields(table, rows);
151
143
  // now get the docs and combine into the rows
152
- let linked = yield getFullLinkedDocs(appId, links);
144
+ let linked = yield getFullLinkedDocs(links);
153
145
  const linkedTables = [];
154
146
  for (let row of rows) {
155
147
  for (let link of links.filter(link => link.thisId === row._id)) {
@@ -159,7 +151,7 @@ exports.attachFullLinkedDocs = (appId, table, rows) => __awaiter(void 0, void 0,
159
151
  const linkedRow = linked.find(row => row._id === link.id);
160
152
  if (linkedRow) {
161
153
  const linkedTableId = linkedRow.tableId || getRelatedTableForField(table, link.fieldName);
162
- const linkedTable = yield getLinkedTable(db, linkedTableId, linkedTables);
154
+ const linkedTable = yield getLinkedTable(linkedTableId, linkedTables);
163
155
  if (linkedTable) {
164
156
  row[link.fieldName].push(processFormulas(linkedTable, linkedRow));
165
157
  }
@@ -170,18 +162,16 @@ exports.attachFullLinkedDocs = (appId, table, rows) => __awaiter(void 0, void 0,
170
162
  });
171
163
  /**
172
164
  * This function will take the given enriched rows and squash the links to only contain the primary display field.
173
- * @param {string} appId The app in which the tables/rows/links exist.
174
165
  * @param {object} table The table from which the rows originated.
175
166
  * @param {array<object>} enriched The pre-enriched rows (full docs) which are to be squashed.
176
167
  * @returns {Promise<Array>} The rows after having their links squashed to only contain the ID and primary display.
177
168
  */
178
- exports.squashLinksToPrimaryDisplay = (appId, table, enriched) => __awaiter(void 0, void 0, void 0, function* () {
179
- const db = new CouchDB(appId);
169
+ exports.squashLinksToPrimaryDisplay = (table, enriched) => __awaiter(void 0, void 0, void 0, function* () {
180
170
  // will populate this as we find them
181
171
  const linkedTables = [table];
182
172
  for (let row of enriched) {
183
173
  // this only fetches the table if its not already in array
184
- const rowTable = yield getLinkedTable(db, row.tableId, linkedTables);
174
+ const rowTable = yield getLinkedTable(row.tableId, linkedTables);
185
175
  for (let [column, schema] of Object.entries(rowTable.schema)) {
186
176
  if (schema.type !== FieldTypes.LINK || !Array.isArray(row[column])) {
187
177
  continue;
@@ -189,7 +179,7 @@ exports.squashLinksToPrimaryDisplay = (appId, table, enriched) => __awaiter(void
189
179
  const newLinks = [];
190
180
  for (let link of row[column]) {
191
181
  const linkTblId = link.tableId || getRelatedTableForField(table, column);
192
- const linkedTable = yield getLinkedTable(db, linkTblId, linkedTables);
182
+ const linkedTable = yield getLinkedTable(linkTblId, linkedTables);
193
183
  const obj = { _id: link._id };
194
184
  if (link[linkedTable.primaryDisplay]) {
195
185
  obj.primaryDisplay = link[linkedTable.primaryDisplay];
@@ -8,11 +8,11 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
9
  });
10
10
  };
11
- const CouchDB = require("../index");
12
11
  const Sentry = require("@sentry/node");
13
12
  const { ViewNames, getQueryIndex } = require("../utils");
14
13
  const { FieldTypes } = require("../../constants");
15
14
  const { createLinkView } = require("../views/staticViews");
15
+ const { getAppDB } = require("@budibase/backend-core/context");
16
16
  /**
17
17
  * Only needed so that boolean parameters are being used for includeDocs
18
18
  * @type {{EXCLUDE: boolean, INCLUDE: boolean}}
@@ -24,7 +24,6 @@ exports.IncludeDocs = {
24
24
  exports.createLinkView = createLinkView;
25
25
  /**
26
26
  * Gets the linking documents, not the linked documents themselves.
27
- * @param {string} args.appId The instance in which we are searching for linked rows.
28
27
  * @param {string} args.tableId The table which we are searching for linked rows against.
29
28
  * @param {string|null} args.fieldName The name of column/field which is being altered, only looking for
30
29
  * linking documents that are related to it. If this is not specified then the table level will be assumed.
@@ -38,8 +37,8 @@ exports.createLinkView = createLinkView;
38
37
  */
39
38
  exports.getLinkDocuments = function (args) {
40
39
  return __awaiter(this, arguments, void 0, function* () {
41
- const { appId, tableId, rowId, includeDocs } = args;
42
- const db = new CouchDB(appId);
40
+ const { tableId, rowId, includeDocs } = args;
41
+ const db = getAppDB();
43
42
  let params;
44
43
  if (rowId != null) {
45
44
  params = { key: [tableId, rowId] };
@@ -75,7 +74,7 @@ exports.getLinkDocuments = function (args) {
75
74
  catch (err) {
76
75
  // check if the view doesn't exist, it should for all new instances
77
76
  if (err != null && err.name === "not_found") {
78
- yield exports.createLinkView(appId);
77
+ yield exports.createLinkView();
79
78
  return exports.getLinkDocuments(arguments[0]);
80
79
  }
81
80
  else {
@@ -95,7 +94,8 @@ exports.getLinkedTableIDs = table => {
95
94
  .filter(column => column.type === FieldTypes.LINK)
96
95
  .map(column => column.tableId);
97
96
  };
98
- exports.getLinkedTable = (db, id, tables) => __awaiter(void 0, void 0, void 0, function* () {
97
+ exports.getLinkedTable = (id, tables) => __awaiter(void 0, void 0, void 0, function* () {
98
+ const db = getAppDB();
99
99
  let linkedTable = tables.find(table => table._id === id);
100
100
  if (linkedTable) {
101
101
  return linkedTable;
@@ -8,7 +8,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
9
  });
10
10
  };
11
- const CouchDB = require("../index");
11
+ const { getAppDB } = require("@budibase/backend-core/context");
12
12
  const { DocumentTypes, SEPARATOR, ViewNames, SearchIndexes, } = require("../utils");
13
13
  const SCREEN_PREFIX = DocumentTypes.SCREEN + SEPARATOR;
14
14
  /**************************************************
@@ -24,12 +24,11 @@ const SCREEN_PREFIX = DocumentTypes.SCREEN + SEPARATOR;
24
24
  /**
25
25
  * Creates the link view for the instance, this will overwrite the existing one, but this should only
26
26
  * be called if it is found that the view does not exist.
27
- * @param {string} appId The instance to which the view should be added.
28
27
  * @returns {Promise<void>} The view now exists, please note that the next view of this query will actually build it,
29
28
  * so it may be slow.
30
29
  */
31
- exports.createLinkView = (appId) => __awaiter(void 0, void 0, void 0, function* () {
32
- const db = new CouchDB(appId);
30
+ exports.createLinkView = () => __awaiter(void 0, void 0, void 0, function* () {
31
+ const db = getAppDB();
33
32
  const designDoc = yield db.get("_design/database");
34
33
  const view = {
35
34
  map: function (doc) {
@@ -56,8 +55,8 @@ exports.createLinkView = (appId) => __awaiter(void 0, void 0, void 0, function*
56
55
  designDoc.views = Object.assign(Object.assign({}, designDoc.views), { [ViewNames.LINK]: view });
57
56
  yield db.put(designDoc);
58
57
  });
59
- exports.createRoutingView = (appId) => __awaiter(void 0, void 0, void 0, function* () {
60
- const db = new CouchDB(appId);
58
+ exports.createRoutingView = () => __awaiter(void 0, void 0, void 0, function* () {
59
+ const db = getAppDB();
61
60
  const designDoc = yield db.get("_design/database");
62
61
  const view = {
63
62
  // if using variables in a map function need to inject them before use
@@ -73,9 +72,9 @@ exports.createRoutingView = (appId) => __awaiter(void 0, void 0, void 0, functio
73
72
  designDoc.views = Object.assign(Object.assign({}, designDoc.views), { [ViewNames.ROUTING]: view });
74
73
  yield db.put(designDoc);
75
74
  });
76
- function searchIndex(appId, indexName, fnString) {
75
+ function searchIndex(indexName, fnString) {
77
76
  return __awaiter(this, void 0, void 0, function* () {
78
- const db = new CouchDB(appId);
77
+ const db = getAppDB();
79
78
  const designDoc = yield db.get("_design/database");
80
79
  designDoc.indexes = {
81
80
  [indexName]: {
@@ -86,8 +85,8 @@ function searchIndex(appId, indexName, fnString) {
86
85
  yield db.put(designDoc);
87
86
  });
88
87
  }
89
- exports.createAllSearchIndex = (appId) => __awaiter(void 0, void 0, void 0, function* () {
90
- yield searchIndex(appId, SearchIndexes.ROWS, function (doc) {
88
+ exports.createAllSearchIndex = () => __awaiter(void 0, void 0, void 0, function* () {
89
+ yield searchIndex(SearchIndexes.ROWS, function (doc) {
91
90
  function idx(input, prev) {
92
91
  for (let key of Object.keys(input)) {
93
92
  let idxKey = prev != null ? `${prev}.${key}` : key;