@budibase/server 1.0.47 → 1.0.49-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (379) hide show
  1. package/__mocks__/arangojs.ts +1 -1
  2. package/__mocks__/aws-sdk.ts +4 -4
  3. package/__mocks__/mongodb.ts +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.937b2767.js → index.506eca43.js} +249 -246
  8. package/builder/assets/index.83c0944f.css +1 -0
  9. package/builder/assets/{vendor.f9faf6ab.js → vendor.d526bfe8.js} +12 -12
  10. package/builder/index.html +3 -3
  11. package/coverage/clover.xml +3069 -2773
  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 +76 -76
  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 +282 -111
  49. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  50. package/coverage/lcov-report/api/controllers/user.js.html +47 -50
  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 +11 -11
  123. package/coverage/lcov-report/constants/index.js.html +68 -32
  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 +138 -123
  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 +36 -42
  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 +4989 -4390
  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 +89 -65
  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 +61 -12
  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 +77 -37
  212. package/dist/api/controllers/user.js +18 -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 -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 +12 -5
  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 +56 -14
  235. package/dist/integrations/googlesheets.js +340 -0
  236. package/dist/integrations/index.js +3 -0
  237. package/dist/integrations/utils.js +60 -8
  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 +17 -19
  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/postgres/init.sql +11 -6
  268. package/scripts/likeCypress.ts +1 -1
  269. package/src/api/controllers/application.js +85 -50
  270. package/src/api/controllers/auth.js +8 -5
  271. package/src/api/controllers/automation.js +13 -23
  272. package/src/api/controllers/cloud.js +2 -3
  273. package/src/api/controllers/component.js +3 -4
  274. package/src/api/controllers/datasource.js +21 -11
  275. package/src/api/controllers/deploy/Deployment.js +3 -7
  276. package/src/api/controllers/deploy/index.js +20 -13
  277. package/src/api/controllers/dev.js +5 -5
  278. package/src/api/controllers/layout.js +3 -3
  279. package/src/api/controllers/metadata.js +4 -9
  280. package/src/api/controllers/migrations.js +13 -0
  281. package/src/api/controllers/permission.js +4 -4
  282. package/src/api/controllers/query/import/index.ts +4 -6
  283. package/src/api/controllers/query/import/tests/index.spec.js +2 -1
  284. package/src/api/controllers/query/index.js +11 -10
  285. package/src/api/controllers/role.js +5 -5
  286. package/src/api/controllers/routing.js +5 -6
  287. package/src/api/controllers/row/ExternalRequest.ts +66 -42
  288. package/src/api/controllers/row/external.js +27 -58
  289. package/src/api/controllers/row/internal.js +54 -90
  290. package/src/api/controllers/row/internalSearch.js +23 -17
  291. package/src/api/controllers/row/staticFormula.js +156 -0
  292. package/src/api/controllers/row/utils.js +13 -18
  293. package/src/api/controllers/screen.js +5 -7
  294. package/src/api/controllers/static/index.js +65 -12
  295. package/src/api/controllers/table/bulkFormula.js +173 -0
  296. package/src/api/controllers/table/external.js +7 -10
  297. package/src/api/controllers/table/index.js +20 -28
  298. package/src/api/controllers/table/internal.js +24 -19
  299. package/src/api/controllers/table/utils.js +101 -44
  300. package/src/api/controllers/user.js +19 -20
  301. package/src/api/controllers/view/index.js +8 -10
  302. package/src/api/controllers/view/utils.js +9 -4
  303. package/src/api/controllers/webhook.js +10 -8
  304. package/src/api/routes/index.js +2 -2
  305. package/src/api/routes/migrations.js +14 -0
  306. package/src/api/routes/static.js +5 -0
  307. package/src/api/routes/tests/application.spec.js +2 -2
  308. package/src/api/routes/tests/auth.spec.js +1 -2
  309. package/src/api/routes/tests/automation.spec.js +1 -0
  310. package/src/api/routes/tests/misc.spec.js +0 -1
  311. package/src/api/routes/tests/routing.spec.js +21 -12
  312. package/src/api/routes/tests/row.spec.js +7 -4
  313. package/src/api/routes/tests/static.spec.js +98 -0
  314. package/src/api/routes/tests/utilities/TestFunctions.js +39 -17
  315. package/src/app.ts +18 -5
  316. package/src/automations/automationUtils.js +2 -3
  317. package/src/automations/steps/createRow.js +2 -5
  318. package/src/automations/steps/deleteRow.js +1 -4
  319. package/src/automations/steps/updateRow.js +1 -1
  320. package/src/automations/triggers.js +33 -31
  321. package/src/automations/utils.js +9 -5
  322. package/src/constants/index.js +17 -5
  323. package/src/db/linkedRows/LinkController.js +3 -7
  324. package/src/db/linkedRows/index.js +16 -31
  325. package/src/db/linkedRows/linkUtils.js +6 -6
  326. package/src/db/tests/linkController.spec.js +0 -1
  327. package/src/db/tests/linkTests.spec.js +5 -6
  328. package/src/db/views/staticViews.js +8 -10
  329. package/src/definitions/common.ts +3 -0
  330. package/src/definitions/datasource.ts +3 -0
  331. package/src/environment.js +4 -1
  332. package/src/integrations/base/sql.ts +69 -21
  333. package/src/integrations/googlesheets.ts +353 -0
  334. package/src/integrations/index.ts +3 -0
  335. package/src/integrations/tests/sql.spec.js +16 -0
  336. package/src/integrations/utils.ts +75 -11
  337. package/src/middleware/authorized.js +66 -30
  338. package/src/middleware/builder.js +2 -2
  339. package/src/middleware/currentapp.js +50 -46
  340. package/src/middleware/tests/authorized.spec.js +13 -6
  341. package/src/middleware/tests/currentapp.spec.js +6 -0
  342. package/src/middleware/tests/usageQuota.spec.js +18 -24
  343. package/src/middleware/usageQuota.js +93 -17
  344. package/src/migrations/functions/appUrls.ts +34 -0
  345. package/src/migrations/functions/quotas1.ts +20 -0
  346. package/src/migrations/functions/tests/appUrls.spec.js +29 -0
  347. package/src/migrations/functions/tests/quotas1.spec.js +27 -0
  348. package/src/migrations/functions/tests/userEmailViewCasing.spec.js +25 -0
  349. package/src/migrations/functions/usageQuotas/index.ts +8 -0
  350. package/src/migrations/functions/usageQuotas/syncApps.ts +18 -0
  351. package/src/migrations/functions/usageQuotas/syncRows.ts +22 -0
  352. package/src/migrations/functions/usageQuotas/tests/syncApps.spec.js +37 -0
  353. package/src/migrations/functions/usageQuotas/tests/syncRows.spec.js +43 -0
  354. package/src/migrations/functions/userEmailViewCasing.ts +13 -0
  355. package/src/migrations/index.ts +56 -0
  356. package/src/module.d.ts +3 -0
  357. package/src/tests/utilities/TestConfiguration.js +82 -55
  358. package/src/threads/automation.js +17 -15
  359. package/src/threads/query.js +19 -21
  360. package/src/utilities/fileSystem/index.js +4 -3
  361. package/src/utilities/global.js +15 -12
  362. package/src/utilities/index.js +7 -17
  363. package/src/utilities/routing/index.js +5 -5
  364. package/src/utilities/rowProcessor/index.js +25 -27
  365. package/src/utilities/rowProcessor/utils.js +23 -7
  366. package/src/utilities/tests/usageQuota/usageQuota.spec.js +72 -0
  367. package/src/utilities/usageQuota/index.js +93 -0
  368. package/src/utilities/usageQuota/rows.js +75 -0
  369. package/src/utilities/usageQuota/usageQuoteReset.js +18 -0
  370. package/src/utilities/users.js +3 -3
  371. package/src/utilities/workerRequests.js +4 -27
  372. package/tsconfig.json +2 -1
  373. package/builder/assets/index.39e01193.css +0 -1
  374. package/dist/api/controllers/hosting.js +0 -30
  375. package/dist/api/routes/hosting.js +0 -11
  376. package/src/api/controllers/hosting.js +0 -22
  377. package/src/api/routes/hosting.js +0 -13
  378. package/src/api/routes/tests/hosting.spec.js +0 -36
  379. 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");
