@budibase/server 1.0.35 → 1.0.39

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 (375) hide show
  1. package/__mocks__/node-fetch.ts +21 -0
  2. package/builder/assets/bb-spaceship.8f6e81e1.svg +227 -0
  3. package/builder/assets/index.3079d0f9.js +1348 -0
  4. package/builder/assets/{index.4fb3f887.css → index.39e01193.css} +1 -1
  5. package/builder/assets/{vendor.470042a4.js → vendor.f9faf6ab.js} +88 -88
  6. package/builder/index.html +3 -3
  7. package/coverage/clover.xml +1589 -1344
  8. package/coverage/coverage-final.json +75 -74
  9. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/apikeys.js.html +3 -3
  11. package/coverage/lcov-report/api/controllers/application.js.html +73 -64
  12. package/coverage/lcov-report/api/controllers/auth.js.html +2 -2
  13. package/coverage/lcov-report/api/controllers/automation.js.html +22 -10
  14. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/cloud.js.html +13 -4
  16. package/coverage/lcov-report/api/controllers/component.js.html +4 -4
  17. package/coverage/lcov-report/api/controllers/datasource.js.html +170 -68
  18. package/coverage/lcov-report/api/controllers/dev.js.html +3 -3
  19. package/coverage/lcov-report/api/controllers/hosting.js.html +3 -3
  20. package/coverage/lcov-report/api/controllers/index.html +39 -54
  21. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  22. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  24. package/coverage/lcov-report/api/controllers/permission.js.html +3 -3
  25. package/coverage/lcov-report/api/controllers/query/index.html +126 -0
  26. package/coverage/lcov-report/api/controllers/{query.js.html → query/index.js.html} +225 -120
  27. package/coverage/lcov-report/api/controllers/query/validation.js.html +206 -0
  28. package/coverage/lcov-report/api/controllers/role.js.html +2 -2
  29. package/coverage/lcov-report/api/controllers/routing.js.html +2 -2
  30. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/row/index.html +22 -22
  32. package/coverage/lcov-report/api/controllers/row/index.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/row/internal.js.html +38 -11
  34. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +8 -5
  35. package/coverage/lcov-report/api/controllers/row/utils.js.html +29 -20
  36. package/coverage/lcov-report/api/controllers/screen.js.html +2 -2
  37. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  39. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  40. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  41. package/coverage/lcov-report/api/controllers/table/internal.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/table/utils.js.html +1 -1
  43. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  44. package/coverage/lcov-report/api/controllers/user.js.html +120 -12
  45. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  46. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  47. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  48. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  49. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  50. package/coverage/lcov-report/api/controllers/webhook.js.html +19 -7
  51. package/coverage/lcov-report/api/index.html +1 -1
  52. package/coverage/lcov-report/api/index.js.html +6 -6
  53. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/apikeys.js.html +2 -2
  55. package/coverage/lcov-report/api/routes/application.js.html +2 -2
  56. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/automation.js.html +2 -2
  58. package/coverage/lcov-report/api/routes/backup.js.html +2 -2
  59. package/coverage/lcov-report/api/routes/cloud.js.html +2 -2
  60. package/coverage/lcov-report/api/routes/component.js.html +2 -2
  61. package/coverage/lcov-report/api/routes/datasource.js.html +2 -2
  62. package/coverage/lcov-report/api/routes/deploy.js.html +2 -2
  63. package/coverage/lcov-report/api/routes/dev.js.html +2 -2
  64. package/coverage/lcov-report/api/routes/hosting.js.html +2 -2
  65. package/coverage/lcov-report/api/routes/index.html +9 -9
  66. package/coverage/lcov-report/api/routes/index.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/integration.js.html +2 -2
  68. package/coverage/lcov-report/api/routes/layout.js.html +2 -2
  69. package/coverage/lcov-report/api/routes/metadata.js.html +2 -2
  70. package/coverage/lcov-report/api/routes/permission.js.html +12 -3
  71. package/coverage/lcov-report/api/routes/query.js.html +20 -86
  72. package/coverage/lcov-report/api/routes/role.js.html +2 -2
  73. package/coverage/lcov-report/api/routes/routing.js.html +2 -2
  74. package/coverage/lcov-report/api/routes/row.js.html +2 -2
  75. package/coverage/lcov-report/api/routes/screen.js.html +2 -2
  76. package/coverage/lcov-report/api/routes/script.js.html +2 -2
  77. package/coverage/lcov-report/api/routes/static.js.html +2 -2
  78. package/coverage/lcov-report/api/routes/table.js.html +2 -2
  79. package/coverage/lcov-report/api/routes/templates.js.html +2 -2
  80. package/coverage/lcov-report/api/routes/user.js.html +33 -3
  81. package/coverage/lcov-report/api/routes/view.js.html +2 -2
  82. package/coverage/lcov-report/api/routes/webhook.js.html +2 -2
  83. package/coverage/lcov-report/automations/actions.js.html +1 -1
  84. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  85. package/coverage/lcov-report/automations/bullboard.js.html +2 -2
  86. package/coverage/lcov-report/automations/index.html +20 -20
  87. package/coverage/lcov-report/automations/index.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/createRow.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/executeQuery.js.html +32 -8
  94. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/index.html +11 -11
  97. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  98. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +5 -8
  99. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  100. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  101. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  102. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  103. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  104. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  105. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  106. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  107. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  108. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  109. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  110. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  111. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  112. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  113. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  114. package/coverage/lcov-report/automations/triggers.js.html +1 -1
  115. package/coverage/lcov-report/automations/utils.js.html +49 -16
  116. package/coverage/lcov-report/constants/index.html +1 -1
  117. package/coverage/lcov-report/constants/index.js.html +25 -25
  118. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  119. package/coverage/lcov-report/constants/screens.js.html +2 -2
  120. package/coverage/lcov-report/db/client.js.html +19 -19
  121. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  122. package/coverage/lcov-report/db/index.html +15 -15
  123. package/coverage/lcov-report/db/index.js.html +3 -3
  124. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  125. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  126. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  127. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  128. package/coverage/lcov-report/db/newid.js.html +4 -4
  129. package/coverage/lcov-report/db/utils.js.html +108 -81
  130. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  131. package/coverage/lcov-report/events/index.html +1 -1
  132. package/coverage/lcov-report/events/index.js.html +1 -1
  133. package/coverage/lcov-report/events/utils.js.html +1 -1
  134. package/coverage/lcov-report/index.html +99 -84
  135. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  136. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  137. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  138. package/coverage/lcov-report/middleware/authorized.js.html +12 -12
  139. package/coverage/lcov-report/middleware/builder.js.html +10 -10
  140. package/coverage/lcov-report/middleware/currentapp.js.html +48 -36
  141. package/coverage/lcov-report/middleware/index.html +1 -1
  142. package/coverage/lcov-report/middleware/joi-validator.js.html +11 -11
  143. package/coverage/lcov-report/middleware/resourceId.js.html +18 -18
  144. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  145. package/coverage/lcov-report/middleware/usageQuota.js.html +2 -2
  146. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  147. package/coverage/lcov-report/threads/automation.js.html +3 -3
  148. package/coverage/lcov-report/threads/index.html +32 -32
  149. package/coverage/lcov-report/threads/index.js.html +12 -12
  150. package/coverage/lcov-report/threads/query.js.html +560 -65
  151. package/coverage/lcov-report/threads/utils.js.html +210 -15
  152. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  153. package/coverage/lcov-report/utilities/budibaseDir.js.html +2 -2
  154. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  155. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  156. package/coverage/lcov-report/utilities/global.js.html +28 -19
  157. package/coverage/lcov-report/utilities/index.html +19 -19
  158. package/coverage/lcov-report/utilities/index.js.html +70 -37
  159. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +2 -2
  160. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  161. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  162. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  163. package/coverage/lcov-report/utilities/rowProcessor/index.html +19 -19
  164. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +247 -10
  165. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  166. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  167. package/coverage/lcov-report/utilities/security.js.html +14 -5
  168. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  169. package/coverage/lcov-report/utilities/users.js.html +1 -1
  170. package/coverage/lcov-report/utilities/workerRequests.js.html +22 -22
  171. package/coverage/lcov.info +2735 -2313
  172. package/dist/api/controllers/apikeys.js +2 -2
  173. package/dist/api/controllers/application.js +4 -4
  174. package/dist/api/controllers/auth.js +1 -1
  175. package/dist/api/controllers/automation.js +7 -5
  176. package/dist/api/controllers/cloud.js +2 -2
  177. package/dist/api/controllers/datasource.js +29 -0
  178. package/dist/api/controllers/deploy/index.js +2 -2
  179. package/dist/api/controllers/dev.js +2 -2
  180. package/dist/api/controllers/hosting.js +2 -2
  181. package/dist/api/controllers/permission.js +2 -2
  182. package/dist/api/controllers/query/import/index.js +79 -0
  183. package/dist/api/controllers/query/import/sources/base/index.js +64 -0
  184. package/dist/api/controllers/query/import/sources/base/openapi.js +42 -0
  185. package/dist/api/controllers/query/import/sources/curl.js +96 -0
  186. package/dist/api/controllers/query/import/sources/openapi2.js +142 -0
  187. package/dist/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.json +253 -0
  188. package/dist/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.json +1054 -0
  189. package/dist/api/controllers/{query.js → query/index.js} +88 -56
  190. package/dist/api/controllers/query/validation.js +38 -0
  191. package/dist/api/controllers/role.js +1 -1
  192. package/dist/api/controllers/routing.js +1 -1
  193. package/dist/api/controllers/row/internal.js +14 -6
  194. package/dist/api/controllers/row/internalSearch.js +3 -2
  195. package/dist/api/controllers/row/utils.js +13 -6
  196. package/dist/api/controllers/screen.js +1 -1
  197. package/dist/api/controllers/user.js +40 -4
  198. package/dist/api/controllers/webhook.js +5 -1
  199. package/dist/api/index.js +1 -1
  200. package/dist/api/routes/apikeys.js +1 -1
  201. package/dist/api/routes/application.js +1 -1
  202. package/dist/api/routes/automation.js +1 -1
  203. package/dist/api/routes/backup.js +1 -1
  204. package/dist/api/routes/cloud.js +1 -1
  205. package/dist/api/routes/component.js +1 -1
  206. package/dist/api/routes/datasource.js +1 -1
  207. package/dist/api/routes/deploy.js +1 -1
  208. package/dist/api/routes/dev.js +1 -1
  209. package/dist/api/routes/hosting.js +1 -1
  210. package/dist/api/routes/integration.js +1 -1
  211. package/dist/api/routes/layout.js +1 -1
  212. package/dist/api/routes/metadata.js +1 -1
  213. package/dist/api/routes/permission.js +1 -1
  214. package/dist/api/routes/query.js +6 -34
  215. package/dist/api/routes/role.js +1 -1
  216. package/dist/api/routes/routing.js +1 -1
  217. package/dist/api/routes/row.js +1 -1
  218. package/dist/api/routes/screen.js +1 -1
  219. package/dist/api/routes/script.js +1 -1
  220. package/dist/api/routes/static.js +1 -1
  221. package/dist/api/routes/table.js +1 -1
  222. package/dist/api/routes/templates.js +1 -1
  223. package/dist/api/routes/tests/utilities/TestFunctions.js +1 -1
  224. package/dist/api/routes/user.js +4 -2
  225. package/dist/api/routes/view.js +1 -1
  226. package/dist/api/routes/webhook.js +1 -1
  227. package/dist/app.js +1 -1
  228. package/dist/automations/bullboard.js +1 -1
  229. package/dist/automations/steps/executeQuery.js +9 -2
  230. package/dist/automations/steps/outgoingWebhook.js +2 -3
  231. package/dist/automations/utils.js +11 -1
  232. package/dist/constants/index.js +3 -3
  233. package/dist/constants/screens.js +1 -1
  234. package/dist/db/client.js +1 -1
  235. package/dist/db/utils.js +9 -1
  236. package/dist/definitions/datasource.js +6 -1
  237. package/dist/integrations/base/sqlTable.js +1 -1
  238. package/dist/integrations/rest.js +259 -120
  239. package/dist/integrations/utils.js +40 -37
  240. package/dist/middleware/authorized.js +2 -2
  241. package/dist/middleware/builder.js +2 -2
  242. package/dist/middleware/currentapp.js +6 -6
  243. package/dist/middleware/usageQuota.js +1 -1
  244. package/dist/package.json +11 -4
  245. package/dist/tests/utilities/TestConfiguration.js +55 -8
  246. package/dist/tests/utilities/structures.js +2 -2
  247. package/dist/threads/automation.js +2 -2
  248. package/dist/threads/query.js +195 -38
  249. package/dist/threads/utils.js +62 -1
  250. package/dist/tsconfig.tsbuildinfo +1 -1
  251. package/dist/utilities/budibaseDir.js +1 -1
  252. package/dist/utilities/fileSystem/utilities.js +2 -1
  253. package/dist/utilities/global.js +5 -5
  254. package/dist/utilities/index.js +11 -1
  255. package/dist/utilities/redis.js +1 -1
  256. package/dist/utilities/rowProcessor/index.js +76 -0
  257. package/dist/utilities/security.js +2 -2
  258. package/dist/utilities/usageQuota.js +2 -2
  259. package/dist/utilities/workerRequests.js +3 -3
  260. package/package.json +12 -5
  261. package/scripts/replicateApp.js +1 -1
  262. package/src/api/controllers/apikeys.js +2 -2
  263. package/src/api/controllers/application.js +7 -4
  264. package/src/api/controllers/auth.js +1 -1
  265. package/src/api/controllers/automation.js +8 -4
  266. package/src/api/controllers/cloud.js +5 -2
  267. package/src/api/controllers/datasource.js +34 -0
  268. package/src/api/controllers/deploy/index.js +2 -2
  269. package/src/api/controllers/dev.js +2 -2
  270. package/src/api/controllers/hosting.js +2 -2
  271. package/src/api/controllers/permission.js +2 -2
  272. package/src/api/controllers/query/import/index.ts +85 -0
  273. package/src/api/controllers/query/import/sources/base/index.ts +87 -0
  274. package/src/api/controllers/query/import/sources/base/openapi.ts +24 -0
  275. package/src/api/controllers/query/import/sources/curl.ts +102 -0
  276. package/src/api/controllers/query/import/sources/openapi2.ts +163 -0
  277. package/src/api/controllers/query/import/sources/tests/curl/curl.spec.js +103 -0
  278. package/src/api/controllers/query/import/sources/tests/curl/data/delete.txt +1 -0
  279. package/src/api/controllers/query/import/sources/tests/curl/data/empty-body.txt +2 -0
  280. package/src/api/controllers/query/import/sources/tests/curl/data/get.txt +1 -0
  281. package/src/api/controllers/query/import/sources/tests/curl/data/headers.txt +3 -0
  282. package/src/api/controllers/query/import/sources/tests/curl/data/patch.txt +2 -0
  283. package/src/api/controllers/query/import/sources/tests/curl/data/path.txt +1 -0
  284. package/src/api/controllers/query/import/sources/tests/curl/data/post.txt +2 -0
  285. package/src/api/controllers/query/import/sources/tests/curl/data/put.txt +2 -0
  286. package/src/api/controllers/query/import/sources/tests/curl/data/query.txt +1 -0
  287. package/src/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.json +253 -0
  288. package/src/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.yaml +160 -0
  289. package/src/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.json +1054 -0
  290. package/src/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.yaml +711 -0
  291. package/src/api/controllers/query/import/sources/tests/openapi2/openapi2.spec.js +238 -0
  292. package/src/api/controllers/query/import/tests/index.spec.js +109 -0
  293. package/src/api/controllers/query/index.js +196 -0
  294. package/src/api/controllers/query/validation.js +42 -0
  295. package/src/api/controllers/role.js +1 -1
  296. package/src/api/controllers/routing.js +1 -1
  297. package/src/api/controllers/row/internal.js +14 -5
  298. package/src/api/controllers/row/internalSearch.js +3 -2
  299. package/src/api/controllers/row/utils.js +11 -8
  300. package/src/api/controllers/screen.js +1 -1
  301. package/src/api/controllers/user.js +39 -3
  302. package/src/api/controllers/webhook.js +5 -1
  303. package/src/api/index.js +1 -1
  304. package/src/api/routes/apikeys.js +1 -1
  305. package/src/api/routes/application.js +1 -1
  306. package/src/api/routes/automation.js +1 -1
  307. package/src/api/routes/backup.js +1 -1
  308. package/src/api/routes/cloud.js +1 -1
  309. package/src/api/routes/component.js +1 -1
  310. package/src/api/routes/datasource.js +1 -1
  311. package/src/api/routes/deploy.js +1 -1
  312. package/src/api/routes/dev.js +1 -1
  313. package/src/api/routes/hosting.js +1 -1
  314. package/src/api/routes/integration.js +1 -1
  315. package/src/api/routes/layout.js +1 -1
  316. package/src/api/routes/metadata.js +1 -1
  317. package/src/api/routes/permission.js +4 -1
  318. package/src/api/routes/query.js +14 -36
  319. package/src/api/routes/role.js +1 -1
  320. package/src/api/routes/routing.js +1 -1
  321. package/src/api/routes/row.js +1 -1
  322. package/src/api/routes/screen.js +1 -1
  323. package/src/api/routes/script.js +1 -1
  324. package/src/api/routes/static.js +1 -1
  325. package/src/api/routes/table.js +1 -1
  326. package/src/api/routes/templates.js +1 -1
  327. package/src/api/routes/tests/datasource.spec.js +45 -0
  328. package/src/api/routes/tests/permissions.spec.js +1 -1
  329. package/src/api/routes/tests/query.spec.js +70 -1
  330. package/src/api/routes/tests/role.spec.js +2 -2
  331. package/src/api/routes/tests/routing.spec.js +1 -1
  332. package/src/api/routes/tests/user.spec.js +1 -1
  333. package/src/api/routes/tests/utilities/TestFunctions.js +1 -1
  334. package/src/api/routes/user.js +11 -1
  335. package/src/api/routes/view.js +1 -1
  336. package/src/api/routes/webhook.js +1 -1
  337. package/src/app.ts +1 -1
  338. package/src/automations/bullboard.js +1 -1
  339. package/src/automations/steps/executeQuery.js +10 -2
  340. package/src/automations/steps/outgoingWebhook.js +2 -3
  341. package/src/automations/utils.js +12 -1
  342. package/src/constants/index.js +3 -3
  343. package/src/constants/screens.js +1 -1
  344. package/src/db/client.js +1 -1
  345. package/src/db/utils.js +10 -1
  346. package/src/definitions/common.ts +2 -16
  347. package/src/definitions/datasource.ts +98 -1
  348. package/src/integrations/base/IntegrationBase.ts +4 -4
  349. package/src/integrations/base/sqlTable.ts +1 -1
  350. package/src/integrations/rest.ts +311 -138
  351. package/src/integrations/tests/rest.spec.js +432 -21
  352. package/src/integrations/utils.ts +8 -7
  353. package/src/middleware/authorized.js +2 -2
  354. package/src/middleware/builder.js +2 -2
  355. package/src/middleware/currentapp.js +11 -7
  356. package/src/middleware/tests/authorized.spec.js +2 -2
  357. package/src/middleware/tests/currentapp.spec.js +35 -41
  358. package/src/middleware/tests/usageQuota.spec.js +1 -1
  359. package/src/middleware/usageQuota.js +1 -1
  360. package/src/tests/utilities/TestConfiguration.js +65 -8
  361. package/src/tests/utilities/structures.js +2 -2
  362. package/src/threads/automation.js +2 -2
  363. package/src/threads/query.js +204 -39
  364. package/src/threads/utils.js +66 -1
  365. package/src/utilities/budibaseDir.js +1 -1
  366. package/src/utilities/fileSystem/utilities.js +3 -1
  367. package/src/utilities/global.js +8 -5
  368. package/src/utilities/index.js +12 -1
  369. package/src/utilities/redis.js +1 -1
  370. package/src/utilities/rowProcessor/index.js +79 -0
  371. package/src/utilities/security.js +5 -2
  372. package/src/utilities/usageQuota.js +2 -2
  373. package/src/utilities/workerRequests.js +3 -3
  374. package/builder/assets/index.9ac33cf1.js +0 -1316
  375. package/src/api/controllers/query.js +0 -161
