@budibase/server 1.0.33 → 1.0.40

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 (382) 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.4fb3f887.css → index.39e01193.css} +1 -1
  4. package/builder/assets/index.6f248ef0.js +1348 -0
  5. package/builder/assets/{vendor.470042a4.js → vendor.f9faf6ab.js} +88 -88
  6. package/builder/index.html +3 -3
  7. package/coverage/clover.xml +1591 -1345
  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} +228 -114
  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 +2740 -2315
  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} +87 -52
  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/environment.js +1 -0
  238. package/dist/integrations/base/sqlTable.js +1 -1
  239. package/dist/integrations/dynamodb.js +19 -0
  240. package/dist/integrations/rest.js +259 -120
  241. package/dist/integrations/s3.js +17 -8
  242. package/dist/integrations/utils.js +40 -37
  243. package/dist/middleware/authorized.js +2 -2
  244. package/dist/middleware/builder.js +2 -2
  245. package/dist/middleware/currentapp.js +6 -6
  246. package/dist/middleware/usageQuota.js +1 -1
  247. package/dist/package.json +11 -4
  248. package/dist/tests/utilities/TestConfiguration.js +55 -8
  249. package/dist/tests/utilities/structures.js +2 -2
  250. package/dist/threads/automation.js +2 -2
  251. package/dist/threads/query.js +195 -38
  252. package/dist/threads/utils.js +62 -1
  253. package/dist/tsconfig.tsbuildinfo +1 -1
  254. package/dist/utilities/budibaseDir.js +1 -1
  255. package/dist/utilities/fileSystem/utilities.js +2 -1
  256. package/dist/utilities/global.js +5 -5
  257. package/dist/utilities/index.js +11 -1
  258. package/dist/utilities/redis.js +1 -1
  259. package/dist/utilities/rowProcessor/index.js +76 -0
  260. package/dist/utilities/security.js +2 -2
  261. package/dist/utilities/usageQuota.js +2 -2
  262. package/dist/utilities/workerRequests.js +3 -3
  263. package/package.json +12 -5
  264. package/scripts/replicateApp.js +1 -1
  265. package/src/api/controllers/apikeys.js +2 -2
  266. package/src/api/controllers/application.js +7 -4
  267. package/src/api/controllers/auth.js +1 -1
  268. package/src/api/controllers/automation.js +8 -4
  269. package/src/api/controllers/cloud.js +5 -2
  270. package/src/api/controllers/datasource.js +34 -0
  271. package/src/api/controllers/deploy/index.js +2 -2
  272. package/src/api/controllers/dev.js +2 -2
  273. package/src/api/controllers/hosting.js +2 -2
  274. package/src/api/controllers/permission.js +2 -2
  275. package/src/api/controllers/query/import/index.ts +85 -0
  276. package/src/api/controllers/query/import/sources/base/index.ts +87 -0
  277. package/src/api/controllers/query/import/sources/base/openapi.ts +24 -0
  278. package/src/api/controllers/query/import/sources/curl.ts +102 -0
  279. package/src/api/controllers/query/import/sources/openapi2.ts +163 -0
  280. package/src/api/controllers/query/import/sources/tests/curl/curl.spec.js +103 -0
  281. package/src/api/controllers/query/import/sources/tests/curl/data/delete.txt +1 -0
  282. package/src/api/controllers/query/import/sources/tests/curl/data/empty-body.txt +2 -0
  283. package/src/api/controllers/query/import/sources/tests/curl/data/get.txt +1 -0
  284. package/src/api/controllers/query/import/sources/tests/curl/data/headers.txt +3 -0
  285. package/src/api/controllers/query/import/sources/tests/curl/data/patch.txt +2 -0
  286. package/src/api/controllers/query/import/sources/tests/curl/data/path.txt +1 -0
  287. package/src/api/controllers/query/import/sources/tests/curl/data/post.txt +2 -0
  288. package/src/api/controllers/query/import/sources/tests/curl/data/put.txt +2 -0
  289. package/src/api/controllers/query/import/sources/tests/curl/data/query.txt +1 -0
  290. package/src/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.json +253 -0
  291. package/src/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.yaml +160 -0
  292. package/src/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.json +1054 -0
  293. package/src/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.yaml +711 -0
  294. package/src/api/controllers/query/import/sources/tests/openapi2/openapi2.spec.js +238 -0
  295. package/src/api/controllers/query/import/tests/index.spec.js +109 -0
  296. package/src/api/controllers/query/index.js +196 -0
  297. package/src/api/controllers/query/validation.js +42 -0
  298. package/src/api/controllers/role.js +1 -1
  299. package/src/api/controllers/routing.js +1 -1
  300. package/src/api/controllers/row/internal.js +14 -5
  301. package/src/api/controllers/row/internalSearch.js +3 -2
  302. package/src/api/controllers/row/utils.js +11 -8
  303. package/src/api/controllers/screen.js +1 -1
  304. package/src/api/controllers/user.js +39 -3
  305. package/src/api/controllers/webhook.js +5 -1
  306. package/src/api/index.js +1 -1
  307. package/src/api/routes/apikeys.js +1 -1
  308. package/src/api/routes/application.js +1 -1
  309. package/src/api/routes/automation.js +1 -1
  310. package/src/api/routes/backup.js +1 -1
  311. package/src/api/routes/cloud.js +1 -1
  312. package/src/api/routes/component.js +1 -1
  313. package/src/api/routes/datasource.js +1 -1
  314. package/src/api/routes/deploy.js +1 -1
  315. package/src/api/routes/dev.js +1 -1
  316. package/src/api/routes/hosting.js +1 -1
  317. package/src/api/routes/integration.js +1 -1
  318. package/src/api/routes/layout.js +1 -1
  319. package/src/api/routes/metadata.js +1 -1
  320. package/src/api/routes/permission.js +4 -1
  321. package/src/api/routes/query.js +14 -36
  322. package/src/api/routes/role.js +1 -1
  323. package/src/api/routes/routing.js +1 -1
  324. package/src/api/routes/row.js +1 -1
  325. package/src/api/routes/screen.js +1 -1
  326. package/src/api/routes/script.js +1 -1
  327. package/src/api/routes/static.js +1 -1
  328. package/src/api/routes/table.js +1 -1
  329. package/src/api/routes/templates.js +1 -1
  330. package/src/api/routes/tests/datasource.spec.js +45 -0
  331. package/src/api/routes/tests/permissions.spec.js +1 -1
  332. package/src/api/routes/tests/query.spec.js +70 -1
  333. package/src/api/routes/tests/role.spec.js +2 -2
  334. package/src/api/routes/tests/routing.spec.js +1 -1
  335. package/src/api/routes/tests/user.spec.js +1 -1
  336. package/src/api/routes/tests/utilities/TestFunctions.js +1 -1
  337. package/src/api/routes/user.js +11 -1
  338. package/src/api/routes/view.js +1 -1
  339. package/src/api/routes/webhook.js +1 -1
  340. package/src/app.ts +1 -1
  341. package/src/automations/bullboard.js +1 -1
  342. package/src/automations/steps/executeQuery.js +10 -2
  343. package/src/automations/steps/outgoingWebhook.js +2 -3
  344. package/src/automations/utils.js +12 -1
  345. package/src/constants/index.js +3 -3
  346. package/src/constants/screens.js +1 -1
  347. package/src/db/client.js +1 -1
  348. package/src/db/utils.js +10 -1
  349. package/src/definitions/common.ts +2 -16
  350. package/src/definitions/datasource.ts +98 -1
  351. package/src/environment.js +1 -0
  352. package/src/integrations/base/IntegrationBase.ts +4 -4
  353. package/src/integrations/base/sqlTable.ts +1 -1
  354. package/src/integrations/dynamodb.ts +18 -0
  355. package/src/integrations/oracle.ts +1 -1
  356. package/src/integrations/rest.ts +311 -138
  357. package/src/integrations/s3.ts +18 -7
  358. package/src/integrations/tests/rest.spec.js +432 -21
  359. package/src/integrations/utils.ts +8 -7
  360. package/src/middleware/authorized.js +2 -2
  361. package/src/middleware/builder.js +2 -2
  362. package/src/middleware/currentapp.js +11 -7
  363. package/src/middleware/tests/authorized.spec.js +2 -2
  364. package/src/middleware/tests/currentapp.spec.js +35 -41
  365. package/src/middleware/tests/usageQuota.spec.js +1 -1
  366. package/src/middleware/usageQuota.js +1 -1
  367. package/src/tests/utilities/TestConfiguration.js +65 -8
  368. package/src/tests/utilities/structures.js +2 -2
  369. package/src/threads/automation.js +2 -2
  370. package/src/threads/query.js +204 -39
  371. package/src/threads/utils.js +66 -1
  372. package/src/utilities/budibaseDir.js +1 -1
  373. package/src/utilities/fileSystem/utilities.js +3 -1
  374. package/src/utilities/global.js +8 -5
  375. package/src/utilities/index.js +12 -1
  376. package/src/utilities/redis.js +1 -1
  377. package/src/utilities/rowProcessor/index.js +79 -0
  378. package/src/utilities/security.js +5 -2
  379. package/src/utilities/usageQuota.js +2 -2
  380. package/src/utilities/workerRequests.js +3 -3
  381. package/builder/assets/index.86f7922e.js +0 -1316
  382. package/src/api/controllers/query.js +0 -158
