@budibase/server 1.0.123 → 1.0.125

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 (325) hide show
  1. package/builder/assets/index.3d890df7.js +1299 -0
  2. package/builder/assets/index.89795487.css +6 -0
  3. package/builder/assets/{vendor.8e34a169.js → vendor.5240f480.js} +1 -1
  4. package/builder/index.html +3 -3
  5. package/coverage/clover.xml +695 -1678
  6. package/coverage/coverage-final.json +28 -43
  7. package/coverage/lcov-report/api/controllers/analytics.js.html +8 -3
  8. package/coverage/lcov-report/api/controllers/apikeys.js.html +9 -4
  9. package/coverage/lcov-report/api/controllers/auth.js.html +8 -3
  10. package/coverage/lcov-report/api/controllers/automation.js.html +8 -3
  11. package/coverage/lcov-report/api/controllers/backup.js.html +8 -3
  12. package/coverage/lcov-report/api/controllers/cloud.js.html +8 -3
  13. package/coverage/lcov-report/api/controllers/component.js.html +8 -3
  14. package/coverage/lcov-report/api/controllers/datasource.js.html +11 -6
  15. package/coverage/lcov-report/api/controllers/dev.js.html +8 -3
  16. package/coverage/lcov-report/api/controllers/index.html +16 -26
  17. package/coverage/lcov-report/api/controllers/integration.js.html +8 -3
  18. package/coverage/lcov-report/api/controllers/layout.js.html +8 -3
  19. package/coverage/lcov-report/api/controllers/metadata.js.html +8 -3
  20. package/coverage/lcov-report/api/controllers/migrations.js.html +8 -3
  21. package/coverage/lcov-report/api/controllers/permission.js.html +8 -3
  22. package/coverage/lcov-report/api/controllers/query/index.html +16 -26
  23. package/coverage/lcov-report/api/controllers/query/validation.js.html +8 -3
  24. package/coverage/lcov-report/api/controllers/role.js.html +10 -5
  25. package/coverage/lcov-report/api/controllers/routing.js.html +9 -4
  26. package/coverage/lcov-report/api/controllers/row/external.js.html +8 -3
  27. package/coverage/lcov-report/api/controllers/row/index.html +25 -35
  28. package/coverage/lcov-report/api/controllers/row/internal.js.html +32 -24
  29. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +21 -16
  30. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +24 -19
  31. package/coverage/lcov-report/api/controllers/row/utils.js.html +33 -19
  32. package/coverage/lcov-report/api/controllers/screen.js.html +9 -4
  33. package/coverage/lcov-report/api/controllers/script.js.html +8 -3
  34. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +55 -50
  35. package/coverage/lcov-report/api/controllers/table/external.js.html +8 -3
  36. package/coverage/lcov-report/api/controllers/table/index.html +19 -44
  37. package/coverage/lcov-report/api/controllers/table/index.js.html +20 -15
  38. package/coverage/lcov-report/api/controllers/templates.js.html +8 -3
  39. package/coverage/lcov-report/api/controllers/user.js.html +8 -3
  40. package/coverage/lcov-report/api/controllers/view/exporters.js.html +8 -3
  41. package/coverage/lcov-report/api/controllers/view/index.html +8 -3
  42. package/coverage/lcov-report/api/controllers/view/index.js.html +10 -5
  43. package/coverage/lcov-report/api/controllers/view/utils.js.html +8 -3
  44. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +8 -3
  45. package/coverage/lcov-report/api/controllers/webhook.js.html +10 -5
  46. package/coverage/lcov-report/api/index.html +18 -13
  47. package/coverage/lcov-report/api/index.js.html +28 -8
  48. package/coverage/lcov-report/api/routes/analytics.js.html +8 -3
  49. package/coverage/lcov-report/api/routes/apikeys.js.html +8 -3
  50. package/coverage/lcov-report/api/routes/auth.js.html +8 -3
  51. package/coverage/lcov-report/api/routes/automation.js.html +8 -3
  52. package/coverage/lcov-report/api/routes/backup.js.html +8 -3
  53. package/coverage/lcov-report/api/routes/cloud.js.html +8 -3
  54. package/coverage/lcov-report/api/routes/component.js.html +8 -3
  55. package/coverage/lcov-report/api/routes/datasource.js.html +8 -3
  56. package/coverage/lcov-report/api/routes/deploy.js.html +8 -3
  57. package/coverage/lcov-report/api/routes/dev.js.html +9 -4
  58. package/coverage/lcov-report/api/routes/index.html +13 -68
  59. package/coverage/lcov-report/api/routes/integration.js.html +8 -3
  60. package/coverage/lcov-report/api/routes/layout.js.html +8 -3
  61. package/coverage/lcov-report/api/routes/metadata.js.html +8 -3
  62. package/coverage/lcov-report/api/routes/migrations.js.html +8 -3
  63. package/coverage/lcov-report/api/routes/permission.js.html +8 -3
  64. package/coverage/lcov-report/api/routes/query.js.html +8 -3
  65. package/coverage/lcov-report/api/routes/role.js.html +8 -3
  66. package/coverage/lcov-report/api/routes/routing.js.html +8 -3
  67. package/coverage/lcov-report/api/routes/screen.js.html +8 -3
  68. package/coverage/lcov-report/api/routes/script.js.html +8 -3
  69. package/coverage/lcov-report/api/routes/table.js.html +8 -3
  70. package/coverage/lcov-report/api/routes/templates.js.html +8 -3
  71. package/coverage/lcov-report/api/routes/user.js.html +8 -3
  72. package/coverage/lcov-report/api/routes/utils/index.html +8 -3
  73. package/coverage/lcov-report/api/routes/utils/validators.js.html +8 -3
  74. package/coverage/lcov-report/api/routes/view.js.html +8 -3
  75. package/coverage/lcov-report/api/routes/webhook.js.html +8 -3
  76. package/coverage/lcov-report/automations/actions.js.html +21 -7
  77. package/coverage/lcov-report/automations/automationUtils.js.html +64 -23
  78. package/coverage/lcov-report/automations/bullboard.js.html +8 -3
  79. package/coverage/lcov-report/automations/index.html +27 -37
  80. package/coverage/lcov-report/automations/index.js.html +8 -3
  81. package/coverage/lcov-report/automations/steps/bash.js.html +8 -3
  82. package/coverage/lcov-report/automations/steps/delay.js.html +8 -3
  83. package/coverage/lcov-report/automations/steps/discord.js.html +8 -3
  84. package/coverage/lcov-report/automations/steps/executeQuery.js.html +8 -3
  85. package/coverage/lcov-report/automations/steps/executeScript.js.html +8 -3
  86. package/coverage/lcov-report/automations/steps/filter.js.html +8 -3
  87. package/coverage/lcov-report/automations/steps/index.html +31 -41
  88. package/coverage/lcov-report/automations/steps/integromat.js.html +8 -3
  89. package/coverage/lcov-report/{api/routes/static.js.html → automations/steps/loop.js.html} +70 -80
  90. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +9 -4
  91. package/coverage/lcov-report/automations/steps/queryRows.js.html +9 -4
  92. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +8 -3
  93. package/coverage/lcov-report/automations/steps/serverLog.js.html +8 -3
  94. package/coverage/lcov-report/automations/steps/slack.js.html +8 -3
  95. package/coverage/lcov-report/automations/steps/updateRow.js.html +8 -3
  96. package/coverage/lcov-report/automations/steps/utils.js.html +14 -9
  97. package/coverage/lcov-report/automations/steps/zapier.js.html +8 -3
  98. package/coverage/lcov-report/automations/triggerInfo/app.js.html +8 -3
  99. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +8 -3
  100. package/coverage/lcov-report/automations/triggerInfo/index.html +8 -3
  101. package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -3
  102. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +8 -3
  103. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +8 -3
  104. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +8 -3
  105. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +8 -3
  106. package/coverage/lcov-report/automations/triggers.js.html +16 -11
  107. package/coverage/lcov-report/block-navigation.js +8 -0
  108. package/coverage/lcov-report/constants/index.html +12 -7
  109. package/coverage/lcov-report/constants/index.js.html +55 -32
  110. package/coverage/lcov-report/constants/layouts.js.html +8 -3
  111. package/coverage/lcov-report/constants/screens.js.html +8 -3
  112. package/coverage/lcov-report/db/inMemoryView.js.html +8 -3
  113. package/coverage/lcov-report/db/index.html +8 -3
  114. package/coverage/lcov-report/db/index.js.html +9 -4
  115. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +20 -15
  116. package/coverage/lcov-report/db/linkedRows/index.html +8 -3
  117. package/coverage/lcov-report/db/linkedRows/index.js.html +22 -17
  118. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +12 -7
  119. package/coverage/lcov-report/db/newid.js.html +11 -6
  120. package/coverage/lcov-report/db/utils.js.html +84 -79
  121. package/coverage/lcov-report/events/AutomationEmitter.js.html +14 -9
  122. package/coverage/lcov-report/events/index.html +8 -3
  123. package/coverage/lcov-report/events/index.js.html +9 -4
  124. package/coverage/lcov-report/events/utils.js.html +18 -13
  125. package/coverage/lcov-report/index.html +125 -120
  126. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +8 -3
  127. package/coverage/lcov-report/integrations/tests/index.html +8 -3
  128. package/coverage/lcov-report/middleware/appInfo.js.html +8 -3
  129. package/coverage/lcov-report/middleware/builder.js.html +8 -3
  130. package/coverage/lcov-report/middleware/currentapp.js.html +65 -15
  131. package/coverage/lcov-report/middleware/index.html +25 -50
  132. package/coverage/lcov-report/middleware/joi-validator.js.html +9 -4
  133. package/coverage/lcov-report/middleware/publicApi.js.html +8 -3
  134. package/coverage/lcov-report/middleware/resourceId.js.html +8 -3
  135. package/coverage/lcov-report/middleware/selfhost.js.html +9 -4
  136. package/coverage/lcov-report/middleware/utils.js.html +8 -3
  137. package/coverage/lcov-report/sorter.js +26 -0
  138. package/coverage/lcov-report/threads/automation.js.html +581 -90
  139. package/coverage/lcov-report/threads/index.html +30 -40
  140. package/coverage/lcov-report/threads/query.js.html +9 -4
  141. package/coverage/lcov-report/threads/utils.js.html +17 -9
  142. package/coverage/lcov-report/utilities/bcrypt.js.html +8 -3
  143. package/coverage/lcov-report/utilities/budibaseDir.js.html +8 -3
  144. package/coverage/lcov-report/utilities/centralPath.js.html +8 -3
  145. package/coverage/lcov-report/utilities/csvParser.js.html +10 -5
  146. package/coverage/lcov-report/utilities/global.js.html +9 -4
  147. package/coverage/lcov-report/utilities/index.html +8 -3
  148. package/coverage/lcov-report/utilities/index.js.html +11 -6
  149. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +32 -9
  150. package/coverage/lcov-report/utilities/queue/index.html +12 -7
  151. package/coverage/lcov-report/utilities/routing/index.html +8 -3
  152. package/coverage/lcov-report/utilities/routing/index.js.html +8 -3
  153. package/coverage/lcov-report/utilities/rowProcessor/index.html +8 -3
  154. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +48 -43
  155. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +18 -13
  156. package/coverage/lcov-report/utilities/scriptRunner.js.html +8 -3
  157. package/coverage/lcov-report/utilities/security.js.html +9 -4
  158. package/coverage/lcov-report/utilities/statusCodes.js.html +8 -3
  159. package/coverage/lcov-report/utilities/usageQuota/index.html +24 -34
  160. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +44 -39
  161. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +8 -3
  162. package/coverage/lcov-report/utilities/users.js.html +8 -3
  163. package/coverage/lcov-report/utilities/workerRequests.js.html +9 -4
  164. package/coverage/lcov.info +1144 -2875
  165. package/dist/api/controllers/application.js +145 -73
  166. package/dist/api/controllers/deploy/index.js +68 -36
  167. package/dist/api/controllers/public/applications.js +29 -9
  168. package/dist/api/controllers/public/queries.js +27 -7
  169. package/dist/api/controllers/public/rows.js +32 -12
  170. package/dist/api/controllers/public/tables.js +2 -2
  171. package/dist/api/controllers/public/users.js +8 -8
  172. package/dist/api/controllers/public/utils.js +1 -1
  173. package/dist/api/controllers/query/import/index.js +3 -3
  174. package/dist/api/controllers/query/index.js +57 -44
  175. package/dist/api/controllers/row/ExternalRequest.js +27 -27
  176. package/dist/api/controllers/row/index.js +83 -60
  177. package/dist/api/controllers/row/internal.js +2 -1
  178. package/dist/api/controllers/row/utils.js +2 -1
  179. package/dist/api/controllers/static/templates/BudibaseApp.svelte +3 -0
  180. package/dist/api/controllers/table/bulkFormula.js +2 -1
  181. package/dist/api/controllers/table/internal.js +41 -35
  182. package/dist/api/controllers/table/utils.js +271 -229
  183. package/dist/api/index.js +5 -0
  184. package/dist/api/routes/application.js +39 -13
  185. package/dist/api/routes/index.js +61 -56
  186. package/dist/api/routes/public/index.js +6 -9
  187. package/dist/api/routes/public/queries.js +1 -1
  188. package/dist/api/routes/public/rows.js +1 -1
  189. package/dist/api/routes/public/tables.js +3 -3
  190. package/dist/api/routes/public/users.js +1 -1
  191. package/dist/api/routes/row.js +43 -17
  192. package/dist/api/routes/static.js +40 -13
  193. package/dist/api/routes/tests/utilities/TestFunctions.js +75 -33
  194. package/dist/app.js +8 -4
  195. package/dist/automations/actions.js +3 -0
  196. package/dist/automations/automationUtils.js +10 -0
  197. package/dist/automations/steps/createRow.js +12 -12
  198. package/dist/automations/steps/deleteRow.js +13 -16
  199. package/dist/automations/steps/loop.js +51 -0
  200. package/dist/automations/tests/utilities/index.js +13 -11
  201. package/dist/automations/utils.js +187 -133
  202. package/dist/constants/index.js +5 -0
  203. package/dist/definitions/datasource.js +1 -0
  204. package/dist/environment.js +2 -3
  205. package/dist/index.js +4 -0
  206. package/dist/integrations/base/sql.js +2 -2
  207. package/dist/integrations/base/sqlTable.js +2 -2
  208. package/dist/integrations/googlesheets.js +1 -1
  209. package/dist/integrations/index.js +4 -0
  210. package/dist/integrations/microsoftSqlServer.js +8 -8
  211. package/dist/integrations/mysql.js +9 -9
  212. package/dist/integrations/oracle.js +7 -7
  213. package/dist/integrations/postgres.js +7 -7
  214. package/dist/integrations/queries/sql.js +2 -2
  215. package/dist/integrations/redis.js +158 -0
  216. package/dist/integrations/rest.js +1 -1
  217. package/dist/middleware/authorized.js +51 -51
  218. package/dist/middleware/currentapp.js +15 -1
  219. package/dist/migrations/functions/appUrls.js +1 -1
  220. package/dist/migrations/functions/developerQuota.js +49 -0
  221. package/dist/migrations/functions/publishedAppsQuota.js +47 -0
  222. package/dist/migrations/functions/quotas1.js +6 -2
  223. package/dist/migrations/functions/usageQuotas/index.js +0 -4
  224. package/dist/migrations/functions/usageQuotas/syncApps.js +4 -7
  225. package/dist/migrations/functions/usageQuotas/syncDevelopers.js +24 -0
  226. package/dist/migrations/functions/usageQuotas/syncPublishedApps.js +26 -0
  227. package/dist/migrations/functions/usageQuotas/syncRows.js +5 -8
  228. package/dist/migrations/index.js +17 -1
  229. package/dist/package.json +14 -8
  230. package/dist/threads/automation.js +149 -27
  231. package/dist/threads/index.js +36 -10
  232. package/dist/threads/utils.js +1 -0
  233. package/dist/tsconfig.build.tsbuildinfo +1 -0
  234. package/dist/utilities/queue/inMemoryQueue.js +6 -1
  235. package/nodemon.json +1 -1
  236. package/package.json +15 -9
  237. package/scripts/dev/manage.js +2 -0
  238. package/src/api/controllers/{application.js → application.ts} +118 -51
  239. package/src/api/controllers/deploy/{index.js → index.ts} +53 -29
  240. package/src/api/controllers/public/applications.ts +2 -2
  241. package/src/api/controllers/public/queries.ts +1 -1
  242. package/src/api/controllers/public/rows.ts +1 -1
  243. package/src/api/controllers/query/{index.js → index.ts} +51 -48
  244. package/src/api/controllers/row/ExternalRequest.ts +1 -1
  245. package/src/api/controllers/row/{index.js → index.ts} +24 -17
  246. package/src/api/controllers/row/internal.js +2 -1
  247. package/src/api/controllers/row/utils.js +4 -1
  248. package/src/api/controllers/static/templates/BudibaseApp.svelte +3 -0
  249. package/src/api/controllers/table/bulkFormula.js +1 -1
  250. package/src/api/controllers/table/{internal.js → internal.ts} +30 -26
  251. package/src/api/controllers/table/{utils.js → utils.ts} +86 -69
  252. package/src/api/index.js +5 -0
  253. package/src/api/routes/{application.js → application.ts} +8 -14
  254. package/src/api/routes/index.ts +60 -0
  255. package/src/api/routes/public/index.ts +1 -4
  256. package/src/api/routes/{row.js → row.ts} +7 -15
  257. package/src/api/routes/{static.js → static.ts} +11 -11
  258. package/src/api/routes/tests/misc.spec.js +39 -37
  259. package/src/api/routes/tests/utilities/{TestFunctions.js → TestFunctions.ts} +57 -33
  260. package/src/app.ts +1 -2
  261. package/src/automations/actions.js +3 -0
  262. package/src/automations/automationUtils.js +12 -0
  263. package/src/automations/steps/{createRow.js → createRow.ts} +9 -15
  264. package/src/automations/steps/{deleteRow.js → deleteRow.ts} +10 -16
  265. package/src/automations/steps/loop.js +50 -0
  266. package/src/automations/tests/automation.spec.js +0 -1
  267. package/src/automations/tests/{createRow.spec.js → createRow.spec.ts} +4 -15
  268. package/src/automations/tests/{deleteRow.spec.js → deleteRow.spec.ts} +3 -5
  269. package/src/automations/tests/utilities/index.js +12 -10
  270. package/src/automations/{utils.js → utils.ts} +39 -28
  271. package/src/constants/index.js +6 -0
  272. package/src/definitions/common.ts +1 -0
  273. package/src/definitions/datasource.ts +1 -0
  274. package/src/environment.js +2 -3
  275. package/src/index.ts +3 -0
  276. package/src/integrations/index.ts +4 -0
  277. package/src/integrations/redis.ts +152 -0
  278. package/src/integrations/tests/redis.spec.js +60 -0
  279. package/src/middleware/{authorized.js → authorized.ts} +20 -14
  280. package/src/middleware/currentapp.js +16 -1
  281. package/src/middleware/tests/currentapp.spec.js +8 -4
  282. package/src/migrations/functions/developerQuota.ts +15 -0
  283. package/src/migrations/functions/publishedAppsQuota.ts +13 -0
  284. package/src/migrations/functions/tests/quotas1.spec.js +0 -2
  285. package/src/migrations/functions/usageQuotas/index.ts +0 -5
  286. package/src/migrations/functions/usageQuotas/syncApps.ts +3 -6
  287. package/src/migrations/functions/usageQuotas/syncDevelopers.ts +19 -0
  288. package/src/migrations/functions/usageQuotas/syncPublishedApps.ts +21 -0
  289. package/src/migrations/functions/usageQuotas/syncRows.ts +3 -6
  290. package/src/migrations/functions/usageQuotas/tests/syncApps.spec.ts +34 -0
  291. package/src/migrations/functions/usageQuotas/tests/syncRows.spec.ts +40 -0
  292. package/src/migrations/index.ts +13 -1
  293. package/src/threads/automation.js +196 -34
  294. package/src/threads/{index.js → index.ts} +18 -14
  295. package/src/threads/utils.js +1 -0
  296. package/src/utilities/queue/inMemoryQueue.js +7 -1
  297. package/tsconfig.build.json +10 -0
  298. package/tsconfig.json +2 -2
  299. package/builder/assets/index.68a7f4e3.css +0 -6
  300. package/builder/assets/index.8d4a5b33.js +0 -1291
  301. package/coverage/lcov-report/api/controllers/application.js.html +0 -1436
  302. package/coverage/lcov-report/api/controllers/query/index.js.html +0 -713
  303. package/coverage/lcov-report/api/controllers/row/index.js.html +0 -524
  304. package/coverage/lcov-report/api/controllers/table/internal.js.html +0 -620
  305. package/coverage/lcov-report/api/controllers/table/utils.js.html +0 -1331
  306. package/coverage/lcov-report/api/routes/application.js.html +0 -179
  307. package/coverage/lcov-report/api/routes/index.js.html +0 -266
  308. package/coverage/lcov-report/api/routes/row.js.html +0 -908
  309. package/coverage/lcov-report/automations/steps/createRow.js.html +0 -380
  310. package/coverage/lcov-report/automations/steps/deleteRow.js.html +0 -347
  311. package/coverage/lcov-report/automations/utils.js.html +0 -665
  312. package/coverage/lcov-report/middleware/authorized.js.html +0 -458
  313. package/coverage/lcov-report/middleware/usageQuota.js.html +0 -572
  314. package/coverage/lcov-report/threads/index.js.html +0 -296
  315. package/coverage/lcov-report/utilities/usageQuota/index.js.html +0 -359
  316. package/dist/middleware/usageQuota.js +0 -154
  317. package/dist/tsconfig.tsbuildinfo +0 -1
  318. package/dist/utilities/usageQuota/index.js +0 -86
  319. package/src/api/routes/index.js +0 -62
  320. package/src/middleware/tests/usageQuota.spec.js +0 -120
  321. package/src/middleware/usageQuota.js +0 -164
  322. package/src/migrations/functions/usageQuotas/tests/syncApps.spec.js +0 -41
  323. package/src/migrations/functions/usageQuotas/tests/syncRows.spec.js +0 -45
  324. package/src/utilities/tests/usageQuota/usageQuota.spec.js +0 -72
  325. package/src/utilities/usageQuota/index.js +0 -93
