@budibase/server 1.0.49-alpha.5 → 1.0.49-alpha.9

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 (316) hide show
  1. package/builder/assets/{index.8f94a789.js → index.ad5370ae.js} +181 -181
  2. package/builder/index.html +1 -1
  3. package/coverage/clover.xml +1926 -1951
  4. package/coverage/coverage-final.json +54 -54
  5. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  6. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  7. package/coverage/lcov-report/api/controllers/application.js.html +58 -37
  8. package/coverage/lcov-report/api/controllers/auth.js.html +11 -14
  9. package/coverage/lcov-report/api/controllers/automation.js.html +21 -51
  10. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  11. package/coverage/lcov-report/api/controllers/cloud.js.html +8 -11
  12. package/coverage/lcov-report/api/controllers/component.js.html +10 -13
  13. package/coverage/lcov-report/api/controllers/datasource.js.html +17 -23
  14. package/coverage/lcov-report/api/controllers/dev.js.html +6 -6
  15. package/coverage/lcov-report/api/controllers/index.html +52 -52
  16. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  17. package/coverage/lcov-report/api/controllers/layout.js.html +4 -4
  18. package/coverage/lcov-report/api/controllers/metadata.js.html +6 -21
  19. package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/permission.js.html +6 -6
  21. package/coverage/lcov-report/api/controllers/query/index.html +10 -10
  22. package/coverage/lcov-report/api/controllers/query/index.js.html +21 -18
  23. package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
  24. package/coverage/lcov-report/api/controllers/role.js.html +9 -9
  25. package/coverage/lcov-report/api/controllers/routing.js.html +7 -10
  26. package/coverage/lcov-report/api/controllers/row/external.js.html +33 -126
  27. package/coverage/lcov-report/api/controllers/row/index.html +28 -28
  28. package/coverage/lcov-report/api/controllers/row/index.js.html +1 -1
  29. package/coverage/lcov-report/api/controllers/row/internal.js.html +37 -82
  30. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +19 -25
  31. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +14 -17
  32. package/coverage/lcov-report/api/controllers/row/utils.js.html +15 -12
  33. package/coverage/lcov-report/api/controllers/screen.js.html +10 -16
  34. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  35. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +20 -50
  36. package/coverage/lcov-report/api/controllers/table/external.js.html +15 -24
  37. package/coverage/lcov-report/api/controllers/table/index.html +37 -37
  38. package/coverage/lcov-report/api/controllers/table/index.js.html +7 -7
  39. package/coverage/lcov-report/api/controllers/table/internal.js.html +36 -45
  40. package/coverage/lcov-report/api/controllers/table/utils.js.html +40 -76
  41. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/user.js.html +26 -35
  43. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  44. package/coverage/lcov-report/api/controllers/view/index.html +16 -16
  45. package/coverage/lcov-report/api/controllers/view/index.js.html +15 -21
  46. package/coverage/lcov-report/api/controllers/view/utils.js.html +25 -10
  47. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  48. package/coverage/lcov-report/api/controllers/webhook.js.html +21 -15
  49. package/coverage/lcov-report/api/index.html +1 -1
  50. package/coverage/lcov-report/api/index.js.html +1 -1
  51. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/index.html +1 -1
  63. package/coverage/lcov-report/api/routes/index.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/static.js.html +1 -1
  76. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  79. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  80. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  81. package/coverage/lcov-report/automations/actions.js.html +1 -1
  82. package/coverage/lcov-report/automations/automationUtils.js.html +4 -7
  83. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  84. package/coverage/lcov-report/automations/index.html +18 -18
  85. package/coverage/lcov-report/automations/index.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  87. package/coverage/lcov-report/automations/steps/createRow.js.html +2 -5
  88. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/index.html +1 -1
  95. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  97. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  98. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  99. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  100. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  101. package/coverage/lcov-report/automations/steps/updateRow.js.html +2 -2
  102. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  103. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  104. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  105. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  106. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  107. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  108. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  109. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  110. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  111. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  112. package/coverage/lcov-report/automations/triggers.js.html +46 -40
  113. package/coverage/lcov-report/automations/utils.js.html +24 -12
  114. package/coverage/lcov-report/constants/index.html +1 -1
  115. package/coverage/lcov-report/constants/index.js.html +1 -1
  116. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  117. package/coverage/lcov-report/constants/screens.js.html +1 -1
  118. package/coverage/lcov-report/db/client.js.html +18 -18
  119. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  120. package/coverage/lcov-report/db/index.html +1 -1
  121. package/coverage/lcov-report/db/index.js.html +3 -3
  122. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +11 -23
  123. package/coverage/lcov-report/db/linkedRows/index.html +27 -27
  124. package/coverage/lcov-report/db/linkedRows/index.js.html +24 -66
  125. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +28 -28
  126. package/coverage/lcov-report/db/newid.js.html +1 -1
  127. package/coverage/lcov-report/db/utils.js.html +5 -5
  128. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  129. package/coverage/lcov-report/events/index.html +1 -1
  130. package/coverage/lcov-report/events/index.js.html +1 -1
  131. package/coverage/lcov-report/events/utils.js.html +1 -1
  132. package/coverage/lcov-report/index.html +90 -90
  133. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  134. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  135. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  136. package/coverage/lcov-report/middleware/authorized.js.html +21 -15
  137. package/coverage/lcov-report/middleware/builder.js.html +3 -3
  138. package/coverage/lcov-report/middleware/currentapp.js.html +72 -60
  139. package/coverage/lcov-report/middleware/index.html +28 -28
  140. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  141. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  142. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  143. package/coverage/lcov-report/middleware/usageQuota.js.html +29 -29
  144. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  145. package/coverage/lcov-report/threads/automation.js.html +30 -24
  146. package/coverage/lcov-report/threads/index.html +25 -25
  147. package/coverage/lcov-report/threads/index.js.html +1 -1
  148. package/coverage/lcov-report/threads/query.js.html +26 -47
  149. package/coverage/lcov-report/threads/utils.js.html +1 -1
  150. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  151. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  152. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  153. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  154. package/coverage/lcov-report/utilities/global.js.html +44 -35
  155. package/coverage/lcov-report/utilities/index.html +27 -27
  156. package/coverage/lcov-report/utilities/index.js.html +40 -70
  157. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +1 -1
  158. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  159. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  160. package/coverage/lcov-report/utilities/routing/index.js.html +7 -7
  161. package/coverage/lcov-report/utilities/rowProcessor/index.html +11 -11
  162. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +16 -58
  163. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  164. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  165. package/coverage/lcov-report/utilities/security.js.html +1 -1
  166. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  167. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  168. package/coverage/lcov-report/utilities/usageQuota/index.js.html +5 -2
  169. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +5 -2
  170. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  171. package/coverage/lcov-report/utilities/users.js.html +5 -5
  172. package/coverage/lcov-report/utilities/workerRequests.js.html +5 -5
  173. package/coverage/lcov.info +3197 -3223
  174. package/dist/api/controllers/application.js +31 -28
  175. package/dist/api/controllers/auth.js +4 -5
  176. package/dist/api/controllers/automation.js +14 -19
  177. package/dist/api/controllers/cloud.js +2 -3
  178. package/dist/api/controllers/component.js +3 -4
  179. package/dist/api/controllers/datasource.js +9 -10
  180. package/dist/api/controllers/deploy/Deployment.js +3 -6
  181. package/dist/api/controllers/deploy/index.js +12 -13
  182. package/dist/api/controllers/dev.js +5 -5
  183. package/dist/api/controllers/layout.js +3 -3
  184. package/dist/api/controllers/metadata.js +4 -4
  185. package/dist/api/controllers/permission.js +4 -4
  186. package/dist/api/controllers/query/import/index.js +4 -6
  187. package/dist/api/controllers/query/index.js +11 -10
  188. package/dist/api/controllers/role.js +5 -5
  189. package/dist/api/controllers/routing.js +5 -6
  190. package/dist/api/controllers/row/ExternalRequest.js +90 -67
  191. package/dist/api/controllers/row/external.js +14 -22
  192. package/dist/api/controllers/row/internal.js +29 -44
  193. package/dist/api/controllers/row/internalSearch.js +11 -13
  194. package/dist/api/controllers/row/staticFormula.js +11 -11
  195. package/dist/api/controllers/row/utils.js +7 -6
  196. package/dist/api/controllers/screen.js +5 -7
  197. package/dist/api/controllers/static/index.js +4 -4
  198. package/dist/api/controllers/table/bulkFormula.js +14 -15
  199. package/dist/api/controllers/table/external.js +7 -10
  200. package/dist/api/controllers/table/index.js +5 -5
  201. package/dist/api/controllers/table/internal.js +16 -19
  202. package/dist/api/controllers/table/utils.js +29 -31
  203. package/dist/api/controllers/user.js +16 -20
  204. package/dist/api/controllers/view/index.js +8 -10
  205. package/dist/api/controllers/view/utils.js +9 -4
  206. package/dist/api/controllers/webhook.js +10 -8
  207. package/dist/api/routes/tests/utilities/TestFunctions.js +37 -17
  208. package/dist/automations/automationUtils.js +2 -3
  209. package/dist/automations/steps/createRow.js +1 -1
  210. package/dist/automations/steps/updateRow.js +1 -1
  211. package/dist/automations/triggers.js +27 -25
  212. package/dist/automations/utils.js +10 -5
  213. package/dist/db/linkedRows/LinkController.js +3 -7
  214. package/dist/db/linkedRows/index.js +16 -26
  215. package/dist/db/linkedRows/linkUtils.js +6 -6
  216. package/dist/db/views/staticViews.js +9 -10
  217. package/dist/environment.js +2 -1
  218. package/dist/integrations/base/sql.js +43 -8
  219. package/dist/integrations/utils.js +3 -0
  220. package/dist/middleware/authorized.js +5 -3
  221. package/dist/middleware/builder.js +2 -2
  222. package/dist/middleware/currentapp.js +41 -37
  223. package/dist/middleware/usageQuota.js +2 -2
  224. package/dist/migrations/functions/usageQuotas/syncApps.js +6 -9
  225. package/dist/migrations/functions/usageQuotas/syncRows.js +7 -9
  226. package/dist/package.json +4 -4
  227. package/dist/tests/utilities/TestConfiguration.js +67 -44
  228. package/dist/threads/automation.js +13 -11
  229. package/dist/threads/query.js +13 -19
  230. package/dist/tsconfig.tsbuildinfo +1 -1
  231. package/dist/utilities/fileSystem/index.js +4 -3
  232. package/dist/utilities/global.js +15 -12
  233. package/dist/utilities/index.js +7 -17
  234. package/dist/utilities/routing/index.js +5 -5
  235. package/dist/utilities/rowProcessor/index.js +9 -10
  236. package/dist/utilities/usageQuota/index.js +1 -0
  237. package/dist/utilities/usageQuota/rows.js +1 -0
  238. package/dist/utilities/users.js +3 -3
  239. package/dist/utilities/workerRequests.js +4 -4
  240. package/package.json +5 -5
  241. package/scripts/integrations/postgres/init.sql +11 -6
  242. package/src/api/controllers/application.js +35 -28
  243. package/src/api/controllers/auth.js +4 -5
  244. package/src/api/controllers/automation.js +13 -23
  245. package/src/api/controllers/cloud.js +2 -3
  246. package/src/api/controllers/component.js +3 -4
  247. package/src/api/controllers/datasource.js +9 -11
  248. package/src/api/controllers/deploy/Deployment.js +3 -7
  249. package/src/api/controllers/deploy/index.js +20 -13
  250. package/src/api/controllers/dev.js +5 -5
  251. package/src/api/controllers/layout.js +3 -3
  252. package/src/api/controllers/metadata.js +4 -9
  253. package/src/api/controllers/permission.js +4 -4
  254. package/src/api/controllers/query/import/index.ts +4 -6
  255. package/src/api/controllers/query/import/tests/index.spec.js +2 -1
  256. package/src/api/controllers/query/index.js +11 -10
  257. package/src/api/controllers/role.js +5 -5
  258. package/src/api/controllers/routing.js +5 -6
  259. package/src/api/controllers/row/ExternalRequest.ts +67 -43
  260. package/src/api/controllers/row/external.js +27 -58
  261. package/src/api/controllers/row/internal.js +29 -44
  262. package/src/api/controllers/row/internalSearch.js +11 -13
  263. package/src/api/controllers/row/staticFormula.js +10 -11
  264. package/src/api/controllers/row/utils.js +7 -6
  265. package/src/api/controllers/screen.js +5 -7
  266. package/src/api/controllers/static/index.js +4 -4
  267. package/src/api/controllers/table/bulkFormula.js +13 -23
  268. package/src/api/controllers/table/external.js +7 -10
  269. package/src/api/controllers/table/index.js +5 -5
  270. package/src/api/controllers/table/internal.js +18 -21
  271. package/src/api/controllers/table/utils.js +29 -41
  272. package/src/api/controllers/user.js +17 -20
  273. package/src/api/controllers/view/index.js +8 -10
  274. package/src/api/controllers/view/utils.js +9 -4
  275. package/src/api/controllers/webhook.js +10 -8
  276. package/src/api/routes/tests/automation.spec.js +1 -0
  277. package/src/api/routes/tests/misc.spec.js +0 -1
  278. package/src/api/routes/tests/routing.spec.js +21 -12
  279. package/src/api/routes/tests/row.spec.js +7 -4
  280. package/src/api/routes/tests/utilities/TestFunctions.js +39 -17
  281. package/src/automations/automationUtils.js +2 -3
  282. package/src/automations/steps/createRow.js +0 -1
  283. package/src/automations/steps/updateRow.js +1 -1
  284. package/src/automations/triggers.js +33 -31
  285. package/src/automations/utils.js +9 -5
  286. package/src/db/linkedRows/LinkController.js +3 -7
  287. package/src/db/linkedRows/index.js +16 -30
  288. package/src/db/linkedRows/linkUtils.js +6 -6
  289. package/src/db/tests/linkController.spec.js +0 -1
  290. package/src/db/tests/linkTests.spec.js +5 -6
  291. package/src/db/views/staticViews.js +8 -10
  292. package/src/environment.js +2 -1
  293. package/src/integrations/base/sql.ts +55 -14
  294. package/src/integrations/utils.ts +4 -1
  295. package/src/middleware/authorized.js +5 -3
  296. package/src/middleware/builder.js +2 -2
  297. package/src/middleware/currentapp.js +50 -46
  298. package/src/middleware/tests/authorized.spec.js +7 -2
  299. package/src/middleware/tests/currentapp.spec.js +6 -0
  300. package/src/middleware/usageQuota.js +2 -2
  301. package/src/migrations/functions/usageQuotas/syncApps.ts +4 -4
  302. package/src/migrations/functions/usageQuotas/syncRows.ts +5 -4
  303. package/src/module.d.ts +3 -0
  304. package/src/tests/utilities/TestConfiguration.js +69 -50
  305. package/src/threads/automation.js +17 -15
  306. package/src/threads/query.js +14 -21
  307. package/src/utilities/fileSystem/index.js +4 -3
  308. package/src/utilities/global.js +15 -12
  309. package/src/utilities/index.js +7 -17
  310. package/src/utilities/routing/index.js +5 -5
  311. package/src/utilities/rowProcessor/index.js +9 -23
  312. package/src/utilities/usageQuota/index.js +1 -0
  313. package/src/utilities/usageQuota/rows.js +1 -0
  314. package/src/utilities/users.js +3 -3
  315. package/src/utilities/workerRequests.js +4 -4
  316. package/tsconfig.json +2 -1
