@budibase/server 1.0.27-alpha.2 → 1.0.27-alpha.20

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 (350) hide show
  1. package/__mocks__/node-fetch.ts +18 -0
  2. package/builder/assets/{index.5522fcd5.css → index.39e01193.css} +1 -1
  3. package/builder/assets/{index.e9e2c4d7.js → index.c5bf8ef6.js} +247 -242
  4. package/builder/assets/{vendor.f9faf6ab.js → vendor.10e2ad1b.js} +12 -12
  5. package/builder/index.html +3 -3
  6. package/coverage/clover.xml +1128 -968
  7. package/coverage/coverage-final.json +70 -70
  8. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  9. package/coverage/lcov-report/api/controllers/apikeys.js.html +3 -3
  10. package/coverage/lcov-report/api/controllers/application.js.html +73 -64
  11. package/coverage/lcov-report/api/controllers/auth.js.html +2 -2
  12. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  13. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/cloud.js.html +13 -4
  15. package/coverage/lcov-report/api/controllers/component.js.html +1 -1
  16. package/coverage/lcov-report/api/controllers/datasource.js.html +150 -48
  17. package/coverage/lcov-report/api/controllers/dev.js.html +3 -3
  18. package/coverage/lcov-report/api/controllers/hosting.js.html +3 -3
  19. package/coverage/lcov-report/api/controllers/index.html +20 -20
  20. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  22. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/permission.js.html +3 -3
  24. package/coverage/lcov-report/api/controllers/query/index.html +21 -21
  25. package/coverage/lcov-report/api/controllers/query/index.js.html +102 -120
  26. package/coverage/lcov-report/api/controllers/query/validation.js.html +6 -3
  27. package/coverage/lcov-report/api/controllers/role.js.html +2 -2
  28. package/coverage/lcov-report/api/controllers/routing.js.html +2 -2
  29. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/row/index.html +11 -11
  31. package/coverage/lcov-report/api/controllers/row/index.js.html +1 -1
  32. package/coverage/lcov-report/api/controllers/row/internal.js.html +38 -11
  33. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +2 -2
  34. package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
  35. package/coverage/lcov-report/api/controllers/screen.js.html +2 -2
  36. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  39. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  40. package/coverage/lcov-report/api/controllers/table/internal.js.html +1 -1
  41. package/coverage/lcov-report/api/controllers/table/utils.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  43. package/coverage/lcov-report/api/controllers/user.js.html +14 -5
  44. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  45. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  46. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  47. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  48. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  49. package/coverage/lcov-report/api/controllers/webhook.js.html +2 -2
  50. package/coverage/lcov-report/api/index.html +1 -1
  51. package/coverage/lcov-report/api/index.js.html +6 -6
  52. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/apikeys.js.html +2 -2
  54. package/coverage/lcov-report/api/routes/application.js.html +2 -2
  55. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/automation.js.html +2 -2
  57. package/coverage/lcov-report/api/routes/backup.js.html +2 -2
  58. package/coverage/lcov-report/api/routes/cloud.js.html +2 -2
  59. package/coverage/lcov-report/api/routes/component.js.html +2 -2
  60. package/coverage/lcov-report/api/routes/datasource.js.html +2 -2
  61. package/coverage/lcov-report/api/routes/deploy.js.html +2 -2
  62. package/coverage/lcov-report/api/routes/dev.js.html +2 -2
  63. package/coverage/lcov-report/api/routes/hosting.js.html +2 -2
  64. package/coverage/lcov-report/api/routes/index.html +1 -1
  65. package/coverage/lcov-report/api/routes/index.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/integration.js.html +2 -2
  67. package/coverage/lcov-report/api/routes/layout.js.html +2 -2
  68. package/coverage/lcov-report/api/routes/metadata.js.html +2 -2
  69. package/coverage/lcov-report/api/routes/permission.js.html +12 -3
  70. package/coverage/lcov-report/api/routes/query.js.html +25 -4
  71. package/coverage/lcov-report/api/routes/role.js.html +2 -2
  72. package/coverage/lcov-report/api/routes/routing.js.html +2 -2
  73. package/coverage/lcov-report/api/routes/row.js.html +2 -2
  74. package/coverage/lcov-report/api/routes/screen.js.html +2 -2
  75. package/coverage/lcov-report/api/routes/script.js.html +2 -2
  76. package/coverage/lcov-report/api/routes/static.js.html +2 -2
  77. package/coverage/lcov-report/api/routes/table.js.html +2 -2
  78. package/coverage/lcov-report/api/routes/templates.js.html +2 -2
  79. package/coverage/lcov-report/api/routes/user.js.html +2 -2
  80. package/coverage/lcov-report/api/routes/view.js.html +2 -2
  81. package/coverage/lcov-report/api/routes/webhook.js.html +2 -2
  82. package/coverage/lcov-report/automations/actions.js.html +1 -1
  83. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  84. package/coverage/lcov-report/automations/bullboard.js.html +2 -2
  85. package/coverage/lcov-report/automations/index.html +1 -1
  86. package/coverage/lcov-report/automations/index.js.html +1 -1
  87. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/createRow.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/executeQuery.js.html +32 -8
  93. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/index.html +11 -11
  96. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  97. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  98. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  99. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  100. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  101. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  102. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  103. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  104. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  105. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  106. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  107. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  108. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  109. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  110. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  111. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  112. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  113. package/coverage/lcov-report/automations/triggers.js.html +1 -1
  114. package/coverage/lcov-report/automations/utils.js.html +6 -6
  115. package/coverage/lcov-report/constants/index.html +1 -1
  116. package/coverage/lcov-report/constants/index.js.html +4 -4
  117. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  118. package/coverage/lcov-report/constants/screens.js.html +2 -2
  119. package/coverage/lcov-report/db/client.js.html +2 -2
  120. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  121. package/coverage/lcov-report/db/index.html +1 -1
  122. package/coverage/lcov-report/db/index.js.html +1 -1
  123. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  124. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  125. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  126. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  127. package/coverage/lcov-report/db/newid.js.html +2 -2
  128. package/coverage/lcov-report/db/utils.js.html +19 -19
  129. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  130. package/coverage/lcov-report/events/index.html +1 -1
  131. package/coverage/lcov-report/events/index.js.html +1 -1
  132. package/coverage/lcov-report/events/utils.js.html +1 -1
  133. package/coverage/lcov-report/index.html +69 -69
  134. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  135. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  136. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  137. package/coverage/lcov-report/middleware/authorized.js.html +12 -12
  138. package/coverage/lcov-report/middleware/builder.js.html +10 -10
  139. package/coverage/lcov-report/middleware/currentapp.js.html +79 -40
  140. package/coverage/lcov-report/middleware/index.html +10 -10
  141. package/coverage/lcov-report/middleware/joi-validator.js.html +9 -9
  142. package/coverage/lcov-report/middleware/resourceId.js.html +18 -18
  143. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  144. package/coverage/lcov-report/middleware/usageQuota.js.html +2 -2
  145. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  146. package/coverage/lcov-report/threads/automation.js.html +3 -3
  147. package/coverage/lcov-report/threads/index.html +31 -31
  148. package/coverage/lcov-report/threads/index.js.html +12 -12
  149. package/coverage/lcov-report/threads/query.js.html +531 -87
  150. package/coverage/lcov-report/threads/utils.js.html +210 -15
  151. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  152. package/coverage/lcov-report/utilities/budibaseDir.js.html +2 -2
  153. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  154. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  155. package/coverage/lcov-report/utilities/global.js.html +28 -19
  156. package/coverage/lcov-report/utilities/index.html +4 -4
  157. package/coverage/lcov-report/utilities/index.js.html +13 -13
  158. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +2 -2
  159. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  160. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  161. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  162. package/coverage/lcov-report/utilities/rowProcessor/index.html +19 -19
  163. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +211 -10
  164. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  165. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  166. package/coverage/lcov-report/utilities/security.js.html +13 -4
  167. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  168. package/coverage/lcov-report/utilities/users.js.html +1 -1
  169. package/coverage/lcov-report/utilities/workerRequests.js.html +22 -22
  170. package/coverage/lcov.info +1921 -1630
  171. package/dist/api/controllers/apikeys.js +2 -2
  172. package/dist/api/controllers/application.js +4 -4
  173. package/dist/api/controllers/auth.js +1 -1
  174. package/dist/api/controllers/cloud.js +2 -2
  175. package/dist/api/controllers/datasource.js +29 -0
  176. package/dist/api/controllers/deploy/index.js +2 -2
  177. package/dist/api/controllers/dev.js +2 -2
  178. package/dist/api/controllers/hosting.js +2 -2
  179. package/dist/api/controllers/permission.js +2 -2
  180. package/dist/api/controllers/query/import/sources/base/index.js +2 -1
  181. package/dist/api/controllers/query/import/sources/curl.js +11 -5
  182. package/dist/api/controllers/query/import/sources/openapi2.js +8 -5
  183. package/dist/api/controllers/query/index.js +46 -47
  184. package/dist/api/controllers/query/validation.js +2 -1
  185. package/dist/api/controllers/role.js +1 -1
  186. package/dist/api/controllers/routing.js +1 -1
  187. package/dist/api/controllers/row/internal.js +14 -6
  188. package/dist/api/controllers/row/internalSearch.js +1 -1
  189. package/dist/api/controllers/screen.js +1 -1
  190. package/dist/api/controllers/user.js +3 -3
  191. package/dist/api/controllers/webhook.js +1 -1
  192. package/dist/api/index.js +1 -1
  193. package/dist/api/routes/apikeys.js +1 -1
  194. package/dist/api/routes/application.js +1 -1
  195. package/dist/api/routes/automation.js +1 -1
  196. package/dist/api/routes/backup.js +1 -1
  197. package/dist/api/routes/cloud.js +1 -1
  198. package/dist/api/routes/component.js +1 -1
  199. package/dist/api/routes/datasource.js +1 -1
  200. package/dist/api/routes/deploy.js +1 -1
  201. package/dist/api/routes/dev.js +1 -1
  202. package/dist/api/routes/hosting.js +1 -1
  203. package/dist/api/routes/integration.js +1 -1
  204. package/dist/api/routes/layout.js +1 -1
  205. package/dist/api/routes/metadata.js +1 -1
  206. package/dist/api/routes/permission.js +1 -1
  207. package/dist/api/routes/query.js +4 -2
  208. package/dist/api/routes/role.js +1 -1
  209. package/dist/api/routes/routing.js +1 -1
  210. package/dist/api/routes/row.js +1 -1
  211. package/dist/api/routes/screen.js +1 -1
  212. package/dist/api/routes/script.js +1 -1
  213. package/dist/api/routes/static.js +1 -1
  214. package/dist/api/routes/table.js +1 -1
  215. package/dist/api/routes/templates.js +1 -1
  216. package/dist/api/routes/tests/utilities/TestFunctions.js +1 -1
  217. package/dist/api/routes/user.js +1 -1
  218. package/dist/api/routes/view.js +1 -1
  219. package/dist/api/routes/webhook.js +1 -1
  220. package/dist/app.js +1 -1
  221. package/dist/automations/bullboard.js +1 -1
  222. package/dist/automations/steps/executeQuery.js +9 -2
  223. package/dist/automations/utils.js +1 -1
  224. package/dist/constants/index.js +3 -3
  225. package/dist/constants/screens.js +1 -1
  226. package/dist/db/client.js +1 -1
  227. package/dist/db/utils.js +1 -1
  228. package/dist/environment.js +1 -0
  229. package/dist/integrations/base/sqlTable.js +1 -1
  230. package/dist/integrations/dynamodb.js +19 -0
  231. package/dist/integrations/rest.js +71 -22
  232. package/dist/integrations/s3.js +17 -8
  233. package/dist/integrations/utils.js +40 -37
  234. package/dist/middleware/authorized.js +2 -2
  235. package/dist/middleware/builder.js +2 -2
  236. package/dist/middleware/currentapp.js +15 -6
  237. package/dist/middleware/usageQuota.js +1 -1
  238. package/dist/package.json +5 -4
  239. package/dist/tests/utilities/TestConfiguration.js +55 -8
  240. package/dist/tests/utilities/structures.js +2 -2
  241. package/dist/threads/automation.js +2 -2
  242. package/dist/threads/query.js +195 -50
  243. package/dist/threads/utils.js +62 -1
  244. package/dist/tsconfig.tsbuildinfo +1 -1
  245. package/dist/utilities/budibaseDir.js +1 -1
  246. package/dist/utilities/fileSystem/utilities.js +2 -1
  247. package/dist/utilities/global.js +5 -5
  248. package/dist/utilities/index.js +2 -2
  249. package/dist/utilities/redis.js +1 -1
  250. package/dist/utilities/rowProcessor/index.js +63 -0
  251. package/dist/utilities/security.js +2 -2
  252. package/dist/utilities/usageQuota.js +2 -2
  253. package/dist/utilities/workerRequests.js +3 -3
  254. package/package.json +6 -5
  255. package/scripts/replicateApp.js +1 -1
  256. package/src/api/controllers/apikeys.js +2 -2
  257. package/src/api/controllers/application.js +7 -4
  258. package/src/api/controllers/auth.js +1 -1
  259. package/src/api/controllers/cloud.js +5 -2
  260. package/src/api/controllers/datasource.js +34 -0
  261. package/src/api/controllers/deploy/index.js +2 -2
  262. package/src/api/controllers/dev.js +2 -2
  263. package/src/api/controllers/hosting.js +2 -2
  264. package/src/api/controllers/permission.js +2 -2
  265. package/src/api/controllers/query/import/sources/base/index.ts +3 -1
  266. package/src/api/controllers/query/import/sources/curl.ts +12 -4
  267. package/src/api/controllers/query/import/sources/openapi2.ts +9 -5
  268. package/src/api/controllers/query/import/sources/tests/curl/curl.spec.js +2 -3
  269. package/src/api/controllers/query/import/sources/tests/openapi2/openapi2.spec.js +6 -7
  270. package/src/api/controllers/query/import/tests/index.spec.js +0 -6
  271. package/src/api/controllers/query/index.js +49 -55
  272. package/src/api/controllers/query/validation.js +2 -1
  273. package/src/api/controllers/role.js +1 -1
  274. package/src/api/controllers/routing.js +1 -1
  275. package/src/api/controllers/row/internal.js +14 -5
  276. package/src/api/controllers/row/internalSearch.js +1 -1
  277. package/src/api/controllers/screen.js +1 -1
  278. package/src/api/controllers/user.js +6 -3
  279. package/src/api/controllers/webhook.js +1 -1
  280. package/src/api/index.js +1 -1
  281. package/src/api/routes/apikeys.js +1 -1
  282. package/src/api/routes/application.js +1 -1
  283. package/src/api/routes/automation.js +1 -1
  284. package/src/api/routes/backup.js +1 -1
  285. package/src/api/routes/cloud.js +1 -1
  286. package/src/api/routes/component.js +1 -1
  287. package/src/api/routes/datasource.js +1 -1
  288. package/src/api/routes/deploy.js +1 -1
  289. package/src/api/routes/dev.js +1 -1
  290. package/src/api/routes/hosting.js +1 -1
  291. package/src/api/routes/integration.js +1 -1
  292. package/src/api/routes/layout.js +1 -1
  293. package/src/api/routes/metadata.js +1 -1
  294. package/src/api/routes/permission.js +4 -1
  295. package/src/api/routes/query.js +9 -2
  296. package/src/api/routes/role.js +1 -1
  297. package/src/api/routes/routing.js +1 -1
  298. package/src/api/routes/row.js +1 -1
  299. package/src/api/routes/screen.js +1 -1
  300. package/src/api/routes/script.js +1 -1
  301. package/src/api/routes/static.js +1 -1
  302. package/src/api/routes/table.js +1 -1
  303. package/src/api/routes/templates.js +1 -1
  304. package/src/api/routes/tests/datasource.spec.js +45 -0
  305. package/src/api/routes/tests/permissions.spec.js +1 -1
  306. package/src/api/routes/tests/query.spec.js +70 -1
  307. package/src/api/routes/tests/role.spec.js +2 -2
  308. package/src/api/routes/tests/routing.spec.js +1 -1
  309. package/src/api/routes/tests/user.spec.js +1 -1
  310. package/src/api/routes/tests/utilities/TestFunctions.js +1 -1
  311. package/src/api/routes/user.js +1 -1
  312. package/src/api/routes/view.js +1 -1
  313. package/src/api/routes/webhook.js +1 -1
  314. package/src/app.ts +1 -1
  315. package/src/automations/bullboard.js +1 -1
  316. package/src/automations/steps/executeQuery.js +10 -2
  317. package/src/automations/utils.js +1 -1
  318. package/src/constants/index.js +3 -3
  319. package/src/constants/screens.js +1 -1
  320. package/src/db/client.js +1 -1
  321. package/src/db/utils.js +1 -1
  322. package/src/definitions/datasource.ts +25 -0
  323. package/src/environment.js +1 -0
  324. package/src/integrations/base/sqlTable.ts +1 -1
  325. package/src/integrations/dynamodb.ts +18 -0
  326. package/src/integrations/rest.ts +103 -20
  327. package/src/integrations/s3.ts +18 -7
  328. package/src/integrations/tests/rest.spec.js +287 -24
  329. package/src/integrations/utils.ts +8 -7
  330. package/src/middleware/authorized.js +2 -2
  331. package/src/middleware/builder.js +2 -2
  332. package/src/middleware/currentapp.js +20 -7
  333. package/src/middleware/tests/authorized.spec.js +2 -2
  334. package/src/middleware/tests/currentapp.spec.js +35 -41
  335. package/src/middleware/tests/usageQuota.spec.js +1 -1
  336. package/src/middleware/usageQuota.js +1 -1
  337. package/src/tests/utilities/TestConfiguration.js +65 -8
  338. package/src/tests/utilities/structures.js +2 -2
  339. package/src/threads/automation.js +2 -2
  340. package/src/threads/query.js +203 -55
  341. package/src/threads/utils.js +66 -1
  342. package/src/utilities/budibaseDir.js +1 -1
  343. package/src/utilities/fileSystem/utilities.js +3 -1
  344. package/src/utilities/global.js +8 -5
  345. package/src/utilities/index.js +2 -2
  346. package/src/utilities/redis.js +1 -1
  347. package/src/utilities/rowProcessor/index.js +67 -0
  348. package/src/utilities/security.js +5 -2
  349. package/src/utilities/usageQuota.js +2 -2
  350. package/src/utilities/workerRequests.js +3 -3