@@ -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.5% </span>
26
+ <span class="strong">81.11% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>60/71</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">48% </span>
33
+ <span class="strong">68.42% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>12/25</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.28% </span>
47
+ <span class="strong">80.68% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>59/70</span>
49
+ <span class='fraction'>71/88</span>
50
50
  </div>
51
51
 
52
52
 
@@ -215,8 +215,45 @@
215
215
  <a name='L156'></a><a href='#L156'>156</a>
216
216
  <a name='L157'></a><a href='#L157'>157</a>
217
217
  <a name='L158'></a><a href='#L158'>158</a>
218
- <a name='L159'></a><a href='#L159'>159</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">34x</span>
219
- <span class="cline-any cline-yes">34x</span>
218
+ <a name='L159'></a><a href='#L159'>159</a>
219
+ <a name='L160'></a><a href='#L160'>160</a>
220
+ <a name='L161'></a><a href='#L161'>161</a>
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>
220
257
  <span class="cline-any cline-neutral">&nbsp;</span>
221
258
  <span class="cline-any cline-neutral">&nbsp;</span>
222
259
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -224,6 +261,9 @@
224
261
  <span class="cline-any cline-yes">34x</span>
225
262
  <span class="cline-any cline-yes">34x</span>
226
263
  <span class="cline-any cline-yes">34x</span>
