@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
@@ -12,9 +12,50 @@ const { getUserRoleHierarchy, getRequiredResourceRole, BUILTIN_ROLE_IDS, } = req
12
12
  const { PermissionTypes, doesHaveBasePermission, } = require("@budibase/backend-core/permissions");
13
13
  const builderMiddleware = require("./builder");
14
14
  const { isWebhookEndpoint } = require("./utils");
15
+ const { buildCsrfMiddleware } = require("@budibase/backend-core/auth");
16
+ const { getAppId } = require("@budibase/backend-core/context");
15
17
  function hasResource(ctx) {
16
18
  return ctx.resourceId != null;
17
19
  }
20
+ const csrf = buildCsrfMiddleware();
21
+ /**
22
+ * Apply authorization to the requested resource:
23
+ * - If this is a builder resource the user must be a builder.
24
+ * - Builders can access all resources.
25
+ * - Otherwise the user must have the required role.
26
+ */
27
+ const checkAuthorized = (ctx, resourceRoles, permType, permLevel) => __awaiter(void 0, void 0, void 0, function* () {
28
+ // check if this is a builder api and the user is not a builder
29
+ const isBuilder = ctx.user && ctx.user.builder && ctx.user.builder.global;
30
+ const isBuilderApi = permType === PermissionTypes.BUILDER;
31
+ if (isBuilderApi && !isBuilder) {
32
+ return ctx.throw(403, "Not Authorized");
33
+ }
34
+ // check for resource authorization
35
+ if (!isBuilder) {
36
+ yield checkAuthorizedResource(ctx, resourceRoles, permType, permLevel);
37
+ }
38
+ });
39
+ const checkAuthorizedResource = (ctx, resourceRoles, permType, permLevel) => __awaiter(void 0, void 0, void 0, function* () {
40
+ // get the user's roles
41
+ const roleId = ctx.roleId || BUILTIN_ROLE_IDS.PUBLIC;
42
+ const userRoles = yield getUserRoleHierarchy(roleId, {
43
+ idOnly: false,
44
+ });
45
+ const permError = "User does not have permission";
46
+ // check if the user has the required role
47
+ if (resourceRoles.length > 0) {
48
+ // deny access if the user doesn't have the required resource role
49
+ const found = userRoles.find(role => resourceRoles.indexOf(role._id) !== -1);
50
+ if (!found) {
51
+ ctx.throw(403, permError);
52
+ }
53
+ // fallback to the base permissions when no resource roles are found
54
+ }
55
+ else if (!doesHaveBasePermission(permType, permLevel, userRoles)) {
56
+ ctx.throw(403, permError);
57
+ }
58
+ });
18
59
  module.exports =