17
- const { USERS_TABLE_SCHEMA, SwitchableTypes } = require("../../../constants");
18
- const { isExternalTable, breakExternalTableId, } = require("../../../integrations/utils");
15
+ const { inputProcessing, cleanupAttachments, } = require("../../../utilities/rowProcessor");
16
+ const { USERS_TABLE_SCHEMA, SwitchableTypes, CanSwitchTypes, } = require("../../../constants");
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
  }
@@ -295,6 +322,19 @@ exports.foreignKeyStructure = (keyName, meta = null) => {
295
322
  }
296
323
  return structure;
297
324
  };
325
+ exports.areSwitchableTypes = (type1, type2) => {
326
+ if (SwitchableTypes.indexOf(type1) === -1 &&
327
+ SwitchableTypes.indexOf(type2) === -1) {
328
+ return false;
329
+ }
330
+ for (let option of CanSwitchTypes) {
331
+ const index1 = option.indexOf(type1), index2 = option.indexOf(type2);
332
+ if (index1 !== -1 && index2 !== -1 && index1 !== index2) {
333
+ return true;
334
+ }
335
+ }
336
+ return false;
337
+ };
298
338
  exports.hasTypeChanged = (table, oldTable) => {
299
339
  if (!oldTable) {
300
340
  return false;
@@ -305,7 +345,7 @@ exports.hasTypeChanged = (table, oldTable) => {
305
345
  continue;
306
346
  }
307
347
  const newType = table.schema[key].type;
308
- if (oldType !== newType && SwitchableTypes.indexOf(oldType) === -1) {
348
+ if (oldType !== newType && !exports.areSwitchableTypes(oldType, newType)) {
309
349
  return true;
310
350
  }
311
351
  }
@@ -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) {
@@ -155,13 +152,14 @@ exports.updateSelfMetadata = function (ctx) {
155
152
  ctx.request.body._id = ctx.user._id;
156
153
  // make sure no stale rev
157
154
  delete ctx.request.body._rev;
155
+ // make sure no csrf token
156
+ delete ctx.request.body.csrfToken;
158
157
  yield exports.updateMetadata(ctx);
159
158
  });
160
159
  };
