@budibase/server 1.0.123-alpha.0 → 1.0.123

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 (330) hide show
  1. package/builder/assets/index.68a7f4e3.css +6 -0
  2. package/builder/assets/index.8d4a5b33.js +1291 -0
  3. package/builder/assets/{vendor.5240f480.js → vendor.8e34a169.js} +1 -1
  4. package/builder/index.html +3 -3
  5. package/coverage/clover.xml +1763 -758
  6. package/coverage/coverage-final.json +43 -28
  7. package/coverage/lcov-report/api/controllers/analytics.js.html +3 -8
  8. package/coverage/lcov-report/api/controllers/apikeys.js.html +4 -9
  9. package/coverage/lcov-report/api/controllers/application.js.html +1436 -0
  10. package/coverage/lcov-report/api/controllers/auth.js.html +3 -8
  11. package/coverage/lcov-report/api/controllers/automation.js.html +3 -8
  12. package/coverage/lcov-report/api/controllers/backup.js.html +3 -8
  13. package/coverage/lcov-report/api/controllers/cloud.js.html +3 -8
  14. package/coverage/lcov-report/api/controllers/component.js.html +3 -8
  15. package/coverage/lcov-report/api/controllers/datasource.js.html +6 -11
  16. package/coverage/lcov-report/api/controllers/dev.js.html +3 -8
  17. package/coverage/lcov-report/api/controllers/index.html +26 -16
  18. package/coverage/lcov-report/api/controllers/integration.js.html +3 -8
  19. package/coverage/lcov-report/api/controllers/layout.js.html +3 -8
  20. package/coverage/lcov-report/api/controllers/metadata.js.html +3 -8
  21. package/coverage/lcov-report/api/controllers/migrations.js.html +3 -8
  22. package/coverage/lcov-report/api/controllers/permission.js.html +3 -8
  23. package/coverage/lcov-report/api/controllers/query/index.html +26 -16
  24. package/coverage/lcov-report/api/controllers/query/index.js.html +713 -0
  25. package/coverage/lcov-report/api/controllers/query/validation.js.html +3 -8
  26. package/coverage/lcov-report/api/controllers/role.js.html +5 -10
  27. package/coverage/lcov-report/api/controllers/routing.js.html +4 -9
  28. package/coverage/lcov-report/api/controllers/row/external.js.html +3 -8
  29. package/coverage/lcov-report/api/controllers/row/index.html +35 -25
  30. package/coverage/lcov-report/api/controllers/row/index.js.html +524 -0
  31. package/coverage/lcov-report/api/controllers/row/internal.js.html +24 -32
  32. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +16 -21
  33. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +19 -24
  34. package/coverage/lcov-report/api/controllers/row/utils.js.html +19 -33
  35. package/coverage/lcov-report/api/controllers/screen.js.html +4 -9
  36. package/coverage/lcov-report/api/controllers/script.js.html +3 -8
  37. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +50 -55
  38. package/coverage/lcov-report/api/controllers/table/external.js.html +3 -8
  39. package/coverage/lcov-report/api/controllers/table/index.html +44 -19
  40. package/coverage/lcov-report/api/controllers/table/index.js.html +15 -20
  41. package/coverage/lcov-report/api/controllers/table/internal.js.html +620 -0
  42. package/coverage/lcov-report/api/controllers/table/utils.js.html +1331 -0
  43. package/coverage/lcov-report/api/controllers/templates.js.html +3 -8
  44. package/coverage/lcov-report/api/controllers/user.js.html +3 -8
  45. package/coverage/lcov-report/api/controllers/view/exporters.js.html +3 -8
  46. package/coverage/lcov-report/api/controllers/view/index.html +3 -8
  47. package/coverage/lcov-report/api/controllers/view/index.js.html +5 -10
  48. package/coverage/lcov-report/api/controllers/view/utils.js.html +3 -8
  49. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +3 -8
  50. package/coverage/lcov-report/api/controllers/webhook.js.html +5 -10
  51. package/coverage/lcov-report/api/index.html +13 -18
  52. package/coverage/lcov-report/api/index.js.html +8 -28
  53. package/coverage/lcov-report/api/routes/analytics.js.html +3 -8
  54. package/coverage/lcov-report/api/routes/apikeys.js.html +3 -8
  55. package/coverage/lcov-report/api/routes/application.js.html +179 -0
  56. package/coverage/lcov-report/api/routes/auth.js.html +3 -8
  57. package/coverage/lcov-report/api/routes/automation.js.html +3 -8
  58. package/coverage/lcov-report/api/routes/backup.js.html +3 -8
  59. package/coverage/lcov-report/api/routes/cloud.js.html +3 -8
  60. package/coverage/lcov-report/api/routes/component.js.html +3 -8
  61. package/coverage/lcov-report/api/routes/datasource.js.html +3 -8
  62. package/coverage/lcov-report/api/routes/deploy.js.html +3 -8
  63. package/coverage/lcov-report/api/routes/dev.js.html +4 -9
  64. package/coverage/lcov-report/api/routes/index.html +68 -13
  65. package/coverage/lcov-report/api/routes/index.js.html +266 -0
  66. package/coverage/lcov-report/api/routes/integration.js.html +3 -8
  67. package/coverage/lcov-report/api/routes/layout.js.html +3 -8
  68. package/coverage/lcov-report/api/routes/metadata.js.html +3 -8
  69. package/coverage/lcov-report/api/routes/migrations.js.html +3 -8
  70. package/coverage/lcov-report/api/routes/permission.js.html +3 -8
  71. package/coverage/lcov-report/api/routes/query.js.html +3 -8
  72. package/coverage/lcov-report/api/routes/role.js.html +3 -8
  73. package/coverage/lcov-report/api/routes/routing.js.html +3 -8
  74. package/coverage/lcov-report/api/routes/row.js.html +908 -0
  75. package/coverage/lcov-report/api/routes/screen.js.html +3 -8
  76. package/coverage/lcov-report/api/routes/script.js.html +3 -8
  77. package/coverage/lcov-report/{automations/steps/loop.js.html → api/routes/static.js.html} +80 -70
  78. package/coverage/lcov-report/api/routes/table.js.html +3 -8
  79. package/coverage/lcov-report/api/routes/templates.js.html +3 -8
  80. package/coverage/lcov-report/api/routes/user.js.html +3 -8
  81. package/coverage/lcov-report/api/routes/utils/index.html +3 -8
  82. package/coverage/lcov-report/api/routes/utils/validators.js.html +3 -8
  83. package/coverage/lcov-report/api/routes/view.js.html +3 -8
  84. package/coverage/lcov-report/api/routes/webhook.js.html +3 -8
  85. package/coverage/lcov-report/automations/actions.js.html +7 -21
  86. package/coverage/lcov-report/automations/automationUtils.js.html +23 -64
  87. package/coverage/lcov-report/automations/bullboard.js.html +3 -8
  88. package/coverage/lcov-report/automations/index.html +37 -27
  89. package/coverage/lcov-report/automations/index.js.html +3 -8
  90. package/coverage/lcov-report/automations/steps/bash.js.html +3 -8
  91. package/coverage/lcov-report/automations/steps/createRow.js.html +380 -0
  92. package/coverage/lcov-report/automations/steps/delay.js.html +3 -8
  93. package/coverage/lcov-report/automations/steps/deleteRow.js.html +347 -0
  94. package/coverage/lcov-report/automations/steps/discord.js.html +3 -8
  95. package/coverage/lcov-report/automations/steps/executeQuery.js.html +3 -8
  96. package/coverage/lcov-report/automations/steps/executeScript.js.html +3 -8
  97. package/coverage/lcov-report/automations/steps/filter.js.html +3 -8
  98. package/coverage/lcov-report/automations/steps/index.html +41 -31
  99. package/coverage/lcov-report/automations/steps/integromat.js.html +3 -8
  100. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +4 -9
  101. package/coverage/lcov-report/automations/steps/queryRows.js.html +4 -9
  102. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +3 -8
  103. package/coverage/lcov-report/automations/steps/serverLog.js.html +3 -8
  104. package/coverage/lcov-report/automations/steps/slack.js.html +3 -8
  105. package/coverage/lcov-report/automations/steps/updateRow.js.html +3 -8
  106. package/coverage/lcov-report/automations/steps/utils.js.html +9 -14
  107. package/coverage/lcov-report/automations/steps/zapier.js.html +3 -8
  108. package/coverage/lcov-report/automations/triggerInfo/app.js.html +3 -8
  109. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +3 -8
  110. package/coverage/lcov-report/automations/triggerInfo/index.html +3 -8
  111. package/coverage/lcov-report/automations/triggerInfo/index.js.html +3 -8
  112. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +3 -8
  113. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +3 -8
  114. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +3 -8
  115. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +3 -8
  116. package/coverage/lcov-report/automations/triggers.js.html +11 -16
  117. package/coverage/lcov-report/automations/utils.js.html +665 -0
  118. package/coverage/lcov-report/block-navigation.js +0 -8
  119. package/coverage/lcov-report/constants/index.html +3 -8
  120. package/coverage/lcov-report/constants/index.js.html +42 -41
  121. package/coverage/lcov-report/constants/layouts.js.html +3 -8
  122. package/coverage/lcov-report/constants/screens.js.html +3 -8
  123. package/coverage/lcov-report/db/inMemoryView.js.html +3 -8
  124. package/coverage/lcov-report/db/index.html +3 -8
  125. package/coverage/lcov-report/db/index.js.html +4 -9
  126. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +23 -25
  127. package/coverage/lcov-report/db/linkedRows/index.html +12 -17
  128. package/coverage/lcov-report/db/linkedRows/index.js.html +17 -22
  129. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +7 -12
  130. package/coverage/lcov-report/db/newid.js.html +6 -11
  131. package/coverage/lcov-report/db/utils.js.html +79 -84
  132. package/coverage/lcov-report/events/AutomationEmitter.js.html +9 -14
  133. package/coverage/lcov-report/events/index.html +3 -8
  134. package/coverage/lcov-report/events/index.js.html +4 -9
  135. package/coverage/lcov-report/events/utils.js.html +13 -18
  136. package/coverage/lcov-report/index.html +132 -137
  137. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +3 -8
  138. package/coverage/lcov-report/integrations/tests/index.html +3 -8
  139. package/coverage/lcov-report/middleware/appInfo.js.html +3 -8
  140. package/coverage/lcov-report/middleware/authorized.js.html +458 -0
  141. package/coverage/lcov-report/middleware/builder.js.html +3 -8
  142. package/coverage/lcov-report/middleware/currentapp.js.html +15 -65
  143. package/coverage/lcov-report/middleware/index.html +50 -25
  144. package/coverage/lcov-report/middleware/joi-validator.js.html +4 -9
  145. package/coverage/lcov-report/middleware/publicApi.js.html +3 -8
  146. package/coverage/lcov-report/middleware/resourceId.js.html +3 -8
  147. package/coverage/lcov-report/middleware/selfhost.js.html +4 -9
  148. package/coverage/lcov-report/middleware/usageQuota.js.html +572 -0
  149. package/coverage/lcov-report/middleware/utils.js.html +3 -8
  150. package/coverage/lcov-report/sorter.js +0 -26
  151. package/coverage/lcov-report/threads/automation.js.html +90 -581
  152. package/coverage/lcov-report/threads/index.html +40 -30
  153. package/coverage/lcov-report/threads/index.js.html +296 -0
  154. package/coverage/lcov-report/threads/query.js.html +4 -9
  155. package/coverage/lcov-report/threads/utils.js.html +9 -17
  156. package/coverage/lcov-report/utilities/bcrypt.js.html +3 -8
  157. package/coverage/lcov-report/utilities/budibaseDir.js.html +3 -8
  158. package/coverage/lcov-report/utilities/centralPath.js.html +3 -8
  159. package/coverage/lcov-report/utilities/csvParser.js.html +5 -10
  160. package/coverage/lcov-report/utilities/global.js.html +4 -9
  161. package/coverage/lcov-report/utilities/index.html +3 -8
  162. package/coverage/lcov-report/utilities/index.js.html +6 -11
  163. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +9 -32
  164. package/coverage/lcov-report/utilities/queue/index.html +7 -12
  165. package/coverage/lcov-report/utilities/routing/index.html +3 -8
  166. package/coverage/lcov-report/utilities/routing/index.js.html +3 -8
  167. package/coverage/lcov-report/utilities/rowProcessor/index.html +27 -32
  168. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +71 -67
  169. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +106 -27
  170. package/coverage/lcov-report/utilities/scriptRunner.js.html +3 -8
  171. package/coverage/lcov-report/utilities/security.js.html +4 -9
  172. package/coverage/lcov-report/utilities/statusCodes.js.html +3 -8
  173. package/coverage/lcov-report/utilities/usageQuota/index.html +34 -24
  174. package/coverage/lcov-report/utilities/usageQuota/index.js.html +359 -0
  175. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +39 -44
  176. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +3 -8
  177. package/coverage/lcov-report/utilities/users.js.html +3 -8
  178. package/coverage/lcov-report/utilities/workerRequests.js.html +4 -9
  179. package/coverage/lcov.info +3061 -1290
  180. package/dist/api/controllers/application.js +73 -145
  181. package/dist/api/controllers/deploy/index.js +36 -68
  182. package/dist/api/controllers/public/applications.js +9 -29
  183. package/dist/api/controllers/public/queries.js +7 -27
  184. package/dist/api/controllers/public/rows.js +12 -32
  185. package/dist/api/controllers/public/tables.js +2 -2
  186. package/dist/api/controllers/public/users.js +8 -8
  187. package/dist/api/controllers/public/utils.js +1 -1
  188. package/dist/api/controllers/query/import/index.js +3 -3
  189. package/dist/api/controllers/query/index.js +44 -57
  190. package/dist/api/controllers/row/ExternalRequest.js +27 -27
  191. package/dist/api/controllers/row/index.js +60 -83
  192. package/dist/api/controllers/row/internal.js +1 -2
  193. package/dist/api/controllers/row/utils.js +1 -2
  194. package/dist/api/controllers/static/templates/BudibaseApp.svelte +0 -3
  195. package/dist/api/controllers/table/bulkFormula.js +1 -2
  196. package/dist/api/controllers/table/internal.js +55 -40
  197. package/dist/api/controllers/table/utils.js +229 -271
  198. package/dist/api/index.js +0 -5
  199. package/dist/api/routes/application.js +13 -39
  200. package/dist/api/routes/index.js +56 -61
  201. package/dist/api/routes/public/index.js +9 -6
  202. package/dist/api/routes/public/queries.js +1 -1
  203. package/dist/api/routes/public/rows.js +1 -1
  204. package/dist/api/routes/public/tables.js +3 -3
  205. package/dist/api/routes/public/users.js +1 -1
  206. package/dist/api/routes/row.js +17 -43
  207. package/dist/api/routes/static.js +13 -40
  208. package/dist/api/routes/tests/utilities/TestFunctions.js +33 -75
  209. package/dist/app.js +4 -8
  210. package/dist/automations/actions.js +0 -3
  211. package/dist/automations/automationUtils.js +0 -10
  212. package/dist/automations/steps/createRow.js +12 -12
  213. package/dist/automations/steps/deleteRow.js +16 -13
  214. package/dist/automations/tests/utilities/index.js +11 -13
  215. package/dist/automations/utils.js +133 -187
  216. package/dist/constants/index.js +7 -5
  217. package/dist/db/linkedRows/LinkController.js +1 -0
  218. package/dist/definitions/datasource.js +0 -1
  219. package/dist/environment.js +3 -2
  220. package/dist/index.js +0 -4
  221. package/dist/integrations/base/sql.js +2 -2
  222. package/dist/integrations/base/sqlTable.js +2 -2
  223. package/dist/integrations/googlesheets.js +1 -1
  224. package/dist/integrations/index.js +0 -4
  225. package/dist/integrations/microsoftSqlServer.js +8 -8
  226. package/dist/integrations/mysql.js +9 -9
  227. package/dist/integrations/oracle.js +7 -7
  228. package/dist/integrations/postgres.js +7 -7
  229. package/dist/integrations/queries/sql.js +2 -2
  230. package/dist/integrations/rest.js +1 -1
  231. package/dist/middleware/authorized.js +51 -51
  232. package/dist/middleware/currentapp.js +1 -15
  233. package/dist/middleware/usageQuota.js +154 -0
  234. package/dist/migrations/functions/appUrls.js +1 -1
  235. package/dist/migrations/functions/quotas1.js +2 -6
  236. package/dist/migrations/functions/usageQuotas/index.js +4 -0
  237. package/dist/migrations/functions/usageQuotas/syncApps.js +7 -4
  238. package/dist/migrations/functions/usageQuotas/syncRows.js +8 -5
  239. package/dist/migrations/index.js +1 -17
  240. package/dist/package.json +4 -10
  241. package/dist/threads/automation.js +27 -149
  242. package/dist/threads/index.js +10 -36
  243. package/dist/threads/utils.js +0 -1
  244. package/dist/tsconfig.tsbuildinfo +1 -0
  245. package/dist/utilities/queue/inMemoryQueue.js +1 -6
  246. package/dist/utilities/rowProcessor/index.js +11 -6
  247. package/dist/utilities/rowProcessor/utils.js +27 -1
  248. package/dist/utilities/usageQuota/index.js +86 -0
  249. package/nodemon.json +1 -1
  250. package/package.json +9 -15
  251. package/scripts/dev/manage.js +0 -2
  252. package/src/api/controllers/{application.ts → application.js} +51 -118
  253. package/src/api/controllers/deploy/{index.ts → index.js} +29 -53
  254. package/src/api/controllers/public/applications.ts +2 -2
  255. package/src/api/controllers/public/queries.ts +1 -1
  256. package/src/api/controllers/public/rows.ts +1 -1
  257. package/src/api/controllers/query/{index.ts → index.js} +48 -51
  258. package/src/api/controllers/row/ExternalRequest.ts +1 -1
  259. package/src/api/controllers/row/{index.ts → index.js} +17 -24
  260. package/src/api/controllers/row/internal.js +1 -2
  261. package/src/api/controllers/row/utils.js +1 -4
  262. package/src/api/controllers/static/templates/BudibaseApp.svelte +0 -3
  263. package/src/api/controllers/table/bulkFormula.js +1 -1
  264. package/src/api/controllers/table/{internal.ts → internal.js} +48 -27
  265. package/src/api/controllers/table/{utils.ts → utils.js} +69 -86
  266. package/src/api/index.js +0 -5
  267. package/src/api/routes/{application.ts → application.js} +14 -8
  268. package/src/api/routes/index.js +62 -0
  269. package/src/api/routes/public/index.ts +4 -1
  270. package/src/api/routes/{row.ts → row.js} +15 -7
  271. package/src/api/routes/{static.ts → static.js} +11 -11
  272. package/src/api/routes/tests/misc.spec.js +37 -39
  273. package/src/api/routes/tests/routing.spec.js +0 -1
  274. package/src/api/routes/tests/utilities/{TestFunctions.ts → TestFunctions.js} +33 -57
  275. package/src/app.ts +2 -1
  276. package/src/automations/actions.js +0 -3
  277. package/src/automations/automationUtils.js +0 -12
  278. package/src/automations/steps/{createRow.ts → createRow.js} +15 -9
  279. package/src/automations/steps/{deleteRow.ts → deleteRow.js} +16 -10
  280. package/src/automations/tests/automation.spec.js +1 -0
  281. package/src/automations/tests/{createRow.spec.ts → createRow.spec.js} +15 -4
  282. package/src/automations/tests/{deleteRow.spec.ts → deleteRow.spec.js} +5 -3
  283. package/src/automations/tests/utilities/index.js +10 -12
  284. package/src/automations/{utils.ts → utils.js} +28 -39
  285. package/src/constants/index.js +8 -6
  286. package/src/db/linkedRows/LinkController.js +1 -0
  287. package/src/definitions/datasource.ts +0 -1
  288. package/src/environment.js +3 -2
  289. package/src/index.ts +0 -3
  290. package/src/integrations/index.ts +0 -4
  291. package/src/middleware/{authorized.ts → authorized.js} +14 -20
  292. package/src/middleware/currentapp.js +1 -16
  293. package/src/middleware/tests/usageQuota.spec.js +120 -0
  294. package/src/middleware/usageQuota.js +164 -0
  295. package/src/migrations/functions/tests/quotas1.spec.js +2 -0
  296. package/src/migrations/functions/usageQuotas/index.ts +5 -0
  297. package/src/migrations/functions/usageQuotas/syncApps.ts +6 -3
  298. package/src/migrations/functions/usageQuotas/syncRows.ts +6 -3
  299. package/src/migrations/functions/usageQuotas/tests/syncApps.spec.js +41 -0
  300. package/src/migrations/functions/usageQuotas/tests/syncRows.spec.js +45 -0
  301. package/src/migrations/index.ts +1 -13
  302. package/src/threads/automation.js +34 -196
  303. package/src/threads/{index.ts → index.js} +14 -18
  304. package/src/threads/utils.js +0 -1
  305. package/src/utilities/queue/inMemoryQueue.js +1 -7
  306. package/src/utilities/rowProcessor/index.js +12 -9
  307. package/src/utilities/rowProcessor/utils.js +29 -1
  308. package/src/utilities/tests/usageQuota/usageQuota.spec.js +72 -0
  309. package/src/utilities/usageQuota/index.js +93 -0
  310. package/tsconfig.json +2 -2
  311. package/builder/assets/index.89795487.css +0 -6
  312. package/builder/assets/index.be9a1b80.js +0 -1299
  313. package/dist/automations/steps/loop.js +0 -51
  314. package/dist/integrations/redis.js +0 -158
  315. package/dist/migrations/functions/developerQuota.js +0 -49
  316. package/dist/migrations/functions/publishedAppsQuota.js +0 -47
  317. package/dist/migrations/functions/usageQuotas/syncDevelopers.js +0 -24
  318. package/dist/migrations/functions/usageQuotas/syncPublishedApps.js +0 -26
  319. package/dist/tsconfig.build.tsbuildinfo +0 -1
  320. package/src/api/routes/index.ts +0 -60
  321. package/src/automations/steps/loop.js +0 -50
  322. package/src/integrations/redis.ts +0 -152
  323. package/src/integrations/tests/redis.spec.js +0 -60
  324. package/src/migrations/functions/developerQuota.ts +0 -15
  325. package/src/migrations/functions/publishedAppsQuota.ts +0 -13
  326. package/src/migrations/functions/usageQuotas/syncDevelopers.ts +0 -19
  327. package/src/migrations/functions/usageQuotas/syncPublishedApps.ts +0 -21
  328. package/src/migrations/functions/usageQuotas/tests/syncApps.spec.ts +0 -34
  329. package/src/migrations/functions/usageQuotas/tests/syncRows.spec.ts +0 -40
  330. package/tsconfig.build.json +0 -10