@@ -3,15 +3,15 @@
3
3
  <html lang="en">
4
4
 
5
5
  <head>
6
- <title>Code coverage report for api/controllers/query.js</title>
6
+ <title>Code coverage report for api/controllers/query/index.js</title>
7
7
  <meta charset="utf-8" />
8
- <link rel="stylesheet" href="../../prettify.css" />
9
- <link rel="stylesheet" href="../../base.css" />
10
- <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
8
+ <link rel="stylesheet" href="../../../prettify.css" />
9
+ <link rel="stylesheet" href="../../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
11
11
  <meta name="viewport" content="width=device-width, initial-scale=1" />
12
12
  <style type='text/css'>
13
13
  .coverage-summary .sorter {
14
- background-image: url(../../sort-arrow-sprite.png);
14
+ background-image: url(../../../sort-arrow-sprite.png);
15
15
  }
16
16
  </style>
17
17
  </head>
@@ -19,34 +19,34 @@
19
19
  <body>
20
20
  <div class='wrapper'>
21
21
  <div class='pad1'>
22
- <h1><a href="../../index.html">All files</a> / <a href="index.html">api/controllers</a> query.js</h1>
22
+ <h1><a href="../../../index.html">All files</a> / <a href="index.html">api/controllers/query</a> index.js</h1>
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">84.72% </span>
26
+ <span class="strong">81.11% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>61/72</span>
28
+ <span class='fraction'>73/90</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">51.85% </span>
33
+ <span class="strong">68.42% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>14/27</span>
35
+ <span class='fraction'>13/19</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">100% </span>
40
+ <span class="strong">85.71% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>9/9</span>
42
+ <span class='fraction'>12/14</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">84.5% </span>
47
+ <span class="strong">80.68% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>60/71</span>
49
+ <span class='fraction'>71/88</span>
50
50
  </div>
