@budibase/server 1.0.49-alpha.0 → 1.0.49-alpha.12

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 (357) 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.8184eed9.js → index.0bdf1cad.js} +195 -194
  8. package/builder/assets/{index.dd9e386f.css → index.83c0944f.css} +1 -1
  9. package/builder/assets/{vendor.3bd2f661.js → vendor.d526bfe8.js} +1 -1
  10. package/builder/index.html +3 -3
  11. package/coverage/clover.xml +2927 -2819
  12. package/coverage/coverage-final.json +104 -103
  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 +157 -136
  16. package/coverage/lcov-report/api/controllers/auth.js.html +11 -14
  17. package/coverage/lcov-report/api/controllers/automation.js.html +39 -69
  18. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/cloud.js.html +8 -11
  20. package/coverage/lcov-report/api/controllers/component.js.html +10 -13
  21. package/coverage/lcov-report/api/controllers/datasource.js.html +31 -37
  22. package/coverage/lcov-report/api/controllers/dev.js.html +6 -6
  23. package/coverage/lcov-report/api/controllers/index.html +69 -54
  24. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/layout.js.html +9 -9
  26. package/coverage/lcov-report/api/controllers/metadata.js.html +6 -21
  27. package/coverage/lcov-report/{migrations/usageQuotas/syncApps.js.html → api/controllers/migrations.js.html} +30 -45
  28. package/coverage/lcov-report/api/controllers/permission.js.html +19 -19
  29. package/coverage/lcov-report/api/controllers/query/index.html +10 -10
  30. package/coverage/lcov-report/api/controllers/query/index.js.html +38 -35
  31. package/coverage/lcov-report/api/controllers/query/validation.js.html +6 -6
  32. package/coverage/lcov-report/api/controllers/role.js.html +16 -16
  33. package/coverage/lcov-report/api/controllers/routing.js.html +7 -10
  34. package/coverage/lcov-report/api/controllers/row/external.js.html +48 -141
  35. package/coverage/lcov-report/api/controllers/row/index.html +52 -37
  36. package/coverage/lcov-report/api/controllers/row/index.js.html +13 -13
  37. package/coverage/lcov-report/api/controllers/row/internal.js.html +108 -216
  38. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +52 -34
  39. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +548 -0
  40. package/coverage/lcov-report/api/controllers/row/utils.js.html +27 -24
  41. package/coverage/lcov-report/api/controllers/screen.js.html +15 -21
  42. package/coverage/lcov-report/api/controllers/script.js.html +4 -4
  43. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +599 -0
  44. package/coverage/lcov-report/api/controllers/table/external.js.html +25 -34
  45. package/coverage/lcov-report/api/controllers/table/index.html +57 -42
  46. package/coverage/lcov-report/api/controllers/table/index.js.html +28 -70
  47. package/coverage/lcov-report/api/controllers/table/internal.js.html +56 -47
  48. package/coverage/lcov-report/api/controllers/table/utils.js.html +169 -85
  49. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  50. package/coverage/lcov-report/api/controllers/user.js.html +43 -52
  51. package/coverage/lcov-report/api/controllers/view/exporters.js.html +4 -4
  52. package/coverage/lcov-report/api/controllers/view/index.html +16 -16
  53. package/coverage/lcov-report/api/controllers/view/index.js.html +27 -33
  54. package/coverage/lcov-report/api/controllers/view/utils.js.html +35 -20
  55. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +7 -7
  56. package/coverage/lcov-report/api/controllers/webhook.js.html +34 -28
  57. package/coverage/lcov-report/api/index.html +1 -1
  58. package/coverage/lcov-report/api/index.js.html +3 -3
  59. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/index.html +22 -7
  71. package/coverage/lcov-report/api/routes/index.js.html +10 -4
  72. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  75. package/coverage/lcov-report/{migrations/usageQuotas/index.js.html → api/routes/migrations.js.html} +25 -55
  76. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  79. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  80. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  81. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  82. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  83. package/coverage/lcov-report/api/routes/static.js.html +1 -1
  84. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  85. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  86. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  87. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  88. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  89. package/coverage/lcov-report/automations/actions.js.html +24 -24
  90. package/coverage/lcov-report/automations/automationUtils.js.html +7 -10
  91. package/coverage/lcov-report/automations/bullboard.js.html +16 -16
  92. package/coverage/lcov-report/automations/index.html +18 -18
  93. package/coverage/lcov-report/automations/index.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/bash.js.html +6 -6
  95. package/coverage/lcov-report/automations/steps/createRow.js.html +7 -10
  96. package/coverage/lcov-report/automations/steps/delay.js.html +4 -4
  97. package/coverage/lcov-report/automations/steps/deleteRow.js.html +7 -7
  98. package/coverage/lcov-report/automations/steps/discord.js.html +7 -7
  99. package/coverage/lcov-report/automations/steps/executeQuery.js.html +6 -6
  100. package/coverage/lcov-report/automations/steps/executeScript.js.html +6 -6
  101. package/coverage/lcov-report/automations/steps/filter.js.html +7 -7
  102. package/coverage/lcov-report/automations/steps/index.html +1 -1
  103. package/coverage/lcov-report/automations/steps/integromat.js.html +5 -5
  104. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +8 -8
  105. package/coverage/lcov-report/automations/steps/queryRows.js.html +10 -10
  106. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +5 -5
  107. package/coverage/lcov-report/automations/steps/serverLog.js.html +3 -3
  108. package/coverage/lcov-report/automations/steps/slack.js.html +5 -5
  109. package/coverage/lcov-report/automations/steps/updateRow.js.html +7 -7
  110. package/coverage/lcov-report/automations/steps/utils.js.html +3 -3
  111. package/coverage/lcov-report/automations/steps/zapier.js.html +5 -5
  112. package/coverage/lcov-report/automations/triggerInfo/app.js.html +2 -2
  113. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +2 -2
  114. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  115. package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -8
  116. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +2 -2
  117. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +2 -2
  118. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +2 -2
  119. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +2 -2
  120. package/coverage/lcov-report/automations/triggers.js.html +61 -55
  121. package/coverage/lcov-report/automations/utils.js.html +54 -42
  122. package/coverage/lcov-report/constants/index.html +5 -5
  123. package/coverage/lcov-report/constants/index.js.html +42 -27
  124. package/coverage/lcov-report/constants/layouts.js.html +5 -5
  125. package/coverage/lcov-report/constants/screens.js.html +4 -4
  126. package/coverage/lcov-report/db/client.js.html +18 -18
  127. package/coverage/lcov-report/db/inMemoryView.js.html +7 -7
  128. package/coverage/lcov-report/db/index.html +1 -1
  129. package/coverage/lcov-report/db/index.js.html +3 -3
  130. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +15 -27
  131. package/coverage/lcov-report/db/linkedRows/index.html +27 -27
  132. package/coverage/lcov-report/db/linkedRows/index.js.html +40 -85
  133. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +40 -40
  134. package/coverage/lcov-report/db/newid.js.html +4 -4
  135. package/coverage/lcov-report/db/utils.js.html +75 -75
  136. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  137. package/coverage/lcov-report/events/index.html +1 -1
  138. package/coverage/lcov-report/events/index.js.html +5 -5
  139. package/coverage/lcov-report/events/utils.js.html +3 -3
  140. package/coverage/lcov-report/index.html +107 -122
  141. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  142. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  143. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  144. package/coverage/lcov-report/middleware/authorized.js.html +21 -15
  145. package/coverage/lcov-report/middleware/builder.js.html +3 -3
  146. package/coverage/lcov-report/middleware/currentapp.js.html +72 -60
  147. package/coverage/lcov-report/middleware/index.html +28 -28
  148. package/coverage/lcov-report/middleware/joi-validator.js.html +3 -3
  149. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  150. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  151. package/coverage/lcov-report/middleware/usageQuota.js.html +29 -35
  152. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  153. package/coverage/lcov-report/threads/automation.js.html +30 -24
  154. package/coverage/lcov-report/threads/index.html +25 -25
  155. package/coverage/lcov-report/threads/index.js.html +10 -10
  156. package/coverage/lcov-report/threads/query.js.html +26 -47
  157. package/coverage/lcov-report/threads/utils.js.html +14 -14
  158. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  159. package/coverage/lcov-report/utilities/budibaseDir.js.html +7 -7
  160. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  161. package/coverage/lcov-report/utilities/csvParser.js.html +6 -6
  162. package/coverage/lcov-report/utilities/global.js.html +57 -48
  163. package/coverage/lcov-report/utilities/index.html +27 -27
  164. package/coverage/lcov-report/utilities/index.js.html +42 -72
  165. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +8 -8
  166. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  167. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  168. package/coverage/lcov-report/utilities/routing/index.js.html +7 -7
  169. package/coverage/lcov-report/utilities/rowProcessor/index.html +27 -27
  170. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +65 -71
  171. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +75 -27
  172. package/coverage/lcov-report/utilities/scriptRunner.js.html +5 -5
  173. package/coverage/lcov-report/utilities/security.js.html +8 -8
  174. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  175. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  176. package/coverage/lcov-report/utilities/usageQuota/index.js.html +13 -10
  177. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +5 -2
  178. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  179. package/coverage/lcov-report/utilities/users.js.html +9 -9
  180. package/coverage/lcov-report/utilities/workerRequests.js.html +16 -16
  181. package/coverage/lcov.info +4620 -4358
  182. package/dist/api/controllers/application.js +49 -48
  183. package/dist/api/controllers/auth.js +4 -5
  184. package/dist/api/controllers/automation.js +14 -19
  185. package/dist/api/controllers/cloud.js +2 -3
  186. package/dist/api/controllers/component.js +3 -4
  187. package/dist/api/controllers/datasource.js +9 -10
  188. package/dist/api/controllers/deploy/Deployment.js +3 -6
  189. package/dist/api/controllers/deploy/index.js +12 -13
  190. package/dist/api/controllers/dev.js +5 -5
  191. package/dist/api/controllers/layout.js +3 -3
  192. package/dist/api/controllers/metadata.js +4 -4
  193. package/dist/api/controllers/migrations.js +21 -0
  194. package/dist/api/controllers/permission.js +4 -4
  195. package/dist/api/controllers/query/import/index.js +4 -6
  196. package/dist/api/controllers/query/index.js +11 -10
  197. package/dist/api/controllers/role.js +5 -5
  198. package/dist/api/controllers/routing.js +5 -6
  199. package/dist/api/controllers/row/ExternalRequest.js +90 -67
  200. package/dist/api/controllers/row/external.js +14 -22
  201. package/dist/api/controllers/row/internal.js +55 -93
  202. package/dist/api/controllers/row/internalSearch.js +23 -17
  203. package/dist/api/controllers/row/staticFormula.js +147 -0
  204. package/dist/api/controllers/row/utils.js +7 -6
  205. package/dist/api/controllers/screen.js +5 -7
  206. package/dist/api/controllers/static/index.js +4 -4
  207. package/dist/api/controllers/table/bulkFormula.js +159 -0
  208. package/dist/api/controllers/table/external.js +7 -10
  209. package/dist/api/controllers/table/index.js +7 -10
  210. package/dist/api/controllers/table/internal.js +20 -16
  211. package/dist/api/controllers/table/utils.js +54 -34
  212. package/dist/api/controllers/user.js +16 -20
  213. package/dist/api/controllers/view/index.js +8 -10
  214. package/dist/api/controllers/view/utils.js +9 -4
  215. package/dist/api/controllers/webhook.js +10 -8
  216. package/dist/api/routes/index.js +2 -0
  217. package/dist/api/routes/migrations.js +9 -0
  218. package/dist/api/routes/tests/utilities/TestFunctions.js +37 -17
  219. package/dist/app.js +35 -5
  220. package/dist/automations/automationUtils.js +2 -3
  221. package/dist/automations/steps/createRow.js +1 -1
  222. package/dist/automations/steps/updateRow.js +1 -1
  223. package/dist/automations/triggers.js +27 -25
  224. package/dist/automations/utils.js +10 -5
  225. package/dist/constants/index.js +4 -0
  226. package/dist/db/linkedRows/LinkController.js +3 -7
  227. package/dist/db/linkedRows/index.js +16 -27
  228. package/dist/db/linkedRows/linkUtils.js +6 -6
  229. package/dist/db/views/staticViews.js +9 -10
  230. package/dist/environment.js +3 -1
  231. package/dist/integrations/base/sql.js +43 -8
  232. package/dist/integrations/utils.js +3 -0
  233. package/dist/middleware/authorized.js +5 -3
  234. package/dist/middleware/builder.js +2 -2
  235. package/dist/middleware/currentapp.js +41 -37
  236. package/dist/middleware/usageQuota.js +2 -4
  237. package/dist/migrations/functions/appUrls.js +46 -0
  238. package/dist/migrations/functions/quotas1.js +50 -0
  239. package/dist/migrations/{usageQuotas → functions/usageQuotas}/index.js +6 -10
  240. package/dist/migrations/{usageQuotas → functions/usageQuotas}/syncApps.js +12 -9
  241. package/dist/migrations/{usageQuotas → functions/usageQuotas}/syncRows.js +16 -12
  242. package/dist/migrations/functions/userEmailViewCasing.js +24 -0
  243. package/dist/migrations/index.js +62 -0
  244. package/dist/package.json +4 -4
  245. package/dist/tests/utilities/TestConfiguration.js +70 -44
  246. package/dist/threads/automation.js +13 -11
  247. package/dist/threads/query.js +13 -19
  248. package/dist/tsconfig.tsbuildinfo +1 -1
  249. package/dist/utilities/fileSystem/index.js +4 -3
  250. package/dist/utilities/global.js +15 -12
  251. package/dist/utilities/index.js +7 -17
  252. package/dist/utilities/routing/index.js +5 -5
  253. package/dist/utilities/rowProcessor/index.js +23 -17
  254. package/dist/utilities/rowProcessor/utils.js +14 -4
  255. package/dist/utilities/usageQuota/index.js +1 -0
  256. package/dist/utilities/usageQuota/rows.js +1 -0
  257. package/dist/utilities/users.js +3 -3
  258. package/dist/utilities/workerRequests.js +4 -4
  259. package/package.json +5 -5
  260. package/scripts/integrations/postgres/init.sql +11 -6
  261. package/scripts/likeCypress.ts +1 -1
  262. package/src/api/controllers/application.js +38 -31
  263. package/src/api/controllers/auth.js +4 -5
  264. package/src/api/controllers/automation.js +13 -23
  265. package/src/api/controllers/cloud.js +2 -3
  266. package/src/api/controllers/component.js +3 -4
  267. package/src/api/controllers/datasource.js +9 -11
  268. package/src/api/controllers/deploy/Deployment.js +3 -7
  269. package/src/api/controllers/deploy/index.js +20 -13
  270. package/src/api/controllers/dev.js +5 -5
  271. package/src/api/controllers/layout.js +3 -3
  272. package/src/api/controllers/metadata.js +4 -9
  273. package/src/api/controllers/migrations.js +13 -0
  274. package/src/api/controllers/permission.js +4 -4
  275. package/src/api/controllers/query/import/index.ts +4 -6
  276. package/src/api/controllers/query/import/tests/index.spec.js +2 -1
  277. package/src/api/controllers/query/index.js +11 -10
  278. package/src/api/controllers/role.js +5 -5
  279. package/src/api/controllers/routing.js +5 -6
  280. package/src/api/controllers/row/ExternalRequest.ts +67 -43
  281. package/src/api/controllers/row/external.js +27 -58
  282. package/src/api/controllers/row/internal.js +54 -90
  283. package/src/api/controllers/row/internalSearch.js +23 -17
  284. package/src/api/controllers/row/staticFormula.js +156 -0
  285. package/src/api/controllers/row/utils.js +7 -6
  286. package/src/api/controllers/screen.js +5 -7
  287. package/src/api/controllers/static/index.js +4 -4
  288. package/src/api/controllers/table/bulkFormula.js +173 -0
  289. package/src/api/controllers/table/external.js +7 -10
  290. package/src/api/controllers/table/index.js +7 -21
  291. package/src/api/controllers/table/internal.js +22 -19
  292. package/src/api/controllers/table/utils.js +70 -42
  293. package/src/api/controllers/user.js +17 -20
  294. package/src/api/controllers/view/index.js +8 -10
  295. package/src/api/controllers/view/utils.js +9 -4
  296. package/src/api/controllers/webhook.js +10 -8
  297. package/src/api/routes/index.js +2 -0
  298. package/src/api/routes/migrations.js +14 -0
  299. package/src/api/routes/tests/automation.spec.js +1 -0
  300. package/src/api/routes/tests/misc.spec.js +0 -1
  301. package/src/api/routes/tests/routing.spec.js +21 -12
  302. package/src/api/routes/tests/row.spec.js +7 -4
  303. package/src/api/routes/tests/utilities/TestFunctions.js +39 -17
  304. package/src/app.ts +18 -5
  305. package/src/automations/automationUtils.js +2 -3
  306. package/src/automations/steps/createRow.js +0 -1
  307. package/src/automations/steps/updateRow.js +1 -1
  308. package/src/automations/triggers.js +33 -31
  309. package/src/automations/utils.js +9 -5
  310. package/src/constants/index.js +5 -0
  311. package/src/db/linkedRows/LinkController.js +3 -7
  312. package/src/db/linkedRows/index.js +16 -31
  313. package/src/db/linkedRows/linkUtils.js +6 -6
  314. package/src/db/tests/linkController.spec.js +0 -1
  315. package/src/db/tests/linkTests.spec.js +5 -6
  316. package/src/db/views/staticViews.js +8 -10
  317. package/src/definitions/common.ts +3 -0
  318. package/src/environment.js +3 -1
  319. package/src/integrations/base/sql.ts +55 -14
  320. package/src/integrations/utils.ts +4 -1
  321. package/src/middleware/authorized.js +5 -3
  322. package/src/middleware/builder.js +2 -2
  323. package/src/middleware/currentapp.js +50 -46
  324. package/src/middleware/tests/authorized.spec.js +7 -2
  325. package/src/middleware/tests/currentapp.spec.js +6 -0
  326. package/src/middleware/usageQuota.js +2 -4
  327. package/src/migrations/functions/appUrls.ts +34 -0
  328. package/src/migrations/functions/quotas1.ts +20 -0
  329. package/src/migrations/functions/tests/appUrls.spec.js +29 -0
  330. package/src/migrations/{tests/usageQuotas/index.spec.js → functions/tests/quotas1.spec.js} +5 -5
  331. package/src/migrations/functions/tests/userEmailViewCasing.spec.js +25 -0
  332. package/src/migrations/functions/usageQuotas/index.ts +8 -0
  333. package/src/migrations/{usageQuotas/syncApps.js → functions/usageQuotas/syncApps.ts} +6 -6
  334. package/src/migrations/functions/usageQuotas/syncRows.ts +22 -0
  335. package/src/migrations/{tests/usageQuotas → functions/usageQuotas/tests}/syncApps.spec.js +4 -4
  336. package/src/migrations/{tests/usageQuotas → functions/usageQuotas/tests}/syncRows.spec.js +4 -4
  337. package/src/migrations/functions/userEmailViewCasing.ts +13 -0
  338. package/src/migrations/index.ts +56 -0
  339. package/src/module.d.ts +3 -0
  340. package/src/tests/utilities/TestConfiguration.js +73 -50
  341. package/src/threads/automation.js +17 -15
  342. package/src/threads/query.js +14 -21
  343. package/src/utilities/fileSystem/index.js +4 -3
  344. package/src/utilities/global.js +15 -12
  345. package/src/utilities/index.js +7 -17
  346. package/src/utilities/routing/index.js +5 -5
  347. package/src/utilities/rowProcessor/index.js +25 -27
  348. package/src/utilities/rowProcessor/utils.js +23 -7
  349. package/src/utilities/usageQuota/index.js +1 -0
  350. package/src/utilities/usageQuota/rows.js +1 -0
  351. package/src/utilities/users.js +3 -3
  352. package/src/utilities/workerRequests.js +4 -4
  353. package/tsconfig.json +2 -1
  354. package/coverage/lcov-report/migrations/usageQuotas/index.html +0 -141
  355. package/coverage/lcov-report/migrations/usageQuotas/syncRows.js.html +0 -143
  356. package/src/migrations/usageQuotas/index.js +0 -24
  357. package/src/migrations/usageQuotas/syncRows.js +0 -21
