@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
@@ -1,22 +1,50 @@
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 { USERS_TABLE_SCHEMA, SwitchableTypes } = require("../../../constants")
11
+ const {
12
+ inputProcessing,
13
+ cleanupAttachments,
14
+ } = require("../../../utilities/rowProcessor")
15
+ const {
16
+ USERS_TABLE_SCHEMA,
17
+ SwitchableTypes,
18
+ CanSwitchTypes,
19
+ } = require("../../../constants")
12
20
  const {
13
21
  isExternalTable,
14
22
  breakExternalTableId,
23
+ isSQL,
15
24
  } = require("../../../integrations/utils")
16
25
  const { getViews, saveView } = require("../view/utils")
17
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
+ }
18
45
 
19
- exports.checkForColumnUpdates = async (db, oldTable, updatedTable) => {
46
+ exports.checkForColumnUpdates = async (oldTable, updatedTable) => {
47
+ const db = getAppDB()
20
48
  let updatedRows = []
21
49
  const rename = updatedTable._rename
22
50
  let deletedColumns = []
@@ -33,18 +61,22 @@ exports.checkForColumnUpdates = async (db, oldTable, updatedTable) => {
33
61
  include_docs: true,
34
62
  })
35
63
  )
36
- updatedRows = rows.rows.map(({ doc }) => {
64
+ const rawRows = rows.rows.map(({ doc }) => doc)
65
+ updatedRows = rawRows.map(row => {
66
+ row = cloneDeep(row)
37
67
  if (rename) {
38
- doc[rename.updated] = doc[rename.old]
39
- delete doc[rename.old]
68
+ row[rename.updated] = row[rename.old]
69
+ delete row[rename.old]
40
70
  } else if (deletedColumns.length !== 0) {
41
- deletedColumns.forEach(colName => delete doc[colName])
71
+ deletedColumns.forEach(colName => delete row[colName])
42
72
  }
43
- return doc
73
+ return row
44
74
  })
45
75
 
76
+ // cleanup any attachments from object storage for deleted attachment columns
77
+ await cleanupAttachments(updatedTable, { oldTable, rows: rawRows })
46
78
  // Update views
47
- await exports.checkForViewUpdates(db, updatedTable, rename, deletedColumns)
79
+ await exports.checkForViewUpdates(updatedTable, rename, deletedColumns)
48
80
  delete updatedTable._rename
49
81
  }
50
82
  return { rows: updatedRows, table: updatedTable }
@@ -71,12 +103,12 @@ exports.makeSureTableUpToDate = (table, tableToSave) => {
71
103
  return tableToSave
72
104
  }
73
105
 
74
- exports.handleDataImport = async (appId, user, table, dataImport) => {
106
+ exports.handleDataImport = async (user, table, dataImport) => {
75
107
  if (!dataImport || !dataImport.csvString) {
76
108
  return table
77
109
  }
78
110
 
79
- const db = new CouchDB(appId)
111
+ const db = getAppDB()
80
112
  // Populate the table with rows imported from CSV in a bulk update
81
113
  const data = await csvParser.transform({
82
114
  ...dataImport,
@@ -111,14 +143,18 @@ exports.handleDataImport = async (appId, user, table, dataImport) => {
111
143
  finalData.push(row)
112
144
  }
113
145
 
146
+ await usageQuota.update(usageQuota.Properties.ROW, finalData.length, {
147
+ dryRun: true,
148
+ })
114
149
  await db.bulkDocs(finalData)
150
+ await usageQuota.update(usageQuota.Properties.ROW, finalData.length)
115
151
  let response = await db.put(table)
116
152
  table._rev = response._rev
117
153
  return table
118
154
  }
119
155
 
120
- exports.handleSearchIndexes = async (appId, table) => {
121
- const db = new CouchDB(appId)
156
+ exports.handleSearchIndexes = async table => {
157
+ const db = getAppDB()
122
158
  // create relevant search indexes
123
159
  if (table.indexes && table.indexes.length > 0) {
124
160
  const currentIndexes = await db.getIndexes()
@@ -175,12 +211,9 @@ exports.checkStaticTables = table => {
175
211
  }
176
212
 
177
213
  class TableSaveFunctions {
178
- constructor({ db, ctx, oldTable, dataImport }) {
179
- this.db = db
180
- this.ctx = ctx
181
- if (this.ctx && this.ctx.user) {
182
- this.appId = this.ctx.appId
183
- }
214
+ constructor({ user, oldTable, dataImport }) {
215
+ this.db = getAppDB()
216
+ this.user = user
184
217
  this.oldTable = oldTable
185
218
  this.dataImport = dataImport
186
219
  // any rows that need updated
@@ -198,24 +231,15 @@ class TableSaveFunctions {
198
231
 
199
232
  // when confirmed valid
200
233
  async mid(table) {
201
- let response = await exports.checkForColumnUpdates(
202
- this.db,
203
- this.oldTable,
204
- table
205
- )
234
+ let response = await exports.checkForColumnUpdates(this.oldTable, table)
206
235
  this.rows = this.rows.concat(response.rows)
207
236
  return table
208
237
  }
209
238
 
210
239
  // after saving
211
240
  async after(table) {
212
- table = await exports.handleSearchIndexes(this.appId, table)
213
- table = await exports.handleDataImport(
214
- this.appId,
215
- this.ctx.user,
216
- table,
217
- this.dataImport
218
- )
241
+ table = await exports.handleSearchIndexes(table)
242
+ table = await exports.handleDataImport(this.user, table, this.dataImport)
219
243
  return table
220
244
  }
221
245
 
@@ -224,8 +248,22 @@ class TableSaveFunctions {
224
248
  }
225
249
  }
226
250
 
227
- exports.getAllExternalTables = async (appId, datasourceId) => {
228
- 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()
229
267
  const datasource = await db.get(datasourceId)
230
268
  if (!datasource || !datasource.entities) {
231
269
  throw "Datasource is not configured fully."
@@ -233,23 +271,25 @@ exports.getAllExternalTables = async (appId, datasourceId) => {
233
271
  return datasource.entities
234
272
  }
235
273
 
236
- exports.getExternalTable = async (appId, datasourceId, tableName) => {
237
- const entities = await exports.getAllExternalTables(appId, datasourceId)
274
+ exports.getExternalTable = async (datasourceId, tableName) => {
275
+ const entities = await exports.getAllExternalTables(datasourceId)
238
276
  return entities[tableName]
239
277
  }
240
278
 
241
- exports.getTable = async (appId, tableId) => {
242
- const db = new CouchDB(appId)
279
+ exports.getTable = async tableId => {
280
+ const db = getAppDB()
243
281
  if (isExternalTable(tableId)) {
244
282
  let { datasourceId, tableName } = breakExternalTableId(tableId)
245
- 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) }
246
286
  } else {
247
287
  return db.get(tableId)
248
288
  }
249
289
  }
250
290
 
251
- exports.checkForViewUpdates = async (db, table, rename, deletedColumns) => {
252
- const views = await getViews(db)
291
+ exports.checkForViewUpdates = async (table, rename, deletedColumns) => {
292
+ const views = await getViews()
253
293
  const tableViews = views.filter(view => view.meta.tableId === table._id)
254
294
 
255
295
  // Check each table view to see if impacted by this table action
@@ -311,7 +351,7 @@ exports.checkForViewUpdates = async (db, table, rename, deletedColumns) => {
311
351
  // Update view if required
312
352
  if (needsUpdated) {
313
353
  const newViewTemplate = viewTemplate(view.meta)
314
- await saveView(db, null, view.name, newViewTemplate)
354
+ await saveView(null, view.name, newViewTemplate)
315
355
  if (!newViewTemplate.meta.schema) {
316
356
  newViewTemplate.meta.schema = table.schema
317
357
  }
@@ -340,6 +380,23 @@ exports.foreignKeyStructure = (keyName, meta = null) => {
340
380
  return structure
341
381
  }
342
382
 
383
+ exports.areSwitchableTypes = (type1, type2) => {
384
+ if (
385
+ SwitchableTypes.indexOf(type1) === -1 &&
386
+ SwitchableTypes.indexOf(type2) === -1
387
+ ) {
388
+ return false
389
+ }
390
+ for (let option of CanSwitchTypes) {
391
+ const index1 = option.indexOf(type1),
392
+ index2 = option.indexOf(type2)
393
+ if (index1 !== -1 && index2 !== -1 && index1 !== index2) {
394
+ return true
395
+ }
396
+ }
397
+ return false
398
+ }
399
+
343
400
  exports.hasTypeChanged = (table, oldTable) => {
344
401
  if (!oldTable) {
345
402
  return false
@@ -350,7 +407,7 @@ exports.hasTypeChanged = (table, oldTable) => {
350
407
  continue
351
408
  }
352
409
  const newType = table.schema[key].type
353
- if (oldType !== newType && SwitchableTypes.indexOf(oldType) === -1) {
410
+ if (oldType !== newType && !exports.areSwitchableTypes(oldType, newType)) {
354
411
  return true
355
412
  }
356
413
  }
@@ -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 } = 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,10 +102,10 @@ 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)
108
+ const db = getAppDB()
111
109
  const metadataId = generateUserMetadataID(userId)
112
110
  let metadata
113
111
  try {
@@ -143,8 +141,8 @@ exports.syncUser = async function (ctx) {
143
141
  }
144
142
 
145
143
  exports.fetchMetadata = async function (ctx) {
146
- const database = new CouchDB(ctx.appId)
147
- const global = await getGlobalUsers(ctx.appId)
144
+ const database = getAppDB()
145
+ const global = await getGlobalUsers()
148
146
  const metadata = await rawMetadata(database)
149
147
  const users = []
150
148
  for (let user of global) {
@@ -167,12 +165,13 @@ exports.updateSelfMetadata = async function (ctx) {
167
165
  ctx.request.body._id = ctx.user._id
168
166
  // make sure no stale rev
169
167
  delete ctx.request.body._rev
168
+ // make sure no csrf token
169
+ delete ctx.request.body.csrfToken
170
170
  await exports.updateMetadata(ctx)
171
171
  }
172
172
 
173
173
  exports.updateMetadata = async function (ctx) {
174
- const appId = ctx.appId
175
- const db = new CouchDB(appId)
174
+ const db = getAppDB()
176
175
  const user = ctx.request.body
177
176
  // this isn't applicable to the user
178
177
  delete user.roles
@@ -184,7 +183,7 @@ exports.updateMetadata = async function (ctx) {
184
183
  }
185
184
 
186
185
  exports.destroyMetadata = async function (ctx) {
187
- const db = new CouchDB(ctx.appId)
186
+ const db = getAppDB()
188
187
  try {
189
188
  const dbUser = await db.get(ctx.params.id)
190
189
  await db.remove(dbUser._id, dbUser._rev)
@@ -207,7 +206,7 @@ exports.setFlag = async function (ctx) {
207
206
  ctx.throw(400, "Must supply a 'flag' field in request body.")
208
207
  }
209
208
  const flagDocId = generateUserFlagID(userId)
210
- const db = new CouchDB(ctx.appId)
209
+ const db = getAppDB()
211
210
  let doc
212
211
  try {
213
212
  doc = await db.get(flagDocId)
@@ -222,7 +221,7 @@ exports.setFlag = async function (ctx) {
222
221
  exports.getFlags = async function (ctx) {
223
222
  const userId = ctx.user._id
224
223
  const docId = generateUserFlagID(userId)
225
- const db = new CouchDB(ctx.appId)
224
+ const db = getAppDB()
226
225
  let doc
227
226
  try {
228
227
  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