@budibase/server 1.0.49 → 1.0.50-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (381) hide show
  1. package/__mocks__/arangojs.ts +1 -1
  2. package/__mocks__/aws-sdk.ts +4 -4
  3. package/__mocks__/mongodb.ts +4 -5
  4. package/__mocks__/mssql.ts +3 -3
  5. package/__mocks__/node-fetch.ts +2 -1
  6. package/__mocks__/pg.ts +3 -5
  7. package/builder/assets/{index.2c37968e.js → index.9fe798bd.js} +252 -249
  8. package/builder/assets/index.c0cc369d.css +6 -0
  9. package/builder/assets/{vendor.f9faf6ab.js → vendor.5ad9695a.js} +202 -106
  10. package/builder/index.html +3 -3
  11. package/coverage/clover.xml +3105 -2814
  12. package/coverage/coverage-final.json +106 -101
  13. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/application.js.html +257 -152
  16. package/coverage/lcov-report/api/controllers/auth.js.html +22 -13
  17. package/coverage/lcov-report/api/controllers/automation.js.html +39 -69
  18. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/cloud.js.html +8 -11
  20. package/coverage/lcov-report/api/controllers/component.js.html +13 -16
  21. package/coverage/lcov-report/api/controllers/datasource.js.html +81 -51
  22. package/coverage/lcov-report/api/controllers/dev.js.html +6 -6
  23. package/coverage/lcov-report/api/controllers/index.html +78 -78
  24. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/layout.js.html +9 -9
  26. package/coverage/lcov-report/api/controllers/metadata.js.html +6 -21
  27. package/coverage/lcov-report/api/controllers/migrations.js.html +119 -0
  28. package/coverage/lcov-report/api/controllers/permission.js.html +19 -19
  29. package/coverage/lcov-report/api/controllers/query/index.html +10 -10
  30. package/coverage/lcov-report/api/controllers/query/index.js.html +38 -35
  31. package/coverage/lcov-report/api/controllers/query/validation.js.html +6 -6
  32. package/coverage/lcov-report/api/controllers/role.js.html +16 -16
  33. package/coverage/lcov-report/api/controllers/routing.js.html +7 -10
  34. package/coverage/lcov-report/api/controllers/row/external.js.html +48 -141
  35. package/coverage/lcov-report/api/controllers/row/index.html +55 -40
  36. package/coverage/lcov-report/api/controllers/row/index.js.html +26 -26
  37. package/coverage/lcov-report/api/controllers/row/internal.js.html +118 -226
  38. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +52 -34
  39. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +548 -0
  40. package/coverage/lcov-report/api/controllers/row/utils.js.html +47 -62
  41. package/coverage/lcov-report/api/controllers/screen.js.html +15 -21
  42. package/coverage/lcov-report/api/controllers/script.js.html +4 -4
  43. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +599 -0
  44. package/coverage/lcov-report/api/controllers/table/external.js.html +25 -34
  45. package/coverage/lcov-report/api/controllers/table/index.html +58 -43
  46. package/coverage/lcov-report/api/controllers/table/index.js.html +58 -82
  47. package/coverage/lcov-report/api/controllers/table/internal.js.html +81 -66
  48. package/coverage/lcov-report/api/controllers/table/utils.js.html +218 -110
  49. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  50. package/coverage/lcov-report/api/controllers/user.js.html +79 -76
  51. package/coverage/lcov-report/api/controllers/view/exporters.js.html +4 -4
  52. package/coverage/lcov-report/api/controllers/view/index.html +16 -16
  53. package/coverage/lcov-report/api/controllers/view/index.js.html +27 -33
  54. package/coverage/lcov-report/api/controllers/view/utils.js.html +35 -20
  55. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +7 -7
  56. package/coverage/lcov-report/api/controllers/webhook.js.html +34 -28
  57. package/coverage/lcov-report/api/index.html +1 -1
  58. package/coverage/lcov-report/api/index.js.html +8 -8
  59. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/index.html +18 -18
  71. package/coverage/lcov-report/api/routes/index.js.html +3 -3
  72. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/{hosting.js.html → migrations.js.html} +17 -14
  76. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  79. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  80. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  81. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  82. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  83. package/coverage/lcov-report/api/routes/static.js.html +17 -2
  84. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  85. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  86. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  87. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  88. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  89. package/coverage/lcov-report/automations/actions.js.html +24 -24
  90. package/coverage/lcov-report/automations/automationUtils.js.html +7 -10
  91. package/coverage/lcov-report/automations/bullboard.js.html +16 -16
  92. package/coverage/lcov-report/automations/index.html +18 -18
  93. package/coverage/lcov-report/automations/index.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/bash.js.html +6 -6
  95. package/coverage/lcov-report/automations/steps/createRow.js.html +13 -22
  96. package/coverage/lcov-report/automations/steps/delay.js.html +4 -4
  97. package/coverage/lcov-report/automations/steps/deleteRow.js.html +11 -20
  98. package/coverage/lcov-report/automations/steps/discord.js.html +7 -7
  99. package/coverage/lcov-report/automations/steps/executeQuery.js.html +6 -6
  100. package/coverage/lcov-report/automations/steps/executeScript.js.html +6 -6
  101. package/coverage/lcov-report/automations/steps/filter.js.html +7 -7
  102. package/coverage/lcov-report/automations/steps/index.html +13 -13
  103. package/coverage/lcov-report/automations/steps/integromat.js.html +5 -5
  104. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +8 -8
  105. package/coverage/lcov-report/automations/steps/queryRows.js.html +10 -10
  106. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +5 -5
  107. package/coverage/lcov-report/automations/steps/serverLog.js.html +3 -3
  108. package/coverage/lcov-report/automations/steps/slack.js.html +5 -5
  109. package/coverage/lcov-report/automations/steps/updateRow.js.html +7 -7
  110. package/coverage/lcov-report/automations/steps/utils.js.html +3 -3
  111. package/coverage/lcov-report/automations/steps/zapier.js.html +5 -5
  112. package/coverage/lcov-report/automations/triggerInfo/app.js.html +2 -2
  113. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +2 -2
  114. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  115. package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -8
  116. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +2 -2
  117. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +2 -2
  118. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +2 -2
  119. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +2 -2
  120. package/coverage/lcov-report/automations/triggers.js.html +61 -55
  121. package/coverage/lcov-report/automations/utils.js.html +54 -42
  122. package/coverage/lcov-report/constants/index.html +5 -5
  123. package/coverage/lcov-report/constants/index.js.html +53 -26
  124. package/coverage/lcov-report/constants/layouts.js.html +5 -5
  125. package/coverage/lcov-report/constants/screens.js.html +4 -4
  126. package/coverage/lcov-report/db/client.js.html +18 -18
  127. package/coverage/lcov-report/db/inMemoryView.js.html +7 -7
  128. package/coverage/lcov-report/db/index.html +15 -15
  129. package/coverage/lcov-report/db/index.js.html +3 -3
  130. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +25 -37
  131. package/coverage/lcov-report/db/linkedRows/index.html +27 -27
  132. package/coverage/lcov-report/db/linkedRows/index.js.html +51 -96
  133. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +42 -42
  134. package/coverage/lcov-report/db/newid.js.html +4 -4
  135. package/coverage/lcov-report/db/utils.js.html +87 -87
  136. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  137. package/coverage/lcov-report/events/index.html +1 -1
  138. package/coverage/lcov-report/events/index.js.html +5 -5
  139. package/coverage/lcov-report/events/utils.js.html +3 -3
  140. package/coverage/lcov-report/index.html +135 -120
  141. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  142. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  143. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  144. package/coverage/lcov-report/middleware/authorized.js.html +173 -65
  145. package/coverage/lcov-report/middleware/builder.js.html +10 -10
  146. package/coverage/lcov-report/middleware/currentapp.js.html +95 -83
  147. package/coverage/lcov-report/middleware/index.html +38 -38
  148. package/coverage/lcov-report/middleware/joi-validator.js.html +3 -3
  149. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  150. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  151. package/coverage/lcov-report/middleware/usageQuota.js.html +281 -53
  152. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  153. package/coverage/lcov-report/threads/automation.js.html +30 -24
  154. package/coverage/lcov-report/threads/index.html +26 -26
  155. package/coverage/lcov-report/threads/index.js.html +10 -10
  156. package/coverage/lcov-report/threads/query.js.html +39 -24
  157. package/coverage/lcov-report/threads/utils.js.html +14 -14
  158. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  159. package/coverage/lcov-report/utilities/budibaseDir.js.html +7 -7
  160. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  161. package/coverage/lcov-report/utilities/csvParser.js.html +6 -6
  162. package/coverage/lcov-report/utilities/global.js.html +58 -49
  163. package/coverage/lcov-report/utilities/index.html +37 -37
  164. package/coverage/lcov-report/utilities/index.js.html +43 -73
  165. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +8 -8
  166. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  167. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  168. package/coverage/lcov-report/utilities/routing/index.js.html +7 -7
  169. package/coverage/lcov-report/utilities/rowProcessor/index.html +27 -27
  170. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +97 -103
  171. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +75 -27
  172. package/coverage/lcov-report/utilities/scriptRunner.js.html +5 -5
  173. package/coverage/lcov-report/utilities/security.js.html +8 -8
  174. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  175. package/coverage/lcov-report/utilities/usageQuota/index.html +141 -0
  176. package/coverage/lcov-report/utilities/usageQuota/index.js.html +359 -0
  177. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +305 -0
  178. package/coverage/lcov-report/{api/controllers/hosting.js.html → utilities/usageQuota/usageQuoteReset.js.html} +36 -48
  179. package/coverage/lcov-report/utilities/users.js.html +9 -9
  180. package/coverage/lcov-report/utilities/workerRequests.js.html +43 -112
  181. package/coverage/lcov.info +5010 -4425
  182. package/dist/api/controllers/application.js +90 -60
  183. package/dist/api/controllers/auth.js +8 -5
  184. package/dist/api/controllers/automation.js +14 -19
  185. package/dist/api/controllers/cloud.js +2 -3
  186. package/dist/api/controllers/component.js +3 -4
  187. package/dist/api/controllers/datasource.js +20 -10
  188. package/dist/api/controllers/deploy/Deployment.js +3 -6
  189. package/dist/api/controllers/deploy/index.js +12 -13
  190. package/dist/api/controllers/dev.js +5 -5
  191. package/dist/api/controllers/layout.js +3 -3
  192. package/dist/api/controllers/metadata.js +4 -4
  193. package/dist/api/controllers/migrations.js +21 -0
  194. package/dist/api/controllers/permission.js +4 -4
  195. package/dist/api/controllers/query/import/index.js +4 -6
  196. package/dist/api/controllers/query/index.js +11 -10
  197. package/dist/api/controllers/role.js +5 -5
  198. package/dist/api/controllers/routing.js +5 -6
  199. package/dist/api/controllers/row/ExternalRequest.js +90 -67
  200. package/dist/api/controllers/row/external.js +14 -22
  201. package/dist/api/controllers/row/internal.js +55 -93
  202. package/dist/api/controllers/row/internalSearch.js +23 -17
  203. package/dist/api/controllers/row/staticFormula.js +147 -0
  204. package/dist/api/controllers/row/utils.js +13 -14
  205. package/dist/api/controllers/screen.js +5 -7
  206. package/dist/api/controllers/static/index.js +62 -16
  207. package/dist/api/controllers/table/bulkFormula.js +159 -0
  208. package/dist/api/controllers/table/external.js +7 -10
  209. package/dist/api/controllers/table/index.js +16 -13
  210. package/dist/api/controllers/table/internal.js +22 -16
  211. package/dist/api/controllers/table/utils.js +62 -35
  212. package/dist/api/controllers/user.js +43 -43
  213. package/dist/api/controllers/view/index.js +8 -10
  214. package/dist/api/controllers/view/utils.js +9 -4
  215. package/dist/api/controllers/webhook.js +10 -8
  216. package/dist/api/routes/index.js +2 -2
  217. package/dist/api/routes/migrations.js +9 -0
  218. package/dist/api/routes/static.js +2 -1
  219. package/dist/api/routes/tests/utilities/TestFunctions.js +37 -17
  220. package/dist/app.js +35 -5
  221. package/dist/automations/automationUtils.js +2 -3
  222. package/dist/automations/steps/createRow.js +3 -5
  223. package/dist/automations/steps/deleteRow.js +1 -4
  224. package/dist/automations/steps/updateRow.js +1 -1
  225. package/dist/automations/triggers.js +27 -25
  226. package/dist/automations/utils.js +10 -5
  227. package/dist/constants/index.js +7 -0
  228. package/dist/db/linkedRows/LinkController.js +3 -7
  229. package/dist/db/linkedRows/index.js +16 -27
  230. package/dist/db/linkedRows/linkUtils.js +6 -6
  231. package/dist/db/views/staticViews.js +9 -10
  232. package/dist/definitions/datasource.js +1 -0
  233. package/dist/environment.js +4 -1
  234. package/dist/integrations/base/sql.js +62 -21
  235. package/dist/integrations/googlesheets.js +340 -0
  236. package/dist/integrations/index.js +3 -0
  237. package/dist/integrations/utils.js +60 -9
  238. package/dist/middleware/authorized.js +57 -30
  239. package/dist/middleware/builder.js +2 -2
  240. package/dist/middleware/currentapp.js +41 -37
  241. package/dist/middleware/usageQuota.js +82 -15
  242. package/dist/migrations/functions/appUrls.js +46 -0
  243. package/dist/migrations/functions/quotas1.js +50 -0
  244. package/dist/migrations/functions/usageQuotas/index.js +20 -0
  245. package/dist/migrations/functions/usageQuotas/syncApps.js +29 -0
  246. package/dist/migrations/functions/usageQuotas/syncRows.js +33 -0
  247. package/dist/migrations/functions/userEmailViewCasing.js +24 -0
  248. package/dist/migrations/index.js +62 -0
  249. package/dist/package.json +8 -5
  250. package/dist/tests/utilities/TestConfiguration.js +80 -50
  251. package/dist/threads/automation.js +13 -11
  252. package/dist/threads/query.js +15 -11
  253. package/dist/tsconfig.tsbuildinfo +1 -1
  254. package/dist/utilities/fileSystem/index.js +4 -3
  255. package/dist/utilities/global.js +15 -12
  256. package/dist/utilities/index.js +7 -17
  257. package/dist/utilities/routing/index.js +5 -5
  258. package/dist/utilities/rowProcessor/index.js +23 -17
  259. package/dist/utilities/rowProcessor/utils.js +14 -4
  260. package/dist/utilities/{usageQuota.js → usageQuota/index.js} +45 -31
  261. package/dist/utilities/usageQuota/rows.js +78 -0
  262. package/dist/utilities/usageQuota/usageQuoteReset.js +16 -0
  263. package/dist/utilities/users.js +3 -3
  264. package/dist/utilities/workerRequests.js +4 -24
  265. package/nodemon.json +1 -1
  266. package/package.json +9 -6
  267. package/scripts/integrations/mssql/data/Dockerfile +1 -1
  268. package/scripts/integrations/mssql/data/setup.sql +17 -4
  269. package/scripts/integrations/postgres/init.sql +11 -6
  270. package/scripts/likeCypress.ts +1 -1
  271. package/src/api/controllers/application.js +85 -50
  272. package/src/api/controllers/auth.js +8 -5
  273. package/src/api/controllers/automation.js +13 -23
  274. package/src/api/controllers/cloud.js +2 -3
  275. package/src/api/controllers/component.js +3 -4
  276. package/src/api/controllers/datasource.js +21 -11
  277. package/src/api/controllers/deploy/Deployment.js +3 -7
  278. package/src/api/controllers/deploy/index.js +20 -13
  279. package/src/api/controllers/dev.js +5 -5
  280. package/src/api/controllers/layout.js +3 -3
  281. package/src/api/controllers/metadata.js +4 -9
  282. package/src/api/controllers/migrations.js +13 -0
  283. package/src/api/controllers/permission.js +4 -4
  284. package/src/api/controllers/query/import/index.ts +4 -6
  285. package/src/api/controllers/query/import/tests/index.spec.js +2 -1
  286. package/src/api/controllers/query/index.js +11 -10
  287. package/src/api/controllers/role.js +5 -5
  288. package/src/api/controllers/routing.js +5 -6
  289. package/src/api/controllers/row/ExternalRequest.ts +67 -43
  290. package/src/api/controllers/row/external.js +27 -58
  291. package/src/api/controllers/row/internal.js +54 -90
  292. package/src/api/controllers/row/internalSearch.js +23 -17
  293. package/src/api/controllers/row/staticFormula.js +156 -0
  294. package/src/api/controllers/row/utils.js +13 -18
  295. package/src/api/controllers/screen.js +5 -7
  296. package/src/api/controllers/static/index.js +66 -15
  297. package/src/api/controllers/table/bulkFormula.js +173 -0
  298. package/src/api/controllers/table/external.js +7 -10
  299. package/src/api/controllers/table/index.js +20 -28
  300. package/src/api/controllers/table/internal.js +24 -19
  301. package/src/api/controllers/table/utils.js +78 -42
  302. package/src/api/controllers/user.js +46 -45
  303. package/src/api/controllers/view/index.js +8 -10
  304. package/src/api/controllers/view/utils.js +9 -4
  305. package/src/api/controllers/webhook.js +10 -8
  306. package/src/api/routes/index.js +2 -2
  307. package/src/api/routes/migrations.js +14 -0
  308. package/src/api/routes/static.js +5 -0
  309. package/src/api/routes/tests/application.spec.js +2 -2
  310. package/src/api/routes/tests/auth.spec.js +1 -2
  311. package/src/api/routes/tests/automation.spec.js +1 -0
  312. package/src/api/routes/tests/misc.spec.js +0 -1
  313. package/src/api/routes/tests/routing.spec.js +21 -12
  314. package/src/api/routes/tests/row.spec.js +7 -4
  315. package/src/api/routes/tests/static.spec.js +98 -0
  316. package/src/api/routes/tests/utilities/TestFunctions.js +39 -17
  317. package/src/app.ts +18 -5
  318. package/src/automations/automationUtils.js +2 -3
  319. package/src/automations/steps/createRow.js +2 -5
  320. package/src/automations/steps/deleteRow.js +1 -4
  321. package/src/automations/steps/updateRow.js +1 -1
  322. package/src/automations/triggers.js +33 -31
  323. package/src/automations/utils.js +9 -5
  324. package/src/constants/index.js +9 -0
  325. package/src/db/linkedRows/LinkController.js +3 -7
  326. package/src/db/linkedRows/index.js +16 -31
  327. package/src/db/linkedRows/linkUtils.js +6 -6
  328. package/src/db/tests/linkController.spec.js +0 -1
  329. package/src/db/tests/linkTests.spec.js +5 -6
  330. package/src/db/views/staticViews.js +8 -10
  331. package/src/definitions/common.ts +3 -0
  332. package/src/definitions/datasource.ts +3 -0
  333. package/src/environment.js +4 -1
  334. package/src/integrations/base/sql.ts +75 -29
  335. package/src/integrations/googlesheets.ts +353 -0
  336. package/src/integrations/index.ts +3 -0
  337. package/src/integrations/tests/sql.spec.js +16 -0
  338. package/src/integrations/utils.ts +75 -12
  339. package/src/middleware/authorized.js +66 -30
  340. package/src/middleware/builder.js +2 -2
  341. package/src/middleware/currentapp.js +50 -46
  342. package/src/middleware/tests/authorized.spec.js +13 -6
  343. package/src/middleware/tests/currentapp.spec.js +6 -0
  344. package/src/middleware/tests/usageQuota.spec.js +18 -24
  345. package/src/middleware/usageQuota.js +93 -17
  346. package/src/migrations/functions/appUrls.ts +34 -0
  347. package/src/migrations/functions/quotas1.ts +20 -0
  348. package/src/migrations/functions/tests/appUrls.spec.js +29 -0
  349. package/src/migrations/functions/tests/quotas1.spec.js +27 -0
  350. package/src/migrations/functions/tests/userEmailViewCasing.spec.js +25 -0
  351. package/src/migrations/functions/usageQuotas/index.ts +8 -0
  352. package/src/migrations/functions/usageQuotas/syncApps.ts +18 -0
  353. package/src/migrations/functions/usageQuotas/syncRows.ts +22 -0
  354. package/src/migrations/functions/usageQuotas/tests/syncApps.spec.js +37 -0
  355. package/src/migrations/functions/usageQuotas/tests/syncRows.spec.js +43 -0
  356. package/src/migrations/functions/userEmailViewCasing.ts +13 -0
  357. package/src/migrations/index.ts +56 -0
  358. package/src/module.d.ts +3 -0
  359. package/src/tests/utilities/TestConfiguration.js +82 -55
  360. package/src/threads/automation.js +17 -15
  361. package/src/threads/query.js +17 -12
  362. package/src/utilities/fileSystem/index.js +4 -3
  363. package/src/utilities/global.js +15 -12
  364. package/src/utilities/index.js +7 -17
  365. package/src/utilities/routing/index.js +5 -5
  366. package/src/utilities/rowProcessor/index.js +25 -27
  367. package/src/utilities/rowProcessor/utils.js +23 -7
  368. package/src/utilities/tests/usageQuota/usageQuota.spec.js +72 -0
  369. package/src/utilities/usageQuota/index.js +93 -0
  370. package/src/utilities/usageQuota/rows.js +75 -0
  371. package/src/utilities/usageQuota/usageQuoteReset.js +18 -0
  372. package/src/utilities/users.js +3 -3
  373. package/src/utilities/workerRequests.js +4 -27
  374. package/tsconfig.json +4 -2
  375. package/builder/assets/index.39e01193.css +0 -1
  376. package/dist/api/controllers/hosting.js +0 -30
  377. package/dist/api/routes/hosting.js +0 -11
  378. package/src/api/controllers/hosting.js +0 -22
  379. package/src/api/routes/hosting.js +0 -13
  380. package/src/api/routes/tests/hosting.spec.js +0 -36
  381. package/src/utilities/usageQuota.js +0 -73