@@ -8,18 +8,18 @@ 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 { generateUserMetadataID, getUserMetadataParams, generateUserFlagID, } = require("../../db/utils");
13
12
  const { InternalTables } = require("../../db/utils");
14
13
  const { getGlobalUsers, getRawGlobalUser } = require("../../utilities/global");
15
14
  const { getFullUser } = require("../../utilities/users");
16
15
  const { isEqual } = require("lodash");
17
16
  const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles");
18
- const { getDevelopmentAppID, getDeployedAppIDs, } = require("@budibase/backend-core/db");
19
- const { doesDatabaseExist } = require("../../utilities");
17
+ const { getDevelopmentAppID, getProdAppIDs, dbExists, } = require("@budibase/backend-core/db");
20
18
  const { UserStatus } = require("@budibase/backend-core/constants");
21
- function rawMetadata(db) {
19
+ const { getAppDB } = require("@budibase/backend-core/context");
20
+ function rawMetadata() {
22
21
  return __awaiter(this, void 0, void 0, function* () {
22
+ const db = getAppDB();
23
23
  return (yield db.allDocs(getUserMetadataParams(null, {
24
24
  include_docs: true,
25
25
  }))).rows.map(row => row.doc);
@@ -45,13 +45,10 @@ function combineMetadataAndUser(user, metadata) {
45
45
  }
46
46
  return null;
47
47
  }
48
- exports.syncGlobalUsers = (appId) => __awaiter(void 0, void 0, void 0, function* () {
48
+ exports.syncGlobalUsers = () => __awaiter(void 0, void 0, void 0, function* () {
49
49
  // sync user metadata
50
- const db = new CouchDB(appId);
51
- const [users, metadata] = yield Promise.all([
52
- getGlobalUsers(appId),
53
- rawMetadata(db),
54
- ]);
50
+ const db = getAppDB();
51
+ const [users, metadata] = yield Promise.all([getGlobalUsers(), rawMetadata()]);
55
52
  const toWrite = [];
56
53
  for (let user of users) {
57
54
  const combined = yield combineMetadataAndUser(user, metadata);
@@ -86,7 +83,7 @@ exports.syncUser = function (ctx) {
86
83
  let prodAppIds;
87
84
  // if they are a builder then get all production app IDs
88
85
  if ((user.builder && user.builder.global) || deleting) {
89
- prodAppIds = yield getDeployedAppIDs(CouchDB);
86
+ prodAppIds = yield getProdAppIDs();
90
87
  }
91
88
  else {
92
89
  prodAppIds = Object.entries(roles)
@@ -97,10 +94,10 @@ exports.syncUser = function (ctx) {
97
94
  const roleId = roles[prodAppId];
98
95
  const devAppId = getDevelopmentAppID(prodAppId);
99
96
  for (let appId of [prodAppId, devAppId]) {
100
- if (!(yield doesDatabaseExist(appId))) {
97
+ if (!(yield dbExists(appId))) {
101
98
  continue;
102
99
  }
103
- const db = new CouchDB(appId);
100
+ const db = getAppDB();
104
101
  const metadataId = generateUserMetadataID(userId);
105
102
  let metadata;
106
103
  try {
@@ -134,8 +131,8 @@ exports.syncUser = function (ctx) {
134
131
  };
135
132
  exports.fetchMetadata = function (ctx) {
136
133
  return __awaiter(this, void 0, void 0, function* () {
137
- const database = new CouchDB(ctx.appId);
138
- const global = yield getGlobalUsers(ctx.appId);
134
+ const database = getAppDB();
135
+ const global = yield getGlobalUsers();
139
136
  const metadata = yield rawMetadata(database);
140
137
  const users = [];
141
138
  for (let user of global) {
@@ -162,8 +159,7 @@ exports.updateSelfMetadata = function (ctx) {
162
159
  };
163
160
  exports.updateMetadata = function (ctx) {
164
161
  return __awaiter(this, void 0, void 0, function* () {
165
- const appId = ctx.appId;
166
- const db = new CouchDB(appId);
162
+ const db = getAppDB();
167
163
  const user = ctx.request.body;
168
164
  // this isn't applicable to the user
169
165
  delete user.roles;
@@ -173,7 +169,7 @@ exports.updateMetadata = function (ctx) {
173
169
  };
174
170
  exports.destroyMetadata = function (ctx) {
175
171
  return __awaiter(this, void 0, void 0, function* () {
176
- const db = new CouchDB(ctx.appId);
172
+ const db = getAppDB();
177
173
  try {
178
174
  const dbUser = yield db.get(ctx.params.id);
179
175
  yield db.remove(dbUser._id, dbUser._rev);
@@ -199,7 +195,7 @@ exports.setFlag = function (ctx) {
199
195
  ctx.throw(400, "Must supply a 'flag' field in request body.");
200
196
  }
201
197
  const flagDocId = generateUserFlagID(userId);
202
- const db = new CouchDB(ctx.appId);
198
+ const db = getAppDB();
203
199
  let doc;
204
200
  try {
205
201
  doc = yield db.get(flagDocId);
@@ -216,7 +212,7 @@ exports.getFlags = function (ctx) {
216
212
  return __awaiter(this, void 0, void 0, function* () {
217
213
  const userId = ctx.user._id;
218
214
  const docId = generateUserFlagID(userId);
219
- const db = new CouchDB(ctx.appId);
215
+ const db = getAppDB();
220
216
  let doc;
221
217
  try {
222
218
  doc = yield db.get(docId);
@@ -19,7 +19,6 @@ var __rest = (this && this.__rest) || function (s, e) {
19
19
  }
20
20
  return t;
21
21
  };
22
- const CouchDB = require("../../../db");
23
22
  const viewTemplate = require("./viewBuilder");
24
23
  const { apiFileReturn } = require("../../../utilities/fileSystem");
25
24
  const exporters = require("./exporters");
@@ -27,18 +26,18 @@ const { saveView, getView, getViews, deleteView } = require("./utils");
27
26
  const { fetchView } = require("../row");
28
27
  const { getTable } = require("../table/utils");
29
28
  const { FieldTypes } = require("../../../constants");
29
+ const { getAppDB } = require("@budibase/backend-core/context");
30
30
  exports.fetch = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
31
- const db = new CouchDB(ctx.appId);
32
- ctx.body = yield getViews(db);
31
+ ctx.body = yield getViews();
33
32
  });
34
33
  exports.save = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
35
- const db = new CouchDB(ctx.appId);
34
+ const db = getAppDB();
36
35
  const _a = ctx.request.body, { originalName } = _a, viewToSave = __rest(_a, ["originalName"]);
37
36
  const view = viewTemplate(viewToSave);
38
37
  if (!viewToSave.name) {
39
38
  ctx.throw(400, "Cannot create view without a name");
40
39
  }
41
- yield saveView(db, originalName, viewToSave.name, view);
40
+ yield saveView(originalName, viewToSave.name, view);
42
41
  // add views to table document
43
42
  const table = yield db.get(ctx.request.body.tableId);
44
43
  if (!table.views)
@@ -54,18 +53,17 @@ exports.save = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
54
53
  ctx.body = Object.assign(Object.assign({}, table.views[viewToSave.name]), { name: viewToSave.name });
55
54
  });
56
55
  exports.destroy = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
57
- const db = new CouchDB(ctx.appId);
56
+ const db = getAppDB();
58
57
  const viewName = decodeURI(ctx.params.viewName);
59
- const view = yield deleteView(db, viewName);
58
+ const view = yield deleteView(viewName);
60
59
  const table = yield db.get(view.meta.tableId);
61
60
  delete table.views[viewName];
62
61
  yield db.put(table);
63
62
  ctx.body = view;
64
63
  });
65
64
  exports.exportView = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
66
- const db = new CouchDB(ctx.appId);
67
65
  const viewName = decodeURI(ctx.query.view);
68
- const view = yield getView(db, viewName);
66
+ const view = yield getView(viewName);
69
67
  const format = ctx.query.format;
70
68
  if (!format || !Object.values(exporters.ExportFormats).includes(format)) {
71
69
  ctx.throw(400, "Format must be specified, either csv or json");
@@ -90,7 +88,7 @@ exports.exportView = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
90
88
  let schema = view && view.meta && view.meta.schema;
91
89
  if (!schema) {
92
90
  const tableId = ctx.params.tableId || view.meta.tableId;
93
- const table = yield getTable(ctx.appId, tableId);
91
+ const table = yield getTable(tableId);
94
92
  schema = table.schema;
95
93
  }
96
94
  // remove any relationships
@@ -10,7 +10,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  };
11
11
  const { ViewNames, generateMemoryViewID, getMemoryViewParams, DocumentTypes, SEPARATOR, } = require("../../../db/utils");
12
12
  const env = require("../../../environment");
13
- exports.getView = (db, viewName) => __awaiter(void 0, void 0, void 0, function* () {
13
+ const { getAppDB } = require("@budibase/backend-core/context");
14
+ exports.getView = (viewName) => __awaiter(void 0, void 0, void 0, function* () {
15
+ const db = getAppDB();
14
16
  if (env.SELF_HOSTED) {
15
17
  const designDoc = yield db.get("_design/database");
16
18
  return designDoc.views[viewName];
@@ -24,7 +26,8 @@ exports.getView = (db, viewName) => __awaiter(void 0, void 0, void 0, function*
24
26
  return viewDoc.view;
25
27
  }
26
28
  });
27
- exports.getViews = (db) => __awaiter(void 0, void 0, void 0, function* () {
29
+ exports.getViews = () => __awaiter(void 0, void 0, void 0, function* () {
30
+ const db = getAppDB();
28
31
  const response = [];
29
32
  if (env.SELF_HOSTED) {
30
33
  const designDoc = yield db.get("_design/database");
@@ -46,7 +49,8 @@ exports.getViews = (db) => __awaiter(void 0, void 0, void 0, function* () {
46
49
  }
47
50
  return response;
48
51
  });
49
- exports.saveView = (db, originalName, viewName, viewTemplate) => __awaiter(void 0, void 0, void 0, function* () {
52
+ exports.saveView = (originalName, viewName, viewTemplate) => __awaiter(void 0, void 0, void 0, function* () {
53
+ const db = getAppDB();
50
54
  if (env.SELF_HOSTED) {
51
55
  const designDoc = yield db.get("_design/database");
52
56
  designDoc.views = Object.assign(Object.assign({}, designDoc.views), { [viewName]: viewTemplate });
@@ -81,7 +85,8 @@ exports.saveView = (db, originalName, viewName, viewTemplate) => __awaiter(void
81
85
  yield db.put(viewDoc);
82
86
  }
83
87
  });
84
- exports.deleteView = (db, viewName) => __awaiter(void 0, void 0, void 0, function* () {
88
+ exports.deleteView = (viewName) => __awaiter(void 0, void 0, void 0, function* () {
89
+ const db = getAppDB();
85
90
  if (env.SELF_HOSTED) {
86
91
  const designDoc = yield db.get("_design/database");
87
92
  const view = designDoc.views[viewName];
@@ -8,12 +8,12 @@ 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 { generateWebhookID, getWebhookParams } = require("../../db/utils");
13
12
  const toJsonSchema = require("to-json-schema");
14
13
  const validate = require("jsonschema").validate;
15
14
  const triggers = require("../../automations/triggers");
16
- const { getDeployedAppID } = require("@budibase/backend-core/db");
15
+ const { getProdAppID } = require("@budibase/backend-core/db");
16
+ const { getAppDB, updateAppId } = require("@budibase/backend-core/context");
17
17
  const AUTOMATION_DESCRIPTION = "Generated from Webhook Schema";
18
18
  function Webhook(name, type, target) {
19
19
  this.live = true;
@@ -28,14 +28,14 @@ exports.WebhookType = {
28
28
  AUTOMATION: "automation",
29
29
  };
30
30
  exports.fetch = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
31
- const db = new CouchDB(ctx.appId);
31
+ const db = getAppDB();
32
32
  const response = yield db.allDocs(getWebhookParams(null, {
33
33
  include_docs: true,
34
34
  }));
35
35
  ctx.body = response.rows.map(row => row.doc);
36
36
  });
37
37
  exports.save = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
38
- const db = new CouchDB(ctx.appId);
38
+ const db = getAppDB();
39
39
  const webhook = ctx.request.body;
40
40
  webhook.appId = ctx.appId;
41
41
  // check that the webhook exists
@@ -53,11 +53,12 @@ exports.save = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
53
53
  };
54
54
  });
55
55
  exports.destroy = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
56
- const db = new CouchDB(ctx.appId);
56
+ const db = getAppDB();
57
57
  ctx.body = yield db.remove(ctx.params.id, ctx.params.rev);
58
58
  });
59
59
  exports.buildSchema = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
60
- const db = new CouchDB(ctx.params.instance);
60
+ updateAppId(ctx.params.instance);
61
+ const db = getAppDB();
61
62
  const webhook = yield db.get(ctx.params.id);
62
63
  webhook.bodySchema = toJsonSchema(ctx.request.body);
63
64
  // update the automation outputs
@@ -80,9 +81,10 @@ exports.buildSchema = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
80
81
  ctx.body = yield db.put(webhook);
81
82
  });
82
83
  exports.trigger = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
83
- const prodAppId = getDeployedAppID(ctx.params.instance);
84
+ const prodAppId = getProdAppID(ctx.params.instance);
85
+ updateAppId(prodAppId);
84
86
  try {
85
- const db = new CouchDB(prodAppId);
87
+ const db = getAppDB();
86
88
  const webhook = yield db.get(ctx.params.id);
87
89
  // validate against the schema
88
90
  if (webhook.bodySchema) {
@@ -25,6 +25,7 @@ const backupRoutes = require("./backup");
25
25
  const metadataRoutes = require("./metadata");
26
26
  const devRoutes = require("./dev");
27
27
  const cloudRoutes = require("./cloud");
28
+ const migrationRoutes = require("./migrations");
28
29
  exports.mainRoutes = [
29
30
  authRoutes,
30
31
  deployRoutes,
@@ -53,5 +54,6 @@ exports.mainRoutes = [
53
54
  // this could be breaking as koa may recognise other routes as this
54
55
  tableRoutes,
55
56
  rowRoutes,
57
+ migrationRoutes,
56
58
  ];
57
59
  exports.staticRoutes = staticRoutes;
@@ -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}`,
@@ -52,6 +52,10 @@ exports.RelationshipTypes = {
52
52
  MANY_TO_ONE: "many-to-one",
53
53
  MANY_TO_MANY: "many-to-many",
54
54
  };
55
+ exports.FormulaTypes = {
56
+ STATIC: "static",
57
+ DYNAMIC: "dynamic",
58
+ };
55
59
  exports.AuthTypes = {
56
60
  APP: "app",
57
61
  BUILDER: "builder",