264
+ <span class="cline-any cline-yes">34x</span>
265
+ <span class="cline-any cline-yes">34x</span>
266
+ <span class="cline-any cline-yes">34x</span>
227
267
  <span class="cline-any cline-neutral">&nbsp;</span>
228
268
  <span class="cline-any cline-yes">34x</span>
229
269
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -247,63 +287,62 @@
247
287
  <span class="cline-any cline-neutral">&nbsp;</span>
248
288
  <span class="cline-any cline-neutral">&nbsp;</span>
249
289
  <span class="cline-any cline-neutral">&nbsp;</span>
290
+ <span class="cline-any cline-neutral">&nbsp;</span>
250
291
  <span class="cline-any cline-yes">2x</span>
251
292
  <span class="cline-any cline-neutral">&nbsp;</span>
252
293
  <span class="cline-any cline-neutral">&nbsp;</span>
253
294
  <span class="cline-any cline-yes">34x</span>
254
- <span class="cline-any cline-yes">20x</span>
255
- <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>
256
297
  <span class="cline-any cline-neutral">&nbsp;</span>
257
- <span class="cline-any cline-yes">20x</span>
258
- <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>
259
300
  <span class="cline-any cline-neutral">&nbsp;</span>
260
301
  <span class="cline-any cline-neutral">&nbsp;</span>
261
- <span class="cline-any cline-yes">20x</span>
262
- <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>
263
307
  <span class="cline-any cline-neutral">&nbsp;</span>
264
- <span class="cline-any cline-yes">20x</span>
265
- <span class="cline-any cline-yes">20x</span>
266
308
  <span class="cline-any cline-neutral">&nbsp;</span>
267
309
  <span class="cline-any cline-neutral">&nbsp;</span>
268
310
  <span class="cline-any cline-neutral">&nbsp;</span>
269
- <span class="cline-any cline-yes">4x</span>
270
311
  <span class="cline-any cline-neutral">&nbsp;</span>
271
312
  <span class="cline-any cline-neutral">&nbsp;</span>
272
- <span class="cline-any cline-yes">4x</span>
273
- <span class="cline-any cline-no">&nbsp;</span>
274
- <span class="cline-any cline-no">&nbsp;</span>
275
313
  <span class="cline-any cline-neutral">&nbsp;</span>
276
- <span class="cline-any cline-no">&nbsp;</span>
277
314
  <span class="cline-any cline-neutral">&nbsp;</span>
278
315
  <span class="cline-any cline-no">&nbsp;</span>
279
316
  <span class="cline-any cline-no">&nbsp;</span>