@@ -8,17 +8,30 @@ 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 csvParser = require("../../../utilities/csvParser");
13
- const { getRowParams, generateRowID, InternalTables, } = require("../../../db/utils");
14
- const { isEqual } = require("lodash/fp");
12
+ const { getRowParams, generateRowID, InternalTables, getTableParams, BudibaseInternalDB, } = require("../../../db/utils");
13
+ const { isEqual } = require("lodash");
15
14
  const { AutoFieldSubTypes, FieldTypes } = require("../../../constants");
16
- const { inputProcessing } = require("../../../utilities/rowProcessor");
15
+ const { inputProcessing, cleanupAttachments, } = require("../../../utilities/rowProcessor");
17
16
  const { USERS_TABLE_SCHEMA, SwitchableTypes, CanSwitchTypes, } = require("../../../constants");
18
- const { isExternalTable, breakExternalTableId, } = require("../../../integrations/utils");
17
+ const { isExternalTable, breakExternalTableId, isSQL, } = require("../../../integrations/utils");
19
18
  const { getViews, saveView } = require("../view/utils");
20
19
  const viewTemplate = require("../view/viewBuilder");
21
- exports.checkForColumnUpdates = (db, oldTable, updatedTable) => __awaiter(void 0, void 0, void 0, function* () {
20
+ const usageQuota = require("../../../utilities/usageQuota");
21
+ const { getAppDB } = require("@budibase/backend-core/context");
22
+ const { cloneDeep } = require("lodash/fp");
23
+ exports.clearColumns = (table, columnNames) => __awaiter(void 0, void 0, void 0, function* () {
24
+ const db = getAppDB();
25
+ const rows = yield db.allDocs(getRowParams(table._id, null, {
26
+ include_docs: true,
27
+ }));
28
+ return db.bulkDocs(rows.rows.map(({ doc }) => {
29
+ columnNames.forEach(colName => delete doc[colName]);
30
+ return doc;
31
+ }));
32
+ });
33
+ exports.checkForColumnUpdates = (oldTable, updatedTable) => __awaiter(void 0, void 0, void 0, function* () {
34
+ const db = getAppDB();
22
35
  let updatedRows = [];
23
36
  const rename = updatedTable._rename;
24
37
  let deletedColumns = [];
@@ -31,18 +44,22 @@ exports.checkForColumnUpdates = (db, oldTable, updatedTable) => __awaiter(void 0
31
44
  const rows = yield db.allDocs(getRowParams(updatedTable._id, null, {
32
45
  include_docs: true,
33
46
  }));
34
- updatedRows = rows.rows.map(({ doc }) => {
47
+ const rawRows = rows.rows.map(({ doc }) => doc);
48
+ updatedRows = rawRows.map(row => {
49
+ row = cloneDeep(row);
35
50
  if (rename) {
36
- doc[rename.updated] = doc[rename.old];
37
- delete doc[rename.old];
51
+ row[rename.updated] = row[rename.old];
52
+ delete row[rename.old];
38
53
  }
39
54
  else if (deletedColumns.length !== 0) {
40
- deletedColumns.forEach(colName => delete doc[colName]);
55
+ deletedColumns.forEach(colName => delete row[colName]);
41
56
  }
42
- return doc;
57
+ return row;
43
58
  });
59
+ // cleanup any attachments from object storage for deleted attachment columns
60
+ yield cleanupAttachments(updatedTable, { oldTable, rows: rawRows });
44
61
  // Update views
45
- yield exports.checkForViewUpdates(db, updatedTable, rename, deletedColumns);
62
+ yield exports.checkForViewUpdates(updatedTable, rename, deletedColumns);
46
63
  delete updatedTable._rename;
47
64
  }
48
65
  return { rows: updatedRows, table: updatedTable };
@@ -65,11 +82,11 @@ exports.makeSureTableUpToDate = (table, tableToSave) => {
65
82
  }
66
83
  return tableToSave;
67
84
  };
68
- exports.handleDataImport = (appId, user, table, dataImport) => __awaiter(void 0, void 0, void 0, function* () {
85
+ exports.handleDataImport = (user, table, dataImport) => __awaiter(void 0, void 0, void 0, function* () {
69
86
  if (!dataImport || !dataImport.csvString) {
70
87
  return table;
71
88
  }
72
- const db = new CouchDB(appId);
89
+ const db = getAppDB();
73
90
  // Populate the table with rows imported from CSV in a bulk update
74
91
  const data = yield csvParser.transform(Object.assign(Object.assign({}, dataImport), { existingTable: table }));
75
92
  let finalData = [];
@@ -95,13 +112,17 @@ exports.handleDataImport = (appId, user, table, dataImport) => __awaiter(void 0,
95
112
  }
96
113
  finalData.push(row);
97
114
  }
115
+ yield usageQuota.update(usageQuota.Properties.ROW, finalData.length, {
116
+ dryRun: true,
117
+ });
98
118
  yield db.bulkDocs(finalData);
119
+ yield usageQuota.update(usageQuota.Properties.ROW, finalData.length);
99
120
  let response = yield db.put(table);
100
121
  table._rev = response._rev;
101
122
  return table;
102
123
  });
103
- exports.handleSearchIndexes = (appId, table) => __awaiter(void 0, void 0, void 0, function* () {
104
- const db = new CouchDB(appId);
124
+ exports.handleSearchIndexes = (table) => __awaiter(void 0, void 0, void 0, function* () {
125
+ const db = getAppDB();
105
126
  // create relevant search indexes
106
127
  if (table.indexes && table.indexes.length > 0) {
107
128
  const currentIndexes = yield db.getIndexes();
@@ -150,12 +171,9 @@ exports.checkStaticTables = table => {
150
171
  return table;
151
172
  };
152
173
  class TableSaveFunctions {
153
- constructor({ db, ctx, oldTable, dataImport }) {
154
- this.db = db;
155
- this.ctx = ctx;
156
- if (this.ctx && this.ctx.user) {
157
- this.appId = this.ctx.appId;
158
- }
174
+ constructor({ user, oldTable, dataImport }) {
175
+ this.db = getAppDB();
176
+ this.user = user;
159
177
  this.oldTable = oldTable;
160
178
  this.dataImport = dataImport;
161
179
  // any rows that need updated
@@ -174,7 +192,7 @@ class TableSaveFunctions {
174
192
  // when confirmed valid
175
193
  mid(table) {
176
194
  return __awaiter(this, void 0, void 0, function* () {
177
- let response = yield exports.checkForColumnUpdates(this.db, this.oldTable, table);
195
+ let response = yield exports.checkForColumnUpdates(this.oldTable, table);
178
196
  this.rows = this.rows.concat(response.rows);
179
197
  return table;
180
198
  });
@@ -182,8 +200,8 @@ class TableSaveFunctions {
182
200
  // after saving
183
201
  after(table) {
184
202
  return __awaiter(this, void 0, void 0, function* () {
185
- table = yield exports.handleSearchIndexes(this.appId, table);
186
- table = yield exports.handleDataImport(this.appId, this.ctx.user, table, this.dataImport);
203
+ table = yield exports.handleSearchIndexes(table);
204
+ table = yield exports.handleDataImport(this.user, table, this.dataImport);
187
205
  return table;
188
206
  });
189
207
  }
@@ -191,30 +209,39 @@ class TableSaveFunctions {
191
209
  return this.rows;
192
210
  }
193
211
  }
194
- exports.getAllExternalTables = (appId, datasourceId) => __awaiter(void 0, void 0, void 0, function* () {
195
- const db = new CouchDB(appId);
212
+ exports.getAllInternalTables = () => __awaiter(void 0, void 0, void 0, function* () {
213
+ const db = getAppDB();
214
+ const internalTables = yield db.allDocs(getTableParams(null, {
215
+ include_docs: true,
216
+ }));
217
+ return internalTables.rows.map(tableDoc => (Object.assign(Object.assign({}, tableDoc.doc), { type: "internal", sourceId: BudibaseInternalDB._id })));
218
+ });
219
+ exports.getAllExternalTables = (datasourceId) => __awaiter(void 0, void 0, void 0, function* () {
220
+ const db = getAppDB();
196
221
  const datasource = yield db.get(datasourceId);
197
222
  if (!datasource || !datasource.entities) {
198
223
  throw "Datasource is not configured fully.";
199
224
  }
200
225
  return datasource.entities;
201
226
  });
202
- exports.getExternalTable = (appId, datasourceId, tableName) => __awaiter(void 0, void 0, void 0, function* () {
203
- const entities = yield exports.getAllExternalTables(appId, datasourceId);
227
+ exports.getExternalTable = (datasourceId, tableName) => __awaiter(void 0, void 0, void 0, function* () {
228
+ const entities = yield exports.getAllExternalTables(datasourceId);
204
229
  return entities[tableName];
205
230
  });
206
- exports.getTable = (appId, tableId) => __awaiter(void 0, void 0, void 0, function* () {
207
- const db = new CouchDB(appId);
231
+ exports.getTable = (tableId) => __awaiter(void 0, void 0, void 0, function* () {
232
+ const db = getAppDB();
208
233
  if (isExternalTable(tableId)) {
209
234
  let { datasourceId, tableName } = breakExternalTableId(tableId);
210
- return exports.getExternalTable(appId, datasourceId, tableName);
235
+ const datasource = yield db.get(datasourceId);
236
+ const table = yield exports.getExternalTable(datasourceId, tableName);
237
+ return Object.assign(Object.assign({}, table), { sql: isSQL(datasource) });
211
238
  }
212
239
  else {
213
240
  return db.get(tableId);
214
241
  }
215
242
  });
216
- exports.checkForViewUpdates = (db, table, rename, deletedColumns) => __awaiter(void 0, void 0, void 0, function* () {
217
- const views = yield getViews(db);
243
+ exports.checkForViewUpdates = (table, rename, deletedColumns) => __awaiter(void 0, void 0, void 0, function* () {
244
+ const views = yield getViews();
218
245
  const tableViews = views.filter(view => view.meta.tableId === table._id);
219
246
  // Check each table view to see if impacted by this table action
220
247
  for (let view of tableViews) {
@@ -270,7 +297,7 @@ exports.checkForViewUpdates = (db, table, rename, deletedColumns) => __awaiter(v
270
297
  // Update view if required
271
298
  if (needsUpdated) {
272
299
  const newViewTemplate = viewTemplate(view.meta);
273
- yield saveView(db, null, view.name, newViewTemplate);
300
+ yield saveView(null, view.name, newViewTemplate);
274
301
  if (!newViewTemplate.meta.schema) {
275
302
  newViewTemplate.meta.schema = table.schema;
276
303
  }
@@ -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, doInAppContext } = 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,34 +94,36 @@ 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);
104
- const metadataId = generateUserMetadataID(userId);
105
- let metadata;
106
- try {
107
- metadata = yield db.get(metadataId);
108
- }
109
- catch (err) {
110
- if (deleting) {
111
- continue;
100
+ yield doInAppContext(appId, () => __awaiter(this, void 0, void 0, function* () {
101
+ const db = getAppDB();
102
+ const metadataId = generateUserMetadataID(userId);
103
+ let metadata;
104
+ try {
105
+ metadata = yield db.get(metadataId);
112
106
  }
113
- metadata = {
114
- tableId: InternalTables.USER_METADATA,
115
- };
116
- }
117
- // assign the roleId for the metadata doc
118
- if (roleId) {
119
- metadata.roleId = roleId;
120
- }
121
- let combined = !deleting
122
- ? combineMetadataAndUser(user, metadata)
123
- : Object.assign(Object.assign({}, metadata), { status: UserStatus.INACTIVE, metadata: BUILTIN_ROLE_IDS.PUBLIC });
124
- // if its null then there was no updates required
125
- if (combined) {
126
- yield db.put(combined);
127
- }
107
+ catch (err) {
108
+ if (deleting) {
109
+ return;
110
+ }
111
+ metadata = {
112
+ tableId: InternalTables.USER_METADATA,
113
+ };
114
+ }
115
+ // assign the roleId for the metadata doc
116
+ if (roleId) {
117
+ metadata.roleId = roleId;
118
+ }
119
+ let combined = !deleting
120
+ ? combineMetadataAndUser(user, metadata)
121
+ : Object.assign(Object.assign({}, metadata), { status: UserStatus.INACTIVE, metadata: BUILTIN_ROLE_IDS.PUBLIC });
122
+ // if its null then there was no updates required
123
+ if (combined) {
124
+ yield db.put(combined);
125
+ }
126
+ }));
128
127
  }
129
128
  }
130
129
  ctx.body = {
@@ -134,8 +133,8 @@ exports.syncUser = function (ctx) {
134
133
  };
135
134
  exports.fetchMetadata = function (ctx) {
136
135
  return __awaiter(this, void 0, void 0, function* () {
137
- const database = new CouchDB(ctx.appId);
138
- const global = yield getGlobalUsers(ctx.appId);
136
+ const database = getAppDB();
137
+ const global = yield getGlobalUsers();
139
138
  const metadata = yield rawMetadata(database);
140
139
  const users = [];
141
140
  for (let user of global) {
@@ -155,13 +154,14 @@ exports.updateSelfMetadata = function (ctx) {
155
154
  ctx.request.body._id = ctx.user._id;
156
155
  // make sure no stale rev
157
156
  delete ctx.request.body._rev;
157
+ // make sure no csrf token
158
+ delete ctx.request.body.csrfToken;
158
159
  yield exports.updateMetadata(ctx);
159
160
  });
160
161
  };
161
162
  exports.updateMetadata = function (ctx) {
162
163
  return __awaiter(this, void 0, void 0, function* () {
163
- const appId = ctx.appId;
164
- const db = new CouchDB(appId);
164
+ const db = getAppDB();
165
165
  const user = ctx.request.body;
166
166
  // this isn't applicable to the user
167
167
  delete user.roles;
@@ -171,7 +171,7 @@ exports.updateMetadata = function (ctx) {
171
171
  };
172
172
  exports.destroyMetadata = function (ctx) {
173
173
  return __awaiter(this, void 0, void 0, function* () {
174
- const db = new CouchDB(ctx.appId);
174
+ const db = getAppDB();
175
175
  try {
176
176
  const dbUser = yield db.get(ctx.params.id);
177
177
  yield db.remove(dbUser._id, dbUser._rev);
@@ -197,7 +197,7 @@ exports.setFlag = function (ctx) {
197
197
  ctx.throw(400, "Must supply a 'flag' field in request body.");
198
198
  }
199
199
  const flagDocId = generateUserFlagID(userId);
200
- const db = new CouchDB(ctx.appId);
200
+ const db = getAppDB();
201
201
  let doc;
202
202
  try {
203
203
  doc = yield db.get(flagDocId);
@@ -214,7 +214,7 @@ exports.getFlags = function (ctx) {
214
214
  return __awaiter(this, void 0, void 0, function* () {
215
215
  const userId = ctx.user._id;
216
216
  const docId = generateUserFlagID(userId);
217
- const db = new CouchDB(ctx.appId);
217
+ const db = getAppDB();
218
218
  let doc;
219
219
  try {
220
220
  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) {
@@ -21,11 +21,11 @@ const integrationRoutes = require("./integration");
21
21
  const permissionRoutes = require("./permission");
22
22
  const datasourceRoutes = require("./datasource");
23
23
  const queryRoutes = require("./query");
24
- const hostingRoutes = require("./hosting");
25
24
  const backupRoutes = require("./backup");
26
25
  const metadataRoutes = require("./metadata");
27
26
  const devRoutes = require("./dev");
28
27
  const cloudRoutes = require("./cloud");
28
+ const migrationRoutes = require("./migrations");
29
29
  exports.mainRoutes = [
30
30
  authRoutes,
31
31
  deployRoutes,
@@ -46,7 +46,6 @@ exports.mainRoutes = [
46
46
  permissionRoutes,
47
47
  datasourceRoutes,
48
48
  queryRoutes,
49
- hostingRoutes,
50
49
  backupRoutes,
51
50
  metadataRoutes,
52
51
  devRoutes,
@@ -55,5 +54,6 @@ exports.mainRoutes = [
55
54
  // this could be breaking as koa may recognise other routes as this
56
55
  tableRoutes,
57
56
  rowRoutes,
57
+ migrationRoutes,
58
58
  ];
59
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;
@@ -43,5 +43,6 @@ router
43
43
  .post("/api/attachments/process", authorized(BUILDER), controller.uploadFile)
44
44
  .post("/api/attachments/:tableId/upload", paramResource("tableId"), authorized(PermissionTypes.TABLE, PermissionLevels.WRITE), controller.uploadFile)
45
45
  // TODO: this likely needs to be secured in some way
46
- .get("/:appId/:path*", controller.serveApp);
46
+ .get("/:appId/:path*", controller.serveApp)
47
+ .post("/api/attachments/:datasourceId/url", authorized(PermissionTypes.TABLE, PermissionLevels.READ), controller.getSignedUploadURL);
47
48
  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
  });