51
51
 
52
52
 
@@ -218,8 +218,42 @@
218
218
  <a name='L159'></a><a href='#L159'>159</a>
219
219
  <a name='L160'></a><a href='#L160'>160</a>
220
220
  <a name='L161'></a><a href='#L161'>161</a>
221
- <a name='L162'></a><a href='#L162'>162</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">34x</span>
222
- <span class="cline-any cline-yes">34x</span>
221
+ <a name='L162'></a><a href='#L162'>162</a>
222
+ <a name='L163'></a><a href='#L163'>163</a>
223
+ <a name='L164'></a><a href='#L164'>164</a>
224
+ <a name='L165'></a><a href='#L165'>165</a>
225
+ <a name='L166'></a><a href='#L166'>166</a>
226
+ <a name='L167'></a><a href='#L167'>167</a>
227
+ <a name='L168'></a><a href='#L168'>168</a>
228
+ <a name='L169'></a><a href='#L169'>169</a>
229
+ <a name='L170'></a><a href='#L170'>170</a>
230
+ <a name='L171'></a><a href='#L171'>171</a>
231
+ <a name='L172'></a><a href='#L172'>172</a>
232
+ <a name='L173'></a><a href='#L173'>173</a>
233
+ <a name='L174'></a><a href='#L174'>174</a>
234
+ <a name='L175'></a><a href='#L175'>175</a>
235
+ <a name='L176'></a><a href='#L176'>176</a>
236
+ <a name='L177'></a><a href='#L177'>177</a>
237
+ <a name='L178'></a><a href='#L178'>178</a>
238
+ <a name='L179'></a><a href='#L179'>179</a>
239
+ <a name='L180'></a><a href='#L180'>180</a>
240
+ <a name='L181'></a><a href='#L181'>181</a>
241
+ <a name='L182'></a><a href='#L182'>182</a>
242
+ <a name='L183'></a><a href='#L183'>183</a>
243
+ <a name='L184'></a><a href='#L184'>184</a>
244
+ <a name='L185'></a><a href='#L185'>185</a>
245
+ <a name='L186'></a><a href='#L186'>186</a>
246
+ <a name='L187'></a><a href='#L187'>187</a>
247
+ <a name='L188'></a><a href='#L188'>188</a>
248
+ <a name='L189'></a><a href='#L189'>189</a>
249
+ <a name='L190'></a><a href='#L190'>190</a>
250
+ <a name='L191'></a><a href='#L191'>191</a>
251
+ <a name='L192'></a><a href='#L192'>192</a>
252
+ <a name='L193'></a><a href='#L193'>193</a>
253
+ <a name='L194'></a><a href='#L194'>194</a>
254
+ <a name='L195'></a><a href='#L195'>195</a>
255
+ <a name='L196'></a><a href='#L196'>196</a>
256
+ <a name='L197'></a><a href='#L197'>197</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">34x</span>
223
257
  <span class="cline-any cline-neutral">&nbsp;</span>