280
- <span class="cline-any cline-neutral">&nbsp;</span>
281
317
  <span class="cline-any cline-no">&nbsp;</span>
282
- <span class="cline-any cline-neutral">&nbsp;</span>
318
+ <span class="cline-any cline-no">&nbsp;</span>
283
319
  <span class="cline-any cline-neutral">&nbsp;</span>
284
320
  <span class="cline-any cline-neutral">&nbsp;</span>
285
321
  <span class="cline-any cline-no">&nbsp;</span>
286
322
  <span class="cline-any cline-neutral">&nbsp;</span>
287
323
  <span class="cline-any cline-neutral">&nbsp;</span>
324
+ <span class="cline-any cline-no">&nbsp;</span>
288
325
  <span class="cline-any cline-neutral">&nbsp;</span>
289
- <span class="cline-any cline-yes">4x</span>
290
- <span class="cline-any cline-neutral">&nbsp;</span>
326
+ <span class="cline-any cline-no">&nbsp;</span>
291
327
  <span class="cline-any cline-neutral">&nbsp;</span>
292
328
  <span class="cline-any cline-neutral">&nbsp;</span>
293
329
  <span class="cline-any cline-neutral">&nbsp;</span>
294
330
  <span class="cline-any cline-no">&nbsp;</span>
295
- <span class="cline-any cline-no">&nbsp;</span>
296
- <span class="cline-any cline-neutral">&nbsp;</span>
297
- <span class="cline-any cline-neutral">&nbsp;</span>
298
331
  <span class="cline-any cline-neutral">&nbsp;</span>
299
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>
300
336
  <span class="cline-any cline-neutral">&nbsp;</span>
301
- <span class="cline-any cline-no">&nbsp;</span>
337
+ <span class="cline-any cline-yes">28x</span>
338
+ <span class="cline-any cline-yes">28x</span>
302
339
  <span class="cline-any cline-neutral">&nbsp;</span>
303
- <span class="cline-any cline-no">&nbsp;</span>
304
340
  <span class="cline-any cline-neutral">&nbsp;</span>
341
+ <span class="cline-any cline-yes">28x</span>
342
+ <span class="cline-any cline-yes">28x</span>
305
343
  <span class="cline-any cline-neutral">&nbsp;</span>
306
- <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>
307
346
  <span class="cline-any cline-neutral">&nbsp;</span>
308
347
  <span class="cline-any cline-neutral">&nbsp;</span>
309
348
  <span class="cline-any cline-yes">34x</span>
@@ -318,22 +357,28 @@
318
357
  <span class="cline-any cline-neutral">&nbsp;</span>
319
358
  <span class="cline-any cline-neutral">&nbsp;</span>
320
359
  <span class="cline-any cline-yes">34x</span>
321
- <span class="cline-any cline-yes">2x</span>
360
+ <span class="cline-any cline-yes">8x</span>
322
361
  <span class="cline-any cline-neutral">&nbsp;</span>
323
- <span class="cline-any cline-yes">2x</span>
362
+ <span class="cline-any cline-yes">8x</span>
324
363
  <span class="cline-any cline-neutral">&nbsp;</span>
325
- <span class="cline-any cline-yes">2x</span>
326
- <span class="cline-any cline-yes">2x</span>
327
364
  <span class="cline-any cline-neutral">&nbsp;</span>
328
- <span class="cline-any cline-yes">2x</span>
329
- <span class="cline-any cline-yes">2x</span>
330
365
  <span class="cline-any cline-neutral">&nbsp;</span>
366
+ <span class="cline-any cline-yes">8x</span>
331
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>
332
370
  <span class="cline-any cline-neutral">&nbsp;</span>
333
371
  <span class="cline-any cline-neutral">&nbsp;</span>
334
372
  <span class="cline-any cline-neutral">&nbsp;</span>
335
373
  <span class="cline-any cline-neutral">&nbsp;</span>
336
- <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>
337
382
  <span class="cline-any cline-neutral">&nbsp;</span>
338
383
  <span class="cline-any cline-neutral">&nbsp;</span>
339
384
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -342,46 +387,79 @@
342
387
  <span class="cline-any cline-neutral">&nbsp;</span>
343
388
  <span class="cline-any cline-neutral">&nbsp;</span>
344
389
  <span class="cline-any cline-neutral">&nbsp;</span>
345
- <span class="cline-any cline-yes">34x</span>
390
+ <span class="cline-any cline-neutral">&nbsp;</span>
346
391
  <span class="cline-any cline-yes">2x</span>