@@ -1,26 +1,31 @@
1
- const { Thread, ThreadType } = require("../threads")
2
- const { definitions } = require("./triggerInfo")
3
- const webhooks = require("../api/controllers/webhook")
4
- const { queue } = require("./bullboard")
5
- const newid = require("../db/newid")
6
- const { updateEntityMetadata } = require("../utilities")
7
- const { MetadataTypes, WebhookType } = require("../constants")
8
- const { getProdAppID } = require("@budibase/backend-core/db")
9
- const { cloneDeep } = require("lodash/fp")
10
- const { doWithDB } = require("@budibase/backend-core/db")
11
- const { getAppDB, getAppId } = require("@budibase/backend-core/context")
1
+ import { Thread, ThreadType } from "../threads"
2
+ import { definitions } from "./triggerInfo"
3
+ import * as webhooks from "../api/controllers/webhook"
4
+ import { queue } from "./bullboard"
5
+ import newid from "../db/newid"
6
+ import { updateEntityMetadata } from "../utilities"
7
+ import { MetadataTypes, WebhookType } from "../constants"
8
+ import { getProdAppID, doWithDB } from "@budibase/backend-core/db"
9
+ import { cloneDeep } from "lodash/fp"
10
+ import { getAppDB, getAppId } from "@budibase/backend-core/context"
11
+ import { tenancy } from "@budibase/backend-core"
12
+ import { quotas } from "@budibase/pro"
12
13
 