224
258
  <span class="cline-any cline-neutral">&nbsp;</span>
225
259
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -228,10 +262,10 @@
228
262
  <span class="cline-any cline-yes">34x</span>
229
263
  <span class="cline-any cline-yes">34x</span>
230
264
  <span class="cline-any cline-yes">34x</span>
231
- <span class="cline-any cline-neutral">&nbsp;</span>
265
+ <span class="cline-any cline-yes">34x</span>
232
266
  <span class="cline-any cline-yes">34x</span>
233
267
  <span class="cline-any cline-neutral">&nbsp;</span>
234
- <span class="cline-any cline-neutral">&nbsp;</span>
268
+ <span class="cline-any cline-yes">34x</span>
235
269
  <span class="cline-any cline-neutral">&nbsp;</span>
236
270
  <span class="cline-any cline-neutral">&nbsp;</span>
237
271
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -253,63 +287,62 @@
253
287
  <span class="cline-any cline-neutral">&nbsp;</span>
254
288
  <span class="cline-any cline-neutral">&nbsp;</span>
255
289
  <span class="cline-any cline-neutral">&nbsp;</span>
290
+ <span class="cline-any cline-neutral">&nbsp;</span>
256
291
  <span class="cline-any cline-yes">2x</span>
257
292
  <span class="cline-any cline-neutral">&nbsp;</span>