161
160
  exports.updateMetadata = function (ctx) {
162
161
  return __awaiter(this, void 0, void 0, function* () {
163
- const appId = ctx.appId;
164
- const db = new CouchDB(appId);
162
+ const db = getAppDB();
165
163
  const user = ctx.request.body;
166
164
  // this isn't applicable to the user
167
165
  delete user.roles;
@@ -171,7 +169,7 @@ exports.updateMetadata = function (ctx) {
171
169
  };
172
170
  exports.destroyMetadata = function (ctx) {
173
171
  return __awaiter(this, void 0, void 0, function* () {
174
- const db = new CouchDB(ctx.appId);
172
+ const db = getAppDB();
175
173
  try {
176
174
  const dbUser = yield db.get(ctx.params.id);
177
175
  yield db.remove(dbUser._id, dbUser._rev);
@@ -197,7 +195,7 @@ exports.setFlag = function (ctx) {
197
195
  ctx.throw(400, "Must supply a 'flag' field in request body.");
198
196
  }
199
197
  const flagDocId = generateUserFlagID(userId);
200
- const db = new CouchDB(ctx.appId);
198
+ const db = getAppDB();
201
199
  let doc;
202
200
  try {
203
201
  doc = yield db.get(flagDocId);
@@ -214,7 +212,7 @@ exports.getFlags = function (ctx) {
214
212
  return __awaiter(this, void 0, void 0, function* () {
215
213
  const userId = ctx.user._id;
216
214
  const docId = generateUserFlagID(userId);
217
- const db = new CouchDB(ctx.appId);
215
+ const db = getAppDB();
218
216
  let doc;
219
217
  try {
220
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) {
@@ -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
  });