@@ -1,4 +1,4 @@
1
- const CouchDB = require("../index")
1
+ const { getAppDB } = require("@budibase/backend-core/context")
2
2
  const {
3
3
  DocumentTypes,
4
4
  SEPARATOR,
@@ -21,12 +21,11 @@ const SCREEN_PREFIX = DocumentTypes.SCREEN + SEPARATOR
21
21
  /**
22
22
  * Creates the link view for the instance, this will overwrite the existing one, but this should only
23
23
  * be called if it is found that the view does not exist.
24
- * @param {string} appId The instance to which the view should be added.
25
24
  * @returns {Promise<void>} The view now exists, please note that the next view of this query will actually build it,
26
25
  * so it may be slow.
27
26
  */
28
- exports.createLinkView = async appId => {
29
- const db = new CouchDB(appId)
27
+ exports.createLinkView = async () => {
28
+ const db = getAppDB()
30
29
  const designDoc = await db.get("_design/database")
31
30
  const view = {
32
31
  map: function (doc) {
@@ -57,8 +56,8 @@ exports.createLinkView = async appId => {
57
56
  await db.put(designDoc)
58
57
  }
59
58
 
60
- exports.createRoutingView = async appId => {
61
- const db = new CouchDB(appId)
59
+ exports.createRoutingView = async () => {
60
+ const db = getAppDB()
62
61
  const designDoc = await db.get("_design/database")
63
62
  const view = {
64
63
  // if using variables in a map function need to inject them before use
@@ -78,8 +77,8 @@ exports.createRoutingView = async appId => {
78
77
  await db.put(designDoc)
79
78
  }
80
79
 
81
- async function searchIndex(appId, indexName, fnString) {
82
- const db = new CouchDB(appId)
80
+ async function searchIndex(indexName, fnString) {
81
+ const db = getAppDB()
83
82
  const designDoc = await db.get("_design/database")
84
83
  designDoc.indexes = {
85
84
  [indexName]: {
@@ -90,9 +89,8 @@ async function searchIndex(appId, indexName, fnString) {
90
89
  await db.put(designDoc)
91
90
  }
92
91
 
93
- exports.createAllSearchIndex = async appId => {
92
+ exports.createAllSearchIndex = async () => {
94
93
  await searchIndex(
95
- appId,
96
94
  SearchIndexes.ROWS,
97
95
  function (doc) {
98
96
  function idx(input, prev) {
@@ -2,7 +2,8 @@ function isTest() {
2
2
  return (
3
3
  process.env.NODE_ENV === "jest" ||
4
4
  process.env.NODE_ENV === "cypress" ||
5
- process.env.JEST_WORKER_ID != null
5
+ (process.env.JEST_WORKER_ID != null &&
6
+ process.env.JEST_WORKER_ID !== "null")
6
7
  )
7
8
  }
8
9
 
@@ -191,29 +191,70 @@ class InternalBuilder {
191
191
  if (!relationships) {
192
192
  return query
193
193
  }
194
+ const tableSets: Record<string, [any]> = {}
195
+ // aggregate into table sets (all the same to tables)
194
196
  for (let relationship of relationships) {
195
- const from = relationship.from,
196
- to = relationship.to,
197
- toTable = relationship.tableName
198
- if (!relationship.through) {
197
+ const keyObj: { toTable: string; throughTable: string | undefined } = {
198
+ toTable: relationship.tableName,
199
+ throughTable: undefined,
200
+ }
201
+ if (relationship.through) {
202
+ keyObj.throughTable = relationship.through
203
+ }
204
+ const key = JSON.stringify(keyObj)
205
+ if (tableSets[key]) {
206
+ tableSets[key].push(relationship)
207
+ } else {
208
+ tableSets[key] = [relationship]
209
+ }
210
+ }
211
+ for (let [key, relationships] of Object.entries(tableSets)) {
212
+ const { toTable, throughTable } = JSON.parse(key)
213
+ if (!throughTable) {
199
214
  // @ts-ignore
200
- query = query.leftJoin(
215
+ query = query.join(
201
216
  toTable,
202
- `${fromTable}.${from}`,
203
- `${toTable}.${to}`
217
+ function () {
218
+ for (let relationship of relationships) {
219
+ const from = relationship.from,
220
+ to = relationship.to
221
+ // @ts-ignore
222
+ this.orOn(`${fromTable}.${from}`, "=", `${toTable}.${to}`)
223
+ }
224
+ },
225
+ "left"
204
226
  )
205
227
  } else {
206
- const throughTable = relationship.through
207
- const fromPrimary = relationship.fromPrimary
208
- const toPrimary = relationship.toPrimary
209
228
  query = query
210
229
  // @ts-ignore
211
- .leftJoin(
230
+ .join(
212
231
  throughTable,
213
- `${fromTable}.${fromPrimary}`,
214
- `${throughTable}.${from}`
232
+ function () {
233
+ for (let relationship of relationships) {
234
+ const fromPrimary = relationship.fromPrimary
235
+ const from = relationship.from
236
+ // @ts-ignore
237
+ this.orOn(
238
+ `${fromTable}.${fromPrimary}`,
239
+ "=",
240
+ `${throughTable}.${from}`
241
+ )
242
+ }
243
+ },
244
+ "left"
245
+ )
246
+ .join(
247
+ toTable,
248
+ function () {
249
+ for (let relationship of relationships) {
250
+ const toPrimary = relationship.toPrimary
251
+ const to = relationship.to
252
+ // @ts-ignore
253
+ this.orOn(`${toTable}.${toPrimary}`, `${throughTable}.${to}`)
254
+ }
255
+ },
256
+ "left"
215
257
  )
216
- .leftJoin(toTable, `${toTable}.${toPrimary}`, `${throughTable}.${to}`)
217
258
  }
218
259
  }
219
260
  return query.limit(BASE_LIMIT)
@@ -52,7 +52,10 @@ export function buildExternalTableId(datasourceId: string, tableName: string) {
52
52
  return `${datasourceId}${DOUBLE_SEPARATOR}${tableName}`
53
53
  }
54
54
 
55
- export function breakExternalTableId(tableId: string) {
55
+ export function breakExternalTableId(tableId: string | undefined) {
56
+ if (!tableId) {
57
+ return {}
58
+ }
56
59
  const parts = tableId.split(DOUBLE_SEPARATOR)
57
60
  let tableName = parts.pop()
58
61
  // if they need joined
@@ -10,6 +10,7 @@ const {
10
10
  const builderMiddleware = require("./builder")
11
11
  const { isWebhookEndpoint } = require("./utils")
12
12
  const { buildCsrfMiddleware } = require("@budibase/backend-core/auth")
13
+ const { getAppId } = require("@budibase/backend-core/context")
13
14
 
14
15
  function hasResource(ctx) {
15
16
  return ctx.resourceId != null
@@ -45,7 +46,7 @@ const checkAuthorizedResource = async (
45
46
  ) => {
46
47
  // get the user's roles
47
48
  const roleId = ctx.roleId || BUILTIN_ROLE_IDS.PUBLIC
48
- const userRoles = await getUserRoleHierarchy(ctx.appId, roleId, {
49
+ const userRoles = await getUserRoleHierarchy(roleId, {
49
50
  idOnly: false,
50
51
  })
51
52
  const permError = "User does not have permission"
@@ -81,8 +82,9 @@ module.exports =
81
82
 
82
83
  // get the resource roles
83
84
  let resourceRoles = []
84
- if (ctx.appId && hasResource(ctx)) {
85
- resourceRoles = await getRequiredResourceRole(ctx.appId, permLevel, ctx)
85
+ const appId = getAppId()
86
+ if (appId && hasResource(ctx)) {
87
+ resourceRoles = await getRequiredResourceRole(permLevel, ctx)
86
88
  }
87
89
 
88
90
  // if the resource is public, proceed
@@ -5,7 +5,7 @@ const {
5
5
  checkDebounce,
6
6
  setDebounce,
7
7
  } = require("../utilities/redis")
8
- const CouchDB = require("../db")
8
+ const { getDB } = require("@budibase/backend-core/db")
9
9
  const { DocumentTypes } = require("../db/utils")
10
10
  const { PermissionTypes } = require("@budibase/backend-core/permissions")
11
11
  const { app: appCache } = require("@budibase/backend-core/cache")
@@ -48,7 +48,7 @@ async function updateAppUpdatedAt(ctx) {
48
48
  if (ctx.method === "GET" || (await checkDebounce(appId))) {
49
49
  return
50
50
  }
51
- const db = new CouchDB(appId)
51
+ const db = getDB(appId)
52
52
  const metadata = await db.get(DocumentTypes.APP_METADATA)
53
53
  metadata.updatedAt = new Date().toISOString()
54
54
  const response = await db.put(metadata)
@@ -11,9 +11,9 @@ const { generateUserMetadataID, isDevAppID } = require("../db/utils")
11
11
  const { dbExists } = require("@budibase/backend-core/db")
12
12
  const { isUserInAppTenant } = require("@budibase/backend-core/tenancy")
13
13
  const { getCachedSelf } = require("../utilities/global")
14
- const CouchDB = require("../db")
15
14
  const env = require("../environment")
16
15
  const { isWebhookEndpoint } = require("./utils")
16
+ const { doInAppContext } = require("@budibase/backend-core/context")
17
17
 
18
18
  module.exports = async (ctx, next) => {
19
19
  // try to get the appID from the request
@@ -31,7 +31,7 @@ module.exports = async (ctx, next) => {
31
31
  // check the app exists referenced in cookie
32
32
  if (appCookie) {
33
33
  const appId = appCookie.appId
34
- const exists = await dbExists(CouchDB, appId)
34
+ const exists = await dbExists(appId)
35
35
  if (!exists) {
36
36
  clearCookie(ctx, Cookies.CurrentApp)
37
37
  return next()
@@ -41,13 +41,15 @@ module.exports = async (ctx, next) => {
41
41
  }
42
42
 
43
43
  // deny access to application preview
44
- if (
45
- isDevAppID(requestAppId) &&
46
- !isWebhookEndpoint(ctx) &&
47
- (!ctx.user || !ctx.user.builder || !ctx.user.builder.global)
48
- ) {
49
- clearCookie(ctx, Cookies.CurrentApp)
50
- return ctx.redirect("/")
44
+ if (!env.isTest()) {
45
+ if (
46
+ isDevAppID(requestAppId) &&
47
+ !isWebhookEndpoint(ctx) &&
48
+ (!ctx.user || !ctx.user.builder || !ctx.user.builder.global)
49
+ ) {
50
+ clearCookie(ctx, Cookies.CurrentApp)
51
+ return ctx.redirect("/")
52
+ }
51
53
  }
52
54
 
53
55
  let appId,
@@ -68,44 +70,46 @@ module.exports = async (ctx, next) => {
68
70
  return next()
69
71
  }
70
72
 
71
- let noCookieSet = false
72
- // if the user not in the right tenant then make sure they have no permissions
73
- // need to judge this only based on the request app ID,
74
- if (
75
- env.MULTI_TENANCY &&
76
- ctx.user &&
77
- requestAppId &&
78
- !isUserInAppTenant(requestAppId)
79
- ) {
80
- // don't error, simply remove the users rights (they are a public user)
81
- delete ctx.user.builder
82
- delete ctx.user.admin
83
- delete ctx.user.roles
84
- roleId = BUILTIN_ROLE_IDS.PUBLIC
85
- noCookieSet = true
86
- }
73
+ return doInAppContext(appId, async () => {
74
+ let noCookieSet = false
75
+ // if the user not in the right tenant then make sure they have no permissions
76
+ // need to judge this only based on the request app ID,
77
+ if (
78
+ env.MULTI_TENANCY &&
79
+ ctx.user &&
80
+ requestAppId &&
81
+ !isUserInAppTenant(requestAppId)
82
+ ) {
83
+ // don't error, simply remove the users rights (they are a public user)
84
+ delete ctx.user.builder
85
+ delete ctx.user.admin
86
+ delete ctx.user.roles
87
+ roleId = BUILTIN_ROLE_IDS.PUBLIC
88
+ noCookieSet = true
89
+ }
87
90
 
88
- ctx.appId = appId
89
- if (roleId) {
90
- ctx.roleId = roleId
91
- const userId = ctx.user ? generateUserMetadataID(ctx.user._id) : null
92
- ctx.user = {
93
- ...ctx.user,
94
- // override userID with metadata one
95
- _id: userId,
96
- userId,
97
- roleId,
98
- role: await getRole(appId, roleId),
91
+ ctx.appId = appId
92
+ if (roleId) {
93
+ ctx.roleId = roleId
94
+ const userId = ctx.user ? generateUserMetadataID(ctx.user._id) : null
95
+ ctx.user = {
96
+ ...ctx.user,
97
+ // override userID with metadata one
98
+ _id: userId,
99
+ userId,
100
+ roleId,
101
+ role: await getRole(roleId),
102
+ }
103
+ }
104
+ if (
105
+ (requestAppId !== appId ||
106
+ appCookie == null ||
107
+ appCookie.appId !== requestAppId) &&
108
+ !noCookieSet
109
+ ) {
110
+ setCookie(ctx, { appId }, Cookies.CurrentApp)
99
111
  }
100
- }
101
- if (
102
- (requestAppId !== appId ||
103
- appCookie == null ||
104
- appCookie.appId !== requestAppId) &&
105
- !noCookieSet
106
- ) {
107
- setCookie(ctx, { appId }, Cookies.CurrentApp)
108
- }
109
112
 
110
- return next()
113
+ return next()
114
+ })
111
115
  }
@@ -11,6 +11,9 @@ const authorizedMiddleware = require("../authorized")
11
11
  const env = require("../../environment")
12
12
  const { PermissionTypes, PermissionLevels } = require("@budibase/backend-core/permissions")
13
13
  require("@budibase/backend-core").init(require("../../db"))
14
+ const { doInAppContext } = require("@budibase/backend-core/context")
15
+
16
+ const APP_ID = ""
14
17
 
15
18
  class TestConfiguration {
16
19
  constructor(role) {
@@ -23,7 +26,7 @@ class TestConfiguration {
23
26
  request: {
24
27
  url: ""
25
28
  },
26
- appId: "",
29
+ appId: APP_ID,
27
30
  auth: {},
28
31
  next: this.next,
29
32
  throw: this.throw,
@@ -32,7 +35,9 @@ class TestConfiguration {
32
35
  }
33
36
 
34
37
  executeMiddleware() {
35
- return this.middleware(this.ctx, this.next)
38
+ return doInAppContext(APP_ID, () => {
39
+ return this.middleware(this.ctx, this.next)
40
+ })
36
41
  }
37
42
 
38
43
  setUser(user) {
@@ -1,6 +1,11 @@
1
1
  mockAuthWithNoCookie()
2
2
  mockWorker()
3
3
 
4
+ jest.mock("@budibase/backend-core/db", () => ({
5
+ ...jest.requireActual("@budibase/backend-core/db"),
6
+ dbExists: () => true,
7
+ }))
8
+
4
9
  function mockWorker() {
5
10
  jest.mock("../../utilities/workerRequests", () => ({
6
11
  getGlobalSelf: () => {
@@ -50,6 +55,7 @@ function mockAuthWithCookie() {
50
55
  return "app_test"
51
56
  },
52
57
  setCookie: jest.fn(),
58
+ clearCookie: jest.fn(),
53
59
  getCookie: () => ({appId: "app_different", roleId: "PUBLIC"}),
54
60
  }))
55
61
  jest.mock("@budibase/backend-core/constants", () => ({
@@ -1,10 +1,10 @@
1
- const CouchDB = require("../db")
2
1
  const usageQuota = require("../utilities/usageQuota")
3
2
  const { getUniqueRows } = require("../utilities/usageQuota/rows")
4
3
  const {
5
4
  isExternalTable,
6
5
  isRowId: isExternalRowId,
7
6
  } = require("../integrations/utils")
7
+ const { getAppDB } = require("@budibase/backend-core/context")
8
8
 
9
9
  // currently only counting new writes and deletes
10
10
  const METHOD_MAP = {
@@ -46,7 +46,7 @@ module.exports = async (ctx, next) => {
46
46
  const usageId = ctx.request.body._id
47
47
  try {
48
48
  if (ctx.appId) {
49
- const db = new CouchDB(ctx.appId)
49
+ const db = getAppDB()
50
50
  await db.get(usageId)
51
51
  }
52
52
  return next()
@@ -1,12 +1,12 @@
1
- const { getGlobalDB, getTenantId } = require("@budibase/backend-core/tenancy")
2
- const { getAllApps } = require("@budibase/backend-core/db")
3
- import CouchDB from "../../../db"
1
+ import { getGlobalDB, getTenantId } from "@budibase/backend-core/tenancy"
2
+ import { getAllApps } from "@budibase/backend-core/db"
4
3
  import { getUsageQuotaDoc } from "../../../utilities/usageQuota"
5
4
 
6
5
  export const run = async () => {
7
6
  const db = getGlobalDB()
8
7
  // get app count
9
- const devApps = await getAllApps(CouchDB, { dev: true })
8
+ // @ts-ignore
9
+ const devApps = await getAllApps({ dev: true })
10
10
  const appCount = devApps ? devApps.length : 0
11
11
 
12
12
  // sync app count
@@ -1,13 +1,14 @@
1
- const { getGlobalDB, getTenantId } = require("@budibase/backend-core/tenancy")
2
- const { getAllApps } = require("@budibase/backend-core/db")
3
- import CouchDB from "../../../db"
1
+ import { getGlobalDB, getTenantId } from "@budibase/backend-core/tenancy"
2
+ import { getAllApps } from "@budibase/backend-core/db"
4
3
  import { getUsageQuotaDoc } from "../../../utilities/usageQuota"
5
4
  import { getUniqueRows } from "../../../utilities/usageQuota/rows"
6
5
 
7
6
  export const run = async () => {
8
7
  const db = getGlobalDB()
9
8
  // get all rows in all apps
10
- const allApps = await getAllApps(CouchDB, { all: true })
9
+ // @ts-ignore
10
+ const allApps = await getAllApps({ all: true })
11
+ // @ts-ignore
11
12
  const appIds = allApps ? allApps.map((app: { appId: any }) => app.appId) : []
12
13
  const rows = await getUniqueRows(appIds)
13
14
  const rowCount = rows ? rows.length : 0
@@ -0,0 +1,3 @@
1
+ declare module "@budibase/backend-core"
2
+ declare module "@budibase/backend-core/tenancy"
3
+ declare module "@budibase/backend-core/db"
@@ -1,3 +1,6 @@
1
+ const core = require("@budibase/backend-core")
2
+ const CouchDB = require("../../db")
3
+ core.init(CouchDB)
1
4
  const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles")
2
5
  const env = require("../../environment")
3
6
  const {
@@ -17,13 +20,11 @@ const supertest = require("supertest")
17
20
  const { cleanup } = require("../../utilities/fileSystem")
18
21
  const { Cookies, Headers } = require("@budibase/backend-core/constants")
19
22
  const { jwt } = require("@budibase/backend-core/auth")
20
- const core = require("@budibase/backend-core")
21
23
  const { getGlobalDB } = require("@budibase/backend-core/tenancy")
22
24
  const { createASession } = require("@budibase/backend-core/sessions")
23
25
  const { user: userCache } = require("@budibase/backend-core/cache")
24
- const CouchDB = require("../../db")
25
26
  const newid = require("../../db/newid")
26
- core.init(CouchDB)
27
+ const context = require("@budibase/backend-core/context")
27
28
 
28
29
  const GLOBAL_USER_ID = "us_uuid1"
29
30
  const EMAIL = "babs@babs.com"
@@ -65,11 +66,21 @@ class TestConfiguration {
65
66
  request.request = {
66
67
  body: config,
67
68
  }
68
- if (params) {
69
- request.params = params
69
+ async function run() {
70
+ if (params) {
71
+ request.params = params
72
+ }
73
+ await controlFunc(request)
74
+ return request.body
75
+ }
76
+ // check if already in a context
77
+ if (context.getAppId() == null) {
78
+ return context.doInAppContext(this.appId, async () => {
79
+ return run()
80
+ })
81
+ } else {
82
+ return run()
70
83
  }
71
- await controlFunc(request)
72
- return request.body
73
84
  }
74
85
 
75
86
  async globalUser({
@@ -175,6 +186,7 @@ class TestConfiguration {
175
186
  // create dev app
176
187
  this.app = await this._req({ name: appName }, null, controllers.app.create)
177
188
  this.appId = this.app.appId
189
+ context.updateAppId(this.appId)
178
190
 
179
191
  // create production app
180
192
  this.prodApp = await this.deploy()
@@ -187,14 +199,16 @@ class TestConfiguration {
187
199
  }
188
200
 
189
201
  async deploy() {
190
- const deployment = await this._req(null, null, controllers.deploy.deployApp)
191
- const prodAppId = deployment.appId.replace("_dev", "")
192
- const appPackage = await this._req(
193
- null,
194
- { appId: prodAppId },
195
- controllers.app.fetchAppPackage
196
- )
197
- return appPackage.application
202
+ await this._req(null, null, controllers.deploy.deployApp)
203
+ const prodAppId = this.getAppId().replace("_dev", "")
204
+ return context.doInAppContext(prodAppId, async () => {
205
+ const appPackage = await this._req(
206
+ null,
207
+ { appId: prodAppId },
208
+ controllers.app.fetchAppPackage
209
+ )
210
+ return appPackage.application
211
+ })
198
212
  }
199
213
 
200
214
  async updateTable(config = null) {
@@ -423,42 +437,47 @@ class TestConfiguration {
423
437
 
424
438
  async login({ roleId, userId, builder, prodApp = false } = {}) {
425
439
  const appId = prodApp ? this.prodAppId : this.appId
426
-
427
- userId = !userId ? `us_uuid1` : userId
428
- if (!this.request) {
429
- throw "Server has not been opened, cannot login."
430
- }
431
- // make sure the user exists in the global DB
432
- if (roleId !== BUILTIN_ROLE_IDS.PUBLIC) {
433
- await this.globalUser({
434
- userId,
435
- builder,
436
- roles: { [this.prodAppId]: roleId },
440
+ return context.doInAppContext(appId, async () => {
441
+ userId = !userId ? `us_uuid1` : userId
442
+ if (!this.request) {
443
+ throw "Server has not been opened, cannot login."
444
+ }
445
+ // make sure the user exists in the global DB
446
+ if (roleId !== BUILTIN_ROLE_IDS.PUBLIC) {
447
+ await this.globalUser({
448
+ id: userId,
449
+ builder,
450
+ roles: { [this.prodAppId]: roleId },
451
+ })
452
+ }
453
+ await createASession(userId, {
454
+ sessionId: "sessionid",
455
+ tenantId: TENANT_ID,
437
456
  })
438
- }
439
- // have to fake this
440
- const auth = {
441
- userId,
442
- sessionId: "sessionid",
443
- tenantId: TENANT_ID,
444
- }
445
- const app = {
446
- roleId: roleId,
447
- appId,
448
- }
449
- const authToken = jwt.sign(auth, env.JWT_SECRET)
450
- const appToken = jwt.sign(app, env.JWT_SECRET)
451
-
452
- // returning necessary request headers
453
- await userCache.invalidateUser(userId)
454
- return {
455
- Accept: "application/json",
456
- Cookie: [
457
- `${Cookies.Auth}=${authToken}`,
458
- `${Cookies.CurrentApp}=${appToken}`,
459
- ],
460
- [Headers.APP_ID]: appId,
461
- }
457
+ // have to fake this
458
+ const auth = {
459
+ userId,
460
+ sessionId: "sessionid",
461
+ tenantId: TENANT_ID,
462
+ }
463
+ const app = {
464
+ roleId: roleId,
465
+ appId,
466
+ }
467
+ const authToken = jwt.sign(auth, env.JWT_SECRET)
468
+ const appToken = jwt.sign(app, env.JWT_SECRET)
469
+
470
+ // returning necessary request headers
471
+ await userCache.invalidateUser(userId)
472
+ return {
473
+ Accept: "application/json",
474
+ Cookie: [
475
+ `${Cookies.Auth}=${authToken}`,
476
+ `${Cookies.CurrentApp}=${appToken}`,
477
+ ],
478
+ [Headers.APP_ID]: appId,
479
+ }
480
+ })
462
481
  }
463
482
  }
464
483