258
293
  <span class="cline-any cline-neutral">&nbsp;</span>
259
294
  <span class="cline-any cline-yes">34x</span>
260
- <span class="cline-any cline-yes">20x</span>
261
- <span class="cline-any cline-yes">20x</span>
295
+ <span class="cline-any cline-no">&nbsp;</span>
296
+ <span class="cline-any cline-no">&nbsp;</span>
262
297
  <span class="cline-any cline-neutral">&nbsp;</span>
263
- <span class="cline-any cline-yes">20x</span>
264
- <span class="cline-any cline-yes">20x</span>
298
+ <span class="cline-any cline-no">&nbsp;</span>
299
+ <span class="cline-any cline-no">&nbsp;</span>
265
300
  <span class="cline-any cline-neutral">&nbsp;</span>
266
301
  <span class="cline-any cline-neutral">&nbsp;</span>
267
- <span class="cline-any cline-yes">20x</span>
268
- <span class="cline-any cline-yes">20x</span>
302
+ <span class="cline-any cline-no">&nbsp;</span>
303
+ <span class="cline-any cline-neutral">&nbsp;</span>
304
+ <span class="cline-any cline-no">&nbsp;</span>
305
+ <span class="cline-any cline-no">&nbsp;</span>
306
+ <span class="cline-any cline-neutral">&nbsp;</span>
269
307
  <span class="cline-any cline-neutral">&nbsp;</span>
270
- <span class="cline-any cline-yes">20x</span>
271
- <span class="cline-any cline-yes">20x</span>
272
308
  <span class="cline-any cline-neutral">&nbsp;</span>
273
309
  <span class="cline-any cline-neutral">&nbsp;</span>
274
310
  <span class="cline-any cline-neutral">&nbsp;</span>
275
- <span class="cline-any cline-yes">4x</span>
276
311
  <span class="cline-any cline-neutral">&nbsp;</span>
277
312
  <span class="cline-any cline-neutral">&nbsp;</span>
278
- <span class="cline-any cline-yes">4x</span>
279
- <span class="cline-any cline-no">&nbsp;</span>
280
- <span class="cline-any cline-no">&nbsp;</span>
281
313
  <span class="cline-any cline-neutral">&nbsp;</span>
282
- <span class="cline-any cline-no">&nbsp;</span>
283
314
  <span class="cline-any cline-neutral">&nbsp;</span>
284
315
  <span class="cline-any cline-no">&nbsp;</span>
285
316
  <span class="cline-any cline-no">&nbsp;</span>
286
- <span class="cline-any cline-neutral">&nbsp;</span>
287
317
  <span class="cline-any cline-no">&nbsp;</span>
288
- <span class="cline-any cline-neutral">&nbsp;</span>
318
+ <span class="cline-any cline-no">&nbsp;</span>
289
319
  <span class="cline-any cline-neutral">&nbsp;</span>
290
320
  <span class="cline-any cline-neutral">&nbsp;</span>
291
321
  <span class="cline-any cline-no">&nbsp;</span>
292
322
  <span class="cline-any cline-neutral">&nbsp;</span>
293
323
  <span class="cline-any cline-neutral">&nbsp;</span>
324
+ <span class="cline-any cline-no">&nbsp;</span>
294
325
  <span class="cline-any cline-neutral">&nbsp;</span>
295
- <span class="cline-any cline-yes">4x</span>
296
- <span class="cline-any cline-neutral">&nbsp;</span>
326
+ <span class="cline-any cline-no">&nbsp;</span>
297
327
  <span class="cline-any cline-neutral">&nbsp;</span>
298
328
  <span class="cline-any cline-neutral">&nbsp;</span>
299
329
  <span class="cline-any cline-neutral">&nbsp;</span>
300
330
  <span class="cline-any cline-no">&nbsp;</span>
301
- <span class="cline-any cline-no">&nbsp;</span>
302
331
  <span class="cline-any cline-neutral">&nbsp;</span>
303
332
  <span class="cline-any cline-neutral">&nbsp;</span>
333
+ <span class="cline-any cline-yes">34x</span>
334
+ <span class="cline-any cline-yes">28x</span>
335
+ <span class="cline-any cline-yes">28x</span>
304
336
  <span class="cline-any cline-neutral">&nbsp;</span>
337
+ <span class="cline-any cline-yes">28x</span>
338
+ <span class="cline-any cline-yes">28x</span>
305
339
  <span class="cline-any cline-neutral">&nbsp;</span>
306
340
  <span class="cline-any cline-neutral">&nbsp;</span>
307
- <span class="cline-any cline-no">&nbsp;</span>
341
+ <span class="cline-any cline-yes">28x</span>
342
+ <span class="cline-any cline-yes">28x</span>
308
343
  <span class="cline-any cline-neutral">&nbsp;</span>
309
- <span class="cline-any cline-no">&nbsp;</span>
310
- <span class="cline-any cline-neutral">&nbsp;</span>
311
- <span class="cline-any cline-neutral">&nbsp;</span>
312
- <span class="cline-any cline-yes">4x</span>
344
+ <span class="cline-any cline-yes">28x</span>
345
+ <span class="cline-any cline-yes">28x</span>
313
346
  <span class="cline-any cline-neutral">&nbsp;</span>
