@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
@@ -8,20 +8,18 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
9
  });
10
10
  };
11
- const CouchDB = require("../../db");
12
11
  const { getScreenParams, generateScreenID } = require("../../db/utils");
13
12
  const { AccessController } = require("@budibase/backend-core/roles");
13
+ const { getAppDB } = require("@budibase/backend-core/context");
14
14
  exports.fetch = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
15
- const appId = ctx.appId;
16
- const db = new CouchDB(appId);
15
+ const db = getAppDB();
17
16
  const screens = (yield db.allDocs(getScreenParams(null, {
18
17
  include_docs: true,
19
18
  }))).rows.map(element => element.doc);
20
- ctx.body = yield new AccessController(appId).checkScreensAccess(screens, ctx.user.role._id);
19
+ ctx.body = yield new AccessController().checkScreensAccess(screens, ctx.user.role._id);
21
20
  });
22
21
  exports.save = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
23
- const appId = ctx.appId;
24
- const db = new CouchDB(appId);
22
+ const db = getAppDB();
25
23
  let screen = ctx.request.body;
26
24
  if (!screen._id) {
27
25
  screen._id = generateScreenID();
@@ -31,7 +29,7 @@ exports.save = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
31
29
  ctx.body = Object.assign(Object.assign({}, screen), { _id: response.id, _rev: response.rev });
32
30
  });
33
31
  exports.destroy = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
34
- const db = new CouchDB(ctx.appId);
32
+ const db = getAppDB();
35
33
  yield db.remove(ctx.params.screenId, ctx.params.screenRev);
