@budibase/server 1.0.49 → 1.0.50-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (381) hide show
  1. package/__mocks__/arangojs.ts +1 -1
  2. package/__mocks__/aws-sdk.ts +4 -4
  3. package/__mocks__/mongodb.ts +4 -5
  4. package/__mocks__/mssql.ts +3 -3
  5. package/__mocks__/node-fetch.ts +2 -1
  6. package/__mocks__/pg.ts +3 -5
  7. package/builder/assets/index.c0cc369d.css +6 -0
  8. package/builder/assets/{index.2c37968e.js → index.ff2bad21.js} +252 -249
  9. package/builder/assets/{vendor.f9faf6ab.js → vendor.5ad9695a.js} +202 -106
  10. package/builder/index.html +3 -3
  11. package/coverage/clover.xml +3105 -2814
  12. package/coverage/coverage-final.json +106 -101
  13. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/application.js.html +257 -152
  16. package/coverage/lcov-report/api/controllers/auth.js.html +22 -13
  17. package/coverage/lcov-report/api/controllers/automation.js.html +39 -69
  18. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/cloud.js.html +8 -11
  20. package/coverage/lcov-report/api/controllers/component.js.html +13 -16
  21. package/coverage/lcov-report/api/controllers/datasource.js.html +81 -51
  22. package/coverage/lcov-report/api/controllers/dev.js.html +6 -6
  23. package/coverage/lcov-report/api/controllers/index.html +78 -78
  24. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/layout.js.html +9 -9
  26. package/coverage/lcov-report/api/controllers/metadata.js.html +6 -21
  27. package/coverage/lcov-report/api/controllers/migrations.js.html +119 -0
  28. package/coverage/lcov-report/api/controllers/permission.js.html +19 -19
  29. package/coverage/lcov-report/api/controllers/query/index.html +10 -10
  30. package/coverage/lcov-report/api/controllers/query/index.js.html +38 -35
  31. package/coverage/lcov-report/api/controllers/query/validation.js.html +6 -6
  32. package/coverage/lcov-report/api/controllers/role.js.html +16 -16
  33. package/coverage/lcov-report/api/controllers/routing.js.html +7 -10
  34. package/coverage/lcov-report/api/controllers/row/external.js.html +48 -141
  35. package/coverage/lcov-report/api/controllers/row/index.html +55 -40
  36. package/coverage/lcov-report/api/controllers/row/index.js.html +26 -26
  37. package/coverage/lcov-report/api/controllers/row/internal.js.html +118 -226
  38. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +52 -34
  39. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +548 -0
  40. package/coverage/lcov-report/api/controllers/row/utils.js.html +47 -62
  41. package/coverage/lcov-report/api/controllers/screen.js.html +15 -21
  42. package/coverage/lcov-report/api/controllers/script.js.html +4 -4
  43. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +599 -0
  44. package/coverage/lcov-report/api/controllers/table/external.js.html +25 -34
  45. package/coverage/lcov-report/api/controllers/table/index.html +58 -43
  46. package/coverage/lcov-report/api/controllers/table/index.js.html +58 -82
  47. package/coverage/lcov-report/api/controllers/table/internal.js.html +81 -66
  48. package/coverage/lcov-report/api/controllers/table/utils.js.html +218 -110
  49. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  50. package/coverage/lcov-report/api/controllers/user.js.html +79 -76
  51. package/coverage/lcov-report/api/controllers/view/exporters.js.html +4 -4
  52. package/coverage/lcov-report/api/controllers/view/index.html +16 -16
  53. package/coverage/lcov-report/api/controllers/view/index.js.html +27 -33
  54. package/coverage/lcov-report/api/controllers/view/utils.js.html +35 -20
  55. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +7 -7
  56. package/coverage/lcov-report/api/controllers/webhook.js.html +34 -28
  57. package/coverage/lcov-report/api/index.html +1 -1
  58. package/coverage/lcov-report/api/index.js.html +8 -8
  59. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/index.html +18 -18
  71. package/coverage/lcov-report/api/routes/index.js.html +3 -3
  72. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/{hosting.js.html → migrations.js.html} +17 -14
  76. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  79. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  80. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  81. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  82. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  83. package/coverage/lcov-report/api/routes/static.js.html +17 -2
  84. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  85. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  86. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  87. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  88. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  89. package/coverage/lcov-report/automations/actions.js.html +24 -24
  90. package/coverage/lcov-report/automations/automationUtils.js.html +7 -10
  91. package/coverage/lcov-report/automations/bullboard.js.html +16 -16
  92. package/coverage/lcov-report/automations/index.html +18 -18
  93. package/coverage/lcov-report/automations/index.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/bash.js.html +6 -6
  95. package/coverage/lcov-report/automations/steps/createRow.js.html +13 -22
  96. package/coverage/lcov-report/automations/steps/delay.js.html +4 -4
  97. package/coverage/lcov-report/automations/steps/deleteRow.js.html +11 -20
  98. package/coverage/lcov-report/automations/steps/discord.js.html +7 -7
  99. package/coverage/lcov-report/automations/steps/executeQuery.js.html +6 -6
  100. package/coverage/lcov-report/automations/steps/executeScript.js.html +6 -6
  101. package/coverage/lcov-report/automations/steps/filter.js.html +7 -7
  102. package/coverage/lcov-report/automations/steps/index.html +13 -13
  103. package/coverage/lcov-report/automations/steps/integromat.js.html +5 -5
  104. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +8 -8
  105. package/coverage/lcov-report/automations/steps/queryRows.js.html +10 -10
  106. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +5 -5
  107. package/coverage/lcov-report/automations/steps/serverLog.js.html +3 -3
  108. package/coverage/lcov-report/automations/steps/slack.js.html +5 -5
  109. package/coverage/lcov-report/automations/steps/updateRow.js.html +7 -7
  110. package/coverage/lcov-report/automations/steps/utils.js.html +3 -3
  111. package/coverage/lcov-report/automations/steps/zapier.js.html +5 -5
  112. package/coverage/lcov-report/automations/triggerInfo/app.js.html +2 -2
  113. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +2 -2
  114. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  115. package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -8
  116. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +2 -2
  117. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +2 -2
  118. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +2 -2
  119. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +2 -2
  120. package/coverage/lcov-report/automations/triggers.js.html +61 -55
  121. package/coverage/lcov-report/automations/utils.js.html +54 -42
  122. package/coverage/lcov-report/constants/index.html +5 -5
  123. package/coverage/lcov-report/constants/index.js.html +53 -26
  124. package/coverage/lcov-report/constants/layouts.js.html +5 -5
  125. package/coverage/lcov-report/constants/screens.js.html +4 -4
  126. package/coverage/lcov-report/db/client.js.html +18 -18
  127. package/coverage/lcov-report/db/inMemoryView.js.html +7 -7
  128. package/coverage/lcov-report/db/index.html +15 -15
  129. package/coverage/lcov-report/db/index.js.html +3 -3
  130. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +25 -37
  131. package/coverage/lcov-report/db/linkedRows/index.html +27 -27
  132. package/coverage/lcov-report/db/linkedRows/index.js.html +51 -96
  133. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +42 -42
  134. package/coverage/lcov-report/db/newid.js.html +4 -4
  135. package/coverage/lcov-report/db/utils.js.html +87 -87
  136. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  137. package/coverage/lcov-report/events/index.html +1 -1
  138. package/coverage/lcov-report/events/index.js.html +5 -5
  139. package/coverage/lcov-report/events/utils.js.html +3 -3
  140. package/coverage/lcov-report/index.html +135 -120
  141. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  142. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  143. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  144. package/coverage/lcov-report/middleware/authorized.js.html +173 -65
  145. package/coverage/lcov-report/middleware/builder.js.html +10 -10
  146. package/coverage/lcov-report/middleware/currentapp.js.html +95 -83
  147. package/coverage/lcov-report/middleware/index.html +38 -38
  148. package/coverage/lcov-report/middleware/joi-validator.js.html +3 -3
  149. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  150. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  151. package/coverage/lcov-report/middleware/usageQuota.js.html +281 -53
  152. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  153. package/coverage/lcov-report/threads/automation.js.html +30 -24
  154. package/coverage/lcov-report/threads/index.html +26 -26
  155. package/coverage/lcov-report/threads/index.js.html +10 -10
  156. package/coverage/lcov-report/threads/query.js.html +39 -24
  157. package/coverage/lcov-report/threads/utils.js.html +14 -14
  158. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  159. package/coverage/lcov-report/utilities/budibaseDir.js.html +7 -7
  160. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  161. package/coverage/lcov-report/utilities/csvParser.js.html +6 -6
  162. package/coverage/lcov-report/utilities/global.js.html +58 -49
  163. package/coverage/lcov-report/utilities/index.html +37 -37
  164. package/coverage/lcov-report/utilities/index.js.html +43 -73
  165. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +8 -8
  166. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  167. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  168. package/coverage/lcov-report/utilities/routing/index.js.html +7 -7
  169. package/coverage/lcov-report/utilities/rowProcessor/index.html +27 -27
  170. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +97 -103
  171. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +75 -27
  172. package/coverage/lcov-report/utilities/scriptRunner.js.html +5 -5
  173. package/coverage/lcov-report/utilities/security.js.html +8 -8
  174. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  175. package/coverage/lcov-report/utilities/usageQuota/index.html +141 -0
  176. package/coverage/lcov-report/utilities/usageQuota/index.js.html +359 -0
  177. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +305 -0
  178. package/coverage/lcov-report/{api/controllers/hosting.js.html → utilities/usageQuota/usageQuoteReset.js.html} +36 -48
  179. package/coverage/lcov-report/utilities/users.js.html +9 -9
  180. package/coverage/lcov-report/utilities/workerRequests.js.html +43 -112
  181. package/coverage/lcov.info +5010 -4425
  182. package/dist/api/controllers/application.js +90 -60
  183. package/dist/api/controllers/auth.js +8 -5
  184. package/dist/api/controllers/automation.js +14 -19
  185. package/dist/api/controllers/cloud.js +2 -3
  186. package/dist/api/controllers/component.js +3 -4
  187. package/dist/api/controllers/datasource.js +20 -10
  188. package/dist/api/controllers/deploy/Deployment.js +3 -6
  189. package/dist/api/controllers/deploy/index.js +12 -13
  190. package/dist/api/controllers/dev.js +5 -5
  191. package/dist/api/controllers/layout.js +3 -3
  192. package/dist/api/controllers/metadata.js +4 -4
  193. package/dist/api/controllers/migrations.js +21 -0
  194. package/dist/api/controllers/permission.js +4 -4
  195. package/dist/api/controllers/query/import/index.js +4 -6
  196. package/dist/api/controllers/query/index.js +11 -10
  197. package/dist/api/controllers/role.js +5 -5
  198. package/dist/api/controllers/routing.js +5 -6
  199. package/dist/api/controllers/row/ExternalRequest.js +90 -67
  200. package/dist/api/controllers/row/external.js +14 -22
  201. package/dist/api/controllers/row/internal.js +55 -93
  202. package/dist/api/controllers/row/internalSearch.js +23 -17
  203. package/dist/api/controllers/row/staticFormula.js +147 -0
  204. package/dist/api/controllers/row/utils.js +13 -14
  205. package/dist/api/controllers/screen.js +5 -7
  206. package/dist/api/controllers/static/index.js +62 -16
  207. package/dist/api/controllers/table/bulkFormula.js +159 -0
  208. package/dist/api/controllers/table/external.js +7 -10
  209. package/dist/api/controllers/table/index.js +16 -13
  210. package/dist/api/controllers/table/internal.js +22 -16
  211. package/dist/api/controllers/table/utils.js +62 -35
  212. package/dist/api/controllers/user.js +43 -43
  213. package/dist/api/controllers/view/index.js +8 -10
  214. package/dist/api/controllers/view/utils.js +9 -4
  215. package/dist/api/controllers/webhook.js +10 -8
  216. package/dist/api/routes/index.js +2 -2
  217. package/dist/api/routes/migrations.js +9 -0
  218. package/dist/api/routes/static.js +2 -1
  219. package/dist/api/routes/tests/utilities/TestFunctions.js +37 -17
  220. package/dist/app.js +35 -5
  221. package/dist/automations/automationUtils.js +2 -3
  222. package/dist/automations/steps/createRow.js +3 -5
  223. package/dist/automations/steps/deleteRow.js +1 -4
  224. package/dist/automations/steps/updateRow.js +1 -1
  225. package/dist/automations/triggers.js +27 -25
  226. package/dist/automations/utils.js +10 -5
  227. package/dist/constants/index.js +7 -0
  228. package/dist/db/linkedRows/LinkController.js +3 -7
  229. package/dist/db/linkedRows/index.js +16 -27
  230. package/dist/db/linkedRows/linkUtils.js +6 -6
  231. package/dist/db/views/staticViews.js +9 -10
  232. package/dist/definitions/datasource.js +1 -0
  233. package/dist/environment.js +4 -1
  234. package/dist/integrations/base/sql.js +62 -21
  235. package/dist/integrations/googlesheets.js +340 -0
  236. package/dist/integrations/index.js +3 -0
  237. package/dist/integrations/utils.js +60 -9
  238. package/dist/middleware/authorized.js +57 -30
  239. package/dist/middleware/builder.js +2 -2
  240. package/dist/middleware/currentapp.js +41 -37
  241. package/dist/middleware/usageQuota.js +82 -15
  242. package/dist/migrations/functions/appUrls.js +46 -0
  243. package/dist/migrations/functions/quotas1.js +50 -0
  244. package/dist/migrations/functions/usageQuotas/index.js +20 -0
  245. package/dist/migrations/functions/usageQuotas/syncApps.js +29 -0
  246. package/dist/migrations/functions/usageQuotas/syncRows.js +33 -0
  247. package/dist/migrations/functions/userEmailViewCasing.js +24 -0
  248. package/dist/migrations/index.js +62 -0
  249. package/dist/package.json +8 -5
  250. package/dist/tests/utilities/TestConfiguration.js +80 -50
  251. package/dist/threads/automation.js +13 -11
  252. package/dist/threads/query.js +15 -11
  253. package/dist/tsconfig.tsbuildinfo +1 -1
  254. package/dist/utilities/fileSystem/index.js +4 -3
  255. package/dist/utilities/global.js +15 -12
  256. package/dist/utilities/index.js +7 -17
  257. package/dist/utilities/routing/index.js +5 -5
  258. package/dist/utilities/rowProcessor/index.js +23 -17
  259. package/dist/utilities/rowProcessor/utils.js +14 -4
  260. package/dist/utilities/{usageQuota.js → usageQuota/index.js} +45 -31
  261. package/dist/utilities/usageQuota/rows.js +78 -0
  262. package/dist/utilities/usageQuota/usageQuoteReset.js +16 -0
  263. package/dist/utilities/users.js +3 -3
  264. package/dist/utilities/workerRequests.js +4 -24
  265. package/nodemon.json +1 -1
  266. package/package.json +9 -6
  267. package/scripts/integrations/mssql/data/Dockerfile +1 -1
  268. package/scripts/integrations/mssql/data/setup.sql +17 -4
  269. package/scripts/integrations/postgres/init.sql +11 -6
  270. package/scripts/likeCypress.ts +1 -1
  271. package/src/api/controllers/application.js +85 -50
  272. package/src/api/controllers/auth.js +8 -5
  273. package/src/api/controllers/automation.js +13 -23
  274. package/src/api/controllers/cloud.js +2 -3
  275. package/src/api/controllers/component.js +3 -4
  276. package/src/api/controllers/datasource.js +21 -11
  277. package/src/api/controllers/deploy/Deployment.js +3 -7
  278. package/src/api/controllers/deploy/index.js +20 -13
  279. package/src/api/controllers/dev.js +5 -5
  280. package/src/api/controllers/layout.js +3 -3
  281. package/src/api/controllers/metadata.js +4 -9
  282. package/src/api/controllers/migrations.js +13 -0
  283. package/src/api/controllers/permission.js +4 -4
  284. package/src/api/controllers/query/import/index.ts +4 -6
  285. package/src/api/controllers/query/import/tests/index.spec.js +2 -1
  286. package/src/api/controllers/query/index.js +11 -10
  287. package/src/api/controllers/role.js +5 -5
  288. package/src/api/controllers/routing.js +5 -6
  289. package/src/api/controllers/row/ExternalRequest.ts +67 -43
  290. package/src/api/controllers/row/external.js +27 -58
  291. package/src/api/controllers/row/internal.js +54 -90
  292. package/src/api/controllers/row/internalSearch.js +23 -17
  293. package/src/api/controllers/row/staticFormula.js +156 -0
  294. package/src/api/controllers/row/utils.js +13 -18
  295. package/src/api/controllers/screen.js +5 -7
  296. package/src/api/controllers/static/index.js +66 -15
  297. package/src/api/controllers/table/bulkFormula.js +173 -0
  298. package/src/api/controllers/table/external.js +7 -10
  299. package/src/api/controllers/table/index.js +20 -28
  300. package/src/api/controllers/table/internal.js +24 -19
  301. package/src/api/controllers/table/utils.js +78 -42
  302. package/src/api/controllers/user.js +46 -45
  303. package/src/api/controllers/view/index.js +8 -10
  304. package/src/api/controllers/view/utils.js +9 -4
  305. package/src/api/controllers/webhook.js +10 -8
  306. package/src/api/routes/index.js +2 -2
  307. package/src/api/routes/migrations.js +14 -0
  308. package/src/api/routes/static.js +5 -0
  309. package/src/api/routes/tests/application.spec.js +2 -2
  310. package/src/api/routes/tests/auth.spec.js +1 -2
  311. package/src/api/routes/tests/automation.spec.js +1 -0
  312. package/src/api/routes/tests/misc.spec.js +0 -1
  313. package/src/api/routes/tests/routing.spec.js +21 -12
  314. package/src/api/routes/tests/row.spec.js +7 -4
  315. package/src/api/routes/tests/static.spec.js +98 -0
  316. package/src/api/routes/tests/utilities/TestFunctions.js +39 -17
  317. package/src/app.ts +18 -5
  318. package/src/automations/automationUtils.js +2 -3
  319. package/src/automations/steps/createRow.js +2 -5
  320. package/src/automations/steps/deleteRow.js +1 -4
  321. package/src/automations/steps/updateRow.js +1 -1
  322. package/src/automations/triggers.js +33 -31
  323. package/src/automations/utils.js +9 -5
  324. package/src/constants/index.js +9 -0
  325. package/src/db/linkedRows/LinkController.js +3 -7
  326. package/src/db/linkedRows/index.js +16 -31
  327. package/src/db/linkedRows/linkUtils.js +6 -6
  328. package/src/db/tests/linkController.spec.js +0 -1
  329. package/src/db/tests/linkTests.spec.js +5 -6
  330. package/src/db/views/staticViews.js +8 -10
  331. package/src/definitions/common.ts +3 -0
  332. package/src/definitions/datasource.ts +3 -0
  333. package/src/environment.js +4 -1
  334. package/src/integrations/base/sql.ts +75 -29
  335. package/src/integrations/googlesheets.ts +353 -0
  336. package/src/integrations/index.ts +3 -0
  337. package/src/integrations/tests/sql.spec.js +16 -0
  338. package/src/integrations/utils.ts +75 -12
  339. package/src/middleware/authorized.js +66 -30
  340. package/src/middleware/builder.js +2 -2
  341. package/src/middleware/currentapp.js +50 -46
  342. package/src/middleware/tests/authorized.spec.js +13 -6
  343. package/src/middleware/tests/currentapp.spec.js +6 -0
  344. package/src/middleware/tests/usageQuota.spec.js +18 -24
  345. package/src/middleware/usageQuota.js +93 -17
  346. package/src/migrations/functions/appUrls.ts +34 -0
  347. package/src/migrations/functions/quotas1.ts +20 -0
  348. package/src/migrations/functions/tests/appUrls.spec.js +29 -0
  349. package/src/migrations/functions/tests/quotas1.spec.js +27 -0
  350. package/src/migrations/functions/tests/userEmailViewCasing.spec.js +25 -0
  351. package/src/migrations/functions/usageQuotas/index.ts +8 -0
  352. package/src/migrations/functions/usageQuotas/syncApps.ts +18 -0
  353. package/src/migrations/functions/usageQuotas/syncRows.ts +22 -0
  354. package/src/migrations/functions/usageQuotas/tests/syncApps.spec.js +37 -0
  355. package/src/migrations/functions/usageQuotas/tests/syncRows.spec.js +43 -0
  356. package/src/migrations/functions/userEmailViewCasing.ts +13 -0
  357. package/src/migrations/index.ts +56 -0
  358. package/src/module.d.ts +3 -0
  359. package/src/tests/utilities/TestConfiguration.js +82 -55
  360. package/src/threads/automation.js +17 -15
  361. package/src/threads/query.js +17 -12
  362. package/src/utilities/fileSystem/index.js +4 -3
  363. package/src/utilities/global.js +15 -12
  364. package/src/utilities/index.js +7 -17
  365. package/src/utilities/routing/index.js +5 -5
  366. package/src/utilities/rowProcessor/index.js +25 -27
  367. package/src/utilities/rowProcessor/utils.js +23 -7
  368. package/src/utilities/tests/usageQuota/usageQuota.spec.js +72 -0
  369. package/src/utilities/usageQuota/index.js +93 -0
  370. package/src/utilities/usageQuota/rows.js +75 -0
  371. package/src/utilities/usageQuota/usageQuoteReset.js +18 -0
  372. package/src/utilities/users.js +3 -3
  373. package/src/utilities/workerRequests.js +4 -27
  374. package/tsconfig.json +2 -1
  375. package/builder/assets/index.39e01193.css +0 -1
  376. package/dist/api/controllers/hosting.js +0 -30
  377. package/dist/api/routes/hosting.js +0 -11
  378. package/src/api/controllers/hosting.js +0 -22
  379. package/src/api/routes/hosting.js +0 -13
  380. package/src/api/routes/tests/hosting.spec.js +0 -36
  381. package/src/utilities/usageQuota.js +0 -73