314
347
  <span class="cline-any cline-neutral">&nbsp;</span>
315
348
  <span class="cline-any cline-yes">34x</span>
@@ -324,22 +357,28 @@
324
357
  <span class="cline-any cline-neutral">&nbsp;</span>
325
358
  <span class="cline-any cline-neutral">&nbsp;</span>
326
359
  <span class="cline-any cline-yes">34x</span>
327
- <span class="cline-any cline-yes">2x</span>
360
+ <span class="cline-any cline-yes">8x</span>
328
361
  <span class="cline-any cline-neutral">&nbsp;</span>
329
- <span class="cline-any cline-yes">2x</span>
362
+ <span class="cline-any cline-yes">8x</span>
330
363
  <span class="cline-any cline-neutral">&nbsp;</span>
331
- <span class="cline-any cline-yes">2x</span>
332
- <span class="cline-any cline-yes">2x</span>
333
364
  <span class="cline-any cline-neutral">&nbsp;</span>
334
- <span class="cline-any cline-yes">2x</span>
335
- <span class="cline-any cline-yes">2x</span>
336
365
  <span class="cline-any cline-neutral">&nbsp;</span>
366
+ <span class="cline-any cline-yes">8x</span>
337
367
  <span class="cline-any cline-neutral">&nbsp;</span>
368
+ <span class="cline-any cline-yes">8x</span>
369
+ <span class="cline-any cline-yes">8x</span>
338
370
  <span class="cline-any cline-neutral">&nbsp;</span>
339
371
  <span class="cline-any cline-neutral">&nbsp;</span>
340
372
  <span class="cline-any cline-neutral">&nbsp;</span>
341
373
  <span class="cline-any cline-neutral">&nbsp;</span>
342
- <span class="cline-any cline-yes">1x</span>
374
+ <span class="cline-any cline-neutral">&nbsp;</span>
375
+ <span class="cline-any cline-neutral">&nbsp;</span>
376
+ <span class="cline-any cline-neutral">&nbsp;</span>
377
+ <span class="cline-any cline-neutral">&nbsp;</span>
378
+ <span class="cline-any cline-neutral">&nbsp;</span>
379
+ <span class="cline-any cline-yes">7x</span>
380
+ <span class="cline-any cline-neutral">&nbsp;</span>
381
+ <span class="cline-any cline-neutral">&nbsp;</span>
343
382
  <span class="cline-any cline-neutral">&nbsp;</span>
344
383
  <span class="cline-any cline-neutral">&nbsp;</span>
345
384
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -348,51 +387,81 @@
348
387
  <span class="cline-any cline-neutral">&nbsp;</span>
349
388
  <span class="cline-any cline-neutral">&nbsp;</span>
350
389
  <span class="cline-any cline-neutral">&nbsp;</span>
351
- <span class="cline-any cline-yes">34x</span>
390
+ <span class="cline-any cline-neutral">&nbsp;</span>
352
391
  <span class="cline-any cline-yes">2x</span>
353
392
  <span class="cline-any cline-neutral">&nbsp;</span>
354
393
  <span class="cline-any cline-yes">2x</span>
355
394
  <span class="cline-any cline-yes">2x</span>
356
395
  <span class="cline-any cline-neutral">&nbsp;</span>
396
+ <span class="cline-any cline-neutral">&nbsp;</span>
397
+ <span class="cline-any cline-yes">2x</span>
357
398
  <span class="cline-any cline-yes">2x</span>
358
399
  <span class="cline-any cline-neutral">&nbsp;</span>
359
400
  <span class="cline-any cline-neutral">&nbsp;</span>
360
401
  <span class="cline-any cline-neutral">&nbsp;</span>
361
402
  <span class="cline-any cline-neutral">&nbsp;</span>
362
403
  <span class="cline-any cline-neutral">&nbsp;</span>
363
- <span class="cline-any cline-yes">2x</span>
364
- <span class="cline-any cline-yes">2x</span>
365
- <span class="cline-any cline-neutral">&nbsp;</span>
366
404
  <span class="cline-any cline-neutral">&nbsp;</span>
367
405
  <span class="cline-any cline-neutral">&nbsp;</span>
368
406
  <span class="cline-any cline-neutral">&nbsp;</span>
369
407
  <span class="cline-any cline-neutral">&nbsp;</span>
370
408
  <span class="cline-any cline-yes">1x</span>
409
+ <span class="cline-any cline-yes">1x</span>
410
+ <span class="cline-any cline-neutral">&nbsp;</span>
411
+ <span class="cline-any cline-no">&nbsp;</span>
412
+ <span class="cline-any cline-neutral">&nbsp;</span>
371
413
  <span class="cline-any cline-neutral">&nbsp;</span>
372
414
  <span class="cline-any cline-yes">1x</span>
373
415
  <span class="cline-any cline-neutral">&nbsp;</span>
374
416
  <span class="cline-any cline-neutral">&nbsp;</span>
375
417
  <span class="cline-any cline-neutral">&nbsp;</span>
376
418
  <span class="cline-any cline-yes">34x</span>
419
+ <span class="cline-any cline-yes">2x</span>
420
+ <span class="cline-any cline-neutral">&nbsp;</span>
421
+ <span class="cline-any cline-neutral">&nbsp;</span>
422
+ <span class="cline-any cline-yes">34x</span>
423
+ <span class="cline-any cline-no">&nbsp;</span>
424
+ <span class="cline-any cline-neutral">&nbsp;</span>
425
+ <span class="cline-any cline-neutral">&nbsp;</span>
426
+ <span class="cline-any cline-yes">34x</span>
427
+ <span class="cline-any cline-yes">2x</span>
428
+ <span class="cline-any cline-yes">2x</span>
429
+ <span class="cline-any cline-yes">2x</span>
430
+ <span class="cline-any cline-neutral">&nbsp;</span>
431
+ <span class="cline-any cline-yes">2x</span>
432
+ <span class="cline-any cline-neutral">&nbsp;</span>
377
433
  <span class="cline-any cline-yes">1x</span>
378
434
  <span class="cline-any cline-yes">1x</span>
379
435
  <span class="cline-any cline-yes">1x</span>