@@ -1,8 +1,9 @@
1
- import { getTenantId } from "@budibase/backend-core/tenancy"
1
+ import { getGlobalDB, getTenantId } from "@budibase/backend-core/tenancy"
2
2
  import { getAllApps } from "@budibase/backend-core/db"
3
- import { quotas, QuotaUsageType, StaticQuotaName } from "@budibase/pro"
3
+ import { getUsageQuotaDoc } from "../../../utilities/usageQuota"
4
4
 
5
5
  export const run = async () => {
6
+ const db = getGlobalDB()
6
7
  // get app count
7
8
  // @ts-ignore
8
9
  const devApps = await getAllApps({ dev: true })
@@ -11,5 +12,7 @@ export const run = async () => {
11
12
  // sync app count
12
13
  const tenantId = getTenantId()
13
14
  console.log(`[Tenant: ${tenantId}] Syncing app count: ${appCount}`)
14
- await quotas.setUsage(appCount, StaticQuotaName.APPS, QuotaUsageType.STATIC)
15
+ const usageDoc = await getUsageQuotaDoc(db)
16
+ usageDoc.usageQuota.apps = appCount
17
+ await db.put(usageDoc)
15
18
  }
@@ -1,9 +1,10 @@
1
- import { getTenantId } from "@budibase/backend-core/tenancy"
1
+ import { getGlobalDB, getTenantId } from "@budibase/backend-core/tenancy"
2
2
  import { getAllApps } from "@budibase/backend-core/db"
3
+ import { getUsageQuotaDoc } from "../../../utilities/usageQuota"
3
4
  import { getUniqueRows } from "../../../utilities/usageQuota/rows"
4
- import { quotas, QuotaUsageType, StaticQuotaName } from "@budibase/pro"
5
5
 
6
6
  export const run = async () => {
7
+ const db = getGlobalDB()
7
8
  // get all rows in all apps
8
9
  // @ts-ignore
9
10
  const allApps = await getAllApps({ all: true })
@@ -15,5 +16,7 @@ export const run = async () => {
15
16
  // sync row count
16
17
  const tenantId = getTenantId()
17
18
  console.log(`[Tenant: ${tenantId}] Syncing row count: ${rowCount}`)
18
- await quotas.setUsage(rowCount, StaticQuotaName.ROWS, QuotaUsageType.STATIC)
19
+ const usageDoc = await getUsageQuotaDoc(db)
20
+ usageDoc.usageQuota.rows = rowCount
21
+ await db.put(usageDoc)
19
22
  }
@@ -0,0 +1,41 @@
1
+ const { doInTenant, getGlobalDB } = require("@budibase/backend-core/tenancy")
2
+ const TestConfig = require("../../../../tests/utilities/TestConfiguration")
3
+ const { TENANT_ID } = require("../../../../tests/utilities/structures")
4
+ const { getUsageQuotaDoc, update, Properties } = require("../../../../utilities/usageQuota")
5
+ const syncApps = require("../syncApps")
6
+ const env = require("../../../../environment")
7
+
8
+ describe("syncApps", () => {
9
+
10
+ let config = new TestConfig(false)
11
+
12
+ beforeEach(async () => {
13
+ await config.init()
14
+ env._set("USE_QUOTAS", 1)
15
+ })
16
+
17
+ afterAll(config.end)
18
+
19
+ it("runs successfully", async () => {
20
+ await doInTenant(TENANT_ID, async () => {
21
+ const db = getGlobalDB()
22
+ // create the usage quota doc and mock usages
23
+ await getUsageQuotaDoc(db)
24
+ await update(Properties.APPS, 3)
25
+
26
+ let usageDoc = await getUsageQuotaDoc(db)
27
+ expect(usageDoc.usageQuota.apps).toEqual(3)
28
+
29
+ // create an extra app to test the migration
30
+ await config.createApp("quota-test")
31
+
32
+ // migrate
33
+ await syncApps.run()
34
+
35
+ // assert the migration worked
36
+ usageDoc = await getUsageQuotaDoc(db)
37
+ expect(usageDoc.usageQuota.apps).toEqual(2)
38
+ })
39
+ })
40
+ })
41
+
@@ -0,0 +1,45 @@
1
+ const { doInTenant, getGlobalDB } = require("@budibase/backend-core/tenancy")
2
+ const TestConfig = require("../../../../tests/utilities/TestConfiguration")
3
+ const { TENANT_ID } = require("../../../../tests/utilities/structures")
4
+ const { getUsageQuotaDoc, update, Properties } = require("../../../../utilities/usageQuota")
5
+ const syncRows = require("../syncRows")
6
+ const env = require("../../../../environment")
7
+
8
+ describe("syncRows", () => {
9
+ let config = new TestConfig(false)
10
+
11
+ beforeEach(async () => {
12
+ await config.init()
13
+ env._set("USE_QUOTAS", 1)
14
+ })
15
+
16
+ afterAll(config.end)
17
+
18
+ it("runs successfully", async () => {
19
+ await doInTenant(TENANT_ID, async () => {
20
+ const db = getGlobalDB()
21
+ await getUsageQuotaDoc(db)
22
+ await update(Properties.ROW, 300)
23
+
24
+ let usageDoc = await getUsageQuotaDoc(db)
25
+ expect(usageDoc.usageQuota.rows).toEqual(300)
26
+
27
+ // app 1
28
+ await config.createTable()
29
+ await config.createRow()
30
+ // app 2
31
+ await config.createApp("second-app")
32
+ await config.createTable()
33
+ await config.createRow()
34
+ await config.createRow()
35
+
36
+ // migrate
37
+ await syncRows.run()
38
+
39
+ // assert the migration worked
40
+ usageDoc = await getUsageQuotaDoc(db)
41
+ expect(usageDoc.usageQuota.rows).toEqual(3)
42
+ })
43
+ })
44
+ })
45
+
@@ -7,8 +7,6 @@ const {
7
7
  import * as userEmailViewCasing from "./functions/userEmailViewCasing"
8
8
  import * as quota1 from "./functions/quotas1"
9
9
  import * as appUrls from "./functions/appUrls"
10
- import * as developerQuota from "./functions/developerQuota"
11
- import * as publishedAppsQuota from "./functions/publishedAppsQuota"
12
10
 
13
11
  export interface Migration {
14
12
  type: string
@@ -28,7 +26,7 @@ export interface Migration {
28
26
  */
29
27
  export interface MigrationOptions {
30
28
  tenantIds?: string[]
31
- force?: {
29
+ forced?: {
32
30
  [type: string]: string[]
33
31
  }
34
32
  }
@@ -50,16 +48,6 @@ export const MIGRATIONS: Migration[] = [
50
48
  opts: { all: true },
51
49
  fn: appUrls.run,
52
50
  },
53
- {
54
- type: MIGRATION_TYPES.GLOBAL,
55
- name: "developer_quota",
56
- fn: developerQuota.run,
57
- },
58
- {
59
- type: MIGRATION_TYPES.GLOBAL,
60
- name: "published_apps_quota",
61
- fn: publishedAppsQuota.run,
62
- },
63
51
  ]
64
52
 
65
53
  export const migrate = async (options?: MigrationOptions) => {
@@ -8,14 +8,10 @@ const { DocumentTypes } = require("../db/utils")
8
8
  const { doInTenant } = require("@budibase/backend-core/tenancy")
9
9
  const { definitions: triggerDefs } = require("../automations/triggerInfo")
10
10
  const { doInAppContext, getAppDB } = require("@budibase/backend-core/context")
11
- const { AutomationErrors } = require("../constants")
12
- const FILTER_STEP_ID = actions.ACTION_DEFINITIONS.FILTER.stepId
13
- const LOOP_STEP_ID = actions.ACTION_DEFINITIONS.LOOP.stepId
14
11
 
12
+ const FILTER_STEP_ID = actions.ACTION_DEFINITIONS.FILTER.stepId
15
13
  const CRON_STEP_ID = triggerDefs.CRON.stepId
16
14
  const STOPPED_STATUS = { success: false, status: "STOPPED" }
17
- const { cloneDeep } = require("lodash/fp")
18
- const env = require("../environment")
19
15
 
20
16
  /**
21
17
  * The automation orchestrator is a class responsible for executing automations.
@@ -78,208 +74,50 @@ class Orchestrator {
78
74
  this.executionOutput.steps.push(stepObj)
79
75
  }
80
76
 
81
- updateContextAndOutput(loopStepNumber, step, output, result) {
82
- this.executionOutput.steps.splice(loopStepNumber, 0, {
83
- id: step.id,
84
- stepId: step.stepId,
85
- outputs: {
86
- ...output,
87
- success: result.success,
88
- status: result.status,
89
- },
90
- inputs: step.inputs,
91
- })
92
- this._context.steps.splice(loopStepNumber, 0, {
93
- ...output,
94
- success: result.success,
95
- status: result.status,
96
- })
97
- }
98
-
99
77
  async execute() {
100
78
  let automation = this._automation
101
79
  const app = await this.getApp()
102
80
  let stopped = false
103
- let loopStep
104
-
105
- let stepCount = 0
106
- let loopStepNumber
107
- let loopSteps = []
108
81
  for (let step of automation.definition.steps) {
109
- stepCount++
110
- let input
111
- if (step.stepId === LOOP_STEP_ID) {
112
- loopStep = step
113
- loopStepNumber = stepCount
82
+ // execution stopped, record state for that
83
+ if (stopped) {
84
+ this.updateExecutionOutput(step.id, step.stepId, {}, STOPPED_STATUS)
114
85
  continue
115
86
  }
116
-
117
- if (loopStep) {
118
- input = await processObject(loopStep.inputs, this._context)
119
- }
120
- let iterations = loopStep ? input.binding.length : 1
121
- let iterationCount = 0
122
- for (let index = 0; index < iterations; index++) {
123
- let originalStepInput = cloneDeep(step.inputs)
124
-
125
- // Handle if the user has set a max iteration count or if it reaches the max limit set by us
126
- if (loopStep) {
127
- // lets first of all handle the input
128
- // if the input is array then use it, if it is a string then split it on every new line
129
- let newInput = await processObject(
130
- loopStep.inputs,
131
- cloneDeep(this._context)
132
- )
133
- newInput = automationUtils.cleanInputValues(
134
- newInput,
135
- loopStep.schema.inputs
136
- )
137
- this._context.steps[loopStepNumber] = {
138
- currentItem: newInput.binding[index],
139
- }
140
-
141
- let tempOutput = { items: loopSteps, iterations: iterationCount }
142
- if (
143
- (loopStep.inputs.option === "Array" &&
144
- !Array.isArray(newInput.binding)) ||
145
- (loopStep.inputs.option === "String" &&
146
- typeof newInput.binding !== "string")
147
- ) {
148
- this.updateContextAndOutput(loopStepNumber, step, tempOutput, {
149
- status: AutomationErrors.INCORRECT_TYPE,
150
- success: false,
151
- })
152
- loopSteps = null
153
- loopStep = null
154
- break
155
- }
156
-
157
- // The "Loop" binding in the front end is "fake", so replace it here so the context can understand it
158
- // Pretty hacky because we need to account for the row object
159
- for (let [key, value] of Object.entries(originalStepInput)) {
160
- if (typeof value === "object") {
161
- for (let [innerKey, innerValue] of Object.entries(
162
- originalStepInput[key]
163
- )) {
164
- if (typeof innerValue === "string") {
165
- originalStepInput[key][innerKey] =
166
- automationUtils.substituteLoopStep(
167
- innerValue,
168
- `steps.${loopStepNumber}`
169
- )
170
- }
171
- }
172
- } else {
173
- if (typeof value === "string") {
174
- originalStepInput[key] = automationUtils.substituteLoopStep(
175
- value,
176
- `steps.${loopStepNumber}`
177
- )
178
- }
179
- }
180
- }
181
-
182
- if (
183
- index === parseInt(env.AUTOMATION_MAX_ITERATIONS) ||
184
- index === loopStep.inputs.iterations
185
- ) {
186
- this.updateContextAndOutput(loopStepNumber, step, tempOutput, {
187
- status: AutomationErrors.MAX_ITERATIONS,
188
- success: true,
189
- })
190
- loopSteps = null
191
- loopStep = null
192
- break
193
- }
194
-
195
- if (
196
- this._context.steps[loopStepNumber]?.currentItem ===
197
- loopStep.inputs.failure
198
- ) {
199
- this.updateContextAndOutput(loopStepNumber, step, tempOutput, {
200
- status: AutomationErrors.FAILURE_CONDITION,
201
- success: false,
202
- })
203
- loopSteps = null
204
- loopStep = null
205
- break
206
- }
207
- }
208
-
209
- // execution stopped, record state for that
210
- if (stopped) {
211
- this.updateExecutionOutput(step.id, step.stepId, {}, STOPPED_STATUS)
212
- continue
213
- }
214
-
215
- // If it's a loop step, we need to manually add the bindings to the context
216
- let stepFn = await this.getStepFunctionality(step.stepId)
217
- let inputs = await processObject(originalStepInput, this._context)
218
- inputs = automationUtils.cleanInputValues(inputs, step.schema.inputs)
219
- try {
220
- // appId is always passed
221
- let tenantId = app.tenantId || DEFAULT_TENANT_ID
222
- const outputs = await doInTenant(tenantId, () => {
223
- return stepFn({
224
- inputs: inputs,
225
- appId: this._appId,
226
- emitter: this._emitter,
227
- context: this._context,
228
- })
87
+ let stepFn = await this.getStepFunctionality(step.stepId)
88
+ step.inputs = await processObject(step.inputs, this._context)
89
+ step.inputs = automationUtils.cleanInputValues(
90
+ step.inputs,
91
+ step.schema.inputs
92
+ )
93
+ // appId is always passed
94
+ try {
95
+ let tenantId = app.tenantId || DEFAULT_TENANT_ID
96
+ const outputs = await doInTenant(tenantId, () => {
97
+ return stepFn({
98
+ inputs: step.inputs,
99
+ appId: this._appId,
100
+ emitter: this._emitter,
101
+ context: this._context,
229
102
  })
230
- this._context.steps[stepCount] = outputs
231
- // if filter causes us to stop execution don't break the loop, set a var
232
- // so that we can finish iterating through the steps and record that it stopped
233
- if (step.stepId === FILTER_STEP_ID && !outputs.success) {
234
- stopped = true
235
- this.updateExecutionOutput(step.id, step.stepId, step.inputs, {
236
- ...outputs,
237
- ...STOPPED_STATUS,
238
- })
239
- continue
240
- }
241
- if (loopStep && loopSteps) {
242
- loopSteps.push(outputs)
243
- } else {
244
- this.updateExecutionOutput(
245
- step.id,
246
- step.stepId,
247
- step.inputs,
248
- outputs
249
- )
250
- }
251
- } catch (err) {
252
- console.error(`Automation error - ${step.stepId} - ${err}`)
253
- return err
254
- }
255
- if (loopStep) {
256
- iterationCount++
257
- if (index === iterations - 1) {
258
- loopStep = null
259
- this._context.steps.splice(loopStepNumber, 1)
260
- break
261
- }
262
- }
263
- }
264
-
265
- if (loopSteps && loopSteps.length) {
266
- let tempOutput = {
267
- success: true,
268
- items: loopSteps,
269
- iterations: iterationCount,
270
- }
271
- this.executionOutput.steps.splice(loopStepNumber + 1, 0, {
272
- id: step.id,
273
- stepId: step.stepId,
274
- outputs: tempOutput,
275
- inputs: step.inputs,
276
103
  })
277
-
278
- this._context.steps.splice(loopStepNumber, 0, tempOutput)
279
- loopSteps = null
104
+ this._context.steps.push(outputs)
105
+ // if filter causes us to stop execution don't break the loop, set a var
106
+ // so that we can finish iterating through the steps and record that it stopped
107
+ if (step.stepId === FILTER_STEP_ID && !outputs.success) {
108
+ stopped = true
109
+ this.updateExecutionOutput(step.id, step.stepId, step.inputs, {
110
+ ...outputs,
111
+ ...STOPPED_STATUS,
112
+ })
113
+ continue
114
+ }
115
+ this.updateExecutionOutput(step.id, step.stepId, step.inputs, outputs)
116
+ } catch (err) {
117
+ console.error(`Automation error - ${step.stepId} - ${err}`)
118
+ return err
280
119
  }
281
120
  }
282
-
283
121
  return this.executionOutput
284
122
  }
285
123
  }
@@ -1,12 +1,12 @@
1
- import workerFarm from "worker-farm"
2
- import * as env from "../environment"
1
+ const workerFarm = require("worker-farm")
2
+ const env = require("../environment")
3
3
 
4
- export const ThreadType = {
4
+ const ThreadType = {
5
5
  QUERY: "query",
6
6
  AUTOMATION: "automation",
7
7
  }
8
8
 
9
- function typeToFile(type: any) {
9
+ function typeToFile(type) {
10
10
  let filename = null
11
11
  switch (type) {
12
12
  case ThreadType.QUERY:
@@ -21,14 +21,8 @@ function typeToFile(type: any) {
21
21
  return require.resolve(filename)
22
22
  }
23
23
 
24
- export class Thread {
25
- type: any
26
- count: any
27
- disableThreading: any
28
- workers: any
29
- timeoutMs: any
30
-
31
- constructor(type: any, opts: any = { timeoutMs: null, count: 1 }) {
24
+ class Thread {
25
+ constructor(type, opts = { timeoutMs: null, count: 1 }) {
32
26
  this.type = type
33
27
  this.count = opts.count ? opts.count : 1
34
28
  this.disableThreading =
@@ -37,7 +31,7 @@ export class Thread {
37
31
  this.count === 0 ||
38
32
  env.isInThread()
39
33
  if (!this.disableThreading) {
40
- const workerOpts: any = {
34
+ const workerOpts = {
41
35
  autoStart: true,
42
36
  maxConcurrentWorkers: this.count,
43
37
  }
@@ -49,7 +43,8 @@ export class Thread {
49
43
  }
50
44
  }
51
45
 
52
- run(data: any) {
46
+ run(data) {
47
+ const timeoutMs = this.timeoutMs
53
48
  return new Promise((resolve, reject) => {
54
49
  let fncToCall
55
50
  // if in test then don't use threading
@@ -58,12 +53,10 @@ export class Thread {
58
53
  } else {
59
54
  fncToCall = this.workers
60
55
  }
61
- fncToCall(data, (err: any, response: any) => {
56
+ fncToCall(data, (err, response) => {
62
57
  if (err && err.type === "TimeoutError") {
63
58
  reject(
64
- new Error(
65
- `Query response time exceeded ${this.timeoutMs}ms timeout.`
66
- )
59
+ new Error(`Query response time exceeded ${timeoutMs}ms timeout.`)
67
60
  )
68
61
  } else if (err) {
69
62
  reject(err)
@@ -74,3 +67,6 @@ export class Thread {
74
67
  })
75
68
  }
76
69
  }
70
+
71
+ module.exports.Thread = Thread
72
+ module.exports.ThreadType = ThreadType
@@ -71,7 +71,6 @@ exports.hasExtraData = response => {
71
71
  return (
72
72
  typeof response === "object" &&
73
73
  !Array.isArray(response) &&
74
- response &&
75
74
  response.data != null &&
76
75
  response.info != null
77
76
  )
@@ -66,8 +66,7 @@ class InMemoryQueue {
66
66
  * @param {object} msg A message to be transported over the queue, this should be
67
67
  * a JSON message as this is required by Bull.
68
68
  */
69
- // eslint-disable-next-line no-unused-vars
70
- add(msg, repeat) {
69
+ add(msg) {
71
70
  if (typeof msg !== "object") {
72
71
  throw "Queue only supports carrying JSON."
73
72
  }
@@ -91,11 +90,6 @@ class InMemoryQueue {
91
90
  return []
92
91
  }
93
92
 
94
- // eslint-disable-next-line no-unused-vars
95
- removeJobs(pattern) {
96
- // no-op
97
- }
98
-
99
93
  /**
100
94
  * Implemented for tests
101
95
  */
@@ -2,7 +2,7 @@ const linkRows = require("../../db/linkedRows")
2
2
  const { cloneDeep } = require("lodash/fp")
3
3
  const { FieldTypes, AutoFieldSubTypes } = require("../../constants")
4
4
  const { attachmentsRelativeURL } = require("../index")
5
- const { processFormulas } = require("./utils")
5
+ const { processFormulas, fixAutoColumnSubType } = require("./utils")
6
6
  const { deleteFiles } = require("../../utilities/fileSystem/utilities")
7
7
  const { ObjectStoreBuckets } = require("../../constants")
8
8
  const {
@@ -11,6 +11,7 @@ const {
11
11
  dbExists,
12
12
  } = require("@budibase/backend-core/db")
13
13
  const { getAppId } = require("@budibase/backend-core/context")
14
+ const { InternalTables } = require("../../db/utils")
14
15
 
15
16
  const BASE_AUTO_ID = 1
16
17
 
@@ -137,21 +138,23 @@ function processAutoColumn(
137
138
  opts = { reprocessing: false, noAutoRelationships: false }
138
139
  ) {
139
140
  let noUser = !user || !user.userId
141
+ let isUserTable = table._id === InternalTables.USER_METADATA
140
142
  let now = new Date().toISOString()
141
143
  // if a row doesn't have a revision then it doesn't exist yet
142
144
  const creating = !row._rev
145
+ // check its not user table, or whether any of the processing options have been disabled
146
+ const shouldUpdateUserFields =
147
+ !isUserTable && !opts.reprocessing && !opts.noAutoRelationships && !noUser
143
148
  for (let [key, schema] of Object.entries(table.schema)) {
144
149
  if (!schema.autocolumn) {
145
150
  continue
146
151
  }
152
+ if (!schema.subtype) {
153
+ schema = fixAutoColumnSubType(schema)
154
+ }
147
155
  switch (schema.subtype) {
148
156
  case AutoFieldSubTypes.CREATED_BY:
149
- if (
150
- creating &&
151
- !opts.reprocessing &&
152
- !opts.noAutoRelationships &&
153
- !noUser
154
- ) {
157
+ if (creating && shouldUpdateUserFields) {
155
158
  row[key] = [user.userId]
156
159
  }
157
160
  break
@@ -161,7 +164,7 @@ function processAutoColumn(
161
164
  }
162
165
  break
163
166
  case AutoFieldSubTypes.UPDATED_BY:
164
- if (!opts.reprocessing && !opts.noAutoRelationships && !noUser) {
167
+ if (shouldUpdateUserFields) {
165
168
  row[key] = [user.userId]
166
169
  }
167
170
  break
@@ -179,7 +182,7 @@ function processAutoColumn(
179
182
  return { table, row }
180
183
  }
181
184
  exports.processAutoColumn = processAutoColumn
182
-
185
+ exports.fixAutoColumnSubType = fixAutoColumnSubType
183
186
  exports.processFormulas = processFormulas
184
187
 
185
188
  /**
@@ -1,6 +1,34 @@
1
- const { FieldTypes, FormulaTypes } = require("../../constants")
1
+ const {
2
+ FieldTypes,
3
+ FormulaTypes,
4
+ AutoFieldDefaultNames,
5
+ AutoFieldSubTypes,
6
+ } = require("../../constants")
2
7
  const { processStringSync } = require("@budibase/string-templates")
3
8
 
9
+ /**
10
+ * If the subtype has been lost for any reason this works out what
11
+ * subtype the auto column should be.
12
+ */
13
+ exports.fixAutoColumnSubType = column => {
14
+ if (!column.autocolumn || !column.name || column.subtype) {
15
+ return column
16
+ }
17
+ // the columns which get auto generated
18
+ if (column.name.endsWith(AutoFieldDefaultNames.CREATED_BY)) {
19
+ column.subtype = AutoFieldSubTypes.CREATED_BY
20
+ } else if (column.name.endsWith(AutoFieldDefaultNames.UPDATED_BY)) {
21
+ column.subtype = AutoFieldSubTypes.UPDATED_BY
22
+ } else if (column.name.endsWith(AutoFieldDefaultNames.CREATED_AT)) {
23
+ column.subtype = AutoFieldSubTypes.CREATED_AT
24
+ } else if (column.name.endsWith(AutoFieldDefaultNames.UPDATED_AT)) {
25
+ column.subtype = AutoFieldSubTypes.UPDATED_AT
26
+ } else if (column.name.endsWith(AutoFieldDefaultNames.AUTO_ID)) {
27
+ column.subtype = AutoFieldSubTypes.AUTO_ID
28
+ }
29
+ return column
30
+ }
31
+
4
32
  /**
5
33
  * Looks through the rows provided and finds formulas - which it then processes.
6
34
  */