@budibase/server 1.0.49 → 1.0.50-alpha.0

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.c0cc369d.css +6 -0
  8. package/builder/assets/{index.2c37968e.js → index.ff2bad21.js} +252 -249
  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 +2 -1
  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
@@ -1,13 +1,17 @@
1
- const CouchDB = require("../../../db")
2
1
  const csvParser = require("../../../utilities/csvParser")
3
2
  const {
4
3
  getRowParams,
5
4
  generateRowID,
6
5
  InternalTables,
6
+ getTableParams,
7
+ BudibaseInternalDB,
7
8
  } = require("../../../db/utils")
8
- const { isEqual } = require("lodash/fp")
9
+ const { isEqual } = require("lodash")
9
10
  const { AutoFieldSubTypes, FieldTypes } = require("../../../constants")
10
- const { inputProcessing } = require("../../../utilities/rowProcessor")
11
+ const {
12
+ inputProcessing,
13
+ cleanupAttachments,
14
+ } = require("../../../utilities/rowProcessor")
11
15
  const {
12
16
  USERS_TABLE_SCHEMA,
13
17
  SwitchableTypes,
@@ -16,11 +20,31 @@ const {
16
20
  const {
17
21
  isExternalTable,
18
22
  breakExternalTableId,
23
+ isSQL,
19
24
  } = require("../../../integrations/utils")
20
25
  const { getViews, saveView } = require("../view/utils")
21
26
  const viewTemplate = require("../view/viewBuilder")
27
+ const usageQuota = require("../../../utilities/usageQuota")
28
+ const { getAppDB } = require("@budibase/backend-core/context")
29
+ const { cloneDeep } = require("lodash/fp")
30
+
31
+ exports.clearColumns = async (table, columnNames) => {
32
+ const db = getAppDB()
33
+ const rows = await db.allDocs(
34
+ getRowParams(table._id, null, {
35
+ include_docs: true,
36
+ })
37
+ )
38
+ return db.bulkDocs(
39
+ rows.rows.map(({ doc }) => {
40
+ columnNames.forEach(colName => delete doc[colName])
41
+ return doc
42
+ })
43
+ )
44
+ }
22
45
 
23
- exports.checkForColumnUpdates = async (db, oldTable, updatedTable) => {
46
+ exports.checkForColumnUpdates = async (oldTable, updatedTable) => {
47
+ const db = getAppDB()
24
48
  let updatedRows = []
25
49
  const rename = updatedTable._rename
26
50
  let deletedColumns = []
@@ -37,18 +61,22 @@ exports.checkForColumnUpdates = async (db, oldTable, updatedTable) => {
37
61
  include_docs: true,
38
62
  })
39
63
  )
40
- updatedRows = rows.rows.map(({ doc }) => {
64
+ const rawRows = rows.rows.map(({ doc }) => doc)
65
+ updatedRows = rawRows.map(row => {
66
+ row = cloneDeep(row)
41
67
  if (rename) {
42
- doc[rename.updated] = doc[rename.old]
43
- delete doc[rename.old]
68
+ row[rename.updated] = row[rename.old]
69
+ delete row[rename.old]
44
70
  } else if (deletedColumns.length !== 0) {
45
- deletedColumns.forEach(colName => delete doc[colName])
71
+ deletedColumns.forEach(colName => delete row[colName])
46
72
  }
47
- return doc
73
+ return row
48
74
  })
49
75
 
76
+ // cleanup any attachments from object storage for deleted attachment columns
77
+ await cleanupAttachments(updatedTable, { oldTable, rows: rawRows })
50
78
  // Update views
51
- await exports.checkForViewUpdates(db, updatedTable, rename, deletedColumns)
79
+ await exports.checkForViewUpdates(updatedTable, rename, deletedColumns)
52
80
  delete updatedTable._rename
53
81
  }
54
82
  return { rows: updatedRows, table: updatedTable }
@@ -75,12 +103,12 @@ exports.makeSureTableUpToDate = (table, tableToSave) => {
75
103
  return tableToSave
76
104
  }
77
105
 
78
- exports.handleDataImport = async (appId, user, table, dataImport) => {
106
+ exports.handleDataImport = async (user, table, dataImport) => {
79
107
  if (!dataImport || !dataImport.csvString) {
80
108
  return table
81
109
  }
82
110
 
83
- const db = new CouchDB(appId)
111
+ const db = getAppDB()
84
112
  // Populate the table with rows imported from CSV in a bulk update
85
113
  const data = await csvParser.transform({
86
114
  ...dataImport,
@@ -115,14 +143,18 @@ exports.handleDataImport = async (appId, user, table, dataImport) => {
115
143
  finalData.push(row)
116
144
  }
117
145
 
146
+ await usageQuota.update(usageQuota.Properties.ROW, finalData.length, {
147
+ dryRun: true,
148
+ })
118
149
  await db.bulkDocs(finalData)
150
+ await usageQuota.update(usageQuota.Properties.ROW, finalData.length)
119
151
  let response = await db.put(table)
120
152
  table._rev = response._rev
121
153
  return table
122
154
  }
123
155
 
124
- exports.handleSearchIndexes = async (appId, table) => {
125
- const db = new CouchDB(appId)
156
+ exports.handleSearchIndexes = async table => {
157
+ const db = getAppDB()
126
158
  // create relevant search indexes
127
159
  if (table.indexes && table.indexes.length > 0) {
128
160
  const currentIndexes = await db.getIndexes()
@@ -179,12 +211,9 @@ exports.checkStaticTables = table => {
179
211
  }
180
212
 
181
213
  class TableSaveFunctions {
182
- constructor({ db, ctx, oldTable, dataImport }) {
183
- this.db = db
184
- this.ctx = ctx
185
- if (this.ctx && this.ctx.user) {
186
- this.appId = this.ctx.appId
187
- }
214
+ constructor({ user, oldTable, dataImport }) {
215
+ this.db = getAppDB()
216
+ this.user = user
188
217
  this.oldTable = oldTable
189
218
  this.dataImport = dataImport
190
219
  // any rows that need updated
@@ -202,24 +231,15 @@ class TableSaveFunctions {
202
231
 
203
232
  // when confirmed valid
204
233
  async mid(table) {
205
- let response = await exports.checkForColumnUpdates(
206
- this.db,
207
- this.oldTable,
208
- table
209
- )
234
+ let response = await exports.checkForColumnUpdates(this.oldTable, table)
210
235
  this.rows = this.rows.concat(response.rows)
211
236
  return table
212
237
  }
213
238
 
214
239
  // after saving
215
240
  async after(table) {
216
- table = await exports.handleSearchIndexes(this.appId, table)
217
- table = await exports.handleDataImport(
218
- this.appId,
219
- this.ctx.user,
220
- table,
221
- this.dataImport
222
- )
241
+ table = await exports.handleSearchIndexes(table)
242
+ table = await exports.handleDataImport(this.user, table, this.dataImport)
223
243
  return table
224
244
  }
225
245
 
@@ -228,8 +248,22 @@ class TableSaveFunctions {
228
248
  }
229
249
  }
230
250
 
231
- exports.getAllExternalTables = async (appId, datasourceId) => {
232
- const db = new CouchDB(appId)
251
+ exports.getAllInternalTables = async () => {
252
+ const db = getAppDB()
253
+ const internalTables = await db.allDocs(
254
+ getTableParams(null, {
255
+ include_docs: true,
256
+ })
257
+ )
258
+ return internalTables.rows.map(tableDoc => ({
259
+ ...tableDoc.doc,
260
+ type: "internal",
261
+ sourceId: BudibaseInternalDB._id,
262
+ }))
263
+ }
264
+
265
+ exports.getAllExternalTables = async datasourceId => {
266
+ const db = getAppDB()
233
267
  const datasource = await db.get(datasourceId)
234
268
  if (!datasource || !datasource.entities) {
235
269
  throw "Datasource is not configured fully."
@@ -237,23 +271,25 @@ exports.getAllExternalTables = async (appId, datasourceId) => {
237
271
  return datasource.entities
238
272
  }
239
273
 
240
- exports.getExternalTable = async (appId, datasourceId, tableName) => {
241
- const entities = await exports.getAllExternalTables(appId, datasourceId)
274
+ exports.getExternalTable = async (datasourceId, tableName) => {
275
+ const entities = await exports.getAllExternalTables(datasourceId)
242
276
  return entities[tableName]
243
277
  }
244
278
 
245
- exports.getTable = async (appId, tableId) => {
246
- const db = new CouchDB(appId)
279
+ exports.getTable = async tableId => {
280
+ const db = getAppDB()
247
281
  if (isExternalTable(tableId)) {
248
282
  let { datasourceId, tableName } = breakExternalTableId(tableId)
249
- return exports.getExternalTable(appId, datasourceId, tableName)
283
+ const datasource = await db.get(datasourceId)
284
+ const table = await exports.getExternalTable(datasourceId, tableName)
285
+ return { ...table, sql: isSQL(datasource) }
250
286
  } else {
251
287
  return db.get(tableId)
252
288
  }
253
289
  }
254
290
 
255
- exports.checkForViewUpdates = async (db, table, rename, deletedColumns) => {
256
- const views = await getViews(db)
291
+ exports.checkForViewUpdates = async (table, rename, deletedColumns) => {
292
+ const views = await getViews()
257
293
  const tableViews = views.filter(view => view.meta.tableId === table._id)
258
294
 
259
295
  // Check each table view to see if impacted by this table action
@@ -315,7 +351,7 @@ exports.checkForViewUpdates = async (db, table, rename, deletedColumns) => {
315
351
  // Update view if required
316
352
  if (needsUpdated) {
317
353
  const newViewTemplate = viewTemplate(view.meta)
318
- await saveView(db, null, view.name, newViewTemplate)
354
+ await saveView(null, view.name, newViewTemplate)
319
355
  if (!newViewTemplate.meta.schema) {
320
356
  newViewTemplate.meta.schema = table.schema
321
357
  }
@@ -1,4 +1,3 @@
1
- const CouchDB = require("../../db")
2
1
  const {
3
2
  generateUserMetadataID,
4
3
  getUserMetadataParams,
@@ -11,12 +10,14 @@ const { isEqual } = require("lodash")
11
10
  const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles")
12
11
  const {
13
12
  getDevelopmentAppID,
14
- getDeployedAppIDs,
13
+ getProdAppIDs,
14
+ dbExists,
15
15
  } = require("@budibase/backend-core/db")
16
- const { doesDatabaseExist } = require("../../utilities")
17
16
  const { UserStatus } = require("@budibase/backend-core/constants")
17
+ const { getAppDB, doInAppContext } = require("@budibase/backend-core/context")
18
18
 
19
- async function rawMetadata(db) {
19
+ async function rawMetadata() {
20
+ const db = getAppDB()
20
21
  return (
21
22
  await db.allDocs(
22
23
  getUserMetadataParams(null, {
@@ -54,13 +55,10 @@ function combineMetadataAndUser(user, metadata) {
54
55
  return null
55
56
  }
56
57
 
57
- exports.syncGlobalUsers = async appId => {
58
+ exports.syncGlobalUsers = async () => {
58
59
  // sync user metadata
59
- const db = new CouchDB(appId)
60
- const [users, metadata] = await Promise.all([
61
- getGlobalUsers(appId),
62
- rawMetadata(db),
63
- ])
60
+ const db = getAppDB()
61
+ const [users, metadata] = await Promise.all([getGlobalUsers(), rawMetadata()])
64
62
  const toWrite = []
65
63
  for (let user of users) {
66
64
  const combined = await combineMetadataAndUser(user, metadata)
@@ -94,7 +92,7 @@ exports.syncUser = async function (ctx) {
94
92
  let prodAppIds
95
93
  // if they are a builder then get all production app IDs
96
94
  if ((user.builder && user.builder.global) || deleting) {
97
- prodAppIds = await getDeployedAppIDs(CouchDB)
95
+ prodAppIds = await getProdAppIDs()
98
96
  } else {
99
97
  prodAppIds = Object.entries(roles)
100
98
  .filter(entry => entry[1] !== BUILTIN_ROLE_IDS.PUBLIC)
@@ -104,37 +102,39 @@ exports.syncUser = async function (ctx) {
104
102
  const roleId = roles[prodAppId]
105
103
  const devAppId = getDevelopmentAppID(prodAppId)
106
104
  for (let appId of [prodAppId, devAppId]) {
107
- if (!(await doesDatabaseExist(appId))) {
105
+ if (!(await dbExists(appId))) {
108
106
  continue
109
107
  }
110
- const db = new CouchDB(appId)
111
- const metadataId = generateUserMetadataID(userId)
112
- let metadata
113
- try {
114
- metadata = await db.get(metadataId)
115
- } catch (err) {
116
- if (deleting) {
117
- continue
108
+ await doInAppContext(appId, async () => {
109
+ const db = getAppDB()
110
+ const metadataId = generateUserMetadataID(userId)
111
+ let metadata
112
+ try {
113
+ metadata = await db.get(metadataId)
114
+ } catch (err) {
115
+ if (deleting) {
116
+ return
117
+ }
118
+ metadata = {
119
+ tableId: InternalTables.USER_METADATA,
120
+ }
118
121
  }
119
- metadata = {
120
- tableId: InternalTables.USER_METADATA,
122
+ // assign the roleId for the metadata doc
123
+ if (roleId) {
124
+ metadata.roleId = roleId
121
125
  }
122
- }
123
- // assign the roleId for the metadata doc
124
- if (roleId) {
125
- metadata.roleId = roleId
126
- }
127
- let combined = !deleting
128
- ? combineMetadataAndUser(user, metadata)
129
- : {
130
- ...metadata,
131
- status: UserStatus.INACTIVE,
132
- metadata: BUILTIN_ROLE_IDS.PUBLIC,
133
- }
134
- // if its null then there was no updates required
135
- if (combined) {
136
- await db.put(combined)
137
- }
126
+ let combined = !deleting
127
+ ? combineMetadataAndUser(user, metadata)
128
+ : {
129
+ ...metadata,
130
+ status: UserStatus.INACTIVE,
131
+ metadata: BUILTIN_ROLE_IDS.PUBLIC,
132
+ }
133
+ // if its null then there was no updates required
134
+ if (combined) {
135
+ await db.put(combined)
136
+ }
137
+ })
138
138
  }
139
139
  }
140
140
  ctx.body = {
@@ -143,8 +143,8 @@ exports.syncUser = async function (ctx) {
143
143
  }
144
144
 
145
145
  exports.fetchMetadata = async function (ctx) {
146
- const database = new CouchDB(ctx.appId)
147
- const global = await getGlobalUsers(ctx.appId)
146
+ const database = getAppDB()
147
+ const global = await getGlobalUsers()
148
148
  const metadata = await rawMetadata(database)
149
149
  const users = []
150
150
  for (let user of global) {
@@ -167,12 +167,13 @@ exports.updateSelfMetadata = async function (ctx) {
167
167
  ctx.request.body._id = ctx.user._id
168
168
  // make sure no stale rev
169
169
  delete ctx.request.body._rev
170
+ // make sure no csrf token
171
+ delete ctx.request.body.csrfToken
170
172
  await exports.updateMetadata(ctx)
171
173
  }
172
174
 
173
175
  exports.updateMetadata = async function (ctx) {
174
- const appId = ctx.appId
175
- const db = new CouchDB(appId)
176
+ const db = getAppDB()
176
177
  const user = ctx.request.body
177
178
  // this isn't applicable to the user
178
179
  delete user.roles
@@ -184,7 +185,7 @@ exports.updateMetadata = async function (ctx) {
184
185
  }
185
186
 
186
187
  exports.destroyMetadata = async function (ctx) {
187
- const db = new CouchDB(ctx.appId)
188
+ const db = getAppDB()
188
189
  try {
189
190
  const dbUser = await db.get(ctx.params.id)
190
191
  await db.remove(dbUser._id, dbUser._rev)
@@ -207,7 +208,7 @@ exports.setFlag = async function (ctx) {
207
208
  ctx.throw(400, "Must supply a 'flag' field in request body.")
208
209
  }
209
210
  const flagDocId = generateUserFlagID(userId)
210
- const db = new CouchDB(ctx.appId)
211
+ const db = getAppDB()
211
212
  let doc
212
213
  try {
213
214
  doc = await db.get(flagDocId)
@@ -222,7 +223,7 @@ exports.setFlag = async function (ctx) {
222
223
  exports.getFlags = async function (ctx) {
223
224
  const userId = ctx.user._id
224
225
  const docId = generateUserFlagID(userId)
225
- const db = new CouchDB(ctx.appId)
226
+ const db = getAppDB()
226
227
  let doc
227
228
  try {
228
229
  doc = await db.get(docId)
@@ -1,4 +1,3 @@
1
- const CouchDB = require("../../../db")
2
1
  const viewTemplate = require("./viewBuilder")
3
2
  const { apiFileReturn } = require("../../../utilities/fileSystem")
4
3
  const exporters = require("./exporters")
@@ -6,14 +5,14 @@ const { saveView, getView, getViews, deleteView } = require("./utils")
6
5
  const { fetchView } = require("../row")
7
6
  const { getTable } = require("../table/utils")
8
7
  const { FieldTypes } = require("../../../constants")
8
+ const { getAppDB } = require("@budibase/backend-core/context")
9
9
 
10
10
  exports.fetch = async ctx => {
11
- const db = new CouchDB(ctx.appId)
12
- ctx.body = await getViews(db)
11
+ ctx.body = await getViews()
13
12
  }
14
13
 
15
14
  exports.save = async ctx => {
16
- const db = new CouchDB(ctx.appId)
15
+ const db = getAppDB()
17
16
  const { originalName, ...viewToSave } = ctx.request.body
18
17
  const view = viewTemplate(viewToSave)
19
18
 
@@ -21,7 +20,7 @@ exports.save = async ctx => {
21
20
  ctx.throw(400, "Cannot create view without a name")
22
21
  }
23
22
 
24
- await saveView(db, originalName, viewToSave.name, view)
23
+ await saveView(originalName, viewToSave.name, view)
25
24
 
26
25
  // add views to table document
27
26
  const table = await db.get(ctx.request.body.tableId)
@@ -42,9 +41,9 @@ exports.save = async ctx => {
42
41
  }
43
42
 
44
43
  exports.destroy = async ctx => {
45
- const db = new CouchDB(ctx.appId)
44
+ const db = getAppDB()
46
45
  const viewName = decodeURI(ctx.params.viewName)
47
- const view = await deleteView(db, viewName)
46
+ const view = await deleteView(viewName)
48
47
  const table = await db.get(view.meta.tableId)
49
48
  delete table.views[viewName]
50
49
  await db.put(table)
@@ -53,9 +52,8 @@ exports.destroy = async ctx => {
53
52
  }
54
53
 
55
54
  exports.exportView = async ctx => {
56
- const db = new CouchDB(ctx.appId)
57
55
  const viewName = decodeURI(ctx.query.view)
58
- const view = await getView(db, viewName)
56
+ const view = await getView(viewName)
59
57
 
60
58
  const format = ctx.query.format
61
59
  if (!format || !Object.values(exporters.ExportFormats).includes(format)) {
@@ -83,7 +81,7 @@ exports.exportView = async ctx => {
83
81
  let schema = view && view.meta && view.meta.schema
84
82
  if (!schema) {
85
83
  const tableId = ctx.params.tableId || view.meta.tableId
86
- const table = await getTable(ctx.appId, tableId)
84
+ const table = await getTable(tableId)
87
85
  schema = table.schema
88
86
  }
89
87
 
@@ -6,8 +6,10 @@ const {
6
6
  SEPARATOR,
7
7
  } = require("../../../db/utils")
8
8
  const env = require("../../../environment")
9
+ const { getAppDB } = require("@budibase/backend-core/context")
9
10
 
10
- exports.getView = async (db, viewName) => {
11
+ exports.getView = async viewName => {
12
+ const db = getAppDB()
11
13
  if (env.SELF_HOSTED) {
12
14
  const designDoc = await db.get("_design/database")
13
15
  return designDoc.views[viewName]
@@ -22,7 +24,8 @@ exports.getView = async (db, viewName) => {
22
24
  }
23
25
  }
24
26
 
25
- exports.getViews = async db => {
27
+ exports.getViews = async () => {
28
+ const db = getAppDB()
26
29
  const response = []
27
30
  if (env.SELF_HOSTED) {
28
31
  const designDoc = await db.get("_design/database")
@@ -54,7 +57,8 @@ exports.getViews = async db => {
54
57
  return response
55
58
  }
56
59
 
57
- exports.saveView = async (db, originalName, viewName, viewTemplate) => {
60
+ exports.saveView = async (originalName, viewName, viewTemplate) => {
61
+ const db = getAppDB()
58
62
  if (env.SELF_HOSTED) {
59
63
  const designDoc = await db.get("_design/database")
60
64
  designDoc.views = {
@@ -91,7 +95,8 @@ exports.saveView = async (db, originalName, viewName, viewTemplate) => {
91
95
  }
92
96
  }
93
97
 
94
- exports.deleteView = async (db, viewName) => {
98
+ exports.deleteView = async viewName => {
99
+ const db = getAppDB()
95
100
  if (env.SELF_HOSTED) {
96
101
  const designDoc = await db.get("_design/database")
97
102
  const view = designDoc.views[viewName]
@@ -1,9 +1,9 @@
1
- const CouchDB = require("../../db")
2
1
  const { generateWebhookID, getWebhookParams } = require("../../db/utils")
3
2
  const toJsonSchema = require("to-json-schema")
4
3
  const validate = require("jsonschema").validate
5
4
  const triggers = require("../../automations/triggers")
6
- const { getDeployedAppID } = require("@budibase/backend-core/db")
5
+ const { getProdAppID } = require("@budibase/backend-core/db")
6
+ const { getAppDB, updateAppId } = require("@budibase/backend-core/context")
7
7
 
8
8
  const AUTOMATION_DESCRIPTION = "Generated from Webhook Schema"
9
9
 
@@ -23,7 +23,7 @@ exports.WebhookType = {
23
23
  }
24
24
 
25
25
  exports.fetch = async ctx => {
26
- const db = new CouchDB(ctx.appId)
26
+ const db = getAppDB()
27
27
  const response = await db.allDocs(
28
28
  getWebhookParams(null, {
29
29
  include_docs: true,
@@ -33,7 +33,7 @@ exports.fetch = async ctx => {
33
33
  }
34
34
 
35
35
  exports.save = async ctx => {
36
- const db = new CouchDB(ctx.appId)
36
+ const db = getAppDB()
37
37
  const webhook = ctx.request.body
38
38
  webhook.appId = ctx.appId
39
39
 
@@ -52,12 +52,13 @@ exports.save = async ctx => {
52
52
  }
53
53
 
54
54
  exports.destroy = async ctx => {
55
- const db = new CouchDB(ctx.appId)
55
+ const db = getAppDB()
56
56
  ctx.body = await db.remove(ctx.params.id, ctx.params.rev)
57
57
  }
58
58
 
59
59
  exports.buildSchema = async ctx => {
60
- const db = new CouchDB(ctx.params.instance)
60
+ updateAppId(ctx.params.instance)
61
+ const db = getAppDB()
61
62
  const webhook = await db.get(ctx.params.id)
62
63
  webhook.bodySchema = toJsonSchema(ctx.request.body)
63
64
  // update the automation outputs
@@ -81,9 +82,10 @@ exports.buildSchema = async ctx => {
81
82
  }
82
83
 
83
84
  exports.trigger = async ctx => {
84
- const prodAppId = getDeployedAppID(ctx.params.instance)
85
+ const prodAppId = getProdAppID(ctx.params.instance)
86
+ updateAppId(prodAppId)
85
87
  try {
86
- const db = new CouchDB(prodAppId)
88
+ const db = getAppDB()
87
89
  const webhook = await db.get(ctx.params.id)
88
90
  // validate against the schema
89
91
  if (webhook.bodySchema) {
@@ -20,11 +20,11 @@ const integrationRoutes = require("./integration")
20
20
  const permissionRoutes = require("./permission")
21
21
  const datasourceRoutes = require("./datasource")
22
22
  const queryRoutes = require("./query")
23
- const hostingRoutes = require("./hosting")
24
23
  const backupRoutes = require("./backup")
25
24
  const metadataRoutes = require("./metadata")
26
25
  const devRoutes = require("./dev")
27
26
  const cloudRoutes = require("./cloud")
27
+ const migrationRoutes = require("./migrations")
28
28
 
29
29
  exports.mainRoutes = [
30
30
  authRoutes,
@@ -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,6 +54,7 @@ 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
 
60
60
  exports.staticRoutes = staticRoutes
@@ -0,0 +1,14 @@
1
+ const Router = require("@koa/router")
2
+ const migrationsController = require("../controllers/migrations")
3
+ const router = Router()
4
+ const { internalApi } = require("@budibase/backend-core/auth")
5
+
6
+ router
7
+ .post("/api/migrations/run", internalApi, migrationsController.migrate)
8
+ .get(
9
+ "/api/migrations/definitions",
10
+ internalApi,
11
+ migrationsController.fetchDefinitions
12
+ )
13
+
14
+ module.exports = router
@@ -46,5 +46,10 @@ router
46
46
  )
47
47
  // TODO: this likely needs to be secured in some way
48
48
  .get("/:appId/:path*", controller.serveApp)
49
+ .post(
50
+ "/api/attachments/:datasourceId/url",
51
+ authorized(PermissionTypes.TABLE, PermissionLevels.READ),
52
+ controller.getSignedUploadURL
53
+ )
49
54
 
50
55
  module.exports = router
@@ -53,8 +53,8 @@ describe("/applications", () => {
53
53
 
54
54
  describe("fetch", () => {
55
55
  it("lists all applications", async () => {
56
- await config.createApp(request, "app1")
57
- await config.createApp(request, "app2")
56
+ await config.createApp("app1")
57
+ await config.createApp("app2")
58
58
 
59
59
  const res = await request
60
60
  .get(`/api/applications?status=${AppStatus.DEV}`)
@@ -13,10 +13,9 @@ describe("/authenticate", () => {
13
13
 
14
14
  describe("fetch self", () => {
15
15
  it("should be able to fetch self", async () => {
16
- const headers = await config.login()
17
16
  const res = await request
18
17
  .get(`/api/self`)
19
- .set(headers)
18
+ .set(config.defaultHeaders())
20
19
  .expect("Content-Type", /json/)
21
20
  .expect(200)
22
21
  expect(res.body._id).toEqual(generateUserMetadataID("us_uuid1"))
@@ -145,6 +145,7 @@ describe("/automations", () => {
145
145
  let table = await config.createTable()
146
146
  automation.definition.trigger.inputs.tableId = table._id
147
147
  automation.definition.steps[0].inputs.row.tableId = table._id
148
+ automation.appId = config.appId
148
149
  automation = await config.createAutomation(automation)
149
150
  await setup.delay(500)
150
151
  const res = await testAutomation(config, automation)
@@ -82,7 +82,6 @@ describe("run misc tests", () => {
82
82
  dataImport.schema[col] = { type: "string" }
83
83
  }
84
84
  await tableUtils.handleDataImport(
85
- config.getAppId(),
86
85
  { userId: "test" },
87
86
  table,
88
87
  dataImport