436
+ <span class="cline-any cline-neutral">&nbsp;</span>
437
+ <span class="cline-any cline-neutral">&nbsp;</span>
438
+ <span class="cline-any cline-yes">1x</span>
439
+ <span class="cline-any cline-yes">1x</span>
440
+ <span class="cline-any cline-neutral">&nbsp;</span>
380
441
  <span class="cline-any cline-yes">1x</span>
381
442
  <span class="cline-any cline-neutral">&nbsp;</span>
382
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const { processString } = require("@budibase/string-templates")
383
- const CouchDB = require("../../db")
443
+ <span class="cline-any cline-neutral">&nbsp;</span>
444
+ <span class="cline-any cline-neutral">&nbsp;</span>
445
+ <span class="cline-any cline-yes">34x</span>
446
+ <span class="cline-any cline-yes">2x</span>
447
+ <span class="cline-any cline-yes">2x</span>
448
+ <span class="cline-any cline-yes">2x</span>
449
+ <span class="cline-any cline-yes">2x</span>
450
+ <span class="cline-any cline-yes">2x</span>
451
+ <span class="cline-any cline-neutral">&nbsp;</span>
452
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const CouchDB = require("../../../db")
384
453
  const {
385
454
  generateQueryID,
386
455
  getQueryParams,
387
456
  isProdAppID,
388
- } = require("../../db/utils")
389
- const { BaseQueryVerbs } = require("../../constants")
390
- const { Thread, ThreadType } = require("../../threads")
391
- const env = require("../../environment")
457
+ } = require("../../../db/utils")
458
+ const { BaseQueryVerbs } = require("../../../constants")
459
+ const { Thread, ThreadType } = require("../../../threads")
460
+ const { save: saveDatasource } = require("../datasource")
461
+ const { RestImporter } = require("./import")
462
+ const { invalidateDynamicVariables } = require("../../../threads/utils")
392
463
  &nbsp;
393
- const Runner = new Thread(ThreadType.QUERY, {
394
- timeoutMs: env.QUERY_THREAD_TIMEOUT || 10000,
395
- })
464
+ const Runner = new Thread(ThreadType.QUERY, { timeoutMs: 10000 })
396
465
  &nbsp;
397
466
  // simple function to append "readable" to all read queries
398
467
  function enrichQueries(input) {
@@ -414,9 +483,49 @@ exports.fetch = async function (ctx) {
414
483
  include_docs: true,
415
484
  })
416
485
  )
486
+ &nbsp;
417
487
  ctx.body = enrichQueries(body.rows.map(row =&gt; row.doc))
418
488
  }
419
489
  &nbsp;