36
34
  ctx.body = {
37
35
  message: "Screen deleted successfully",
@@ -14,14 +14,16 @@ const { resolve, join } = require("../../../utilities/centralPath");
14
14
  const uuid = require("uuid");
15
15
  const { ObjectStoreBuckets } = require("../../../constants");
16
16
  const { processString } = require("@budibase/string-templates");
17
- const { getDeployedApps } = require("../../../utilities/workerRequests");
18
- const CouchDB = require("../../../db");
17
+ const { getAllApps } = require("@budibase/backend-core/db");
19
18
  const { loadHandlebarsFile, NODE_MODULES_PATH, TOP_LEVEL_PATH, } = require("../../../utilities/fileSystem");
20
19
  const env = require("../../../environment");
21
20
  const { clientLibraryPath } = require("../../../utilities");
22
21
  const { upload } = require("../../../utilities/fileSystem");
23
22
  const { attachmentsRelativeURL } = require("../../../utilities");
24
23
  const { DocumentTypes } = require("../../../db/utils");
24
+ const { getAppDB, updateAppId } = require("@budibase/backend-core/context");
25
+ const AWS = require("aws-sdk");
26
+ const AWS_REGION = env.AWS_REGION ? env.AWS_REGION : "eu-west-1";
25
27
  function prepareUpload({ s3Key, bucket, metadata, file }) {
26
28
  return __awaiter(this, void 0, void 0, function* () {
27
29
  const response = yield upload({
@@ -41,17 +43,16 @@ function prepareUpload({ s3Key, bucket, metadata, file }) {
41
43
  };
42
44
  });
43
45
  }
44
- function checkForSelfHostedURL(ctx) {
46
+ function getAppIdFromUrl(ctx) {
45
47
  return __awaiter(this, void 0, void 0, function* () {
46
- // the "appId" component of the URL may actually be a specific self hosted URL
48
+ // the "appId" component of the URL can be the id or the custom url
47
49
  let possibleAppUrl = `/${encodeURI(ctx.params.appId).toLowerCase()}`;
48
- const apps = yield getDeployedApps();
49
- if (apps[possibleAppUrl] && apps[possibleAppUrl].appId) {
50
- return apps[possibleAppUrl].appId;
51
- }
52
- else {
53
- return ctx.params.appId;
54
- }
50
+ // search prod apps for a url that matches, exclude dev where id is always used
51
+ const apps = yield getAllApps({ dev: false });
52
+ const app = apps.filter(a => a.url && a.url.toLowerCase() === possibleAppUrl)[0];
53
+ const appId = app && app.appId ? app.appId : ctx.params.appId;
54
+ updateAppId(appId);
55
+ return appId;
55
56
  });
56
57
  }
57
58
  exports.serveBuilder = function (ctx) {
@@ -80,12 +81,9 @@ exports.uploadFile = function (ctx) {
80
81
  };
81
82
  exports.serveApp = function (ctx) {
82
83
  return __awaiter(this, void 0, void 0, function* () {
83
- let appId = ctx.params.appId;
84
- if (env.SELF_HOSTED) {
85
- appId = yield checkForSelfHostedURL(ctx);
86
- }
84
+ let appId = yield getAppIdFromUrl(ctx);
87
85
  const App = require("./templates/BudibaseApp.svelte").default;
88
- const db = new CouchDB(appId, { skip_setup: true });
86
+ const db = getAppDB({ skip_setup: true });
89
87
  const appInfo = yield db.get(DocumentTypes.APP_METADATA);
90
88
  const { head, html, css } = App.render({
91
89
  title: appInfo.name,
@@ -109,3 +107,51 @@ exports.serveClientLibrary = function (ctx) {
109
107
  });
110
108
  });
111
109
  };
110
+ exports.getSignedUploadURL = function (ctx) {
111
+ var _a, _b, _c;
112
+ return __awaiter(this, void 0, void 0, function* () {
113
+ const database = getAppDB();
114
+ // Ensure datasource is valid
115
+ let datasource;
116
+ try {
117
+ const { datasourceId } = ctx.params;
118
+ datasource = yield database.get(datasourceId);
119
+ if (!datasource) {
120
+ ctx.throw(400, "The specified datasource could not be found");
121
+ }
122
+ }
123
+ catch (error) {
124
+ ctx.throw(400, "The specified datasource could not be found");
125
+ }
126
+ // Ensure we aren't using a custom endpoint
127
+ if ((_a = datasource === null || datasource === void 0 ? void 0 : datasource.config) === null || _a === void 0 ? void 0 : _a.endpoint) {
128
+ ctx.throw(400, "S3 datasources with custom endpoints are not supported");
129
+ }
130
+ // Determine type of datasource and generate signed URL
131
+ let signedUrl;
132
+ let publicUrl;
133
+ if (datasource.source === "S3") {
134
+ const { bucket, key } = ctx.request.body || {};
135
+ if (!bucket || !key) {
136
+ ctx.throw(400, "bucket and key values are required");
137
+ return;
138
+ }
139
+ try {
140
+ const s3 = new AWS.S3({
141
+ region: AWS_REGION,
142
+ accessKeyId: (_b = datasource === null || datasource === void 0 ? void 0 : datasource.config) === null || _b === void 0 ? void 0 : _b.accessKeyId,
143
+ secretAccessKey: (_c = datasource === null || datasource === void 0 ? void 0 : datasource.config) === null || _c === void 0 ? void 0 : _c.secretAccessKey,
144
+ apiVersion: "2006-03-01",
145
+ signatureVersion: "v4",
146
+ });
147
+ const params = { Bucket: bucket, Key: key };
148
+ signedUrl = s3.getSignedUrl("putObject", params);
149
+ publicUrl = `https://${bucket}.s3.${AWS_REGION}.amazonaws.com/${key}`;
150
+ }
151
+ catch (error) {
152
+ ctx.throw(400, error);
153
+ }
154
+ }
155
+ ctx.body = { signedUrl, publicUrl };
156
+ });
157
+ };
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ const { FieldTypes, FormulaTypes } = require("../../../constants");
12
+ const { getAllInternalTables, clearColumns } = require("./utils");
13
+ const { doesContainStrings } = require("@budibase/string-templates");
14
+ const { cloneDeep } = require("lodash/fp");
15
+ const { isEqual, uniq } = require("lodash");
16
+ const { updateAllFormulasInTable } = require("../row/staticFormula");
17
+ const { getAppDB } = require("@budibase/backend-core/context");
18
+ function isStaticFormula(column) {
19
+ return (column.type === FieldTypes.FORMULA &&
20
+ column.formulaType === FormulaTypes.STATIC);
21
+ }
22
+ /**
23
+ * This retrieves the formula columns from a table schema that use a specified column name
24
+ * in the formula.
25
+ */
26
+ function getFormulaThatUseColumn(table, columnNames) {
27
+ let formula = [];
28
+ columnNames = Array.isArray(columnNames) ? columnNames : [columnNames];
29
+ for (let column of Object.values(table.schema)) {
30
+ // not a static formula, or doesn't contain a relationship
31
+ if (!isStaticFormula(column)) {
32
+ continue;
33
+ }
34
+ if (!doesContainStrings(column.formula, columnNames)) {
35
+ continue;
36
+ }
37
+ formula.push(column.name);
38
+ }
39
+ return formula;
40
+ }
41
+ /**
42
+ * This functions checks for when a related table, column or related column is deleted, if any
43
+ * tables need to have the formula column removed.
44
+ */
45
+ function checkIfFormulaNeedsCleared(table, { oldTable, deletion }) {
46
+ return __awaiter(this, void 0, void 0, function* () {
47
+ // start by retrieving all tables, remove the current table from the list
48
+ const tables = (yield getAllInternalTables()).filter(tbl => tbl._id !== table._id);
49
+ const schemaToUse = oldTable ? oldTable.schema : table.schema;
50
+ let removedColumns = Object.values(schemaToUse).filter(column => deletion || !table.schema[column.name]);
51
+ // remove any formula columns that used related columns
52
+ for (let removed of removedColumns) {
53
+ let tableToUse = table;
54
+ // if relationship, get the related table
55
+ if (removed.type === FieldTypes.LINK) {
56
+ tableToUse = tables.find(table => table._id === removed.tableId);
57
+ }
58
+ const columnsToDelete = getFormulaThatUseColumn(tableToUse, removed.name);
59
+ if (columnsToDelete.length > 0) {
60
+ yield clearColumns(table, columnsToDelete);
61
+ }
62
+ // need a special case, where a column has been removed from this table, but was used
63
+ // in a different, related tables formula
64
+ if (!table.relatedFormula) {
65
+ continue;
66
+ }
67
+ for (let relatedTableId of table.relatedFormula) {
68
+ const relatedColumns = Object.values(table.schema).filter(column => column.tableId === relatedTableId);
69
+ const relatedTable = tables.find(table => table._id === relatedTableId);
70
+ // look to see if the column was used in a relationship formula,
71
+ // relationships won't be used for this
72
+ if (relatedTable && relatedColumns && removed.type !== FieldTypes.LINK) {
73
+ let relatedFormulaToRemove = [];
74
+ for (let column of relatedColumns) {
75
+ relatedFormulaToRemove = relatedFormulaToRemove.concat(getFormulaThatUseColumn(relatedTable, [
76
+ column.fieldName,
77
+ removed.name,
78
+ ]));
79
+ }
80
+ if (relatedFormulaToRemove.length > 0) {
81
+ yield clearColumns(relatedTable, uniq(relatedFormulaToRemove));
82
+ }
83
+ }
84
+ }
85
+ }
86
+ });
87
+ }
88
+ /**
89
+ * This function adds a note to related tables that they are
90
+ * used in a static formula - so that the link controller
91
+ * can manage hydrating related rows formula fields. This is
92
+ * specifically only for static formula.
93
+ */
94
+ function updateRelatedFormulaLinksOnTables(table, { deletion } = { deletion: false }) {
95
+ return __awaiter(this, void 0, void 0, function* () {
96
+ const db = getAppDB();
97
+ // start by retrieving all tables, remove the current table from the list
98
+ const tables = (yield getAllInternalTables()).filter(tbl => tbl._id !== table._id);
99
+ // clone the tables, so we can compare at end
100
+ const initialTables = cloneDeep(tables);
101
+ // first find the related column names
102
+ const relatedColumns = Object.values(table.schema).filter(col => col.type === FieldTypes.LINK);
103
+ // we start by removing the formula field from all tables
104
+ for (let otherTable of tables) {
105
+ if (!otherTable.relatedFormula) {
106
+ continue;
107
+ }
108
+ const index = otherTable.relatedFormula.indexOf(table._id);
109
+ if (index !== -1) {
110
+ otherTable.relatedFormula.splice(index, 1);
111
+ }
112
+ }
113
+ // if deleting, just remove the table IDs, don't try add
114
+ if (!deletion) {
115
+ for (let relatedCol of relatedColumns) {
116
+ let columns = getFormulaThatUseColumn(table, relatedCol.name);
117
+ if (!columns || columns.length === 0) {
118
+ continue;
119
+ }
120
+ const relatedTable = tables.find(related => related._id === relatedCol.tableId);
121
+ // check if the table is already in the list of related formula, if it isn't, then add it
122
+ if (relatedTable &&
123
+ (!relatedTable.relatedFormula ||
124
+ !relatedTable.relatedFormula.includes(table._id))) {
125
+ relatedTable.relatedFormula = relatedTable.relatedFormula
126
+ ? [...relatedTable.relatedFormula, table._id]
127
+ : [table._id];
128
+ }
129
+ }
130
+ }
131
+ // now we just need to compare all the tables and see if any need saved
132
+ for (let initial of initialTables) {
133
+ const found = tables.find(tbl => initial._id === tbl._id);
134
+ if (found && !isEqual(initial, found)) {
135
+ yield db.put(found);
136
+ }
137
+ }
138
+ });
139
+ }
140
+ function checkIfFormulaUpdated(table, { oldTable }) {
141
+ return __awaiter(this, void 0, void 0, function* () {
142
+ // look to see if any formula values have changed
143
+ const shouldUpdate = Object.values(table.schema).find(column => isStaticFormula(column) &&
144
+ (!oldTable ||
145
+ !oldTable.schema[column.name] ||
146
+ !isEqual(oldTable.schema[column.name], column)));
147
+ // if a static formula column has updated, then need to run the update
148
+ if (shouldUpdate != null) {
149
+ yield updateAllFormulasInTable(table);
150
+ }
151
+ });
152
+ }
153
+ exports.runStaticFormulaChecks = (table, { oldTable, deletion }) => __awaiter(void 0, void 0, void 0, function* () {
154
+ yield updateRelatedFormulaLinksOnTables(table, { deletion });
155
+ yield checkIfFormulaNeedsCleared(table, { oldTable, deletion });
156
+ if (!deletion) {
157
+ yield checkIfFormulaUpdated(table, { oldTable });
158
+ }
159
+ });
@@ -8,7 +8,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
9
  });
10
10
  };
11
- const CouchDB = require("../../../db");
12
11
  const { buildExternalTableId, breakExternalTableId, } = require("../../../integrations/utils");
13
12
  const { getTable, generateForeignKey, generateJunctionTableName, foreignKeyStructure, hasTypeChanged, } = require("./utils");
14
13
  const { DataSourceOperation, FieldTypes, RelationshipTypes, } = require("../../../constants");
@@ -16,6 +15,7 @@ const { makeExternalQuery } = require("../../../integrations/base/utils");
16
15
  const { cloneDeep } = require("lodash/fp");
17
16
  const csvParser = require("../../../utilities/csvParser");
18
17
  const { handleRequest } = require("../row/external");
18
+ const { getAppDB } = require("@budibase/backend-core/context");
19
19
  function makeTableRequest(datasource, operation, table, tables, oldTable = null) {
20
20
  return __awaiter(this, void 0, void 0, function* () {
21
21
  const json = {
@@ -134,7 +134,6 @@ function isRelationshipSetup(column) {
134
134
  }
135
135
  exports.save = function (ctx) {
136
136
  return __awaiter(this, void 0, void 0, function* () {
137
- const appId = ctx.appId;
138
137
  const table = ctx.request.body;
139
138
  // can't do this right now
140
139
  delete table.dataImport;
@@ -146,12 +145,12 @@ exports.save = function (ctx) {
146
145
  let tableToSave = Object.assign({ type: "table", _id: buildExternalTableId(datasourceId, table.name) }, table);
147
146
  let oldTable;
148
147
  if (ctx.request.body && ctx.request.body._id) {
149
- oldTable = yield getTable(appId, ctx.request.body._id);
148
+ oldTable = yield getTable(ctx.request.body._id);
150
149
  }
151
150
  if (hasTypeChanged(tableToSave, oldTable)) {
152
151
  ctx.throw(400, "A column type has changed.");
153
152
  }
154
- const db = new CouchDB(appId);
153
+ const db = getAppDB();
155
154
  const datasource = yield db.get(datasourceId);
156
155
  const oldTables = cloneDeep(datasource.entities);
157
156
  const tables = datasource.entities;
@@ -215,13 +214,12 @@ exports.save = function (ctx) {
215
214
  };
216
215
  exports.destroy = function (ctx) {
217
216
  return __awaiter(this, void 0, void 0, function* () {
218
- const appId = ctx.appId;
219
- const tableToDelete = yield getTable(appId, ctx.params.tableId);
217
+ const tableToDelete = yield getTable(ctx.params.tableId);
220
218
  if (!tableToDelete || !tableToDelete.created) {
221
219
  ctx.throw(400, "Cannot delete tables which weren't created in Budibase.");
222
220
  }
223
221
  const datasourceId = getDatasourceId(tableToDelete);
224
- const db = new CouchDB(appId);
222
+ const db = getAppDB();
225
223
  const datasource = yield db.get(datasourceId);
226
224
  const tables = datasource.entities;
227
225
  const operation = DataSourceOperation.DELETE_TABLE;
@@ -234,14 +232,13 @@ exports.destroy = function (ctx) {
234
232
  };
235
233
  exports.bulkImport = function (ctx) {
236
234
  return __awaiter(this, void 0, void 0, function* () {
237
- const appId = ctx.appId;
238
- const table = yield getTable(appId, ctx.params.tableId);
235
+ const table = yield getTable(ctx.params.tableId);
239
236
  const { dataImport } = ctx.request.body;
240
237
  if (!dataImport || !dataImport.schema || !dataImport.csvString) {
241
238
  ctx.throw(400, "Provided data import information is invalid.");
242
239
  }
243
240
  const rows = yield csvParser.transform(Object.assign(Object.assign({}, dataImport), { existingTable: table }));
244
- yield handleRequest(appId, DataSourceOperation.BULK_CREATE, table._id, {
241
+ yield handleRequest(DataSourceOperation.BULK_CREATE, table._id, {
245
242
  rows,
246
243
  });
247
244
  return table;
@@ -8,13 +8,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
9
  });
10
10
  };
11
- const CouchDB = require("../../../db");
12
11
  const internal = require("./internal");
13
12
  const external = require("./external");
14
13
  const csvParser = require("../../../utilities/csvParser");
15
- const { isExternalTable } = require("../../../integrations/utils");
16
- const { getTableParams, getDatasourceParams, BudibaseInternalDB, } = require("../../../db/utils");
17
- const { getTable } = require("./utils");
14
+ const { isExternalTable, isSQL } = require("../../../integrations/utils");
15
+ const { getDatasourceParams } = require("../../../db/utils");
16
+ const { getAppDB } = require("@budibase/backend-core/context");
17
+ const { getTable, getAllInternalTables } = require("./utils");
18
18
  function pickApi({ tableId, table }) {
19
19
  if (table && !tableId) {
20
20
  tableId = table._id;
@@ -30,16 +30,19 @@ function pickApi({ tableId, table }) {
30
30
  // covers both internal and external
31
31
  exports.fetch = function (ctx) {
32
32
  return __awaiter(this, void 0, void 0, function* () {
33
- const db = new CouchDB(ctx.appId);
34
- const internalTables = yield db.allDocs(getTableParams(null, {
35
- include_docs: true,
36
- }));
37
- const internal = internalTables.rows.map(row => (Object.assign(Object.assign({}, row.doc), { type: "internal", sourceId: BudibaseInternalDB._id })));
33
+ const db = getAppDB();
34
+ const internal = yield getAllInternalTables();
38
35
  const externalTables = yield db.allDocs(getDatasourceParams("plus", {
39
36
  include_docs: true,
40
37
  }));
41
- const external = externalTables.rows.flatMap(row => {
42
- return Object.values(row.doc.entities || {}).map(entity => (Object.assign(Object.assign({}, entity), { type: "external", sourceId: row.doc._id })));
38
+ const external = externalTables.rows.flatMap(tableDoc => {
39
+ let entities = tableDoc.doc.entities;
40
+ if (entities) {
41
+ return Object.values(entities).map(entity => (Object.assign(Object.assign({}, entity), { type: "external", sourceId: tableDoc.doc._id, sql: isSQL(tableDoc.doc) })));
42
+ }
43
+ else {
44
+ return [];
45
+ }
43
46
  });
44
47
  ctx.body = [...internal, ...external];
45
48
  });
@@ -47,7 +50,7 @@ exports.fetch = function (ctx) {
47
50
  exports.find = function (ctx) {
48
51
  return __awaiter(this, void 0, void 0, function* () {
49
52
  const tableId = ctx.params.id;
50
- ctx.body = yield getTable(ctx.appId, tableId);
53
+ ctx.body = yield getTable(tableId);
51
54
  });
52
55
  };
53
56
  exports.save = function (ctx) {
@@ -90,7 +93,7 @@ exports.validateCSVSchema = function (ctx) {
90
93
  const { csvString, schema = {}, tableId } = ctx.request.body;
91
94
  let existingTable;
92
95
  if (tableId) {
93
- existingTable = yield getTable(ctx.appId, tableId);
96
+ existingTable = yield getTable(tableId);
94
97
  }
95
98
  let result = yield csvParser.parse(csvString, schema);
96
99
  if (existingTable) {
@@ -19,15 +19,18 @@ var __rest = (this && this.__rest) || function (s, e) {
19
19
  }
20
20
  return t;
21
21
  };
22
- const CouchDB = require("../../../db");
23
22
  const linkRows = require("../../../db/linkedRows");
24
23
  const { getRowParams, generateTableID } = require("../../../db/utils");
25
24
  const { FieldTypes } = require("../../../constants");
26
25
  const { TableSaveFunctions, hasTypeChanged, getTable, handleDataImport, } = require("./utils");
26
+ const usageQuota = require("../../../utilities/usageQuota");
27
+ const { getAppDB } = require("@budibase/backend-core/context");
28
+ const env = require("../../../environment");
29
+ const { cleanupAttachments } = require("../../../utilities/rowProcessor");
30
+ const { runStaticFormulaChecks } = require("./bulkFormula");
27
31
  exports.save = function (ctx) {
28
32
  return __awaiter(this, void 0, void 0, function* () {
29
- const appId = ctx.appId;
30
- const db = new CouchDB(appId);
33
+ const db = getAppDB();
31
34
  const _a = ctx.request.body, { dataImport } = _a, rest = __rest(_a, ["dataImport"]);
32
35
  let tableToSave = Object.assign({ type: "table", _id: generateTableID(), views: {} }, rest);
33
36
  // if the table obj had an _id then it will have been retrieved
@@ -41,8 +44,7 @@ exports.save = function (ctx) {
41
44
  // saving a table is a complex operation, involving many different steps, this
42
45
  // has been broken out into a utility to make it more obvious/easier to manipulate
43
46
  const tableSaveFunctions = new TableSaveFunctions({
44
- db,
45
- ctx,
47
+ user: ctx.user,
46
48
  oldTable,
47
49
  dataImport,
48
50
  });
@@ -82,7 +84,6 @@ exports.save = function (ctx) {
82
84
  // update linked rows
83
85
  try {
84
86
  const linkResp = yield linkRows.updateLinks({
85
- appId,
86
87
  eventType: oldTable
87
88
  ? linkRows.EventType.TABLE_UPDATED
88
89
  : linkRows.EventType.TABLE_SAVE,
@@ -105,42 +106,47 @@ exports.save = function (ctx) {
105
106
  const result = yield db.put(tableToSave);
106
107
  tableToSave._rev = result.rev;
107
108
  tableToSave = yield tableSaveFunctions.after(tableToSave);
109
+ // has to run after, make sure it has _id
110
+ yield runStaticFormulaChecks(tableToSave, { oldTable });
108
111
  return tableToSave;
109
112
  });
110
113
  };
111
114
  exports.destroy = function (ctx) {
112
115
  return __awaiter(this, void 0, void 0, function* () {
113
- const appId = ctx.appId;
114
- const db = new CouchDB(appId);
116
+ const db = getAppDB();
115
117
  const tableToDelete = yield db.get(ctx.params.tableId);
116
118
  // Delete all rows for that table
117
119
  const rows = yield db.allDocs(getRowParams(ctx.params.tableId, null, {
118
120
  include_docs: true,
119
121
  }));
120
122
  yield db.bulkDocs(rows.rows.map(row => (Object.assign(Object.assign({}, row.doc), { _deleted: true }))));
123
+ yield usageQuota.update(usageQuota.Properties.ROW, -rows.rows.length);
121
124
  // update linked rows
122
125
  yield linkRows.updateLinks({
123
- appId,
124
126
  eventType: linkRows.EventType.TABLE_DELETE,
125
127
  table: tableToDelete,
126
128
  });
127
129
  // don't remove the table itself until very end
128
130
  yield db.remove(tableToDelete);
129
131
  // remove table search index
130
- const currentIndexes = yield db.getIndexes();
131
- const existingIndex = currentIndexes.indexes.find(existing => existing.name === `search:${ctx.params.tableId}`);
132
- if (existingIndex) {
133
- yield db.deleteIndex(existingIndex);
132
+ if (!env.isTest()) {
133
+ const currentIndexes = yield db.getIndexes();
134
+ const existingIndex = currentIndexes.indexes.find(existing => existing.name === `search:${ctx.params.tableId}`);
135
+ if (existingIndex) {
136
+ yield db.deleteIndex(existingIndex);
137
+ }
134
138
  }
139
+ // has to run after, make sure it has _id
140
+ yield runStaticFormulaChecks(tableToDelete, { deletion: true });
141
+ yield cleanupAttachments(tableToDelete, { rows });
135
142
  return tableToDelete;
136
143
  });
137
144
  };
138
145
  exports.bulkImport = function (ctx) {
139
146
  return __awaiter(this, void 0, void 0, function* () {
140
- const appId = ctx.appId;
141
- const table = yield getTable(appId, ctx.params.tableId);
147
+ const table = yield getTable(ctx.params.tableId);
142
148
  const { dataImport } = ctx.request.body;
143
- yield handleDataImport(appId, ctx.user, table, dataImport);
149
+ yield handleDataImport(ctx.user, table, dataImport);
144
150
  return table;
145
151
  });
146
152
  };