347
392
  <span class="cline-any cline-neutral">&nbsp;</span>
348
393
  <span class="cline-any cline-yes">2x</span>
349
394
  <span class="cline-any cline-yes">2x</span>
350
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>
351
398
  <span class="cline-any cline-yes">2x</span>
352
399
  <span class="cline-any cline-neutral">&nbsp;</span>
353
400
  <span class="cline-any cline-neutral">&nbsp;</span>
354
401
  <span class="cline-any cline-neutral">&nbsp;</span>
355
402
  <span class="cline-any cline-neutral">&nbsp;</span>
356
403
  <span class="cline-any cline-neutral">&nbsp;</span>
357
- <span class="cline-any cline-yes">2x</span>
358
- <span class="cline-any cline-yes">2x</span>
359
- <span class="cline-any cline-neutral">&nbsp;</span>
360
404
  <span class="cline-any cline-neutral">&nbsp;</span>
361
405
  <span class="cline-any cline-neutral">&nbsp;</span>
362
406
  <span class="cline-any cline-neutral">&nbsp;</span>
363
407
  <span class="cline-any cline-neutral">&nbsp;</span>
364
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>
365
413
  <span class="cline-any cline-neutral">&nbsp;</span>
366
414
  <span class="cline-any cline-yes">1x</span>
367
415
  <span class="cline-any cline-neutral">&nbsp;</span>
368
416
  <span class="cline-any cline-neutral">&nbsp;</span>
369
417
  <span class="cline-any cline-neutral">&nbsp;</span>
370
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>
371
433
  <span class="cline-any cline-yes">1x</span>
372
434
  <span class="cline-any cline-yes">1x</span>
373
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>
374
441
  <span class="cline-any cline-yes">1x</span>
375
442
  <span class="cline-any cline-neutral">&nbsp;</span>
376
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const { processString } = require("@budibase/string-templates")
377
- 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")
378
453
  const {
379
454
  generateQueryID,
380
455
  getQueryParams,
381
456
  isProdAppID,
382
- } = require("../../db/utils")
383
- const { BaseQueryVerbs } = require("../../constants")
384
- const { Thread, ThreadType } = require("../../threads")
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")
385
463
  &nbsp;
386
464
  const Runner = new Thread(ThreadType.QUERY, { timeoutMs: 10000 })
387
465
  &nbsp;
@@ -405,9 +483,49 @@ exports.fetch = async function (ctx) {
405
483
  include_docs: true,
406
484
  })
407
485
  )
486
+ &nbsp;
408
487
  ctx.body = enrichQueries(body.rows.map(row =&gt; row.doc))
409
488
  }
