@budibase/server 1.0.49-alpha.0 → 1.0.49-alpha.12

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 (357) 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.8184eed9.js → index.0bdf1cad.js} +195 -194
  8. package/builder/assets/{index.dd9e386f.css → index.83c0944f.css} +1 -1
  9. package/builder/assets/{vendor.3bd2f661.js → vendor.d526bfe8.js} +1 -1
  10. package/builder/index.html +3 -3
  11. package/coverage/clover.xml +2927 -2819
  12. package/coverage/coverage-final.json +104 -103
  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 +157 -136
  16. package/coverage/lcov-report/api/controllers/auth.js.html +11 -14
  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 +10 -13
  21. package/coverage/lcov-report/api/controllers/datasource.js.html +31 -37
  22. package/coverage/lcov-report/api/controllers/dev.js.html +6 -6
  23. package/coverage/lcov-report/api/controllers/index.html +69 -54
  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/{migrations/usageQuotas/syncApps.js.html → api/controllers/migrations.js.html} +30 -45
  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 +52 -37
  36. package/coverage/lcov-report/api/controllers/row/index.js.html +13 -13
  37. package/coverage/lcov-report/api/controllers/row/internal.js.html +108 -216
  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 +27 -24
  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 +57 -42
  46. package/coverage/lcov-report/api/controllers/table/index.js.html +28 -70
  47. package/coverage/lcov-report/api/controllers/table/internal.js.html +56 -47
  48. package/coverage/lcov-report/api/controllers/table/utils.js.html +169 -85
  49. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  50. package/coverage/lcov-report/api/controllers/user.js.html +43 -52
  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 +3 -3
  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 +22 -7
  71. package/coverage/lcov-report/api/routes/index.js.html +10 -4
  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/{migrations/usageQuotas/index.js.html → api/routes/migrations.js.html} +25 -55
  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 +1 -1
  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 +7 -10
  96. package/coverage/lcov-report/automations/steps/delay.js.html +4 -4
  97. package/coverage/lcov-report/automations/steps/deleteRow.js.html +7 -7
  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 +1 -1
  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 +42 -27
  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 +1 -1
  129. package/coverage/lcov-report/db/index.js.html +3 -3
  130. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +15 -27
  131. package/coverage/lcov-report/db/linkedRows/index.html +27 -27
  132. package/coverage/lcov-report/db/linkedRows/index.js.html +40 -85
  133. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +40 -40
  134. package/coverage/lcov-report/db/newid.js.html +4 -4
  135. package/coverage/lcov-report/db/utils.js.html +75 -75
  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 +107 -122
  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 +21 -15
  145. package/coverage/lcov-report/middleware/builder.js.html +3 -3
  146. package/coverage/lcov-report/middleware/currentapp.js.html +72 -60
  147. package/coverage/lcov-report/middleware/index.html +28 -28
  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 +29 -35
  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 +25 -25
  155. package/coverage/lcov-report/threads/index.js.html +10 -10
  156. package/coverage/lcov-report/threads/query.js.html +26 -47
  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 +57 -48
  163. package/coverage/lcov-report/utilities/index.html +27 -27
  164. package/coverage/lcov-report/utilities/index.js.html +42 -72
  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 +65 -71
  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 +1 -1
  176. package/coverage/lcov-report/utilities/usageQuota/index.js.html +13 -10
  177. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +5 -2
  178. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  179. package/coverage/lcov-report/utilities/users.js.html +9 -9
  180. package/coverage/lcov-report/utilities/workerRequests.js.html +16 -16
  181. package/coverage/lcov.info +4620 -4358
  182. package/dist/api/controllers/application.js +49 -48
  183. package/dist/api/controllers/auth.js +4 -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 +9 -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 +7 -6
  205. package/dist/api/controllers/screen.js +5 -7
  206. package/dist/api/controllers/static/index.js +4 -4
  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 +7 -10
  210. package/dist/api/controllers/table/internal.js +20 -16
  211. package/dist/api/controllers/table/utils.js +54 -34
  212. package/dist/api/controllers/user.js +16 -20
  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 -0
  217. package/dist/api/routes/migrations.js +9 -0
  218. package/dist/api/routes/tests/utilities/TestFunctions.js +37 -17
  219. package/dist/app.js +35 -5
  220. package/dist/automations/automationUtils.js +2 -3
  221. package/dist/automations/steps/createRow.js +1 -1
  222. package/dist/automations/steps/updateRow.js +1 -1
  223. package/dist/automations/triggers.js +27 -25
  224. package/dist/automations/utils.js +10 -5
  225. package/dist/constants/index.js +4 -0
  226. package/dist/db/linkedRows/LinkController.js +3 -7
  227. package/dist/db/linkedRows/index.js +16 -27
  228. package/dist/db/linkedRows/linkUtils.js +6 -6
  229. package/dist/db/views/staticViews.js +9 -10
  230. package/dist/environment.js +3 -1
  231. package/dist/integrations/base/sql.js +43 -8
  232. package/dist/integrations/utils.js +3 -0
  233. package/dist/middleware/authorized.js +5 -3
  234. package/dist/middleware/builder.js +2 -2
  235. package/dist/middleware/currentapp.js +41 -37
  236. package/dist/middleware/usageQuota.js +2 -4
  237. package/dist/migrations/functions/appUrls.js +46 -0
  238. package/dist/migrations/functions/quotas1.js +50 -0
  239. package/dist/migrations/{usageQuotas → functions/usageQuotas}/index.js +6 -10
  240. package/dist/migrations/{usageQuotas → functions/usageQuotas}/syncApps.js +12 -9
  241. package/dist/migrations/{usageQuotas → functions/usageQuotas}/syncRows.js +16 -12
  242. package/dist/migrations/functions/userEmailViewCasing.js +24 -0
  243. package/dist/migrations/index.js +62 -0
  244. package/dist/package.json +4 -4
  245. package/dist/tests/utilities/TestConfiguration.js +70 -44
  246. package/dist/threads/automation.js +13 -11
  247. package/dist/threads/query.js +13 -19
  248. package/dist/tsconfig.tsbuildinfo +1 -1
  249. package/dist/utilities/fileSystem/index.js +4 -3
  250. package/dist/utilities/global.js +15 -12
  251. package/dist/utilities/index.js +7 -17
  252. package/dist/utilities/routing/index.js +5 -5
  253. package/dist/utilities/rowProcessor/index.js +23 -17
  254. package/dist/utilities/rowProcessor/utils.js +14 -4
  255. package/dist/utilities/usageQuota/index.js +1 -0
  256. package/dist/utilities/usageQuota/rows.js +1 -0
  257. package/dist/utilities/users.js +3 -3
  258. package/dist/utilities/workerRequests.js +4 -4
  259. package/package.json +5 -5
  260. package/scripts/integrations/postgres/init.sql +11 -6
  261. package/scripts/likeCypress.ts +1 -1
  262. package/src/api/controllers/application.js +38 -31
  263. package/src/api/controllers/auth.js +4 -5
  264. package/src/api/controllers/automation.js +13 -23
  265. package/src/api/controllers/cloud.js +2 -3
  266. package/src/api/controllers/component.js +3 -4
  267. package/src/api/controllers/datasource.js +9 -11
  268. package/src/api/controllers/deploy/Deployment.js +3 -7
  269. package/src/api/controllers/deploy/index.js +20 -13
  270. package/src/api/controllers/dev.js +5 -5
  271. package/src/api/controllers/layout.js +3 -3
  272. package/src/api/controllers/metadata.js +4 -9
  273. package/src/api/controllers/migrations.js +13 -0
  274. package/src/api/controllers/permission.js +4 -4
  275. package/src/api/controllers/query/import/index.ts +4 -6
  276. package/src/api/controllers/query/import/tests/index.spec.js +2 -1
  277. package/src/api/controllers/query/index.js +11 -10
  278. package/src/api/controllers/role.js +5 -5
  279. package/src/api/controllers/routing.js +5 -6
  280. package/src/api/controllers/row/ExternalRequest.ts +67 -43
  281. package/src/api/controllers/row/external.js +27 -58
  282. package/src/api/controllers/row/internal.js +54 -90
  283. package/src/api/controllers/row/internalSearch.js +23 -17
  284. package/src/api/controllers/row/staticFormula.js +156 -0
  285. package/src/api/controllers/row/utils.js +7 -6
  286. package/src/api/controllers/screen.js +5 -7
  287. package/src/api/controllers/static/index.js +4 -4
  288. package/src/api/controllers/table/bulkFormula.js +173 -0
  289. package/src/api/controllers/table/external.js +7 -10
  290. package/src/api/controllers/table/index.js +7 -21
  291. package/src/api/controllers/table/internal.js +22 -19
  292. package/src/api/controllers/table/utils.js +70 -42
  293. package/src/api/controllers/user.js +17 -20
  294. package/src/api/controllers/view/index.js +8 -10
  295. package/src/api/controllers/view/utils.js +9 -4
  296. package/src/api/controllers/webhook.js +10 -8
  297. package/src/api/routes/index.js +2 -0
  298. package/src/api/routes/migrations.js +14 -0
  299. package/src/api/routes/tests/automation.spec.js +1 -0
  300. package/src/api/routes/tests/misc.spec.js +0 -1
  301. package/src/api/routes/tests/routing.spec.js +21 -12
  302. package/src/api/routes/tests/row.spec.js +7 -4
  303. package/src/api/routes/tests/utilities/TestFunctions.js +39 -17
  304. package/src/app.ts +18 -5
  305. package/src/automations/automationUtils.js +2 -3
  306. package/src/automations/steps/createRow.js +0 -1
  307. package/src/automations/steps/updateRow.js +1 -1
  308. package/src/automations/triggers.js +33 -31
  309. package/src/automations/utils.js +9 -5
  310. package/src/constants/index.js +5 -0
  311. package/src/db/linkedRows/LinkController.js +3 -7
  312. package/src/db/linkedRows/index.js +16 -31
  313. package/src/db/linkedRows/linkUtils.js +6 -6
  314. package/src/db/tests/linkController.spec.js +0 -1
  315. package/src/db/tests/linkTests.spec.js +5 -6
  316. package/src/db/views/staticViews.js +8 -10
  317. package/src/definitions/common.ts +3 -0
  318. package/src/environment.js +3 -1
  319. package/src/integrations/base/sql.ts +55 -14
  320. package/src/integrations/utils.ts +4 -1
  321. package/src/middleware/authorized.js +5 -3
  322. package/src/middleware/builder.js +2 -2
  323. package/src/middleware/currentapp.js +50 -46
  324. package/src/middleware/tests/authorized.spec.js +7 -2
  325. package/src/middleware/tests/currentapp.spec.js +6 -0
  326. package/src/middleware/usageQuota.js +2 -4
  327. package/src/migrations/functions/appUrls.ts +34 -0
  328. package/src/migrations/functions/quotas1.ts +20 -0
  329. package/src/migrations/functions/tests/appUrls.spec.js +29 -0
  330. package/src/migrations/{tests/usageQuotas/index.spec.js → functions/tests/quotas1.spec.js} +5 -5
  331. package/src/migrations/functions/tests/userEmailViewCasing.spec.js +25 -0
  332. package/src/migrations/functions/usageQuotas/index.ts +8 -0
  333. package/src/migrations/{usageQuotas/syncApps.js → functions/usageQuotas/syncApps.ts} +6 -6
  334. package/src/migrations/functions/usageQuotas/syncRows.ts +22 -0
  335. package/src/migrations/{tests/usageQuotas → functions/usageQuotas/tests}/syncApps.spec.js +4 -4
  336. package/src/migrations/{tests/usageQuotas → functions/usageQuotas/tests}/syncRows.spec.js +4 -4
  337. package/src/migrations/functions/userEmailViewCasing.ts +13 -0
  338. package/src/migrations/index.ts +56 -0
  339. package/src/module.d.ts +3 -0
  340. package/src/tests/utilities/TestConfiguration.js +73 -50
  341. package/src/threads/automation.js +17 -15
  342. package/src/threads/query.js +14 -21
  343. package/src/utilities/fileSystem/index.js +4 -3
  344. package/src/utilities/global.js +15 -12
  345. package/src/utilities/index.js +7 -17
  346. package/src/utilities/routing/index.js +5 -5
  347. package/src/utilities/rowProcessor/index.js +25 -27
  348. package/src/utilities/rowProcessor/utils.js +23 -7
  349. package/src/utilities/usageQuota/index.js +1 -0
  350. package/src/utilities/usageQuota/rows.js +1 -0
  351. package/src/utilities/users.js +3 -3
  352. package/src/utilities/workerRequests.js +4 -4
  353. package/tsconfig.json +2 -1
  354. package/coverage/lcov-report/migrations/usageQuotas/index.html +0 -141
  355. package/coverage/lcov-report/migrations/usageQuotas/syncRows.js.html +0 -143
  356. package/src/migrations/usageQuotas/index.js +0 -24
  357. package/src/migrations/usageQuotas/syncRows.js +0 -21