@@ -19,6 +19,19 @@ import {
19
19
  isRowId,
20
20
  convertRowId,
21
21
  } from "../../../integrations/utils"
22
+ import { getDatasourceAndQuery } from "./utils"
23
+ import {
24
+ DataSourceOperation,
25
+ FieldTypes,
26
+ RelationshipTypes,
27
+ } from "../../../constants"
28
+ import { breakExternalTableId, isSQL } from "../../../integrations/utils"
29
+ import { processObjectSync } from "@budibase/string-templates"
30
+ // @ts-ignore
31
+ import { cloneDeep } from "lodash/fp"
32
+ import { processFormulas } from "../../../utilities/rowProcessor/utils"
33
+ // @ts-ignore
34
+ import { getAppDB } from "@budibase/backend-core/context"
22
35
 
23
36
  interface ManyRelationship {
24
37
  tableId?: string
@@ -38,18 +51,6 @@ interface RunConfig {
38
51
  }
39
52
 
40
53
  module External {
41
- const { getDatasourceAndQuery } = require("./utils")
42
- const {
43
- DataSourceOperation,
44
- FieldTypes,
45
- RelationshipTypes,
46
- } = require("../../../constants")
47
- const { breakExternalTableId, isSQL } = require("../../../integrations/utils")
48
- const { processObjectSync } = require("@budibase/string-templates")
49
- const { cloneDeep } = require("lodash/fp")
50
- const CouchDB = require("../../../db")
51
- const { processFormulas } = require("../../../utilities/rowProcessor/utils")
52
-
53
54
  function buildFilters(
54
55
  id: string | undefined,
55
56
  filters: SearchFilters,
@@ -183,7 +184,7 @@ module External {
183
184
  thisRow._id = generateIdForRow(row, table)
184
185
  thisRow.tableId = table._id
185
186
  thisRow._rev = "rev"
186
- return thisRow
187
+ return processFormulas(table, thisRow)
187
188
  }
188
189
 
189
190
  function fixArrayTypes(row: Row, table: Table) {
@@ -210,19 +211,12 @@ module External {
210
211
  }
211
212
 
212
213
  class ExternalRequest {
213
- private readonly appId: string
214
214
  private operation: Operation
215
215
  private tableId: string
216
216
  private datasource: Datasource
217
217
  private tables: { [key: string]: Table } = {}
218
218
 
219
- constructor(
220
- appId: string,
221
- operation: Operation,
222
- tableId: string,
223
- datasource: Datasource
224
- ) {
225
- this.appId = appId
219
+ constructor(operation: Operation, tableId: string, datasource: Datasource) {
226
220
  this.operation = operation
227
221
  this.tableId = tableId
228
222
  this.datasource = datasource
@@ -231,12 +225,14 @@ module External {
231
225
  }
232
226
  }
233
227
 
234
- getTable(tableId: string | undefined): Table {
228
+ getTable(tableId: string | undefined): Table | undefined {
235
229
  if (!tableId) {
236
230
  throw "Table ID is unknown, cannot find table"
237
231
  }
238
232
  const { tableName } = breakExternalTableId(tableId)
239
- return this.tables[tableName]
233
+ if (tableName) {
234
+ return this.tables[tableName]
235
+ }
240
236
  }
241
237
 
242
238
  inputProcessing(row: Row | undefined, table: Table) {
@@ -272,9 +268,11 @@ module External {
272
268
  newRow[key] = row[key]
273
269
  continue
274
270
  }
275
- const { tableName: linkTableName } = breakExternalTableId(field.tableId)
271
+ const { tableName: linkTableName } = breakExternalTableId(
272
+ field?.tableId
273
+ )
276
274
  // table has to exist for many to many
277
- if (!this.tables[linkTableName]) {
275
+ if (!linkTableName || !this.tables[linkTableName]) {
278
276
  continue
279
277
  }
280
278
  const linkTable = this.tables[linkTableName]
@@ -329,8 +327,12 @@ module External {
329
327
  * This iterates through the returned rows and works out what elements of the rows
330
328
  * actually match up to another row (based on primary keys) - this is pretty specific
331
329
  * to SQL and the way that SQL relationships are returned based on joins.
330
+ * This is complicated, but the idea is that when a SQL query returns all the relations
331
+ * will be separate rows, with all of the data in each row. We have to decipher what comes
332
+ * from where (which tables) and how to convert that into budibase columns.
332
333
  */
333
334
  updateRelationshipColumns(
335
+ table: Table,
334
336
  row: Row,
335
337
  rows: { [key: string]: Row },
336
338
  relationships: RelationshipsJson[]
@@ -341,6 +343,13 @@ module External {
341
343
  if (!linkedTable) {
342
344
  continue
343
345
  }
346
+ const fromColumn = `${table.name}.${relationship.from}`
347
+ const toColumn = `${linkedTable.name}.${relationship.to}`
348
+ // this is important when working with multiple relationships
349
+ // between the same tables, don't want to overlap/multiply the relations
350
+ if (!relationship.through && row[fromColumn] !== row[toColumn]) {
351
+ continue
352
+ }
344
353
  let linked = basicProcessing(row, linkedTable)
345
354
  if (!linked._id) {
346
355
  continue
@@ -388,6 +397,7 @@ module External {
388
397
  // this is a relationship of some sort
389
398
  if (finalRows[rowId]) {
390
399
  finalRows = this.updateRelationshipColumns(
400
+ table,
391
401
  row,
392
402
  finalRows,
393
403
  relationships
@@ -401,6 +411,7 @@ module External {
401
411
  finalRows[thisRow._id] = thisRow
402
412
  // do this at end once its been added to the final rows
403
413
  finalRows = this.updateRelationshipColumns(
414
+ table,
404
415
  row,
405
416
  finalRows,
406
417
  relationships
@@ -422,7 +433,7 @@ module External {
422
433
  }
423
434
  const { tableName: linkTableName } = breakExternalTableId(field.tableId)
424
435
  // no table to link to, this is not a valid relationships
425
- if (!this.tables[linkTableName]) {
436
+ if (!linkTableName || !this.tables[linkTableName]) {
426
437
  continue
427
438
  }
428
439
  const linkTable = this.tables[linkTableName]
@@ -460,6 +471,9 @@ module External {
460
471
  async lookupRelations(tableId: string, row: Row) {
461
472
  const related: { [key: string]: any } = {}
462
473
  const { tableName } = breakExternalTableId(tableId)
474
+ if (!tableName) {
475
+ return related
476
+ }
463
477
  const table = this.tables[tableName]
464
478
  // @ts-ignore
465
479
  const primaryKey = table.primary[0]
@@ -484,7 +498,7 @@ module External {
484
498
  if (!lookupField || !row[lookupField]) {
485
499
  continue
486
500
  }
487
- const response = await getDatasourceAndQuery(this.appId, {
501
+ const response = await getDatasourceAndQuery({
488
502
  endpoint: getEndpoint(tableId, DataSourceOperation.READ),
489
503
  filters: {
490
504
  equal: {
@@ -515,28 +529,30 @@ module External {
515
529
  row: Row,
516
530
  relationships: ManyRelationship[]
517
531
  ) {
518
- const { appId } = this
519
532
  // if we're creating (in a through table) need to wipe the existing ones first
520
533
  const promises = []
521
534
  const related = await this.lookupRelations(mainTableId, row)
522
535
  for (let relationship of relationships) {
523
536
  const { key, tableId, isUpdate, id, ...rest } = relationship
524
- const body = processObjectSync(rest, row)
537
+ const body: { [key: string]: any } = processObjectSync(rest, row, {})
525
538
  const linkTable = this.getTable(tableId)
526
539
  // @ts-ignore
527
- const linkPrimary = linkTable.primary[0]
528
- const rows = related[key]?.rows || []
540
+ const linkPrimary = linkTable?.primary[0]
541
+ if (!linkTable || !linkPrimary) {
542
+ return
543
+ }
544
+ const rows = related[key].rows || []
529
545
  const found = rows.find(
530
546
  (row: { [key: string]: any }) =>
531
547
  row[linkPrimary] === relationship.id ||
532
- row[linkPrimary] === body[linkPrimary]
548
+ row[linkPrimary] === body?.[linkPrimary]
533
549
  )
534
550
  const operation = isUpdate
535
551
  ? DataSourceOperation.UPDATE
536
552
  : DataSourceOperation.CREATE
537
553
  if (!found) {
538
554
  promises.push(
539
- getDatasourceAndQuery(appId, {
555
+ getDatasourceAndQuery({
540
556
  endpoint: getEndpoint(tableId, operation),
541
557
  // if we're doing many relationships then we're writing, only one response
542
558
  body,
@@ -552,9 +568,12 @@ module External {
552
568
  for (let [colName, { isMany, rows, tableId }] of Object.entries(
553
569
  related
554
570
  )) {
555
- const table: Table = this.getTable(tableId)
571
+ const table: Table | undefined = this.getTable(tableId)
556
572
  // if its not the foreign key skip it, nothing to do
557
- if (table.primary && table.primary.indexOf(colName) !== -1) {
573
+ if (
574
+ !table ||
575
+ (table.primary && table.primary.indexOf(colName) !== -1)
576
+ ) {
558
577
  continue
559
578
  }
560
579
  for (let row of rows) {
@@ -566,7 +585,7 @@ module External {
566
585
  : DataSourceOperation.UPDATE
567
586
  const body = isMany ? null : { [colName]: null }
568
587
  promises.push(
569
- getDatasourceAndQuery(this.appId, {
588
+ getDatasourceAndQuery({
570
589
  endpoint: getEndpoint(tableId, op),
571
590
  body,
572
591
  filters,
@@ -605,20 +624,25 @@ module External {
605
624
  continue
606
625
  }
607
626
  const { tableName: linkTableName } = breakExternalTableId(field.tableId)
608
- const linkTable = this.tables[linkTableName]
609
- if (linkTable) {
610
- const linkedFields = extractRealFields(linkTable, fields)
611
- fields = fields.concat(linkedFields)
627
+ if (linkTableName) {
628
+ const linkTable = this.tables[linkTableName]
629
+ if (linkTable) {
630
+ const linkedFields = extractRealFields(linkTable, fields)
631
+ fields = fields.concat(linkedFields)
632
+ }
612
633
  }
613
634
  }
614
635
  return fields
615
636
  }
616
637
 
617
638
  async run(config: RunConfig) {
618
- const { appId, operation, tableId } = this
639
+ const { operation, tableId } = this
619
640
  let { datasourceId, tableName } = breakExternalTableId(tableId)
641
+ if (!tableName) {
642
+ throw "Unable to run without a table name"
643
+ }
620
644
  if (!this.datasource) {
621
- const db = new CouchDB(appId)
645
+ const db = getAppDB()
622
646
  this.datasource = await db.get(datasourceId)
623
647
  if (!this.datasource || !this.datasource.entities) {
624
648
  throw "No tables found, fetch tables before query."
@@ -670,7 +694,7 @@ module External {
670
694
  },
671
695
  }
672
696
  // can't really use response right now
673
- const response = await getDatasourceAndQuery(appId, json)
697
+ const response = await getDatasourceAndQuery(json)
674
698
  // handle many to many relationships now if we know the ID (could be auto increment)
675
699
  if (
676
700
  operation !== DataSourceOperation.READ &&
@@ -9,9 +9,9 @@ const {
9
9
  breakRowIdField,
10
10
  } = require("../../../integrations/utils")
11
11
  const ExternalRequest = require("./ExternalRequest")
12
- const CouchDB = require("../../../db")
12
+ const { getAppDB } = require("@budibase/backend-core/context")
13
13
 
14
- async function handleRequest(appId, operation, tableId, opts = {}) {
14
+ async function handleRequest(operation, tableId, opts = {}) {
15
15
  // make sure the filters are cleaned up, no empty strings for equals, fuzzy or string
16
16
  if (opts && opts.filters) {
17
17
  for (let filterField of NoEmptyFilterStrings) {
@@ -25,31 +25,27 @@ async function handleRequest(appId, operation, tableId, opts = {}) {
25
25
  }
26
26
  }
27
27
  }
28
- return new ExternalRequest(appId, operation, tableId, opts.datasource).run(
29
- opts
30
- )
28
+ return new ExternalRequest(operation, tableId, opts.datasource).run(opts)
31
29
  }
32
30
 
33
31
  exports.handleRequest = handleRequest
34
32
 
35
33
  exports.patch = async ctx => {
36
- const appId = ctx.appId
37
34
  const inputs = ctx.request.body
38
35
  const tableId = ctx.params.tableId
39
36
  const id = breakRowIdField(inputs._id)
40
37
  // don't save the ID to db
41
38
  delete inputs._id
42
- return handleRequest(appId, DataSourceOperation.UPDATE, tableId, {
39
+ return handleRequest(DataSourceOperation.UPDATE, tableId, {
43
40
  id,
44
41
  row: inputs,
45
42
  })
46
43
  }
47
44
 
48
45
  exports.save = async ctx => {
49
- const appId = ctx.appId
50
46
  const inputs = ctx.request.body
51
47
  const tableId = ctx.params.tableId
52
- return handleRequest(appId, DataSourceOperation.CREATE, tableId, {
48
+ return handleRequest(DataSourceOperation.CREATE, tableId, {
53
49
  row: inputs,
54
50
  })
55
51
  }
@@ -63,49 +59,35 @@ exports.fetchView = async ctx => {
63
59
  }
64
60
 
65
61
  exports.fetch = async ctx => {
66
- const appId = ctx.appId
67
62
  const tableId = ctx.params.tableId
68
- return handleRequest(appId, DataSourceOperation.READ, tableId)
63
+ return handleRequest(DataSourceOperation.READ, tableId)
69
64
  }
70
65
 
71
66
  exports.find = async ctx => {
72
- const appId = ctx.appId
73
67
  const id = ctx.params.rowId
74
68
  const tableId = ctx.params.tableId
75
- const response = await handleRequest(
76
- appId,
77
- DataSourceOperation.READ,
78
- tableId,
79
- {
80
- id,
81
- }
82
- )
69
+ const response = await handleRequest(DataSourceOperation.READ, tableId, {
70
+ id,
71
+ })
83
72
  return response ? response[0] : response
84
73
  }
85
74
 
86
75
  exports.destroy = async ctx => {
87
- const appId = ctx.appId
88
76
  const tableId = ctx.params.tableId
89
77
  const id = ctx.request.body._id
90
- const { row } = await handleRequest(
91
- appId,
92
- DataSourceOperation.DELETE,
93
- tableId,
94
- {
95
- id,
96
- }
97
- )
78
+ const { row } = await handleRequest(DataSourceOperation.DELETE, tableId, {
79
+ id,
80
+ })
98
81
  return { response: { ok: true }, row }
99
82
  }
100
83
 
101
84
  exports.bulkDestroy = async ctx => {
102
- const appId = ctx.appId
103
85
  const { rows } = ctx.request.body
104
86
  const tableId = ctx.params.tableId
105
87
  let promises = []
106
88
  for (let row of rows) {
107
89
  promises.push(
108
- handleRequest(appId, DataSourceOperation.DELETE, tableId, {
90
+ handleRequest(DataSourceOperation.DELETE, tableId, {
109
91
  id: breakRowIdField(row._id),
110
92
  })
111
93
  )
@@ -115,7 +97,6 @@ exports.bulkDestroy = async ctx => {
115
97
  }
116
98
 
117
99
  exports.search = async ctx => {
118
- const appId = ctx.appId
119
100
  const tableId = ctx.params.tableId
120
101
  const { paginate, query, ...params } = ctx.request.body
121
102
  let { bookmark, limit } = params
@@ -145,26 +126,21 @@ exports.search = async ctx => {
145
126
  [params.sort]: direction,
146
127
  }
147
128
  }
148
- const rows = await handleRequest(appId, DataSourceOperation.READ, tableId, {
129
+ const rows = await handleRequest(DataSourceOperation.READ, tableId, {
149
130
  filters: query,
150
131
  sort,
151
132
  paginate: paginateObj,
152
133
  })
153
134
  let hasNextPage = false
154
135
  if (paginate && rows.length === limit) {
155
- const nextRows = await handleRequest(
156
- appId,
157
- DataSourceOperation.READ,
158
- tableId,
159
- {
160
- filters: query,
161
- sort,
162
- paginate: {
163
- limit: 1,
164
- page: bookmark * limit + 1,
165
- },
166
- }
167
- )
136
+ const nextRows = await handleRequest(DataSourceOperation.READ, tableId, {
137
+ filters: query,
138
+ sort,
139
+ paginate: {
140
+ limit: 1,
141
+ page: bookmark * limit + 1,
142
+ },
143
+ })
168
144
  hasNextPage = nextRows.length > 0
169
145
  }
170
146
  // need wrapper object for bookmarks etc when paginating
@@ -177,25 +153,19 @@ exports.validate = async () => {
177
153
  }
178
154
 
179
155
  exports.fetchEnrichedRow = async ctx => {
180
- const appId = ctx.appId
181
156
  const id = ctx.params.rowId
182
157
  const tableId = ctx.params.tableId
183
158
  const { datasourceId, tableName } = breakExternalTableId(tableId)
184
- const db = new CouchDB(appId)
159
+ const db = getAppDB()
185
160
  const datasource = await db.get(datasourceId)
186
161
  if (!datasource || !datasource.entities) {
187
162
  ctx.throw(400, "Datasource has not been configured for plus API.")
188
163
  }
189
164
  const tables = datasource.entities
190
- const response = await handleRequest(
191
- appId,
192
- DataSourceOperation.READ,
193
- tableId,
194
- {
195
- id,
196
- datasource,
197
- }
198
- )
165
+ const response = await handleRequest(DataSourceOperation.READ, tableId, {
166
+ id,
167
+ datasource,
168
+ })
199
169
  const table = tables[tableName]
200
170
  const row = response[0]
201
171
  // this seems like a lot of work, but basically we need to dig deeper for the enrich
@@ -214,7 +184,6 @@ exports.fetchEnrichedRow = async ctx => {
214
184
  // don't support composite keys right now
215
185
  const linkedIds = links.map(link => breakRowIdField(link._id)[0])
216
186
  row[fieldName] = await handleRequest(
217
- appId,
218
187
  DataSourceOperation.READ,
219
188
  linkedTableId,
220
189
  {