490
+ exports.import = <span class="fstat-no" title="function not covered" >as</span>ync ctx =&gt; {
491
+ const body = <span class="cstat-no" title="statement not covered" >ctx.request.body</span>
492
+ const data = <span class="cstat-no" title="statement not covered" >body.data</span>
493
+ &nbsp;
494
+ const importer = <span class="cstat-no" title="statement not covered" >new RestImporter(data)</span>
495
+ <span class="cstat-no" title="statement not covered" > await importer.init()</span>
496
+ &nbsp;
497
+ let datasourceId
498
+ <span class="cstat-no" title="statement not covered" > if (!body.datasourceId) {</span>
499
+ // construct new datasource
500
+ const info = <span class="cstat-no" title="statement not covered" >await importer.getInfo()</span>
501
+ let datasource = <span class="cstat-no" title="statement not covered" >{</span>
502
+ type: "datasource",
503
+ source: "REST",
504
+ config: {
505
+ url: info.url,
506
+ defaultHeaders: [],
507
+ },
508
+ name: info.name,
509
+ }
510
+ // save the datasource
511
+ const datasourceCtx = <span class="cstat-no" title="statement not covered" >{ ...ctx }</span>
512
+ <span class="cstat-no" title="statement not covered" > datasourceCtx.request.body.datasource = datasource</span>
513
+ <span class="cstat-no" title="statement not covered" > await saveDatasource(datasourceCtx)</span>
514
+ <span class="cstat-no" title="statement not covered" > datasourceId = datasourceCtx.body.datasource._id</span>
515
+ } else {
516
+ // use existing datasource
517
+ <span class="cstat-no" title="statement not covered" > datasourceId = body.datasourceId</span>
518
+ }
519
+ &nbsp;
520
+ const importResult = <span class="cstat-no" title="statement not covered" >await importer.importQueries(ctx.appId, datasourceId)</span>
521
+ &nbsp;
522
+ <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
523
+ ...importResult,
524
+ datasourceId,
525
+ }
526
+ <span class="cstat-no" title="statement not covered" > ctx.status = 200</span>
527
+ }
528
+ &nbsp;
420
529
  exports.save = async function (ctx) {
421
530
  const db = new CouchDB(ctx.appId)
422
531
  const query = ctx.request.body
@@ -432,47 +541,6 @@ exports.save = async function (ctx) {
432
541
  ctx.message = `Query ${query.name} saved successfully.`
433
542
  }
434
543
  &nbsp;
435
- async function enrichQueryFields(fields, parameters = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> {
436
- const enrichedQuery = {}
437
- &nbsp;
438
- // enrich the fields with dynamic parameters
439
- for (let key of Object.keys(fields)) {
440
- <span class="cstat-no" title="statement not covered" > if (fields[key] == null) {</span>
441
- <span class="cstat-no" title="statement not covered" > continue</span>
442
- }
443
- <span class="cstat-no" title="statement not covered" > if (typeof fields[key] === "object") {</span>
444
- // enrich nested fields object
445
- <span class="cstat-no" title="statement not covered" > enrichedQuery[key] = await enrichQueryFields(fields[key], parameters)</span>
446
- } else <span class="cstat-no" title="statement not covered" >if (typeof fields[key] === "string") {</span>
447
- // enrich string value as normal
448
- <span class="cstat-no" title="statement not covered" > enrichedQuery[key] = await processString(fields[key], parameters, {</span>
449
- noHelpers: true,
450
- })
451
- } else {
452
- <span class="cstat-no" title="statement not covered" > enrichedQuery[key] = fields[key]</span>
453
- }
454
- }
455
- &nbsp;
456
- <span class="missing-if-branch" title="if path not taken" >I</span>if (
457
- enrichedQuery.json ||
458
- enrichedQuery.customData ||
459
- enrichedQuery.requestBody
460
- ) {
461
- <span class="cstat-no" title="statement not covered" > try {</span>
462
- <span class="cstat-no" title="statement not covered" > enrichedQuery.json = JSON.parse(</span>
463
- enrichedQuery.json ||
464
- enrichedQuery.customData ||
465
- enrichedQuery.requestBody
466
- )
467
- } catch (err) {
468
- <span class="cstat-no" title="statement not covered" > throw { message: `JSON Invalid - error: ${err}` }</span>
469
- }
470
- <span class="cstat-no" title="statement not covered" > delete enrichedQuery.customData</span>
471
- }
472
- &nbsp;
473
- return enrichedQuery
474
- }
475
- &nbsp;
476
544
  exports.find = async function (ctx) {
477
545
  const db = new CouchDB(ctx.appId)
478
546
  const query = enrichQueries(await db.get(ctx.params.queryId))
@@ -488,54 +556,91 @@ exports.preview = async function (ctx) {
488
556
  const db = new CouchDB(ctx.appId)
489
557
  &nbsp;
490
558
  const datasource = await db.get(ctx.request.body.datasourceId)
491
- &nbsp;
492
- const { fields, parameters, queryVerb, transformer } = ctx.request.body
493
- const enrichedQuery = await enrichQueryFields(fields, parameters)
559
+ // preview may not have a queryId as it hasn't been saved, but if it does
560
+ // this stops dynamic variables from calling the same query
561
+ const { fields, parameters, queryVerb, transformer, queryId } =
562
+ ctx.request.body
494
563
  &nbsp;
495
564
  try {
496
- const { rows, keys } = await Runner.run({
565
+ const { rows, keys, info, extra } = await Runner.run({
566
+ appId: ctx.appId,
497
567
  datasource,
498
568
  queryVerb,
499
- query: enrichedQuery,
569
+ fields,
570
+ parameters,
500
571
  transformer,
572
+ queryId,
501
573
  })
502
574
  &nbsp;
503
575
  ctx.body = {
504
576
  rows,
505
577
  schemaFields: [...new Set(keys)],
578
+ info,
579
+ extra,
506
580
  }
507
581
  } catch (err) {
508
582
  ctx.throw(400, err)
509
583
  }
510
584
  }
511
585
  &nbsp;
512
- exports.execute = async function (ctx) {
586
+ async function execute(ctx, opts = <span class="branch-0 cbranch-no" title="branch not covered" >{ rowsOnly: false })</span> {
513
587
  const db = new CouchDB(ctx.appId)
514
588
  &nbsp;
515
589
  const query = await db.get(ctx.params.queryId)
516
590
  const datasource = await db.get(query.datasourceId)
517
- &nbsp;
518
- const enrichedQuery = await enrichQueryFields(
519
- query.fields,
520
- ctx.request.body.parameters
521
- )
522
591
  &nbsp;
523
592
  // call the relevant CRUD method on the integration class
524
593
  try {
525
- const { rows } = await Runner.run({
594
+ const { rows, pagination, extra } = await Runner.run({
595
+ appId: ctx.appId,
526
596
  datasource,
527
597
  queryVerb: query.queryVerb,
528
- query: enrichedQuery,
598
+ fields: query.fields,
599
+ pagination: ctx.request.body.pagination,
600
+ parameters: ctx.request.body.parameters,
529
601
  transformer: query.transformer,
602
+ queryId: ctx.params.queryId,
530
603
  })
531
- ctx.body = rows
604
+ if (opts &amp;&amp; opts.rowsOnly) {
605
+ ctx.body = rows
606
+ } else <span class="missing-if-branch" title="else path not taken" >E</span>{
607
+ <span class="cstat-no" title="statement not covered" > ctx.body = { data: rows, pagination, ...extra }</span>
608
+ }
532
609
  } catch (err) {
533
610
  ctx.throw(400, err)
534
611
  }
535
612
  }
536
613
  &nbsp;
614
+ exports.executeV1 = async function (ctx) {
615
+ return execute(ctx, { rowsOnly: true })
616
+ }
617
+ &nbsp;
618
+ exports.executeV2 = <span class="fstat-no" title="function not covered" >as</span>ync function (ctx) {
619
+ <span class="cstat-no" title="statement not covered" > return execute(ctx, { rowsOnly: false })</span>
620
+ }
621
+ &nbsp;
622
+ const removeDynamicVariables = async (db, queryId) =&gt; {
623
+ const query = await db.get(queryId)
624
+ const datasource = await db.get(query.datasourceId)
625
+ const dynamicVariables = datasource.config.dynamicVariables
626
+ &nbsp;
627
+ if (dynamicVariables) {
628
+ // delete dynamic variables from the datasource
629
+ const newVariables = dynamicVariables.filter(dv =&gt; dv.queryId !== queryId)
630
+ datasource.config.dynamicVariables = newVariables
631
+ await db.put(datasource)
632
+ &nbsp;
633
+ // invalidate the deleted variables
634
+ const variablesToDelete = dynamicVariables.filter(
635
+ dv =&gt; dv.queryId === queryId
636
+ )
637
+ await invalidateDynamicVariables(variablesToDelete)
638
+ }
639
+ }
640
+ &nbsp;
537
641
  exports.destroy = async function (ctx) {
538
642
  const db = new CouchDB(ctx.appId)
643
+ await removeDynamicVariables(db, ctx.params.queryId)
539
644
  await db.remove(ctx.params.queryId, ctx.params.revId)
540
645
  ctx.message = `Query deleted.`
541
646
  ctx.status = 200
@@ -547,17 +652,17 @@ exports.destroy = async function (ctx) {
547
652
  <div class='footer quiet pad2 space-top1 center small'>
548
653
  Code coverage generated by
549
654
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
550
- at Thu Jan 06 2022 08:28:44 GMT+0000 (Coordinated Universal Time)
655
+ at Thu Jan 13 2022 15:16:54 GMT+0000 (Coordinated Universal Time)
551
656
  </div>
552
657
  </div>
553
- <script src="../../prettify.js"></script>
658
+ <script src="../../../prettify.js"></script>
554
659
  <script>
555
660
  window.onload = function () {
556
661
  prettyPrint();
557
662
  };
558
663
  </script>
559
- <script src="../../sorter.js"></script>
560
- <script src="../../block-navigation.js"></script>
664
+ <script src="../../../sorter.js"></script>
665
+ <script src="../../../block-navigation.js"></script>
561
666
  </body>
562
667
  </html>
563
668