19
60
  (permType, permLevel = null) => (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
20
61
  // webhooks don't need authentication, each webhook unique
@@ -28,37 +69,23 @@ module.exports =
28
69
  // check general builder stuff, this middleware is a good way
29
70
  // to find API endpoints which are builder focused
30
71
  yield builderMiddleware(ctx, permType);
31
- const isAuthed = ctx.isAuthenticated;
32
- // builders for now have permission to do anything
33
- let isBuilder = ctx.user && ctx.user.builder && ctx.user.builder.global;
34
- const isBuilderApi = permType === PermissionTypes.BUILDER;
35
- if (isBuilder) {
36
- return next();
37
- }
38
- else if (isBuilderApi && !isBuilder) {
39
- return ctx.throw(403, "Not Authorized");
72
+ // get the resource roles
73
+ let resourceRoles = [];
74
+ const appId = getAppId();
75
+ if (appId && hasResource(ctx)) {
76
+ resourceRoles = yield getRequiredResourceRole(permLevel, ctx);
40
77
  }
41
- // need to check this first, in-case public access, don't check authed until last
42
- const roleId = ctx.roleId || BUILTIN_ROLE_IDS.PUBLIC;
43
- const hierarchy = yield getUserRoleHierarchy(ctx.appId, roleId, {
44
- idOnly: false,
45
- });
46
- const permError = "User does not have permission";
47
- let possibleRoleIds = [];
48
- if (hasResource(ctx)) {
49
- possibleRoleIds = yield getRequiredResourceRole(ctx.appId, permLevel, ctx);
50
- }
51
- // check if we found a role, if not fallback to base permissions
52
- if (possibleRoleIds.length > 0) {
53
- const found = hierarchy.find(role => possibleRoleIds.indexOf(role._id) !== -1);
54
- return found ? next() : ctx.throw(403, permError);
55
- }
56
- else if (!doesHaveBasePermission(permType, permLevel, hierarchy)) {
57
- ctx.throw(403, permError);
78
+ // if the resource is public, proceed
79
+ const isPublicResource = resourceRoles.includes(BUILTIN_ROLE_IDS.PUBLIC);
80
+ if (isPublicResource) {
81
+ return next();
58
82
  }
59
- // if they are not authed, then anything using the authorized middleware will fail
60
- if (!isAuthed) {
61
- ctx.throw(403, "Session not authenticated");
83
+ // check authenticated
84
+ if (!ctx.isAuthenticated) {
85
+ return ctx.throw(403, "Session not authenticated");
62
86
  }
63
- return next();
87
+ // check authorized
88
+ yield checkAuthorized(ctx, resourceRoles, permType, permLevel);
89
+ // csrf protection
90
+ return csrf(ctx, next);
64
91
  });
@@ -10,7 +10,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  };
11
11
  const { APP_DEV_PREFIX } = require("../db/utils");
12
12
  const { doesUserHaveLock, updateLock, checkDebounce, setDebounce, } = require("../utilities/redis");
13
- const CouchDB = require("../db");
13
+ const { getDB } = require("@budibase/backend-core/db");
14
14
  const { DocumentTypes } = require("../db/utils");
15
15
  const { PermissionTypes } = require("@budibase/backend-core/permissions");
16
16
  const { app: appCache } = require("@budibase/backend-core/cache");
@@ -49,7 +49,7 @@ function updateAppUpdatedAt(ctx) {
49
49
  if (ctx.method === "GET" || (yield checkDebounce(appId))) {
50
50
  return;
51
51
  }
52
- const db = new CouchDB(appId);
52
+ const db = getDB(appId);
53
53
  const metadata = yield db.get(DocumentTypes.APP_METADATA);
54
54
  metadata.updatedAt = new Date().toISOString();
55
55
  const response = yield db.put(metadata);
@@ -16,9 +16,9 @@ const { generateUserMetadataID, isDevAppID } = require("../db/utils");
16
16
  const { dbExists } = require("@budibase/backend-core/db");
17
17
  const { isUserInAppTenant } = require("@budibase/backend-core/tenancy");
18
18
  const { getCachedSelf } = require("../utilities/global");
19
- const CouchDB = require("../db");
20
19
  const env = require("../environment");
21
20
  const { isWebhookEndpoint } = require("./utils");
21
+ const { doInAppContext } = require("@budibase/backend-core/context");
22
22
  module.exports = (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
23
23
  // try to get the appID from the request
24
24
  let requestAppId = getAppId(ctx);
@@ -36,7 +36,7 @@ module.exports = (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
36
36
  // check the app exists referenced in cookie
37
37
  if (appCookie) {
38
38
  const appId = appCookie.appId;
39
- const exists = yield dbExists(CouchDB, appId);
39
+ const exists = yield dbExists(appId);
40
40
  if (!exists) {
41
41
  clearCookie(ctx, Cookies.CurrentApp);
42
42
  return next();
@@ -45,11 +45,13 @@ module.exports = (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
45
45
  requestAppId = requestAppId || appId;
46
46
  }
47
47
  // deny access to application preview
48
- if (isDevAppID(requestAppId) &&
49
- !isWebhookEndpoint(ctx) &&
50
- (!ctx.user || !ctx.user.builder || !ctx.user.builder.global)) {
51
- clearCookie(ctx, Cookies.CurrentApp);
52
- return ctx.redirect("/");
48
+ if (!env.isTest()) {
49
+ if (isDevAppID(requestAppId) &&
50
+ !isWebhookEndpoint(ctx) &&
51
+ (!ctx.user || !ctx.user.builder || !ctx.user.builder.global)) {
52
+ clearCookie(ctx, Cookies.CurrentApp);
53
+ return ctx.redirect("/");
54
+ }
53
55
  }
54
56
  let appId, roleId = BUILTIN_ROLE_IDS.PUBLIC;
55
57
  if (!ctx.user) {
@@ -67,34 +69,36 @@ module.exports = (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
67
69
  if (!appId) {
68
70
  return next();
69
71
  }
70
- let noCookieSet = false;
71
- // if the user not in the right tenant then make sure they have no permissions
72
- // need to judge this only based on the request app ID,
73
- if (env.MULTI_TENANCY &&
74
- ctx.user &&
75
- requestAppId &&
76
- !isUserInAppTenant(requestAppId)) {
77
- // don't error, simply remove the users rights (they are a public user)
78
- delete ctx.user.builder;
79
- delete ctx.user.admin;
80
- delete ctx.user.roles;
81
- roleId = BUILTIN_ROLE_IDS.PUBLIC;
82
- noCookieSet = true;
83
- }
84
- ctx.appId = appId;
85
- if (roleId) {
86
- ctx.roleId = roleId;
87
- const userId = ctx.user ? generateUserMetadataID(ctx.user._id) : null;
88
- ctx.user = Object.assign(Object.assign({}, ctx.user), {
89
- // override userID with metadata one
90
- _id: userId, userId,
91
- roleId, role: yield getRole(appId, roleId) });
92
- }
93
- if ((requestAppId !== appId ||
94
- appCookie == null ||
95
- appCookie.appId !== requestAppId) &&
96
- !noCookieSet) {
97
- setCookie(ctx, { appId }, Cookies.CurrentApp);
98
- }
99
- return next();
72
+ return doInAppContext(appId, () => __awaiter(void 0, void 0, void 0, function* () {
73
+ let noCookieSet = false;
74
+ // if the user not in the right tenant then make sure they have no permissions
75
+ // need to judge this only based on the request app ID,
76
+ if (env.MULTI_TENANCY &&
77
+ ctx.user &&
78
+ requestAppId &&
79
+ !isUserInAppTenant(requestAppId)) {
80
+ // don't error, simply remove the users rights (they are a public user)
81
+ delete ctx.user.builder;
82
+ delete ctx.user.admin;
83
+ delete ctx.user.roles;
84
+ roleId = BUILTIN_ROLE_IDS.PUBLIC;
85
+ noCookieSet = true;
86
+ }
87
+ ctx.appId = appId;
88
+ if (roleId) {
89
+ ctx.roleId = roleId;
90
+ const userId = ctx.user ? generateUserMetadataID(ctx.user._id) : null;
91
+ ctx.user = Object.assign(Object.assign({}, ctx.user), {
92
+ // override userID with metadata one
93
+ _id: userId, userId,
94
+ roleId, role: yield getRole(roleId) });
95
+ }
96
+ if ((requestAppId !== appId ||
97
+ appCookie == null ||
98
+ appCookie.appId !== requestAppId) &&
99
+ !noCookieSet) {
100
+ setCookie(ctx, { appId }, Cookies.CurrentApp);
101
+ }
102
+ return next();
103
+ }));
100
104
  });
@@ -8,13 +8,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
9
  });
10
10
  };
11
- const CouchDB = require("../db");
12
11
  const usageQuota = require("../utilities/usageQuota");
13
- const env = require("../environment");
14
- const { getTenantId } = require("@budibase/backend-core/tenancy");
12
+ const { getUniqueRows } = require("../utilities/usageQuota/rows");
15
13
  const { isExternalTable, isRowId: isExternalRowId, } = require("../integrations/utils");
16
- // tenants without limits
17
- const EXCLUDED_TENANTS = ["bb", "default", "bbtest", "bbstaging"];
14
+ const { getAppDB } = require("@budibase/backend-core/context");
18
15
  // currently only counting new writes and deletes
19
16
  const METHOD_MAP = {
20
17
  POST: 1,
@@ -22,13 +19,13 @@ const METHOD_MAP = {
22
19
  };
23
20
  const DOMAIN_MAP = {
24
21
  rows: usageQuota.Properties.ROW,
25
- upload: usageQuota.Properties.UPLOAD,
26
- views: usageQuota.Properties.VIEW,
27
- users: usageQuota.Properties.USER,
22
+ // upload: usageQuota.Properties.UPLOAD, // doesn't work yet
23
+ // views: usageQuota.Properties.VIEW, // doesn't work yet
24
+ // users: usageQuota.Properties.USER, // doesn't work yet
28
25
  applications: usageQuota.Properties.APPS,
29
26
  // this will not be updated by endpoint calls
30
27
  // instead it will be updated by triggerInfo
31
- automationRuns: usageQuota.Properties.AUTOMATION,
28
+ // automationRuns: usageQuota.Properties.AUTOMATION, // doesn't work yet
32
29
  };
33
30
  function getProperty(url) {
34
31
  for (let domain of Object.keys(DOMAIN_MAP)) {
@@ -38,9 +35,7 @@ function getProperty(url) {
38
35
  }
39
36
  }
40
37
  module.exports = (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
41
- const tenantId = getTenantId();
42
- // if in development or a self hosted cloud usage quotas should not be executed
43
- if (env.isDev() || env.SELF_HOSTED || EXCLUDED_TENANTS.includes(tenantId)) {
38
+ if (!usageQuota.useQuotas()) {
44
39
  return next();
45
40
  }
46
41
  let usage = METHOD_MAP[ctx.req.method];
@@ -53,7 +48,7 @@ module.exports = (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
53
48
  const usageId = ctx.request.body._id;
54
49
  try {
55
50
  if (ctx.appId) {
56
- const db = new CouchDB(ctx.appId);
51
+ const db = getAppDB();
57
52
  yield db.get(usageId);
58
53
  }
59
54
  return next();
@@ -78,10 +73,82 @@ module.exports = (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
78
73
  usage = files.map(file => file.size).reduce((total, size) => total + size);
79
74
  }
80
75
  try {
81
- yield usageQuota.update(property, usage);
82
- return next();
76
+ yield performRequest(ctx, next, property, usage);
83
77
  }
84
78
  catch (err) {
85
79
  ctx.throw(400, err);
86
80
  }
87
81
  });
82
+ const performRequest = (ctx, next, property, usage) => __awaiter(void 0, void 0, void 0, function* () {
83
+ const usageContext = {
84
+ skipNext: false,
85
+ skipUsage: false,
86
+ [usageQuota.Properties.APPS]: {},
87
+ };
88
+ if (usage === -1) {
89
+ if (PRE_DELETE[property]) {
90
+ yield PRE_DELETE[property](ctx, usageContext);
91
+ }
92
+ }
93
+ else {
94
+ if (PRE_CREATE[property]) {
95
+ yield PRE_CREATE[property](ctx, usageContext);
96
+ }
97
+ }
98
+ // run the request
99
+ if (!usageContext.skipNext) {
100
+ yield usageQuota.update(property, usage, { dryRun: true });
101
+ yield next();
102
+ }
103
+ if (usage === -1) {
104
+ if (POST_DELETE[property]) {
105
+ yield POST_DELETE[property](ctx, usageContext);
106
+ }
107
+ }
108
+ else {
109
+ if (POST_CREATE[property]) {
110
+ yield POST_CREATE[property](ctx, usageContext);
111
+ }
112
+ }
113
+ // update the usage
114
+ if (!usageContext.skipUsage) {
115
+ yield usageQuota.update(property, usage);
116
+ }
117
+ });
118
+ const appPreDelete = (ctx, usageContext) => __awaiter(void 0, void 0, void 0, function* () {
119
+ if (ctx.query.unpublish) {
120
+ // don't run usage decrement for unpublish
121
+ usageContext.skipUsage = true;
122
+ return;
123
+ }
124
+ // store the row count to delete
125
+ const rows = yield getUniqueRows([ctx.appId]);
126
+ if (rows.length) {
127
+ usageContext[usageQuota.Properties.APPS] = { rowCount: rows.length };
128
+ }
129
+ });
130
+ const appPostDelete = (ctx, usageContext) => __awaiter(void 0, void 0, void 0, function* () {
131
+ // delete the app rows from usage
132
+ const rowCount = usageContext[usageQuota.Properties.APPS].rowCount;
133
+ if (rowCount) {
134
+ yield usageQuota.update(usageQuota.Properties.ROW, -rowCount);
135
+ }
136
+ });
137
+ const appPostCreate = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
138
+ // app import & template creation
139
+ if (ctx.request.body.useTemplate === "true") {
140
+ const rows = yield getUniqueRows([ctx.response.body.appId]);
141
+ const rowCount = rows ? rows.length : 0;
142
+ yield usageQuota.update(usageQuota.Properties.ROW, rowCount);
143
+ }
144
+ });
145
+ const PRE_DELETE = {
146
+ [usageQuota.Properties.APPS]: appPreDelete,
147
+ };
148
+ const POST_DELETE = {
149
+ [usageQuota.Properties.APPS]: appPostDelete,
150
+ };
151
+ const PRE_CREATE = {};
152
+ const POST_CREATE = {
153
+ [usageQuota.Properties.APPS]: appPostCreate,
154
+ };
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.run = void 0;
13
+ const { DocumentTypes } = require("@budibase/backend-core/db");
14
+ const application_1 = require("../../api/controllers/application");
15
+ /**
16
+ * Date:
17
+ * January 2022
18
+ *
19
+ * Description:
20
+ * Add the url to the app metadata if it doesn't exist
21
+ */
22
+ const run = (appDb) => __awaiter(void 0, void 0, void 0, function* () {
23
+ let metadata;
24
+ try {
25
+ metadata = yield appDb.get(DocumentTypes.APP_METADATA);
26
+ }
27
+ catch (e) {
28
+ // sometimes the metadata document doesn't exist
29
+ // exit early instead of failing the migration
30
+ console.error("Error retrieving app metadata. Skipping", e);
31
+ return;
32
+ }
33
+ if (!metadata.url) {
34
+ const context = {
35
+ request: {
36
+ body: {
37
+ name: metadata.name,
38
+ },
39
+ },
40
+ };
41
+ metadata.url = application_1.getAppUrl(context);
42
+ console.log(`Adding url to app: ${metadata.url}`);
43
+ yield appDb.put(metadata);
44
+ }
45
+ });
46
+ exports.run = run;
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
22
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
23
+ return new (P || (P = Promise))(function (resolve, reject) {
24
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
25
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
26
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
27
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
28
+ });
29
+ };
30
+ Object.defineProperty(exports, "__esModule", { value: true });
31
+ exports.run = void 0;
32
+ const usageQuotas_1 = require("./usageQuotas");
33
+ const syncApps = __importStar(require("./usageQuotas/syncApps"));
34
+ const syncRows = __importStar(require("./usageQuotas/syncRows"));
35
+ /**
36
+ * Date:
37
+ * January 2022
38
+ *
39
+ * Description:
40
+ * Synchronise the app and row quotas to the state of the db after it was
41
+ * discovered that the quota resets were still in place and the row quotas
42
+ * weren't being decremented correctly.
43
+ */
44
+ const run = () => __awaiter(void 0, void 0, void 0, function* () {
45
+ yield usageQuotas_1.runQuotaMigration(() => __awaiter(void 0, void 0, void 0, function* () {
46
+ yield syncApps.run();
47
+ yield syncRows.run();
48
+ }));
49
+ });
50
+ exports.run = run;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.runQuotaMigration = void 0;
13
+ const { useQuotas } = require("../../../utilities/usageQuota");
14
+ const runQuotaMigration = (migration) => __awaiter(void 0, void 0, void 0, function* () {
15
+ if (!useQuotas()) {
16
+ return;
17
+ }
18
+ yield migration();
19
+ });
20
+ exports.runQuotaMigration = runQuotaMigration;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.run = void 0;
13
+ const tenancy_1 = require("@budibase/backend-core/tenancy");
14
+ const db_1 = require("@budibase/backend-core/db");
15
+ const usageQuota_1 = require("../../../utilities/usageQuota");
16
+ const run = () => __awaiter(void 0, void 0, void 0, function* () {
17
+ const db = tenancy_1.getGlobalDB();
18
+ // get app count
19
+ // @ts-ignore
20
+ const devApps = yield db_1.getAllApps({ dev: true });
21
+ const appCount = devApps ? devApps.length : 0;
22
+ // sync app count
23
+ const tenantId = tenancy_1.getTenantId();
24
+ console.log(`[Tenant: ${tenantId}] Syncing app count: ${appCount}`);
25
+ const usageDoc = yield usageQuota_1.getUsageQuotaDoc(db);
26
+ usageDoc.usageQuota.apps = appCount;
27
+ yield db.put(usageDoc);
28
+ });
29
+ exports.run = run;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.run = void 0;
13
+ const tenancy_1 = require("@budibase/backend-core/tenancy");
14
+ const db_1 = require("@budibase/backend-core/db");
15
+ const usageQuota_1 = require("../../../utilities/usageQuota");
16
+ const rows_1 = require("../../../utilities/usageQuota/rows");
17
+ const run = () => __awaiter(void 0, void 0, void 0, function* () {
18
+ const db = tenancy_1.getGlobalDB();
19
+ // get all rows in all apps
20
+ // @ts-ignore
21
+ const allApps = yield db_1.getAllApps({ all: true });
22
+ // @ts-ignore
23
+ const appIds = allApps ? allApps.map((app) => app.appId) : [];
24
+ const rows = yield rows_1.getUniqueRows(appIds);
25
+ const rowCount = rows ? rows.length : 0;
26
+ // sync row count
27
+ const tenantId = tenancy_1.getTenantId();
28
+ console.log(`[Tenant: ${tenantId}] Syncing row count: ${rowCount}`);
29
+ const usageDoc = yield usageQuota_1.getUsageQuotaDoc(db);
30
+ usageDoc.usageQuota.rows = rowCount;
31
+ yield db.put(usageDoc);
32
+ });
33
+ exports.run = run;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.run = void 0;
13
+ const { createUserEmailView } = require("@budibase/backend-core/db");
14
+ /**
15
+ * Date:
16
+ * October 2021
17
+ *
18
+ * Description:
19
+ * Recreate the user email view to include latest changes i.e. lower casing the email address
20
+ */
21
+ const run = (db) => __awaiter(void 0, void 0, void 0, function* () {
22
+ yield createUserEmailView(db);
23
+ });
24
+ exports.run = run;
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
22
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
23
+ return new (P || (P = Promise))(function (resolve, reject) {
24
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
25
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
26
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
27
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
28
+ });
29
+ };
30
+ var __importDefault = (this && this.__importDefault) || function (mod) {
31
+ return (mod && mod.__esModule) ? mod : { "default": mod };
32
+ };
33
+ Object.defineProperty(exports, "__esModule", { value: true });
34
+ exports.migrate = exports.MIGRATIONS = void 0;
35
+ const db_1 = __importDefault(require("../db"));
36
+ const { MIGRATION_TYPES, runMigrations, } = require("@budibase/backend-core/migrations");
37
+ // migration functions
38
+ const userEmailViewCasing = __importStar(require("./functions/userEmailViewCasing"));
39
+ const quota1 = __importStar(require("./functions/quotas1"));
40
+ const appUrls = __importStar(require("./functions/appUrls"));
41
+ exports.MIGRATIONS = [
42
+ {
43
+ type: MIGRATION_TYPES.GLOBAL,
44
+ name: "user_email_view_casing",
45
+ fn: userEmailViewCasing.run,
46
+ },
47
+ {
48
+ type: MIGRATION_TYPES.GLOBAL,
49
+ name: "quotas_1",
50
+ fn: quota1.run,
51
+ },
52
+ {
53
+ type: MIGRATION_TYPES.APP,
54
+ name: "app_urls",
55
+ opts: { all: true },
56
+ fn: appUrls.run,
57
+ },
58
+ ];
59
+ const migrate = (options) => __awaiter(void 0, void 0, void 0, function* () {
60
+ yield runMigrations(db_1.default, exports.MIGRATIONS, options);
61
+ });
62
+ exports.migrate = migrate;