@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
@@ -3,6 +3,7 @@ import queryEndpoints from "./queries"
3
3
  import tableEndpoints from "./tables"
4
4
  import rowEndpoints from "./rows"
5
5
  import userEndpoints from "./users"
6
+ import usage from "../../../middleware/usageQuota"
6
7
  import authorized from "../../../middleware/authorized"
7
8
  import publicApi from "../../../middleware/publicApi"
8
9
  import { paramResource, paramSubResource } from "../../../middleware/resourceId"
@@ -113,6 +114,8 @@ function applyRoutes(
113
114
  // add the authorization middleware, using the correct perm type
114
115
  addMiddleware(endpoints.read, authorized(permType, PermissionLevels.READ))
115
116
  addMiddleware(endpoints.write, authorized(permType, PermissionLevels.WRITE))
117
+ // add the usage quota middleware
118
+ addMiddleware(endpoints.write, usage)
116
119
  // add the output mapper middleware
117
120
  addMiddleware(endpoints.read, mapperMiddleware, { output: true })
118
121
  addMiddleware(endpoints.write, mapperMiddleware, { output: true })
@@ -127,4 +130,4 @@ applyRoutes(queryEndpoints, PermissionTypes.QUERY, "queryId")
127
130
  // needs to be applied last for routing purposes, don't override other endpoints
128
131
  applyRoutes(rowEndpoints, PermissionTypes.TABLE, "tableId", "rowId")
129
132
 
130
- export default publicRouter
133
+ module.exports = publicRouter
@@ -1,14 +1,18 @@
1
- import Router from "@koa/router"
2
- import * as rowController from "../controllers/row"
3
- import authorized from "../../middleware/authorized"
4
- import { paramResource, paramSubResource } from "../../middleware/resourceId"
1
+ const Router = require("@koa/router")
2
+ const rowController = require("../controllers/row")
3
+ const authorized = require("../../middleware/authorized")
4
+ const usage = require("../../middleware/usageQuota")
5
+ const {
6
+ paramResource,
7
+ paramSubResource,
8
+ } = require("../../middleware/resourceId")
5
9
  const {
6
10
  PermissionLevels,
7
11
  PermissionTypes,
8
12
  } = require("@budibase/backend-core/permissions")
9
13
  const { internalSearchValidator } = require("./utils/validators")
10
14
 
11
- const router = new Router()
15
+ const router = Router()
12
16
 
13
17
  router
14
18
  /**
@@ -176,6 +180,7 @@ router
176
180
  "/api/:tableId/rows",
177
181
  paramResource("tableId"),
178
182
  authorized(PermissionTypes.TABLE, PermissionLevels.WRITE),
183
+ usage,
179
184
  rowController.save
180
185
  )
181
186
  /**
@@ -190,6 +195,7 @@ router
190
195
  "/api/:tableId/rows",
191
196
  paramResource("tableId"),
192
197
  authorized(PermissionTypes.TABLE, PermissionLevels.WRITE),
198
+ usage,
193
199
  rowController.patch
194
200
  )
195
201
  /**
@@ -242,6 +248,7 @@ router
242
248
  "/api/:tableId/rows",
243
249
  paramResource("tableId"),
244
250
  authorized(PermissionTypes.TABLE, PermissionLevels.WRITE),
251
+ usage,
245
252
  rowController.destroy
246
253
  )
247
254
 
@@ -262,7 +269,8 @@ router
262
269
  "/api/:tableId/rows/exportRows",
263
270
  paramResource("tableId"),
264
271
  authorized(PermissionTypes.TABLE, PermissionLevels.WRITE),
265
- rowController.exportRows
272
+ usage,
273
+ rowController.export
266
274
  )
267
275
 
268
- export default router
276
+ module.exports = router
@@ -1,19 +1,19 @@
1
- import Router from "@koa/router"
2
- import * as controller from "../controllers/static"
3
- import { budibaseTempDir } from "../../utilities/budibaseDir"
4
- import authorized from "../../middleware/authorized"
5
- import {
1
+ const Router = require("@koa/router")
2
+ const controller = require("../controllers/static")
3
+ const { budibaseTempDir } = require("../../utilities/budibaseDir")
4
+ const authorized = require("../../middleware/authorized")
5
+ const {
6
6
  BUILDER,
7
7
  PermissionTypes,
8
8
  PermissionLevels,
9
- } from "@budibase/backend-core/permissions"
10
- import * as env from "../../environment"
11
- import { paramResource } from "../../middleware/resourceId"
9
+ } = require("@budibase/backend-core/permissions")
10
+ const env = require("../../environment")
11
+ const { paramResource } = require("../../middleware/resourceId")
12
12
 
13
- const router = new Router()
13
+ const router = Router()
14
14
 
15
15
  /* istanbul ignore next */
16
- router.param("file", async (file: any, ctx: any, next: any) => {
16
+ router.param("file", async (file, ctx, next) => {
17
17
  ctx.file = file && file.includes(".") ? file : "index.html"
18
18
  if (!ctx.file.startsWith("budibase-client")) {
19
19
  return next()
@@ -52,4 +52,4 @@ router
52
52
  controller.getSignedUploadURL
53
53
  )
54
54
 
55
- export default router
55
+ module.exports = router
@@ -43,55 +43,53 @@ describe("run misc tests", () => {
43
43
 
44
44
  describe("test table utilities", () => {
45
45
  it("should be able to import a CSV", async () => {
46
- return config.doInContext(null, async () => {
47
- const table = await config.createTable({
48
- name: "table",
49
- type: "table",
50
- key: "name",
51
- schema: {
52
- a: {
46
+ const table = await config.createTable({
47
+ name: "table",
48
+ type: "table",
49
+ key: "name",
50
+ schema: {
51
+ a: {
52
+ type: "string",
53
+ constraints: {
53
54
  type: "string",
54
- constraints: {
55
- type: "string",
56
- },
57
55
  },
58
- b: {
56
+ },
57
+ b: {
58
+ type: "string",
59
+ constraints: {
59
60
  type: "string",
60
- constraints: {
61
- type: "string",
62
- },
63
61
  },
64
- c: {
62
+ },
63
+ c: {
64
+ type: "string",
65
+ constraints: {
65
66
  type: "string",
66
- constraints: {
67
- type: "string",
68
- },
69
67
  },
70
- d: {
68
+ },
69
+ d: {
70
+ type: "string",
71
+ constraints: {
71
72
  type: "string",
72
- constraints: {
73
- type: "string",
74
- },
75
73
  },
76
74
  },
77
- })
78
- const dataImport = {
79
- csvString: "a,b,c,d\n1,2,3,4",
80
- schema: {},
81
- }
82
- for (let col of ["a", "b", "c", "d"]) {
83
- dataImport.schema[col] = { type: "string" }
84
- }
85
- await tableUtils.handleDataImport(
86
- { userId: "test" },
87
- table,
88
- dataImport
89
- )
90
- const rows = await config.getRows()
91
- expect(rows[0].a).toEqual("1")
92
- expect(rows[0].b).toEqual("2")
93
- expect(rows[0].c).toEqual("3")
75
+ },
94
76
  })
77
+ const dataImport = {
78
+ csvString: "a,b,c,d\n1,2,3,4",
79
+ schema: {},
80
+ }
81
+ for (let col of ["a", "b", "c", "d"]) {
82
+ dataImport.schema[col] = { type: "string" }
83
+ }
84
+ await tableUtils.handleDataImport(
85
+ { userId: "test" },
86
+ table,
87
+ dataImport
88
+ )
89
+ const rows = await config.getRows()
90
+ expect(rows[0].a).toEqual("1")
91
+ expect(rows[0].b).toEqual("2")
92
+ expect(rows[0].c).toEqual("3")
95
93
  })
96
94
  })
97
95
  })
@@ -2,7 +2,6 @@ const setup = require("./utilities")
2
2
  const { basicScreen } = setup.structures
3
3
  const { checkBuilderEndpoint, runInProd } = require("./utilities/TestFunctions")
4
4
  const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles")
5
- const { doInAppContext } = require("@budibase/backend-core/context")
6
5
 
7
6
  const route = "/test"
8
7
 
@@ -1,54 +1,44 @@
1
- import * as rowController from "../../../controllers/row"
2
- import * as appController from "../../../controllers/application"
3
- import { AppStatus } from "../../../../db/utils"
4
- import { BUILTIN_ROLE_IDS } from "@budibase/backend-core/roles"
5
- import { doInTenant } from "@budibase/backend-core/tenancy"
6
- import { TENANT_ID } from "../../../../tests/utilities/structures"
7
- import { getAppDB, doInAppContext } from "@budibase/backend-core/context"
8
- import * as env from "../../../../environment"
9
-
10
- class Request {
11
- appId: any
12
- params: any
13
- request: any
14
- body: any
15
-
16
- constructor(appId: any, params: any) {
17
- this.appId = appId
18
- this.params = params
19
- this.request = {}
20
- }
1
+ const rowController = require("../../../controllers/row")
2
+ const appController = require("../../../controllers/application")
3
+ const { AppStatus } = require("../../../../db/utils")
4
+ const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles")
5
+ const { TENANT_ID } = require("../../../../tests/utilities/structures")
6
+ const { doInAppContext } = require("@budibase/backend-core/context")
7
+ const env = require("../../../../environment")
8
+
9
+ function Request(appId, params) {
10
+ this.appId = appId
11
+ this.params = params
12
+ this.request = {}
21
13
  }
22
14
 
23
- function runRequest(appId: any, controlFunc: any, request?: any) {
15
+ function runRequest(appId, controlFunc, request) {
24
16
  return doInAppContext(appId, async () => {
25
17
  return controlFunc(request)
26
18
  })
27
19
  }
28
20
 
29
- export const getAllTableRows = async (config: any) => {
21
+ exports.getAllTableRows = async config => {
30
22
  const req = new Request(config.appId, { tableId: config.table._id })
31
23
  await runRequest(config.appId, rowController.fetch, req)
32
24
  return req.body
33
25
  }
34
26
 
35
- export const clearAllApps = async (tenantId = TENANT_ID) => {
36
- await doInTenant(tenantId, async () => {
37
- const req: any = { query: { status: AppStatus.DEV }, user: { tenantId } }
38
- await appController.fetch(req)
39
- const apps = req.body
40
- if (!apps || apps.length <= 0) {
41
- return
42
- }
43
- for (let app of apps) {
44
- const { appId } = app
45
- const req = new Request(null, { appId })
46
- await runRequest(appId, appController.destroy, req)
47
- }
48
- })
27
+ exports.clearAllApps = async (tenantId = TENANT_ID) => {
28
+ const req = { query: { status: AppStatus.DEV }, user: { tenantId } }
29
+ await appController.fetch(req)
30
+ const apps = req.body
31
+ if (!apps || apps.length <= 0) {
32
+ return
33
+ }
34
+ for (let app of apps) {
35
+ const { appId } = app
36
+ const req = new Request(null, { appId })
37
+ await runRequest(appId, appController.delete, req)
38
+ }
49
39
  }
50
40
 
51
- export const clearAllAutomations = async (config: any) => {
41
+ exports.clearAllAutomations = async config => {
52
42
  const automations = await config.getAllAutomations()
53
43
  for (let auto of automations) {
54
44
  await doInAppContext(config.appId, async () => {
@@ -57,12 +47,7 @@ export const clearAllAutomations = async (config: any) => {
57
47
  }
58
48
  }
59
49
 
60
- export const createRequest = (
61
- request: any,
62
- method: any,
63
- url: any,
64
- body: any
65
- ) => {
50
+ exports.createRequest = (request, method, url, body) => {
66
51
  let req
67
52
 
68
53
  if (method === "POST") req = request.post(url).send(body)
@@ -74,12 +59,7 @@ export const createRequest = (
74
59
  return req
75
60
  }
76
61
 
77
- export const checkBuilderEndpoint = async ({
78
- config,
79
- method,
80
- url,
81
- body,
82
- }: any) => {
62
+ exports.checkBuilderEndpoint = async ({ config, method, url, body }) => {
83
63
  const headers = await config.login({
84
64
  userId: "us_fail",
85
65
  builder: false,
@@ -91,14 +71,14 @@ export const checkBuilderEndpoint = async ({
91
71
  .expect(403)
92
72
  }
93
73
 
94
- export const checkPermissionsEndpoint = async ({
74
+ exports.checkPermissionsEndpoint = async ({
95
75
  config,
96
76
  method,
97
77
  url,
98
78
  body,
99
79
  passRole,
100
80
  failRole,
101
- }: any) => {
81
+ }) => {
102
82
  const passHeader = await config.login({
103
83
  roleId: passRole,
104
84
  prodApp: true,
@@ -126,11 +106,7 @@ export const checkPermissionsEndpoint = async ({
126
106
  .expect(403)
127
107
  }
128
108
 
129
- export const getDB = () => {
130
- return getAppDB()
131
- }
132
-
133
- export const testAutomation = async (config: any, automation: any) => {
109
+ exports.testAutomation = async (config, automation) => {
134
110
  return runRequest(automation.appId, async () => {
135
111
  return await config.request
136
112
  .post(`/api/automations/${automation._id}/test`)
@@ -146,7 +122,7 @@ export const testAutomation = async (config: any, automation: any) => {
146
122
  })
147
123
  }
148
124
 
149
- export const runInProd = async (func: any) => {
125
+ exports.runInProd = async func => {
150
126
  const nodeEnv = env.NODE_ENV
151
127
  const workerId = env.JEST_WORKER_ID
152
128
  env._set("NODE_ENV", "PRODUCTION")
package/src/app.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  // need to load environment first
2
2
  import { ExtendableContext } from "koa"
3
+
3
4
  import * as env from "./environment"
4
5
  import db from "./db"
5
6
  db.init()
@@ -14,7 +15,7 @@ const automations = require("./automations/index")
14
15
  const Sentry = require("@sentry/node")
15
16
  const fileSystem = require("./utilities/fileSystem")
16
17
  const bullboard = require("./automations/bullboard")
17
- import redis from "./utilities/redis"
18
+ const redis = require("./utilities/redis")
18
19
  import * as migrations from "./migrations"
19
20
 
20
21
  const app = new Koa()
@@ -13,7 +13,6 @@ const integromat = require("./steps/integromat")
13
13
  let filter = require("./steps/filter")
14
14
  let delay = require("./steps/delay")
15
15
  let queryRow = require("./steps/queryRows")
16
- let loop = require("./steps/loop")
17
16
  const env = require("../environment")
18
17
 
19
18
  const ACTION_IMPLS = {
@@ -28,7 +27,6 @@ const ACTION_IMPLS = {
28
27
  DELAY: delay.run,
29
28
  FILTER: filter.run,
30
29
  QUERY_ROWS: queryRow.run,
31
- LOOP: loop.run,
32
30
  // these used to be lowercase step IDs, maintain for backwards compat
33
31
  discord: discord.run,
34
32
  slack: slack.run,
@@ -47,7 +45,6 @@ const ACTION_DEFINITIONS = {
47
45
  DELAY: delay.definition,
48
46
  FILTER: filter.definition,
49
47
  QUERY_ROWS: queryRow.definition,
50
- LOOP: loop.definition,
51
48
  // these used to be lowercase step IDs, maintain for backwards compat
52
49
  discord: discord.definition,
53
50
  slack: slack.definition,
@@ -1,5 +1,4 @@
1
1
  const { getTable } = require("../api/controllers/table/utils")
2
- const { findHBSBlocks } = require("@budibase/string-templates")
3
2
 
4
3
  /**
5
4
  * When values are input to the system generally they will be of type string as this is required for template strings.
@@ -75,14 +74,3 @@ exports.getError = err => {
75
74
  }
76
75
  return typeof err !== "string" ? err.toString() : err
77
76
  }
78
-
79
- exports.substituteLoopStep = (hbsString, substitute) => {
80
- let blocks = findHBSBlocks(hbsString)
81
- for (let block of blocks) {
82
- let oldBlock = block
83
- block = block.replace(/loop/, substitute)
84
- hbsString = hbsString.replace(new RegExp(oldBlock, "g"), block)
85
- }
86
-
87
- return hbsString
88
- }
@@ -1,8 +1,9 @@
1
- import { save } from "../../api/controllers/row"
2
- import { cleanUpRow, getError } from "../automationUtils"
3
- import { buildCtx } from "./utils"
1
+ const rowController = require("../../api/controllers/row")
2
+ const automationUtils = require("../automationUtils")
3
+ const usage = require("../../utilities/usageQuota")
4
+ const { buildCtx } = require("./utils")
4
5
 
5
- export const definition = {
6
+ exports.definition = {
6
7
  name: "Create Row",
7
8
  tagline: "Create a {{inputs.enriched.table.name}} row",
8
9
  icon: "TableRowAddBottom",
@@ -58,7 +59,7 @@ export const definition = {
58
59
  },
59
60
  }
60
61
 
61
- export async function run({ inputs, appId, emitter }: any) {
62
+ exports.run = async function ({ inputs, appId, emitter }) {
62
63
  if (inputs.row == null || inputs.row.tableId == null) {
63
64
  return {
64
65
  success: false,
@@ -68,7 +69,7 @@ export async function run({ inputs, appId, emitter }: any) {
68
69
  }
69
70
  }
70
71
  // have to clean up the row, remove the table from it
71
- const ctx: any = buildCtx(appId, emitter, {
72
+ const ctx = buildCtx(appId, emitter, {
72
73
  body: inputs.row,
73
74
  params: {
74
75
  tableId: inputs.row.tableId,
@@ -76,8 +77,13 @@ export async function run({ inputs, appId, emitter }: any) {
76
77
  })
77
78
 
78
79
  try {
79
- inputs.row = await cleanUpRow(inputs.row.tableId, inputs.row)
80
- await save(ctx)
80
+ inputs.row = await automationUtils.cleanUpRow(
81
+ inputs.row.tableId,
82
+ inputs.row
83
+ )
84
+ await usage.update(usage.Properties.ROW, 1, { dryRun: true })
85
+ await rowController.save(ctx)
86
+ await usage.update(usage.Properties.ROW, 1)
81
87
  return {
82
88
  row: inputs.row,
83
89
  response: ctx.body,
@@ -88,7 +94,7 @@ export async function run({ inputs, appId, emitter }: any) {
88
94
  } catch (err) {
89
95
  return {
90
96
  success: false,
91
- response: getError(err),
97
+ response: automationUtils.getError(err),
92
98
  }
93
99
  }
94
100
  }
@@ -1,8 +1,9 @@
1
- import { destroy } from "../../api/controllers/row"
2
- import { buildCtx } from "./utils"
3
- import { getError } from "../automationUtils"
1
+ const rowController = require("../../api/controllers/row")
2
+ const usage = require("../../utilities/usageQuota")
3
+ const { buildCtx } = require("./utils")
4
+ const automationUtils = require("../automationUtils")
4
5
 
5
- export const definition = {
6
+ exports.definition = {
6
7
  description: "Delete a row from your database",
7
8
  icon: "TableRowRemoveCenter",
8
9
  name: "Delete Row",
@@ -23,8 +24,12 @@ export const definition = {
23
24
  type: "string",
24
25
  title: "Row ID",
25
26
  },
27
+ revision: {
28
+ type: "string",
29
+ title: "Row Revision",
30
+ },
26
31
  },
27
- required: ["tableId", "id"],
32
+ required: ["tableId", "id", "revision"],
28
33
  },
29
34
  outputs: {
30
35
  properties: {
@@ -47,8 +52,8 @@ export const definition = {
47
52
  },
48
53
  }
49
54
 
50
- export async function run({ inputs, appId, emitter }: any) {
51
- if (inputs.id == null) {
55
+ exports.run = async function ({ inputs, appId, emitter }) {
56
+ if (inputs.id == null || inputs.revision == null) {
52
57
  return {
53
58
  success: false,
54
59
  response: {
@@ -57,7 +62,7 @@ export async function run({ inputs, appId, emitter }: any) {
57
62
  }
58
63
  }
59
64
 
60
- let ctx: any = buildCtx(appId, emitter, {
65
+ let ctx = buildCtx(appId, emitter, {
61
66
  body: {
62
67
  _id: inputs.id,
63
68
  _rev: inputs.revision,
@@ -68,7 +73,8 @@ export async function run({ inputs, appId, emitter }: any) {
68
73
  })
69
74
 
70
75
  try {
71
- await destroy(ctx)
76
+ await usage.update(usage.Properties.ROW, -1)
77
+ await rowController.destroy(ctx)
72
78
  return {
73
79
  response: ctx.body,
74
80
  row: ctx.row,
@@ -77,7 +83,7 @@ export async function run({ inputs, appId, emitter }: any) {
77
83
  } catch (err) {
78
84
  return {
79
85
  success: false,
80
- response: getError(err),
86
+ response: automationUtils.getError(err),
81
87
  }
82
88
  }
83
89
  }
@@ -1,3 +1,4 @@
1
+ jest.mock("../../utilities/usageQuota")
1
2
  jest.mock("../../threads/automation")
2
3
  jest.mock("../../utilities/redis", () => ({
3
4
  init: jest.fn(),
@@ -1,8 +1,10 @@
1
- import * as setup from "./utilities"
1
+ jest.mock("../../utilities/usageQuota")
2
+
3
+ const usageQuota = require("../../utilities/usageQuota")
4
+ const setup = require("./utilities")
2
5
 
3
6
  describe("test the create row action", () => {
4
- let table: any
5
- let row: any
7
+ let table, row
6
8
  let config = setup.getConfig()
7
9
 
8
10
  beforeEach(async () => {
@@ -34,11 +36,20 @@ describe("test the create row action", () => {
34
36
  row: {
35
37
  tableId: "invalid",
36
38
  invalid: "invalid",
37
- },
39
+ }
38
40
  })
39
41
  expect(res.success).toEqual(false)
40
42
  })
41
43
 
44
+ it("check usage quota attempts", async () => {
45
+ await setup.runInProd(async () => {
46
+ await setup.runStep(setup.actions.CREATE_ROW.stepId, {
47
+ row
48
+ })
49
+ expect(usageQuota.update).toHaveBeenCalledWith("rows", 1)
50
+ })
51
+ })
52
+
42
53
  it("should check invalid inputs return an error", async () => {
43
54
  const res = await setup.runStep(setup.actions.CREATE_ROW.stepId, {})
44
55
  expect(res.success).toEqual(false)
@@ -1,9 +1,10 @@
1
+ jest.mock("../../utilities/usageQuota")
2
+
3
+ const usageQuota = require("../../utilities/usageQuota")
1
4
  const setup = require("./utilities")
2
5
 
3
6
  describe("test the delete row action", () => {
4
- let table: any
5
- let row: any
6
- let inputs: any
7
+ let table, row, inputs
7
8
  let config = setup.getConfig()
8
9
 
9
10
  beforeEach(async () => {
@@ -36,6 +37,7 @@ describe("test the delete row action", () => {
36
37
  it("check usage quota attempts", async () => {
37
38
  await setup.runInProd(async () => {
38
39
  await setup.runStep(setup.actions.DELETE_ROW.stepId, inputs)
40
+ expect(usageQuota.update).toHaveBeenCalledWith("rows", -1)
39
41
  })
40
42
  })
41
43
 
@@ -1,6 +1,4 @@
1
1
  const TestConfig = require("../../../tests/utilities/TestConfiguration")
2
- const { TENANT_ID } = require("../../../tests/utilities/structures")
3
- const { doInTenant } = require("@budibase/backend-core/tenancy")
4
2
  const actions = require("../../actions")
5
3
  const emitter = require("../../../events/index")
6
4
  const env = require("../../../environment")
@@ -20,6 +18,7 @@ exports.afterAll = () => {
20
18
 
21
19
  exports.runInProd = async fn => {
22
20
  env._set("NODE_ENV", "production")
21
+ env._set("USE_QUOTAS", 1)
23
22
  let error
24
23
  try {
25
24
  await fn()
@@ -27,22 +26,21 @@ exports.runInProd = async fn => {
27
26
  error = err
28
27
  }
29
28
  env._set("NODE_ENV", "jest")
29
+ env._set("USE_QUOTAS", null)
30
30
  if (error) {
31
31
  throw error
32
32
  }
33
33
  }
34
34
 
35
35
  exports.runStep = async function runStep(stepId, inputs) {
36
- return doInTenant(TENANT_ID, async () => {
37
- let step = await actions.getAction(stepId)
38
- expect(step).toBeDefined()
39
- return step({
40
- inputs,
41
- appId: config ? config.getAppId() : null,
42
- // don't really need an API key, mocked out usage quota, not being tested here
43
- apiKey: exports.apiKey,
44
- emitter,
45
- })
36
+ let step = await actions.getAction(stepId)
37
+ expect(step).toBeDefined()
38
+ return step({
39
+ inputs,
40
+ appId: config ? config.getAppId() : null,
41
+ // don't really need an API key, mocked out usage quota, not being tested here
42
+ apiKey: exports.apiKey,
43
+ emitter,
46
44
  })
47
45
  }
48
46