410
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;
411
529
  exports.save = async function (ctx) {
412
530
  const db = new CouchDB(ctx.appId)
413
531
  const query = ctx.request.body
@@ -423,47 +541,6 @@ exports.save = async function (ctx) {
423
541
  ctx.message = `Query ${query.name} saved successfully.`
424
542
  }
425
543
  &nbsp;
426
- async function enrichQueryFields(fields, parameters = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> {
427
- const enrichedQuery = {}
428
- &nbsp;
429
- // enrich the fields with dynamic parameters
430
- for (let key of Object.keys(fields)) {
431
- <span class="cstat-no" title="statement not covered" > if (fields[key] == null) {</span>
432
- <span class="cstat-no" title="statement not covered" > continue</span>
433
- }
434
- <span class="cstat-no" title="statement not covered" > if (typeof fields[key] === "object") {</span>
435
- // enrich nested fields object
436
- <span class="cstat-no" title="statement not covered" > enrichedQuery[key] = await enrichQueryFields(fields[key], parameters)</span>
437
- } else <span class="cstat-no" title="statement not covered" >if (typeof fields[key] === "string") {</span>
438
- // enrich string value as normal
439
- <span class="cstat-no" title="statement not covered" > enrichedQuery[key] = await processString(fields[key], parameters, {</span>
440
- noHelpers: true,
441
- })
442
- } else {
443
- <span class="cstat-no" title="statement not covered" > enrichedQuery[key] = fields[key]</span>
444
- }
445
- }
446
- &nbsp;
447
- <span class="missing-if-branch" title="if path not taken" >I</span>if (
448
- enrichedQuery.json ||
449
- enrichedQuery.customData ||
450
- enrichedQuery.requestBody
451
- ) {
452
- <span class="cstat-no" title="statement not covered" > try {</span>
453
- <span class="cstat-no" title="statement not covered" > enrichedQuery.json = JSON.parse(</span>
454
- enrichedQuery.json ||
455
- enrichedQuery.customData ||
456
- enrichedQuery.requestBody
457
- )
458
- } catch (err) {
459
- <span class="cstat-no" title="statement not covered" > throw { message: `JSON Invalid - error: ${err}` }</span>
460
- }
461
- <span class="cstat-no" title="statement not covered" > delete enrichedQuery.customData</span>
462
- }
463
- &nbsp;
464
- return enrichedQuery
465
- }
466
- &nbsp;
467
544
  exports.find = async function (ctx) {
468
545
  const db = new CouchDB(ctx.appId)
469
546
  const query = enrichQueries(await db.get(ctx.params.queryId))
@@ -479,54 +556,91 @@ exports.preview = async function (ctx) {
479
556
  const db = new CouchDB(ctx.appId)
480
557
  &nbsp;
481
558
  const datasource = await db.get(ctx.request.body.datasourceId)
482
- &nbsp;
483
- const { fields, parameters, queryVerb, transformer } = ctx.request.body
484
- 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
485
563
  &nbsp;
486
564
  try {
487
- const { rows, keys } = await Runner.run({
565
+ const { rows, keys, info, extra } = await Runner.run({
566
+ appId: ctx.appId,
488
567
  datasource,
489
568
  queryVerb,
490
- query: enrichedQuery,
569
+ fields,
570
+ parameters,
491
571
  transformer,
572
+ queryId,
492
573
  })
493
574
  &nbsp;
494
575
  ctx.body = {
495
576
  rows,
496
577
  schemaFields: [...new Set(keys)],
578
+ info,
579
+ extra,
497
580
  }
498
581
  } catch (err) {
499
582
  ctx.throw(400, err)
500
583
  }
501
584
  }
502
585
  &nbsp;
503
- exports.execute = async function (ctx) {
586
+ async function execute(ctx, opts = <span class="branch-0 cbranch-no" title="branch not covered" >{ rowsOnly: false })</span> {
504
587
  const db = new CouchDB(ctx.appId)
505
588
  &nbsp;
506
589
  const query = await db.get(ctx.params.queryId)
507
590
  const datasource = await db.get(query.datasourceId)
508
- &nbsp;
509
- const enrichedQuery = await enrichQueryFields(
510
- query.fields,
511
- ctx.request.body.parameters
512
- )
513
591
  &nbsp;
514
592
  // call the relevant CRUD method on the integration class
515
593
  try {
516
- const { rows } = await Runner.run({
594
+ const { rows, pagination, extra } = await Runner.run({
595
+ appId: ctx.appId,
517
596
  datasource,
518
597
  queryVerb: query.queryVerb,
519
- query: enrichedQuery,
598
+ fields: query.fields,
599
+ pagination: ctx.request.body.pagination,
600
+ parameters: ctx.request.body.parameters,
520
601
  transformer: query.transformer,
602
+ queryId: ctx.params.queryId,
521
603
  })
522
- 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
+ }
523
609
  } catch (err) {
524
610
  ctx.throw(400, err)
525
611
  }
526
612
  }
527
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;
528
641
  exports.destroy = async function (ctx) {
529
642
  const db = new CouchDB(ctx.appId)
643
+ await removeDynamicVariables(db, ctx.params.queryId)
530
644
  await db.remove(ctx.params.queryId, ctx.params.revId)
531
645
  ctx.message = `Query deleted.`
532
646
  ctx.status = 200
@@ -538,17 +652,17 @@ exports.destroy = async function (ctx) {
538
652
  <div class='footer quiet pad2 space-top1 center small'>
539
653
  Code coverage generated by
540
654
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
541
- at Fri Dec 31 2021 15:33:09 GMT+0000 (Coordinated Universal Time)
655
+ at Thu Jan 13 2022 18:34:51 GMT+0000 (Coordinated Universal Time)
542
656
  </div>
543
657
  </div>
544
- <script src="../../prettify.js"></script>
658
+ <script src="../../../prettify.js"></script>
545
659
  <script>
546
660
  window.onload = function () {
547
661
  prettyPrint();
548
662
  };
549
663
  </script>
550
- <script src="../../sorter.js"></script>
551
- <script src="../../block-navigation.js"></script>
664
+ <script src="../../../sorter.js"></script>
665
+ <script src="../../../block-navigation.js"></script>
552
666
  </body>
553
667
  </html>
554
668