@@ -1,4 +1,3 @@
1
- const { processString } = require("@budibase/string-templates")
2
1
  const CouchDB = require("../../../db")
3
2
  const {
4
3
  generateQueryID,
@@ -9,6 +8,7 @@ const { BaseQueryVerbs } = require("../../../constants")
9
8
  const { Thread, ThreadType } = require("../../../threads")
10
9
  const { save: saveDatasource } = require("../datasource")
11
10
  const { RestImporter } = require("./import")
11
+ const { invalidateDynamicVariables } = require("../../../threads/utils")
12
12
 
13
13
  const Runner = new Thread(ThreadType.QUERY, { timeoutMs: 10000 })
14
14
 
@@ -90,47 +90,6 @@ exports.save = async function (ctx) {
90
90
  ctx.message = `Query ${query.name} saved successfully.`
91
91
  }
92
92
 
93
- async function enrichQueryFields(fields, parameters = {}) {
94
- const enrichedQuery = {}
95
-
96
- // enrich the fields with dynamic parameters
97
- for (let key of Object.keys(fields)) {
98
- if (fields[key] == null) {
99
- continue
100
- }
101
- if (typeof fields[key] === "object") {
102
- // enrich nested fields object
103
- enrichedQuery[key] = await enrichQueryFields(fields[key], parameters)
104
- } else if (typeof fields[key] === "string") {
105
- // enrich string value as normal
106
- enrichedQuery[key] = await processString(fields[key], parameters, {
107
- noHelpers: true,
108
- })
109
- } else {
110
- enrichedQuery[key] = fields[key]
111
- }
112
- }
113
-
114
- if (
115
- enrichedQuery.json ||
116
- enrichedQuery.customData ||
117
- enrichedQuery.requestBody
118
- ) {
119
- try {
120
- enrichedQuery.json = JSON.parse(
121
- enrichedQuery.json ||
122
- enrichedQuery.customData ||
123
- enrichedQuery.requestBody
124
- )
125
- } catch (err) {
126
- // no json found, ignore
127
- }
128
- delete enrichedQuery.customData
129
- }
130
-
131
- return enrichedQuery
132
- }
133
-
134
93
  exports.find = async function (ctx) {
135
94
  const db = new CouchDB(ctx.appId)
136
95
  const query = enrichQueries(await db.get(ctx.params.queryId))
@@ -146,16 +105,20 @@ exports.preview = async function (ctx) {
146
105
  const db = new CouchDB(ctx.appId)
147
106
 
148
107
  const datasource = await db.get(ctx.request.body.datasourceId)
149
-
150
- const { fields, parameters, queryVerb, transformer } = ctx.request.body
151
- const enrichedQuery = await enrichQueryFields(fields, parameters)
108
+ // preview may not have a queryId as it hasn't been saved, but if it does
109
+ // this stops dynamic variables from calling the same query
110
+ const { fields, parameters, queryVerb, transformer, queryId } =
111
+ ctx.request.body
152
112
 
153
113
  try {
154
114
  const { rows, keys, info, extra } = await Runner.run({
115
+ appId: ctx.appId,
155
116
  datasource,
156
117
  queryVerb,
157
- query: enrichedQuery,
118
+ fields,
119
+ parameters,
158
120
  transformer,
121
+ queryId,
159
122
  })
160
123
 
161
124
  ctx.body = {
@@ -169,33 +132,64 @@ exports.preview = async function (ctx) {
169
132
  }
170
133
  }
171
134
 
172
- exports.execute = async function (ctx) {
135
+ async function execute(ctx, opts = { rowsOnly: false }) {
173
136
  const db = new CouchDB(ctx.appId)
174
137
 
175
138
  const query = await db.get(ctx.params.queryId)
176
139
  const datasource = await db.get(query.datasourceId)
177
140
 
178
- const enrichedQuery = await enrichQueryFields(
179
- query.fields,
180
- ctx.request.body.parameters
181
- )
182
-
183
141
  // call the relevant CRUD method on the integration class
184
142
  try {
185
- const { rows } = await Runner.run({
143
+ const { rows, pagination, extra } = await Runner.run({
144
+ appId: ctx.appId,
186
145
  datasource,
187
146
  queryVerb: query.queryVerb,
188
- query: enrichedQuery,
147
+ fields: query.fields,
148
+ pagination: ctx.request.body.pagination,
149
+ parameters: ctx.request.body.parameters,
189
150
  transformer: query.transformer,
151
+ queryId: ctx.params.queryId,
190
152
  })
191
- ctx.body = rows
153
+ if (opts && opts.rowsOnly) {
154
+ ctx.body = rows
155
+ } else {
156
+ ctx.body = { data: rows, pagination, ...extra }
157
+ }
192
158
  } catch (err) {
193
159
  ctx.throw(400, err)
194
160
  }
195
161
  }
196
162
 
163
+ exports.executeV1 = async function (ctx) {
164
+ return execute(ctx, { rowsOnly: true })
165
+ }
166
+
167
+ exports.executeV2 = async function (ctx) {
168
+ return execute(ctx, { rowsOnly: false })
169
+ }
170
+
171
+ const removeDynamicVariables = async (db, queryId) => {
172
+ const query = await db.get(queryId)
173
+ const datasource = await db.get(query.datasourceId)
174
+ const dynamicVariables = datasource.config.dynamicVariables
175
+
176
+ if (dynamicVariables) {
177
+ // delete dynamic variables from the datasource
178
+ const newVariables = dynamicVariables.filter(dv => dv.queryId !== queryId)
179
+ datasource.config.dynamicVariables = newVariables
180
+ await db.put(datasource)
181
+
182
+ // invalidate the deleted variables
183
+ const variablesToDelete = dynamicVariables.filter(
184
+ dv => dv.queryId === queryId
185
+ )
186
+ await invalidateDynamicVariables(variablesToDelete)
187
+ }
188
+ }
189
+
197
190
  exports.destroy = async function (ctx) {
198
191
  const db = new CouchDB(ctx.appId)
192
+ await removeDynamicVariables(db, ctx.params.queryId)
199
193
  await db.remove(ctx.params.queryId, ctx.params.revId)
200
194
  ctx.message = `Query deleted.`
201
195
  ctx.status = 200
@@ -36,6 +36,7 @@ exports.generateQueryPreviewValidation = () => {
36
36
  extra: Joi.object().optional(),
37
37
  datasourceId: Joi.string().required(),
38
38
  transformer: Joi.string().optional(),
39
- parameters: Joi.object({}).required().unknown(true)
39
+ parameters: Joi.object({}).required().unknown(true),
40
+ queryId: Joi.string().optional(),
40
41
  }))
41
42
  }
@@ -4,7 +4,7 @@ const {
4
4
  getRole,
5
5
  isBuiltin,
6
6
  getAllRoles,
7
- } = require("@budibase/auth/roles")
7
+ } = require("@budibase/backend-core/roles")
8
8
  const {
9
9
  generateRoleID,
10
10
  getUserMetadataParams,
@@ -2,7 +2,7 @@ const { getRoutingInfo } = require("../../utilities/routing")
2
2
  const {
3
3
  getUserRoleHierarchy,
4
4
  BUILTIN_ROLE_IDS,
5
- } = require("@budibase/auth/roles")
5
+ } = require("@budibase/backend-core/roles")
6
6
 
7
7
  const URL_SEPARATOR = "/"
8
8
 
@@ -11,6 +11,7 @@ const {
11
11
  inputProcessing,
12
12
  outputProcessing,
13
13
  processAutoColumn,
14
+ cleanupAttachments,
14
15
  } = require("../../../utilities/rowProcessor")
15
16
  const { FieldTypes } = require("../../../constants")
16
17
  const { isEqual } = require("lodash")
@@ -25,6 +26,7 @@ const {
25
26
  getFromDesignDoc,
26
27
  getFromMemoryDoc,
27
28
  } = require("../view/utils")
29
+ const { cloneDeep } = require("lodash/fp")
28
30
 
29
31
  const CALCULATION_TYPES = {
30
32
  SUM: "sum",
@@ -109,14 +111,14 @@ exports.patch = async ctx => {
109
111
  const inputs = ctx.request.body
110
112
  const tableId = inputs.tableId
111
113
  const isUserTable = tableId === InternalTables.USER_METADATA
112
- let dbRow
114
+ let oldRow
113
115
  try {
114
- dbRow = await db.get(inputs._id)
116
+ oldRow = await db.get(inputs._id)
115
117
  } catch (err) {
116
118
  if (isUserTable) {
117
119
  // don't include the rev, it'll be the global rev
118
120
  // this time
119
- dbRow = {
121
+ oldRow = {
120
122
  _id: inputs._id,
121
123
  }
122
124
  } else {
@@ -125,13 +127,14 @@ exports.patch = async ctx => {
125
127
  }
126
128
  let dbTable = await db.get(tableId)
127
129
  // need to build up full patch fields before coerce
130
+ let combinedRow = cloneDeep(oldRow)
128
131
  for (let key of Object.keys(inputs)) {
129
132
  if (!dbTable.schema[key]) continue
130
- dbRow[key] = inputs[key]
133
+ combinedRow[key] = inputs[key]
131
134
  }
132
135
 
133
136
  // this returns the table and row incase they have been updated
134
- let { table, row } = inputProcessing(ctx.user, dbTable, dbRow)
137
+ let { table, row } = inputProcessing(ctx.user, dbTable, combinedRow)
135
138
  const validateResult = await validate({
136
139
  row,
137
140
  table,
@@ -149,6 +152,8 @@ exports.patch = async ctx => {
149
152
  tableId: row.tableId,
150
153
  table,
151
154
  })
155
+ // check if any attachments removed
156
+ await cleanupAttachments(appId, table, { oldRow, row })
152
157
 
153
158
  if (isUserTable) {
154
159
  // the row has been updated, need to put it into the ctx
@@ -295,6 +300,8 @@ exports.destroy = async function (ctx) {
295
300
  row,
296
301
  tableId: row.tableId,
297
302
  })
303
+ // remove any attachments that were on the row from object storage
304
+ await cleanupAttachments(appId, table, { row })
298
305
 
299
306
  let response
300
307
  if (ctx.params.tableId === InternalTables.USER_METADATA) {
@@ -341,6 +348,8 @@ exports.bulkDestroy = async ctx => {
341
348
  } else {
342
349
  await db.bulkDocs(rows.map(row => ({ ...row, _deleted: true })))
343
350
  }
351
+ // remove any attachments that were on the rows from object storage
352
+ await cleanupAttachments(appId, table, { rows })
344
353
  await Promise.all(updates)
345
354
  return { response: { ok: true }, rows }
346
355
  }
@@ -1,6 +1,6 @@
1
1
  const { SearchIndexes } = require("../../../db/utils")
2
2
  const fetch = require("node-fetch")
3
- const { getCouchUrl } = require("@budibase/auth/db")
3
+ const { getCouchUrl } = require("@budibase/backend-core/db")
4
4
 
5
5
  /**
6
6
  * Class to build lucene query URLs.
@@ -1,6 +1,6 @@
1
1
  const CouchDB = require("../../db")
2
2
  const { getScreenParams, generateScreenID } = require("../../db/utils")
3
- const { AccessController } = require("@budibase/auth/roles")
3
+ const { AccessController } = require("@budibase/backend-core/roles")
4
4
 
5
5
  exports.fetch = async ctx => {
6
6
  const appId = ctx.appId
@@ -8,10 +8,13 @@ const { InternalTables } = require("../../db/utils")
8
8
  const { getGlobalUsers, getRawGlobalUser } = require("../../utilities/global")
9
9
  const { getFullUser } = require("../../utilities/users")
10
10
  const { isEqual } = require("lodash")
11
- const { BUILTIN_ROLE_IDS } = require("@budibase/auth/roles")
12
- const { getDevelopmentAppID, getDeployedAppIDs } = require("@budibase/auth/db")
11
+ const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles")
12
+ const {
13
+ getDevelopmentAppID,
14
+ getDeployedAppIDs,
15
+ } = require("@budibase/backend-core/db")
13
16
  const { doesDatabaseExist } = require("../../utilities")
14
- const { UserStatus } = require("@budibase/auth/constants")
17
+ const { UserStatus } = require("@budibase/backend-core/constants")
15
18
 
16
19
  async function rawMetadata(db) {
17
20
  return (
@@ -3,7 +3,7 @@ const { generateWebhookID, getWebhookParams } = require("../../db/utils")
3
3
  const toJsonSchema = require("to-json-schema")
4
4
  const validate = require("jsonschema").validate
5
5
  const triggers = require("../../automations/triggers")
6
- const { getDeployedAppID } = require("@budibase/auth/db")
6
+ const { getDeployedAppID } = require("@budibase/backend-core/db")
7
7
 
8
8
  const AUTOMATION_DESCRIPTION = "Generated from Webhook Schema"
9
9
 
package/src/api/index.js CHANGED
@@ -4,7 +4,7 @@ const {
4
4
  auditLog,
5
5
  buildTenancyMiddleware,
6
6
  buildAppTenancyMiddleware,
7
- } = require("@budibase/auth").auth
7
+ } = require("@budibase/backend-core/auth")
8
8
  const currentApp = require("../middleware/currentapp")
9
9
  const compress = require("koa-compress")
10
10
  const zlib = require("zlib")
@@ -1,7 +1,7 @@
1
1
  const Router = require("@koa/router")
2
2
  const controller = require("../controllers/apikeys")
3
3
  const authorized = require("../../middleware/authorized")
4
- const { BUILDER } = require("@budibase/auth/permissions")
4
+ const { BUILDER } = require("@budibase/backend-core/permissions")
5
5
 
6
6
  const router = Router()
7
7
 
@@ -1,7 +1,7 @@
1
1
  const Router = require("@koa/router")
2
2
  const controller = require("../controllers/application")
3
3
  const authorized = require("../../middleware/authorized")
4
- const { BUILDER } = require("@budibase/auth/permissions")
4
+ const { BUILDER } = require("@budibase/backend-core/permissions")
5
5
  const usage = require("../../middleware/usageQuota")
6
6
 
7
7
  const router = Router()
@@ -6,7 +6,7 @@ const {
6
6
  BUILDER,
7
7
  PermissionLevels,
8
8
  PermissionTypes,
9
- } = require("@budibase/auth/permissions")
9
+ } = require("@budibase/backend-core/permissions")
10
10
  const Joi = require("joi")
11
11
  const { bodyResource, paramResource } = require("../../middleware/resourceId")
12
12
  const {
@@ -1,7 +1,7 @@
1
1
  const Router = require("@koa/router")
2
2
  const controller = require("../controllers/backup")
3
3
  const authorized = require("../../middleware/authorized")
4
- const { BUILDER } = require("@budibase/auth/permissions")
4
+ const { BUILDER } = require("@budibase/backend-core/permissions")
5
5
 
6
6
  const router = Router()
7
7
 
@@ -1,7 +1,7 @@
1
1
  const Router = require("@koa/router")
2
2
  const controller = require("../controllers/cloud")
3
3
  const authorized = require("../../middleware/authorized")
4
- const { BUILDER } = require("@budibase/auth/permissions")
4
+ const { BUILDER } = require("@budibase/backend-core/permissions")
5
5
 
6
6
  const router = Router()
7
7
 
@@ -1,7 +1,7 @@
1
1
  const Router = require("@koa/router")
2
2
  const controller = require("../controllers/component")
3
3
  const authorized = require("../../middleware/authorized")
4
- const { BUILDER } = require("@budibase/auth/permissions")
4
+ const { BUILDER } = require("@budibase/backend-core/permissions")
5
5
 
6
6
  const router = Router()
7
7
 
@@ -6,7 +6,7 @@ const {
6
6
  BUILDER,
7
7
  PermissionLevels,
8
8
  PermissionTypes,
9
- } = require("@budibase/auth/permissions")
9
+ } = require("@budibase/backend-core/permissions")
10
10
  const Joi = require("joi")
11
11
  const { DataSourceOperation } = require("../../constants")
12
12
 
@@ -1,7 +1,7 @@
1
1
  const Router = require("@koa/router")
2
2
  const controller = require("../controllers/deploy")
3
3
  const authorized = require("../../middleware/authorized")
4
- const { BUILDER } = require("@budibase/auth/permissions")
4
+ const { BUILDER } = require("@budibase/backend-core/permissions")
5
5
 
6
6
  const router = Router()
7
7
 
@@ -2,7 +2,7 @@ const Router = require("@koa/router")
2
2
  const controller = require("../controllers/dev")
3
3
  const env = require("../../environment")
4
4
  const authorized = require("../../middleware/authorized")
5
- const { BUILDER } = require("@budibase/auth/permissions")
5
+ const { BUILDER } = require("@budibase/backend-core/permissions")
6
6
 
7
7
  const router = Router()
8
8
 
@@ -1,7 +1,7 @@
1
1
  const Router = require("@koa/router")
2
2
  const controller = require("../controllers/hosting")
3
3
  const authorized = require("../../middleware/authorized")
4
- const { BUILDER } = require("@budibase/auth/permissions")
4
+ const { BUILDER } = require("@budibase/backend-core/permissions")
5
5
 
6
6
  const router = Router()
7
7
 
@@ -1,7 +1,7 @@
1
1
  const Router = require("@koa/router")
2
2
  const controller = require("../controllers/integration")
3
3
  const authorized = require("../../middleware/authorized")
4
- const { BUILDER } = require("@budibase/auth/permissions")
4
+ const { BUILDER } = require("@budibase/backend-core/permissions")
5
5
 
6
6
  const router = Router()
7
7
 
@@ -1,6 +1,6 @@
1
1
  const Router = require("@koa/router")
2
2
  const authorized = require("../../middleware/authorized")
3
- const { BUILDER } = require("@budibase/auth/permissions")
3
+ const { BUILDER } = require("@budibase/backend-core/permissions")
4
4
  const controller = require("../controllers/layout")
5
5
 
6
6
  const router = Router()
@@ -5,7 +5,7 @@ const {
5
5
  AppType,
6
6
  } = require("../../middleware/appInfo")
7
7
  const authorized = require("../../middleware/authorized")
8
- const { BUILDER } = require("@budibase/auth/permissions")
8
+ const { BUILDER } = require("@budibase/backend-core/permissions")
9
9
 
10
10
  const router = Router()
11
11
 
@@ -1,7 +1,10 @@
1
1
  const Router = require("@koa/router")
2
2
  const controller = require("../controllers/permission")
3
3
  const authorized = require("../../middleware/authorized")
4
- const { BUILDER, PermissionLevels } = require("@budibase/auth/permissions")
4
+ const {
5
+ BUILDER,
6
+ PermissionLevels,
7
+ } = require("@budibase/backend-core/permissions")
5
8
  const Joi = require("joi")
6
9
  const joiValidator = require("../../middleware/joi-validator")
7
10
 
@@ -5,7 +5,7 @@ const {
5
5
  PermissionLevels,
6
6
  PermissionTypes,
7
7
  BUILDER,
8
- } = require("@budibase/auth/permissions")
8
+ } = require("@budibase/backend-core/permissions")
9
9
  const {
10
10
  bodyResource,
11
11
  bodySubResource,
@@ -41,11 +41,18 @@ router
41
41
  authorized(PermissionTypes.QUERY, PermissionLevels.READ),
42
42
  queryController.find
43
43
  )
44
+ // DEPRECATED - use new query endpoint for future work
44
45
  .post(
45
46
  "/api/queries/:queryId",
46
47
  paramResource("queryId"),
47
48
  authorized(PermissionTypes.QUERY, PermissionLevels.WRITE),
48
- queryController.execute
49
+ queryController.executeV1
50
+ )
51
+ .post(
52
+ "/api/v2/queries/:queryId",
53
+ paramResource("queryId"),
54
+ authorized(PermissionTypes.QUERY, PermissionLevels.WRITE),
55
+ queryController.executeV2
49
56
  )
50
57
  .delete(
51
58
  "/api/queries/:queryId/:revId",
@@ -7,7 +7,7 @@ const {
7
7
  BUILTIN_PERMISSION_IDS,
8
8
  BUILDER,
9
9
  PermissionLevels,
10
- } = require("@budibase/auth/permissions")
10
+ } = require("@budibase/backend-core/permissions")
11
11
 
12
12
  const router = Router()
13
13
 
@@ -1,6 +1,6 @@
1
1
  const Router = require("@koa/router")
2
2
  const authorized = require("../../middleware/authorized")
3
- const { BUILDER } = require("@budibase/auth/permissions")
3
+ const { BUILDER } = require("@budibase/backend-core/permissions")
4
4
  const controller = require("../controllers/routing")
5
5
 
6
6
  const router = Router()
@@ -9,7 +9,7 @@ const {
9
9
  const {
10
10
  PermissionLevels,
11
11
  PermissionTypes,
12
- } = require("@budibase/auth/permissions")
12
+ } = require("@budibase/backend-core/permissions")
13
13
 
14
14
  const router = Router()
15
15
 
@@ -1,7 +1,7 @@
1
1
  const Router = require("@koa/router")
2
2
  const controller = require("../controllers/screen")
3
3
  const authorized = require("../../middleware/authorized")
4
- const { BUILDER } = require("@budibase/auth/permissions")
4
+ const { BUILDER } = require("@budibase/backend-core/permissions")
5
5
  const joiValidator = require("../../middleware/joi-validator")
6
6
  const Joi = require("joi")
7
7
 
@@ -1,7 +1,7 @@
1
1
  const Router = require("@koa/router")
2
2
  const controller = require("../controllers/script")
3
3
  const authorized = require("../../middleware/authorized")
4
- const { BUILDER } = require("@budibase/auth/permissions")
4
+ const { BUILDER } = require("@budibase/backend-core/permissions")
5
5
 
6
6
  const router = Router()
7
7
 
@@ -6,7 +6,7 @@ const {
6
6
  BUILDER,
7
7
  PermissionTypes,
8
8
  PermissionLevels,
9
- } = require("@budibase/auth/permissions")
9
+ } = require("@budibase/backend-core/permissions")
10
10
  const env = require("../../environment")
11
11
  const { paramResource } = require("../../middleware/resourceId")
12
12
 
@@ -6,7 +6,7 @@ const {
6
6
  BUILDER,
7
7
  PermissionLevels,
8
8
  PermissionTypes,
9
- } = require("@budibase/auth/permissions")
9
+ } = require("@budibase/backend-core/permissions")
10
10
  const joiValidator = require("../../middleware/joi-validator")
11
11
  const Joi = require("joi")
12
12
 
@@ -1,7 +1,7 @@
1
1
  const Router = require("@koa/router")
2
2
  const controller = require("../controllers/templates")
3
3
  const authorized = require("../../middleware/authorized")
4
- const { BUILDER } = require("@budibase/auth/permissions")
4
+ const { BUILDER } = require("@budibase/backend-core/permissions")
5
5
 
6
6
  const router = Router()
7
7
 
@@ -4,6 +4,7 @@ let setup = require("./utilities")
4
4
  let { basicDatasource } = setup.structures
5
5
  let { checkBuilderEndpoint } = require("./utilities/TestFunctions")
6
6
  const pg = require("pg")
7
+ const { checkCacheForDynamicVariable } = require("../../../threads/utils")
7
8
 
8
9
  describe("/datasources", () => {
9
10
  let request = setup.getRequest()
@@ -31,6 +32,50 @@ describe("/datasources", () => {
31
32
  })
32
33
  })
33
34
 
35
+ describe("update", () => {
36
+ it("should update an existing datasource", async () => {
37
+ datasource.name = "Updated Test"
38
+ const res = await request
39
+ .put(`/api/datasources/${datasource._id}`)
40
+ .send(datasource)
41
+ .set(config.defaultHeaders())
42
+ .expect('Content-Type', /json/)
43
+ .expect(200)
44
+
45
+ expect(res.body.datasource.name).toEqual("Updated Test")
46
+ expect(res.body.errors).toBeUndefined()
47
+ })
48
+
49
+ describe("dynamic variables", () => {
50
+ async function preview(datasource, fields) {
51
+ return config.previewQuery(request, config, datasource, fields)
52
+ }
53
+
54
+ it("should invalidate changed or removed variables", async () => {
55
+ const { datasource, query } = await config.dynamicVariableDatasource()
56
+ // preview once to cache variables
57
+ await preview(datasource, { path: "www.test.com", queryString: "test={{ variable3 }}" })
58
+ // check variables in cache
59
+ let contents = await checkCacheForDynamicVariable(query._id, "variable3")
60
+ expect(contents.rows.length).toEqual(1)
61
+
62
+ // update the datasource to remove the variables
63
+ datasource.config.dynamicVariables = []
64
+ const res = await request
65
+ .put(`/api/datasources/${datasource._id}`)
66
+ .send(datasource)
67
+ .set(config.defaultHeaders())
68
+ .expect('Content-Type', /json/)
69
+ .expect(200)
70
+ expect(res.body.errors).toBeUndefined()
71
+
72
+ // check variables no longer in cache
73
+ contents = await checkCacheForDynamicVariable(query._id, "variable3")
74
+ expect(contents).toBe(null)
75
+ })
76
+ })
77
+ })
78
+
34
79
  describe("fetch", () => {
35
80
  it("returns all the datasources from the server", async () => {
36
81
  const res = await request
@@ -1,4 +1,4 @@
1
- const { BUILTIN_ROLE_IDS } = require("@budibase/auth/roles")
1
+ const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles")
2
2
  const setup = require("./utilities")
3
3
  const { basicRow } = setup.structures
4
4