@@ -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",
@@ -15,13 +15,13 @@ const uuid = require("uuid");
15
15
  const { ObjectStoreBuckets } = require("../../../constants");
16
16
  const { processString } = require("@budibase/string-templates");
17
17
  const { getAllApps } = require("@budibase/backend-core/db");
18
- const CouchDB = require("../../../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 } = require("@budibase/backend-core/context");
25
25
  const AWS = require("aws-sdk");
26
26
  const AWS_REGION = env.AWS_REGION ? env.AWS_REGION : "eu-west-1";
27
27
  function prepareUpload({ s3Key, bucket, metadata, file }) {
@@ -48,7 +48,7 @@ function getAppIdFromUrl(ctx) {
48
48
  // the "appId" component of the URL can be the id or the custom url
49
49
  let possibleAppUrl = `/${encodeURI(ctx.params.appId).toLowerCase()}`;
50
50
  // search prod apps for a url that matches, exclude dev where id is always used
51
- const apps = yield getAllApps(CouchDB, { dev: false });
51
+ const apps = yield getAllApps({ dev: false });
52
52
  const app = apps.filter(a => a.url && a.url.toLowerCase() === possibleAppUrl)[0];
53
53
  if (app && app.appId) {
54
54
  return app.appId;
@@ -86,7 +86,7 @@ exports.serveApp = function (ctx) {
86
86
  return __awaiter(this, void 0, void 0, function* () {
87
87
  let appId = yield getAppIdFromUrl(ctx);
88
88
  const App = require("./templates/BudibaseApp.svelte").default;
89
- const db = new CouchDB(appId, { skip_setup: true });
89
+ const db = getAppDB({ skip_setup: true });
90
90
  const appInfo = yield db.get(DocumentTypes.APP_METADATA);
91
91
  const { head, html, css } = App.render({
92
92
  title: appInfo.name,
@@ -113,7 +113,7 @@ exports.serveClientLibrary = function (ctx) {
113
113
  exports.getSignedUploadURL = function (ctx) {
114
114
  var _a, _b, _c;
115
115
  return __awaiter(this, void 0, void 0, function* () {
116
- const database = new CouchDB(ctx.appId);
116
+ const database = getAppDB();
117
117
  // Ensure datasource is valid
118
118
  let datasource;
119
119
  try {
@@ -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
14
  const { isExternalTable, isSQL } = require("../../../integrations/utils");
16
- const { getTableParams, getDatasourceParams, BudibaseInternalDB, } = require("../../../db/utils");
17
- const { getTable } = require("./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,11 +30,8 @@ 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(tableDoc => (Object.assign(Object.assign({}, tableDoc.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
  }));
@@ -53,7 +50,7 @@ exports.fetch = function (ctx) {
53
50
  exports.find = function (ctx) {
54
51
  return __awaiter(this, void 0, void 0, function* () {
55
52
  const tableId = ctx.params.id;
56
- ctx.body = yield getTable(ctx.appId, tableId);
53
+ ctx.body = yield getTable(tableId);
57
54
  });
58
55
  };
59
56
  exports.save = function (ctx) {
@@ -96,7 +93,7 @@ exports.validateCSVSchema = function (ctx) {
96
93
  const { csvString, schema = {}, tableId } = ctx.request.body;
97
94
  let existingTable;
98
95
  if (tableId) {
99
- existingTable = yield getTable(ctx.appId, tableId);
96
+ existingTable = yield getTable(tableId);
100
97
  }
101
98
  let result = yield csvParser.parse(csvString, schema);
102
99
  if (existingTable) {
@@ -19,16 +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");
27
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");
28
31
  exports.save = function (ctx) {
29
32
  return __awaiter(this, void 0, void 0, function* () {
30
- const appId = ctx.appId;
31
- const db = new CouchDB(appId);
33
+ const db = getAppDB();
32
34
  const _a = ctx.request.body, { dataImport } = _a, rest = __rest(_a, ["dataImport"]);
33
35
  let tableToSave = Object.assign({ type: "table", _id: generateTableID(), views: {} }, rest);
34
36
  // if the table obj had an _id then it will have been retrieved
@@ -42,8 +44,7 @@ exports.save = function (ctx) {
42
44
  // saving a table is a complex operation, involving many different steps, this
43
45
  // has been broken out into a utility to make it more obvious/easier to manipulate
44
46
  const tableSaveFunctions = new TableSaveFunctions({
45
- db,
46
- ctx,
47
+ user: ctx.user,
47
48
  oldTable,
48
49
  dataImport,
49
50
  });
@@ -83,7 +84,6 @@ exports.save = function (ctx) {
83
84
  // update linked rows
84
85
  try {
85
86
  const linkResp = yield linkRows.updateLinks({
86
- appId,
87
87
  eventType: oldTable
88
88
  ? linkRows.EventType.TABLE_UPDATED
89
89
  : linkRows.EventType.TABLE_SAVE,
@@ -106,13 +106,14 @@ exports.save = function (ctx) {
106
106
  const result = yield db.put(tableToSave);
107
107
  tableToSave._rev = result.rev;
108
108
  tableToSave = yield tableSaveFunctions.after(tableToSave);
109
+ // has to run after, make sure it has _id
110
+ yield runStaticFormulaChecks(tableToSave, { oldTable });
109
111
  return tableToSave;
110
112
  });
111
113
  };
112
114
  exports.destroy = function (ctx) {
113
115
  return __awaiter(this, void 0, void 0, function* () {
114
- const appId = ctx.appId;
115
- const db = new CouchDB(appId);
116
+ const db = getAppDB();
116
117
  const tableToDelete = yield db.get(ctx.params.tableId);
117
118
  // Delete all rows for that table
118
119
  const rows = yield db.allDocs(getRowParams(ctx.params.tableId, null, {
@@ -122,27 +123,30 @@ exports.destroy = function (ctx) {
122
123
  yield usageQuota.update(usageQuota.Properties.ROW, -rows.rows.length);
123
124
  // update linked rows
124
125
  yield linkRows.updateLinks({
125
- appId,
126
126
  eventType: linkRows.EventType.TABLE_DELETE,
127
127
  table: tableToDelete,
128
128
  });
129
129
  // don't remove the table itself until very end
130
130
  yield db.remove(tableToDelete);
131
131
  // remove table search index
132
- const currentIndexes = yield db.getIndexes();
133
- const existingIndex = currentIndexes.indexes.find(existing => existing.name === `search:${ctx.params.tableId}`);
134
- if (existingIndex) {
135
- 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
+ }
136
138
  }
139
+ // has to run after, make sure it has _id
140
+ yield runStaticFormulaChecks(tableToDelete, { deletion: true });
141
+ yield cleanupAttachments(tableToDelete, { rows });
137
142
  return tableToDelete;
138
143
  });
139
144
  };
140
145
  exports.bulkImport = function (ctx) {
141
146
  return __awaiter(this, void 0, void 0, function* () {
142
- const appId = ctx.appId;
143
- const table = yield getTable(appId, ctx.params.tableId);
147
+ const table = yield getTable(ctx.params.tableId);
144
148
  const { dataImport } = ctx.request.body;
145
- yield handleDataImport(appId, ctx.user, table, dataImport);
149
+ yield handleDataImport(ctx.user, table, dataImport);
146
150
  return table;
147
151
  });
148
152
  };
@@ -8,18 +8,30 @@ 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 csvParser = require("../../../utilities/csvParser");
13
- const { getRowParams, generateRowID, InternalTables, } = require("../../../db/utils");
14
- const { isEqual } = require("lodash/fp");
12
+ const { getRowParams, generateRowID, InternalTables, getTableParams, BudibaseInternalDB, } = require("../../../db/utils");
13
+ const { isEqual } = require("lodash");
15
14
  const { AutoFieldSubTypes, FieldTypes } = require("../../../constants");
16
- const { inputProcessing } = require("../../../utilities/rowProcessor");
15
+ const { inputProcessing, cleanupAttachments, } = require("../../../utilities/rowProcessor");
17
16
  const { USERS_TABLE_SCHEMA, SwitchableTypes, CanSwitchTypes, } = require("../../../constants");
18
17
  const { isExternalTable, breakExternalTableId, isSQL, } = require("../../../integrations/utils");
19
18
  const { getViews, saveView } = require("../view/utils");
20
19
  const viewTemplate = require("../view/viewBuilder");
21
20
  const usageQuota = require("../../../utilities/usageQuota");
22
- exports.checkForColumnUpdates = (db, oldTable, updatedTable) => __awaiter(void 0, void 0, void 0, function* () {
21
+ const { getAppDB } = require("@budibase/backend-core/context");
22
+ const { cloneDeep } = require("lodash/fp");
23
+ exports.clearColumns = (table, columnNames) => __awaiter(void 0, void 0, void 0, function* () {
24
+ const db = getAppDB();
25
+ const rows = yield db.allDocs(getRowParams(table._id, null, {
26
+ include_docs: true,
27
+ }));
28
+ return db.bulkDocs(rows.rows.map(({ doc }) => {
29
+ columnNames.forEach(colName => delete doc[colName]);
30
+ return doc;
31
+ }));
32
+ });
33
+ exports.checkForColumnUpdates = (oldTable, updatedTable) => __awaiter(void 0, void 0, void 0, function* () {
34
+ const db = getAppDB();
23
35
  let updatedRows = [];
24
36
  const rename = updatedTable._rename;
25
37
  let deletedColumns = [];
@@ -32,18 +44,22 @@ exports.checkForColumnUpdates = (db, oldTable, updatedTable) => __awaiter(void 0
32
44
  const rows = yield db.allDocs(getRowParams(updatedTable._id, null, {
33
45
  include_docs: true,
34
46
  }));
35
- updatedRows = rows.rows.map(({ doc }) => {
47
+ const rawRows = rows.rows.map(({ doc }) => doc);
48
+ updatedRows = rawRows.map(row => {
49
+ row = cloneDeep(row);
36
50
  if (rename) {
37
- doc[rename.updated] = doc[rename.old];
38
- delete doc[rename.old];
51
+ row[rename.updated] = row[rename.old];
52
+ delete row[rename.old];
39
53
  }
40
54
  else if (deletedColumns.length !== 0) {
41
- deletedColumns.forEach(colName => delete doc[colName]);
55
+ deletedColumns.forEach(colName => delete row[colName]);
42
56
  }
43
- return doc;
57
+ return row;
44
58
  });
59
+ // cleanup any attachments from object storage for deleted attachment columns
60
+ yield cleanupAttachments(updatedTable, { oldTable, rows: rawRows });
45
61
  // Update views
46
- yield exports.checkForViewUpdates(db, updatedTable, rename, deletedColumns);
62
+ yield exports.checkForViewUpdates(updatedTable, rename, deletedColumns);
47
63
  delete updatedTable._rename;
48
64
  }
49
65
  return { rows: updatedRows, table: updatedTable };
@@ -66,11 +82,11 @@ exports.makeSureTableUpToDate = (table, tableToSave) => {
66
82
  }
67
83
  return tableToSave;
68
84
  };
69
- exports.handleDataImport = (appId, user, table, dataImport) => __awaiter(void 0, void 0, void 0, function* () {
85
+ exports.handleDataImport = (user, table, dataImport) => __awaiter(void 0, void 0, void 0, function* () {
70
86
  if (!dataImport || !dataImport.csvString) {
71
87
  return table;
72
88
  }
73
- const db = new CouchDB(appId);
89
+ const db = getAppDB();
74
90
  // Populate the table with rows imported from CSV in a bulk update
75
91
  const data = yield csvParser.transform(Object.assign(Object.assign({}, dataImport), { existingTable: table }));
76
92
  let finalData = [];
@@ -105,8 +121,8 @@ exports.handleDataImport = (appId, user, table, dataImport) => __awaiter(void 0,
105
121
  table._rev = response._rev;
106
122
  return table;
107
123
  });
108
- exports.handleSearchIndexes = (appId, table) => __awaiter(void 0, void 0, void 0, function* () {
109
- const db = new CouchDB(appId);
124
+ exports.handleSearchIndexes = (table) => __awaiter(void 0, void 0, void 0, function* () {
125
+ const db = getAppDB();
110
126
  // create relevant search indexes
111
127
  if (table.indexes && table.indexes.length > 0) {
112
128
  const currentIndexes = yield db.getIndexes();
@@ -155,12 +171,9 @@ exports.checkStaticTables = table => {
155
171
  return table;
156
172
  };
157
173
  class TableSaveFunctions {
158
- constructor({ db, ctx, oldTable, dataImport }) {
159
- this.db = db;
160
- this.ctx = ctx;
161
- if (this.ctx && this.ctx.user) {
162
- this.appId = this.ctx.appId;
163
- }
174
+ constructor({ user, oldTable, dataImport }) {
175
+ this.db = getAppDB();
176
+ this.user = user;
164
177
  this.oldTable = oldTable;
165
178
  this.dataImport = dataImport;
166
179
  // any rows that need updated
@@ -179,7 +192,7 @@ class TableSaveFunctions {
179
192
  // when confirmed valid
180
193
  mid(table) {
181
194
  return __awaiter(this, void 0, void 0, function* () {
182
- let response = yield exports.checkForColumnUpdates(this.db, this.oldTable, table);
195
+ let response = yield exports.checkForColumnUpdates(this.oldTable, table);
183
196
  this.rows = this.rows.concat(response.rows);
184
197
  return table;
185
198
  });
@@ -187,8 +200,8 @@ class TableSaveFunctions {
187
200
  // after saving
188
201
  after(table) {
189
202
  return __awaiter(this, void 0, void 0, function* () {
190
- table = yield exports.handleSearchIndexes(this.appId, table);
191
- table = yield exports.handleDataImport(this.appId, this.ctx.user, table, this.dataImport);
203
+ table = yield exports.handleSearchIndexes(table);
204
+ table = yield exports.handleDataImport(this.user, table, this.dataImport);
192
205
  return table;
193
206
  });
194
207
  }
@@ -196,32 +209,39 @@ class TableSaveFunctions {
196
209
  return this.rows;
197
210
  }
198
211
  }
199
- exports.getAllExternalTables = (appId, datasourceId) => __awaiter(void 0, void 0, void 0, function* () {
200
- const db = new CouchDB(appId);
212
+ exports.getAllInternalTables = () => __awaiter(void 0, void 0, void 0, function* () {
213
+ const db = getAppDB();
214
+ const internalTables = yield db.allDocs(getTableParams(null, {
215
+ include_docs: true,
216
+ }));
217
+ return internalTables.rows.map(tableDoc => (Object.assign(Object.assign({}, tableDoc.doc), { type: "internal", sourceId: BudibaseInternalDB._id })));
218
+ });
219
+ exports.getAllExternalTables = (datasourceId) => __awaiter(void 0, void 0, void 0, function* () {
220
+ const db = getAppDB();
201
221
  const datasource = yield db.get(datasourceId);
202
222
  if (!datasource || !datasource.entities) {
203
223
  throw "Datasource is not configured fully.";
204
224
  }
205
225
  return datasource.entities;
206
226
  });
207
- exports.getExternalTable = (appId, datasourceId, tableName) => __awaiter(void 0, void 0, void 0, function* () {
208
- const entities = yield exports.getAllExternalTables(appId, datasourceId);
227
+ exports.getExternalTable = (datasourceId, tableName) => __awaiter(void 0, void 0, void 0, function* () {
228
+ const entities = yield exports.getAllExternalTables(datasourceId);
209
229
  return entities[tableName];
210
230
  });
211
- exports.getTable = (appId, tableId) => __awaiter(void 0, void 0, void 0, function* () {
212
- const db = new CouchDB(appId);
231
+ exports.getTable = (tableId) => __awaiter(void 0, void 0, void 0, function* () {
232
+ const db = getAppDB();
213
233
  if (isExternalTable(tableId)) {
214
234
  let { datasourceId, tableName } = breakExternalTableId(tableId);
215
235
  const datasource = yield db.get(datasourceId);
216
- const table = yield exports.getExternalTable(appId, datasourceId, tableName);
236
+ const table = yield exports.getExternalTable(datasourceId, tableName);
217
237
  return Object.assign(Object.assign({}, table), { sql: isSQL(datasource) });
218
238
  }
219
239
  else {
220
240
  return db.get(tableId);
221
241
  }
222
242
  });
223
- exports.checkForViewUpdates = (db, table, rename, deletedColumns) => __awaiter(void 0, void 0, void 0, function* () {
224
- const views = yield getViews(db);
243
+ exports.checkForViewUpdates = (table, rename, deletedColumns) => __awaiter(void 0, void 0, void 0, function* () {
244
+ const views = yield getViews();
225
245
  const tableViews = views.filter(view => view.meta.tableId === table._id);
226
246
  // Check each table view to see if impacted by this table action
227
247
  for (let view of tableViews) {
@@ -277,7 +297,7 @@ exports.checkForViewUpdates = (db, table, rename, deletedColumns) => __awaiter(v
277
297
  // Update view if required
278
298
  if (needsUpdated) {
279
299
  const newViewTemplate = viewTemplate(view.meta);
280
- yield saveView(db, null, view.name, newViewTemplate);
300
+ yield saveView(null, view.name, newViewTemplate);
281
301
  if (!newViewTemplate.meta.schema) {
282
302
  newViewTemplate.meta.schema = table.schema;
283
303
  }