13
14
  const WH_STEP_ID = definitions.WEBHOOK.stepId
14
15
  const CRON_STEP_ID = definitions.CRON.stepId
15
16
  const Runner = new Thread(ThreadType.AUTOMATION)
16
17
 
17
- exports.processEvent = async job => {
18
+ export async function processEvent(job: any) {
18
19
  try {
19
- // need to actually await these so that an error can be captured properly
20
20
  console.log(
21
21
  `${job.data.automation.appId} automation ${job.data.automation._id} running`
22
22
  )
23
- return await Runner.run(job)
23
+ // need to actually await these so that an error can be captured properly
24
+ const tenantId = tenancy.getTenantIDFromAppID(job.data.event.appId)
25
+ return await tenancy.doInTenant(tenantId, async () => {
26
+ const runFn = () => Runner.run(job)
27
+ return quotas.addAutomation(runFn)
28
+ })
24
29
  } catch (err) {
25
30
  const errJson = JSON.stringify(err)
26
31
  console.error(
@@ -31,11 +36,15 @@ exports.processEvent = async job => {
31
36
  }
32
37
  }
33
38
 
34
- exports.updateTestHistory = async (appId, automation, history) => {
39
+ export async function updateTestHistory(
40
+ appId: any,
41
+ automation: any,
42
+ history: any
43
+ ) {
35
44
  return updateEntityMetadata(
36
45
  MetadataTypes.AUTOMATION_TEST_HISTORY,
37
46
  automation._id,
38
- metadata => {
47
+ (metadata: any) => {
39
48
  if (metadata && Array.isArray(metadata.history)) {
40
49
  metadata.history.push(history)
41
50
  } else {
@@ -48,7 +57,7 @@ exports.updateTestHistory = async (appId, automation, history) => {
48
57
  )
49
58
  }
50
59
 
51
- exports.removeDeprecated = definitions => {
60
+ export function removeDeprecated(definitions: any) {
52
61
  const base = cloneDeep(definitions)
53
62
  for (let key of Object.keys(base)) {
54
63
  if (base[key].deprecated) {
@@ -59,13 +68,15 @@ exports.removeDeprecated = definitions => {
59
68
  }
60
69
 
61
70
  // end the repetition and the job itself
62
- exports.disableAllCrons = async appId => {
71
+ export async function disableAllCrons(appId: any) {
63
72
  const promises = []
64
73
  const jobs = await queue.getRepeatableJobs()
65
74
  for (let job of jobs) {
66
75
  if (job.key.includes(`${appId}_cron`)) {
67
76
  promises.push(queue.removeRepeatableByKey(job.key))
68
- promises.push(queue.removeJobs(job.id))
77
+ if (job.id) {
78
+ promises.push(queue.removeJobs(job.id))
79
+ }
69
80
  }
70
81
  }
71
82
  return Promise.all(promises)
@@ -76,9 +87,9 @@ exports.disableAllCrons = async appId => {
76
87
  * @param {string} appId The ID of the app in which we are checking for webhooks
77
88
  * @param {object|undefined} automation The automation object to be updated.
78
89
  */
79
- exports.enableCronTrigger = async (appId, automation) => {
90
+ export async function enableCronTrigger(appId: any, automation: any) {
80
91
  const trigger = automation ? automation.definition.trigger : null
81
- function isCronTrigger(auto) {
92
+ function isCronTrigger(auto: any) {
82
93
  return (
83
94
  auto &&
84
95
  auto.definition.trigger &&
@@ -89,7 +100,7 @@ exports.enableCronTrigger = async (appId, automation) => {
89
100
  if (isCronTrigger(automation)) {
90
101
  // make a job id rather than letting Bull decide, makes it easier to handle on way out
91
102
  const jobId = `${appId}_cron_${newid()}`
92
- const job = await queue.add(
103
+ const job: any = await queue.add(
93
104
  {
94
105
  automation,
95
106
  event: { appId, timestamp: Date.now() },
@@ -101,7 +112,7 @@ exports.enableCronTrigger = async (appId, automation) => {
101
112
  // can't use getAppDB here as this is likely to be called from dev app,
102
113
  // but this call could be for dev app or prod app, need to just use what
103
114
  // was passed in
104
- await doWithDB(appId, async db => {
115
+ await doWithDB(appId, async (db: any) => {
105
116
  const response = await db.put(automation)
106
117
  automation._id = response.id
107
118
  automation._rev = response.rev
@@ -118,13 +129,13 @@ exports.enableCronTrigger = async (appId, automation) => {
118
129
  * @returns {Promise<object|undefined>} After this is complete the new automation object may have been updated and should be
119
130
  * written to DB (this does not write to DB as it would be wasteful to repeat).
120
131
  */
121
- exports.checkForWebhooks = async ({ oldAuto, newAuto }) => {
132
+ export async function checkForWebhooks({ oldAuto, newAuto }: any) {
122
133
  const appId = getAppId()
123
134
  const oldTrigger = oldAuto ? oldAuto.definition.trigger : null
124
135
  const newTrigger = newAuto ? newAuto.definition.trigger : null
125
136
  const triggerChanged =
126
137
  oldTrigger && newTrigger && oldTrigger.id !== newTrigger.id
127
- function isWebhookTrigger(auto) {
138
+ function isWebhookTrigger(auto: any) {
128
139
  return (
129
140
  auto &&
130
141
  auto.definition.trigger &&
@@ -160,7 +171,7 @@ exports.checkForWebhooks = async ({ oldAuto, newAuto }) => {
160
171
  (!isWebhookTrigger(oldAuto) || triggerChanged) &&
161
172
  isWebhookTrigger(newAuto)
162
173
  ) {
163
- const ctx = {
174
+ const ctx: any = {
164
175
  appId,
165
176
  request: {
166
177
  body: new webhooks.Webhook(
@@ -190,6 +201,6 @@ exports.checkForWebhooks = async ({ oldAuto, newAuto }) => {
190
201
  * @param appId {string} the app that is being removed.
191
202
  * @return {Promise<void>} clean is complete if this succeeds.
192
203
  */
193
- exports.cleanupAutomations = async appId => {
194
- await exports.disableAllCrons(appId)
204
+ export async function cleanupAutomations(appId: any) {
205
+ await disableAllCrons(appId)
195
206
  }
@@ -198,5 +198,11 @@ exports.WebhookType = {
198
198
  AUTOMATION: "automation",
199
199
  }
200
200
 
201
+ exports.AutomationErrors = {
202
+ INCORRECT_TYPE: "INCORRECT_TYPE",
203
+ MAX_ITERATIONS: "MAX_ITERATIONS_REACHED",
204
+ FAILURE_CONDITION: "FAILURE_CONDITION_MET",
205
+ }
206
+
201
207
  // pass through the list from the auth/core lib
202
208
  exports.ObjectStoreBuckets = ObjectStoreBuckets
@@ -19,6 +19,7 @@ export interface FieldSchema {
19
19
  through?: string
20
20
  foreignKey?: string
21
21
  autocolumn?: boolean
22
+ subtype?: string
22
23
  throughFrom?: string
23
24
  throughTo?: string
24
25
  formula?: string
@@ -49,6 +49,7 @@ export enum SourceNames {
49
49
  ORACLE = "ORACLE",
50
50
  GOOGLE_SHEETS = "GOOGLE_SHEETS",
51
51
  FIREBASE = "FIREBASE",
52
+ REDIS = "REDIS",
52
53
  }
53
54
 
54
55
  export enum IncludeRelationships {
@@ -34,7 +34,7 @@ let inThread = false
34
34
 
35
35
  module.exports = {
36
36
  // important
37
- PORT: process.env.PORT,
37
+ PORT: process.env.PORT || process.env.APP_PORT,
38
38
  JWT_SECRET: process.env.JWT_SECRET,
39
39
  COUCH_DB_URL: process.env.COUCH_DB_URL,
40
40
  MINIO_URL: process.env.MINIO_URL,
@@ -44,8 +44,6 @@ module.exports = {
44
44
  ENABLE_ANALYTICS: process.env.ENABLE_ANALYTICS,
45
45
  MINIO_ACCESS_KEY: process.env.MINIO_ACCESS_KEY,
46
46
  MINIO_SECRET_KEY: process.env.MINIO_SECRET_KEY,
47
- USE_QUOTAS: process.env.USE_QUOTAS,
48
- EXCLUDE_QUOTAS_TENANTS: process.env.EXCLUDE_QUOTAS_TENANTS,
49
47
  REDIS_URL: process.env.REDIS_URL,
50
48
  REDIS_PASSWORD: process.env.REDIS_PASSWORD,
51
49
  INTERNAL_API_KEY: process.env.INTERNAL_API_KEY,
@@ -65,6 +63,7 @@ module.exports = {
65
63
  LOG_LEVEL: process.env.LOG_LEVEL,
66
64
  AUTOMATION_DIRECTORY: process.env.AUTOMATION_DIRECTORY,
67
65
  AUTOMATION_BUCKET: process.env.AUTOMATION_BUCKET,
66
+ AUTOMATION_MAX_ITERATIONS: process.env.AUTOMATION_MAX_ITERATIONS,
68
67
  SENDGRID_API_KEY: process.env.SENDGRID_API_KEY,
69
68
  DYNAMO_ENDPOINT: process.env.DYNAMO_ENDPOINT,
70
69
  POSTHOG_TOKEN: process.env.POSTHOG_TOKEN,
package/src/index.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { bootstrap } from "global-agent"
1
2
  const fixPath = require("fix-path")
2
3
  const { checkDevelopmentEnvironment } = require("./utilities/fileSystem")
3
4
 
@@ -6,6 +7,8 @@ function runServer() {
6
7
  // will print an error explaining what to do
7
8
  checkDevelopmentEnvironment()
8
9
  fixPath()
10
+ // this will setup http and https proxies form env variables
11
+ bootstrap()
9
12
  require("./app")
10
13
  }
11
14
 
@@ -11,6 +11,7 @@ const arangodb = require("./arangodb")
11
11
  const rest = require("./rest")
12
12
  const googlesheets = require("./googlesheets")
13
13
  const firebase = require("./firebase")
14
+ const redis = require("./redis")
14
15
  const { SourceNames } = require("../definitions/datasource")
15
16
  const environment = require("../environment")
16
17
 
@@ -26,6 +27,8 @@ const DEFINITIONS = {
26
27
  [SourceNames.MYSQL]: mysql.schema,
27
28
  [SourceNames.ARANGODB]: arangodb.schema,
28
29
  [SourceNames.REST]: rest.schema,
30
+ [SourceNames.FIREBASE]: firebase.schema,
31
+ [SourceNames.REDIS]: redis.schema,
29
32
  }
30
33
 
31
34
  const INTEGRATIONS = {
@@ -42,6 +45,7 @@ const INTEGRATIONS = {
42
45
  [SourceNames.REST]: rest.integration,
43
46
  [SourceNames.FIREBASE]: firebase.integration,
44
47
  [SourceNames.GOOGLE_SHEETS]: googlesheets.integration,
48
+ [SourceNames.REDIS]: redis.integration,
45
49
  }
46
50
 
47
51
  // optionally add oracle integration if the oracle binary can be installed
@@ -0,0 +1,152 @@
1
+ import {
2
+ DatasourceFieldTypes,
3
+ Integration,
4
+ QueryTypes,
5
+ } from "../definitions/datasource"
6
+ import Redis from "ioredis"
7
+
8
+ module RedisModule {
9
+ interface RedisConfig {
10
+ host: string
11
+ port: number
12
+ username: string
13
+ password?: string
14
+ }
15
+
16
+ const SCHEMA: Integration = {
17
+ docs: "https://redis.io/docs/",
18
+ description: "",
19
+ friendlyName: "Redis",
20
+ datasource: {
21
+ host: {
22
+ type: "string",
23
+ required: true,
24
+ default: "localhost",
25
+ },
26
+ port: {
27
+ type: "number",
28
+ required: true,
29
+ default: 6379,
30
+ },
31
+ username: {
32
+ type: "string",
33
+ required: false,
34
+ },
35
+ password: {
36
+ type: "password",
37
+ required: false,
38
+ },
39
+ },
40
+ query: {
41
+ create: {
42
+ type: QueryTypes.FIELDS,
43
+ fields: {
44
+ key: {
45
+ type: DatasourceFieldTypes.STRING,
46
+ required: true,
47
+ },
48
+ value: {
49
+ type: DatasourceFieldTypes.STRING,
50
+ required: true,
51
+ },
52
+ ttl: {
53
+ type: DatasourceFieldTypes.NUMBER,
54
+ },
55
+ },
56
+ },
57
+ read: {
58
+ readable: true,
59
+ type: QueryTypes.FIELDS,
60
+ fields: {
61
+ key: {
62
+ type: DatasourceFieldTypes.STRING,
63
+ required: true,
64
+ },
65
+ },
66
+ },
67
+ delete: {
68
+ type: QueryTypes.FIELDS,
69
+ fields: {
70
+ key: {
71
+ type: DatasourceFieldTypes.STRING,
72
+ required: true,
73
+ },
74
+ },
75
+ },
76
+ command: {
77
+ readable: true,
78
+ displayName: "Redis Command",
79
+ type: QueryTypes.JSON,
80
+ },
81
+ },
82
+ }
83
+
84
+ class RedisIntegration {
85
+ private readonly config: RedisConfig
86
+ private client: any
87
+
88
+ constructor(config: RedisConfig) {
89
+ this.config = config
90
+ this.client = new Redis({
91
+ host: this.config.host,
92
+ port: this.config.port,
93
+ username: this.config.username,
94
+ password: this.config.password,
95
+ })
96
+ }
97
+
98
+ async disconnect() {
99
+ this.client.disconnect()
100
+ }
101
+
102
+ async redisContext(query: Function) {
103
+ try {
104
+ return await query()
105
+ } catch (err) {
106
+ throw new Error(`Redis error: ${err}`)
107
+ } finally {
108
+ this.disconnect()
109
+ }
110
+ }
111
+
112
+ async create(query: { key: string; value: string; ttl: number }) {
113
+ return this.redisContext(async () => {
114
+ const response = await this.client.set(query.key, query.value)
115
+ if (query.ttl) {
116
+ await this.client.expire(query.key, query.ttl)
117
+ }
118
+ return response
119
+ })
120
+ }
121
+
122
+ async read(query: { key: string }) {
123
+ return this.redisContext(async () => {
124
+ const response = await this.client.get(query.key)
125
+ return response
126
+ })
127
+ }
128
+
129
+ async delete(query: { key: string }) {
130
+ return this.redisContext(async () => {
131
+ const response = await this.client.del(query.key)
132
+ return response
133
+ })
134
+ }
135
+
136
+ async command(query: { json: string }) {
137
+ return this.redisContext(async () => {
138
+ const commands = query.json.trim().split(" ")
139
+ const pipeline = this.client.pipeline([commands])
140
+ const result = await pipeline.exec()
141
+ return {
142
+ response: result[0][1],
143
+ }
144
+ })
145
+ }
146
+ }
147
+
148
+ module.exports = {
149
+ schema: SCHEMA,
150
+ integration: RedisIntegration,
151
+ }
152
+ }
@@ -0,0 +1,60 @@
1
+ const Redis = require("ioredis-mock")
2
+ const RedisIntegration = require("../redis")
3
+
4
+ class TestConfiguration {
5
+ constructor(config = {}) {
6
+ this.integration = new RedisIntegration.integration(config)
7
+ this.redis = new Redis({
8
+ data: {
9
+ test: 'test',
10
+ result: "1"
11
+ },
12
+ })
13
+ this.integration.client = this.redis
14
+ }
15
+ }
16
+
17
+ describe("Redis Integration", () => {
18
+ let config
19
+
20
+ beforeEach(() => {
21
+ config = new TestConfiguration()
22
+ })
23
+
24
+ it("calls the create method with the correct params", async () => {
25
+ const body = {
26
+ key: "key",
27
+ value: "value"
28
+ }
29
+ const response = await config.integration.create(body)
30
+ expect(await config.redis.get("key")).toEqual("value")
31
+ })
32
+
33
+ it("calls the read method with the correct params", async () => {
34
+ const body = {
35
+ key: "test"
36
+ }
37
+ const response = await config.integration.read(body)
38
+ expect(response).toEqual("test")
39
+ })
40
+
41
+ it("calls the delete method with the correct params", async () => {
42
+ const body = {
43
+ key: "test"
44
+ }
45
+ await config.integration.delete(body)
46
+ expect(await config.redis.get(body.key)).toEqual(null)
47
+ })
48
+
49
+ it("calls the command method with the correct params", async () => {
50
+ const body = {
51
+ json: "KEYS *"
52
+ }
53
+
54
+ // ioredis-mock doesn't support pipelines
55
+ config.integration.client.pipeline = jest.fn(() => ({ exec: jest.fn(() => [[]]) }))
56
+
57
+ await config.integration.command(body)
58
+ expect(config.integration.client.pipeline).toHaveBeenCalledWith([["KEYS", "*"]])
59
+ })
60
+ })
@@ -1,8 +1,8 @@
1
- const {
1
+ import {
2
2
  getUserRoleHierarchy,
3
3
  getRequiredResourceRole,
4
4
  BUILTIN_ROLE_IDS,
5
- } = require("@budibase/backend-core/roles")
5
+ } from "@budibase/backend-core/roles"
6
6
  const {
7
7
  PermissionTypes,
8
8
  PermissionLevels,
@@ -13,7 +13,7 @@ const { isWebhookEndpoint } = require("./utils")
13
13
  const { buildCsrfMiddleware } = require("@budibase/backend-core/auth")
14
14
  const { getAppId } = require("@budibase/backend-core/context")
15
15
 
16
- function hasResource(ctx) {
16
+ function hasResource(ctx: any) {
17
17
  return ctx.resourceId != null
18
18
  }
19
19
 
@@ -25,7 +25,12 @@ const csrf = buildCsrfMiddleware()
25
25
  * - Builders can access all resources.
26
26
  * - Otherwise the user must have the required role.
27
27
  */
28
- const checkAuthorized = async (ctx, resourceRoles, permType, permLevel) => {
28
+ const checkAuthorized = async (
29
+ ctx: any,
30
+ resourceRoles: any,
31
+ permType: any,
32
+ permLevel: any
33
+ ) => {
29
34
  // check if this is a builder api and the user is not a builder
30
35
  const isBuilder = ctx.user && ctx.user.builder && ctx.user.builder.global
31
36
  const isBuilderApi = permType === PermissionTypes.BUILDER
@@ -40,10 +45,10 @@ const checkAuthorized = async (ctx, resourceRoles, permType, permLevel) => {
40
45
  }
41
46
 
42
47
  const checkAuthorizedResource = async (
43
- ctx,
44
- resourceRoles,
45
- permType,
46
- permLevel
48
+ ctx: any,
49
+ resourceRoles: any,
50
+ permType: any,
51
+ permLevel: any
47
52
  ) => {
48
53
  // get the user's roles
49
54
  const roleId = ctx.roleId || BUILTIN_ROLE_IDS.PUBLIC
@@ -54,7 +59,9 @@ const checkAuthorizedResource = async (
54
59
  // check if the user has the required role
55
60
  if (resourceRoles.length > 0) {
56
61
  // deny access if the user doesn't have the required resource role
57
- const found = userRoles.find(role => resourceRoles.indexOf(role._id) !== -1)
62
+ const found = userRoles.find(
63
+ (role: any) => resourceRoles.indexOf(role._id) !== -1
64
+ )
58
65
  if (!found) {
59
66
  ctx.throw(403, permError)
60
67
  }
@@ -64,9 +71,8 @@ const checkAuthorizedResource = async (
64
71
  }
65
72
  }
66
73
 
67
- module.exports =
68
- (permType, permLevel = null, opts = { schema: false }) =>
69
- async (ctx, next) => {
74
+ export = (permType: any, permLevel: any = null, opts = { schema: false }) =>
75
+ async (ctx: any, next: any) => {
70
76
  // webhooks don't need authentication, each webhook unique
71
77
  // also internal requests (between services) don't need authorized
72
78
  if (isWebhookEndpoint(ctx) || ctx.internal) {
@@ -82,8 +88,8 @@ module.exports =
82
88
  await builderMiddleware(ctx, permType)
83
89
 
84
90
  // get the resource roles
85
- let resourceRoles = [],
86
- otherLevelRoles
91
+ let resourceRoles: any = []
92
+ let otherLevelRoles: any = []
87
93
  const otherLevel =
88
94
  permLevel === PermissionLevels.READ
89
95
  ? PermissionLevels.WRITE
@@ -4,7 +4,7 @@ const {
4
4
  getCookie,
5
5
  clearCookie,
6
6
  } = require("@budibase/backend-core/utils")
7
- const { Cookies } = require("@budibase/backend-core/constants")
7
+ const { Cookies, Headers } = require("@budibase/backend-core/constants")
8
8
  const { getRole } = require("@budibase/backend-core/roles")
9
9
  const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles")
10
10
  const { generateUserMetadataID, isDevAppID } = require("../db/utils")
@@ -63,6 +63,21 @@ module.exports = async (ctx, next) => {
63
63
  appId = requestAppId
64
64
  // retrieving global user gets the right role
65
65
  roleId = globalUser.roleId || roleId
66
+
67
+ // Allow builders to specify their role via a header
68
+ const isBuilder =
69
+ globalUser && globalUser.builder && globalUser.builder.global
70
+ const isDevApp = appId && isDevAppID(appId)
71
+ const roleHeader = ctx.request && ctx.request.headers[Headers.PREVIEW_ROLE]
72
+ if (isBuilder && isDevApp && roleHeader) {
73
+ // Ensure the role is valid by ensuring a definition exists
74
+ try {
75
+ await getRole(roleHeader)
76
+ roleId = roleHeader
77
+ } catch (error) {
78
+ // Swallow error and do nothing
79
+ }
80
+ }
66
81
  }
67
82
 
68
83
  // nothing more to do
@@ -1,10 +1,14 @@
1
1
  mockAuthWithNoCookie()
2
2
  mockWorker()
3
3
 
4
- jest.mock("@budibase/backend-core/db", () => ({
5
- ...jest.requireActual("@budibase/backend-core/db"),
6
- dbExists: () => true,
7
- }))
4
+ jest.mock("@budibase/backend-core/db", () => {
5
+ const coreDb = jest.requireActual("@budibase/backend-core/db")
6
+ coreDb.init()
7
+ return {
8
+ ...coreDb,
9
+ dbExists: () => true,
10
+ }
11
+ })
8
12
 
9
13
  function mockWorker() {
10
14
  jest.mock("../../utilities/workerRequests", () => ({
@@ -0,0 +1,15 @@
1
+ const { createUserBuildersView } = require("@budibase/backend-core/db")
2
+ import * as syncDevelopers from "./usageQuotas/syncDevelopers"
3
+
4
+ /**
5
+ * Date:
6
+ * March 2022
7
+ *
8
+ * Description:
9
+ * Create the builder users view and sync the developer count
10
+ */
11
+
12
+ export const run = async (db: any) => {
13
+ await createUserBuildersView(db)
14
+ await syncDevelopers.run()
15
+ }
@@ -0,0 +1,13 @@
1
+ import * as syncPublishedApps from "./usageQuotas/syncPublishedApps"
2
+
3
+ /**
4
+ * Date:
5
+ * March 2022
6
+ *
7
+ * Description:
8
+ * Sync the published apps count
9
+ */
10
+
11
+ export const run = async (db: any) => {
12
+ await syncPublishedApps.run()
13
+ }
@@ -1,4 +1,3 @@
1
- const env = require("../../../environment")
2
1
  const TestConfig = require("../../../tests/utilities/TestConfiguration")
3
2
 
4
3
  const syncApps = jest.fn()
@@ -14,7 +13,6 @@ describe("run", () => {
14
13
 
15
14
  beforeEach(async () => {
16
15
  await config.init()
17
- env._set("USE_QUOTAS", 1)
18
16
  })
19
17
 
20
18
  afterAll(config.end)
@@ -1,8 +1,3 @@
1
- const { useQuotas } = require("../../../utilities/usageQuota")
2
-
3
1
  export const runQuotaMigration = async (migration: Function) => {
4
- if (!useQuotas()) {
5
- return
6
- }
7
2
  await migration()
8
3
  }
@@ -1,9 +1,8 @@
1
- import { getGlobalDB, getTenantId } from "@budibase/backend-core/tenancy"
1
+ import { getTenantId } from "@budibase/backend-core/tenancy"
2
2
  import { getAllApps } from "@budibase/backend-core/db"
3
- import { getUsageQuotaDoc } from "../../../utilities/usageQuota"
3
+ import { quotas, QuotaUsageType, StaticQuotaName } from "@budibase/pro"
4
4
 
5
5
  export const run = async () => {
6
- const db = getGlobalDB()
7
6
  // get app count
8
7
  // @ts-ignore
9
8
  const devApps = await getAllApps({ dev: true })
@@ -12,7 +11,5 @@ export const run = async () => {
12
11
  // sync app count
13
12
  const tenantId = getTenantId()
14
13
  console.log(`[Tenant: ${tenantId}] Syncing app count: ${appCount}`)
15
- const usageDoc = await getUsageQuotaDoc(db)
16
- usageDoc.usageQuota.apps = appCount
17
- await db.put(usageDoc)
14
+ await quotas.setUsage(appCount, StaticQuotaName.APPS, QuotaUsageType.STATIC)
18
15
  }