@budibase/server 1.0.78 → 1.0.79-alpha.10

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 (305) hide show
  1. package/__mocks__/node-fetch.ts +1 -0
  2. package/builder/assets/index.1a081633.js +1288 -0
  3. package/builder/assets/{index.c8d1e8f0.css → index.c57242d4.css} +2 -2
  4. package/builder/assets/{vendor.20f80cec.js → vendor.a7c6ad0a.js} +190 -216
  5. package/builder/index.html +3 -3
  6. package/coverage/clover.xml +2399 -2336
  7. package/coverage/coverage-final.json +138 -137
  8. package/coverage/lcov-report/api/controllers/analytics.js.html +6 -6
  9. package/coverage/lcov-report/api/controllers/apikeys.js.html +6 -6
  10. package/coverage/lcov-report/api/controllers/application.js.html +152 -149
  11. package/coverage/lcov-report/api/controllers/auth.js.html +7 -7
  12. package/coverage/lcov-report/api/controllers/automation.js.html +21 -21
  13. package/coverage/lcov-report/api/controllers/backup.js.html +3 -3
  14. package/coverage/lcov-report/api/controllers/cloud.js.html +11 -11
  15. package/coverage/lcov-report/api/controllers/component.js.html +5 -5
  16. package/coverage/lcov-report/api/controllers/datasource.js.html +16 -16
  17. package/coverage/lcov-report/api/controllers/dev.js.html +19 -19
  18. package/coverage/lcov-report/api/controllers/index.html +16 -16
  19. package/coverage/lcov-report/api/controllers/integration.js.html +4 -4
  20. package/coverage/lcov-report/api/controllers/layout.js.html +6 -6
  21. package/coverage/lcov-report/api/controllers/metadata.js.html +9 -9
  22. package/coverage/lcov-report/api/controllers/migrations.js.html +4 -4
  23. package/coverage/lcov-report/api/controllers/permission.js.html +15 -15
  24. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  25. package/coverage/lcov-report/api/controllers/query/index.js.html +26 -26
  26. package/coverage/lcov-report/api/controllers/query/validation.js.html +10 -10
  27. package/coverage/lcov-report/api/controllers/role.js.html +9 -9
  28. package/coverage/lcov-report/api/controllers/routing.js.html +9 -9
  29. package/coverage/lcov-report/api/controllers/row/external.js.html +16 -16
  30. package/coverage/lcov-report/api/controllers/row/index.html +27 -27
  31. package/coverage/lcov-report/api/controllers/row/index.js.html +46 -46
  32. package/coverage/lcov-report/api/controllers/row/internal.js.html +94 -82
  33. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +204 -204
  34. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +24 -24
  35. package/coverage/lcov-report/api/controllers/row/utils.js.html +29 -29
  36. package/coverage/lcov-report/api/controllers/screen.js.html +7 -7
  37. package/coverage/lcov-report/api/controllers/script.js.html +4 -4
  38. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +49 -49
  39. package/coverage/lcov-report/api/controllers/table/external.js.html +12 -12
  40. package/coverage/lcov-report/api/controllers/table/index.html +11 -11
  41. package/coverage/lcov-report/api/controllers/table/index.js.html +47 -44
  42. package/coverage/lcov-report/api/controllers/table/internal.js.html +50 -50
  43. package/coverage/lcov-report/api/controllers/table/utils.js.html +80 -80
  44. package/coverage/lcov-report/api/controllers/templates.js.html +5 -5
  45. package/coverage/lcov-report/api/controllers/user.js.html +19 -19
  46. package/coverage/lcov-report/api/controllers/view/exporters.js.html +4 -4
  47. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  48. package/coverage/lcov-report/api/controllers/view/index.js.html +14 -14
  49. package/coverage/lcov-report/api/controllers/view/utils.js.html +12 -12
  50. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +7 -7
  51. package/coverage/lcov-report/api/controllers/webhook.js.html +18 -27
  52. package/coverage/lcov-report/api/index.html +10 -10
  53. package/coverage/lcov-report/api/index.js.html +37 -28
  54. package/coverage/lcov-report/api/routes/analytics.js.html +6 -6
  55. package/coverage/lcov-report/api/routes/apikeys.js.html +8 -8
  56. package/coverage/lcov-report/api/routes/application.js.html +9 -9
  57. package/coverage/lcov-report/api/routes/auth.js.html +6 -6
  58. package/coverage/lcov-report/api/routes/automation.js.html +19 -109
  59. package/coverage/lcov-report/api/routes/backup.js.html +8 -8
  60. package/coverage/lcov-report/api/routes/cloud.js.html +8 -8
  61. package/coverage/lcov-report/api/routes/component.js.html +8 -8
  62. package/coverage/lcov-report/api/routes/datasource.js.html +18 -156
  63. package/coverage/lcov-report/api/routes/deploy.js.html +8 -8
  64. package/coverage/lcov-report/api/routes/dev.js.html +13 -13
  65. package/coverage/lcov-report/api/routes/index.html +35 -35
  66. package/coverage/lcov-report/api/routes/index.js.html +38 -32
  67. package/coverage/lcov-report/api/routes/integration.js.html +8 -8
  68. package/coverage/lcov-report/api/routes/layout.js.html +8 -8
  69. package/coverage/lcov-report/api/routes/metadata.js.html +9 -9
  70. package/coverage/lcov-report/api/routes/migrations.js.html +7 -7
  71. package/coverage/lcov-report/api/routes/permission.js.html +16 -58
  72. package/coverage/lcov-report/api/routes/query.js.html +10 -10
  73. package/coverage/lcov-report/api/routes/role.js.html +15 -78
  74. package/coverage/lcov-report/api/routes/routing.js.html +8 -8
  75. package/coverage/lcov-report/api/routes/row.js.html +17 -14
  76. package/coverage/lcov-report/api/routes/screen.js.html +14 -95
  77. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/static.js.html +13 -13
  79. package/coverage/lcov-report/api/routes/table.js.html +17 -62
  80. package/coverage/lcov-report/api/routes/templates.js.html +8 -8
  81. package/coverage/lcov-report/api/routes/user.js.html +8 -8
  82. package/coverage/lcov-report/api/routes/utils/index.html +111 -0
  83. package/coverage/lcov-report/api/routes/utils/validators.js.html +737 -0
  84. package/coverage/lcov-report/api/routes/view.js.html +10 -10
  85. package/coverage/lcov-report/api/routes/webhook.js.html +14 -62
  86. package/coverage/lcov-report/automations/actions.js.html +24 -24
  87. package/coverage/lcov-report/automations/automationUtils.js.html +5 -5
  88. package/coverage/lcov-report/automations/bullboard.js.html +16 -16
  89. package/coverage/lcov-report/automations/index.html +1 -1
  90. package/coverage/lcov-report/automations/index.js.html +7 -7
  91. package/coverage/lcov-report/automations/steps/bash.js.html +6 -6
  92. package/coverage/lcov-report/automations/steps/createRow.js.html +7 -7
  93. package/coverage/lcov-report/automations/steps/delay.js.html +4 -4
  94. package/coverage/lcov-report/automations/steps/deleteRow.js.html +7 -7
  95. package/coverage/lcov-report/automations/steps/discord.js.html +7 -7
  96. package/coverage/lcov-report/automations/steps/executeQuery.js.html +6 -6
  97. package/coverage/lcov-report/automations/steps/executeScript.js.html +6 -6
  98. package/coverage/lcov-report/automations/steps/filter.js.html +12 -9
  99. package/coverage/lcov-report/automations/steps/index.html +1 -1
  100. package/coverage/lcov-report/automations/steps/integromat.js.html +5 -5
  101. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +8 -8
  102. package/coverage/lcov-report/automations/steps/queryRows.js.html +11 -11
  103. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +5 -5
  104. package/coverage/lcov-report/automations/steps/serverLog.js.html +3 -3
  105. package/coverage/lcov-report/automations/steps/slack.js.html +5 -5
  106. package/coverage/lcov-report/automations/steps/updateRow.js.html +6 -6
  107. package/coverage/lcov-report/automations/steps/utils.js.html +3 -3
  108. package/coverage/lcov-report/automations/steps/zapier.js.html +5 -5
  109. package/coverage/lcov-report/automations/triggerInfo/app.js.html +2 -2
  110. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +2 -2
  111. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  112. package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -8
  113. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +2 -2
  114. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +2 -2
  115. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +2 -2
  116. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +2 -2
  117. package/coverage/lcov-report/automations/triggers.js.html +26 -26
  118. package/coverage/lcov-report/automations/utils.js.html +35 -35
  119. package/coverage/lcov-report/constants/index.html +5 -5
  120. package/coverage/lcov-report/constants/index.js.html +40 -28
  121. package/coverage/lcov-report/constants/layouts.js.html +5 -5
  122. package/coverage/lcov-report/constants/screens.js.html +4 -4
  123. package/coverage/lcov-report/db/client.js.html +18 -18
  124. package/coverage/lcov-report/db/inMemoryView.js.html +7 -7
  125. package/coverage/lcov-report/db/index.html +15 -15
  126. package/coverage/lcov-report/db/index.js.html +3 -3
  127. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +21 -21
  128. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  129. package/coverage/lcov-report/db/linkedRows/index.js.html +36 -36
  130. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +30 -30
  131. package/coverage/lcov-report/db/newid.js.html +4 -4
  132. package/coverage/lcov-report/db/utils.js.html +123 -87
  133. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  134. package/coverage/lcov-report/events/index.html +1 -1
  135. package/coverage/lcov-report/events/index.js.html +8 -8
  136. package/coverage/lcov-report/events/utils.js.html +18 -18
  137. package/coverage/lcov-report/index.html +89 -74
  138. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  139. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  140. package/coverage/lcov-report/middleware/appInfo.js.html +5 -5
  141. package/coverage/lcov-report/middleware/authorized.js.html +29 -29
  142. package/coverage/lcov-report/middleware/builder.js.html +16 -16
  143. package/coverage/lcov-report/middleware/currentapp.js.html +44 -44
  144. package/coverage/lcov-report/middleware/index.html +1 -1
  145. package/coverage/lcov-report/middleware/joi-validator.js.html +14 -14
  146. package/coverage/lcov-report/middleware/resourceId.js.html +29 -29
  147. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  148. package/coverage/lcov-report/middleware/usageQuota.js.html +17 -17
  149. package/coverage/lcov-report/middleware/utils.js.html +4 -4
  150. package/coverage/lcov-report/threads/automation.js.html +1 -1
  151. package/coverage/lcov-report/threads/index.html +19 -19
  152. package/coverage/lcov-report/threads/index.js.html +10 -10
  153. package/coverage/lcov-report/threads/query.js.html +123 -39
  154. package/coverage/lcov-report/threads/utils.js.html +14 -14
  155. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  156. package/coverage/lcov-report/utilities/budibaseDir.js.html +7 -7
  157. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  158. package/coverage/lcov-report/utilities/csvParser.js.html +6 -6
  159. package/coverage/lcov-report/utilities/global.js.html +28 -28
  160. package/coverage/lcov-report/utilities/index.html +18 -18
  161. package/coverage/lcov-report/utilities/index.js.html +24 -24
  162. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +9 -9
  163. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  164. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  165. package/coverage/lcov-report/utilities/routing/index.js.html +6 -6
  166. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  167. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +60 -60
  168. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +13 -13
  169. package/coverage/lcov-report/utilities/scriptRunner.js.html +5 -5
  170. package/coverage/lcov-report/utilities/security.js.html +8 -8
  171. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  172. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  173. package/coverage/lcov-report/utilities/usageQuota/index.js.html +12 -12
  174. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +8 -8
  175. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  176. package/coverage/lcov-report/utilities/users.js.html +5 -5
  177. package/coverage/lcov-report/utilities/workerRequests.js.html +200 -53
  178. package/coverage/lcov.info +3323 -3224
  179. package/dist/api/controllers/application.js +1 -0
  180. package/dist/api/controllers/public/applications.js +94 -0
  181. package/dist/api/controllers/public/mapping/applications.js +29 -0
  182. package/dist/api/controllers/public/mapping/index.js +11 -0
  183. package/dist/api/controllers/public/mapping/queries.js +36 -0
  184. package/dist/api/controllers/public/mapping/rows.js +24 -0
  185. package/dist/api/controllers/public/mapping/tables.js +23 -0
  186. package/dist/api/controllers/public/mapping/types.js +2 -0
  187. package/dist/api/controllers/public/mapping/users.js +29 -0
  188. package/dist/api/controllers/public/queries.js +38 -0
  189. package/dist/api/controllers/public/rows.js +97 -0
  190. package/dist/api/controllers/public/tables.js +75 -0
  191. package/dist/api/controllers/public/users.js +95 -0
  192. package/dist/api/controllers/public/utils.js +49 -0
  193. package/dist/api/controllers/row/internal.js +4 -1
  194. package/dist/api/controllers/table/index.js +2 -1
  195. package/dist/api/controllers/webhook.js +3 -5
  196. package/dist/api/index.js +3 -1
  197. package/dist/api/routes/automation.js +3 -31
  198. package/dist/api/routes/datasource.js +3 -50
  199. package/dist/api/routes/index.js +2 -0
  200. package/dist/api/routes/permission.js +4 -14
  201. package/dist/api/routes/public/applications.js +141 -0
  202. package/dist/api/routes/public/index.js +68 -0
  203. package/dist/api/routes/public/middleware/mapper.js +94 -0
  204. package/dist/api/routes/public/queries.js +77 -0
  205. package/dist/api/routes/public/rows.js +229 -0
  206. package/dist/api/routes/public/tables.js +154 -0
  207. package/dist/api/routes/public/users.js +137 -0
  208. package/dist/api/routes/public/utils/Endpoint.js +36 -0
  209. package/dist/api/routes/role.js +3 -19
  210. package/dist/api/routes/row.js +3 -4
  211. package/dist/api/routes/screen.js +2 -23
  212. package/dist/api/routes/table.js +3 -17
  213. package/dist/api/routes/tests/utilities/index.js +23 -0
  214. package/dist/api/routes/utils/validators.js +200 -0
  215. package/dist/api/routes/webhook.js +2 -17
  216. package/dist/automations/steps/filter.js +2 -2
  217. package/dist/automations/steps/queryRows.js +1 -1
  218. package/dist/automations/utils.js +2 -2
  219. package/dist/constants/index.js +3 -0
  220. package/dist/db/utils.js +11 -0
  221. package/dist/definitions/openapi.js +6 -0
  222. package/dist/integrations/googlesheets.js +3 -0
  223. package/dist/integrations/microsoftSqlServer.js +35 -29
  224. package/dist/integrations/mysql.js +30 -26
  225. package/dist/integrations/oracle.js +14 -19
  226. package/dist/integrations/postgres.js +34 -28
  227. package/dist/package.json +8 -7
  228. package/dist/tests/utilities/TestConfiguration.js +25 -8
  229. package/dist/threads/query.js +33 -8
  230. package/dist/tsconfig.tsbuildinfo +1 -1
  231. package/dist/utilities/workerRequests.js +50 -15
  232. package/package.json +9 -8
  233. package/scripts/integrations/oracle/oracle.md +2 -2
  234. package/scripts/integrations/postgres/init.sql +5 -3
  235. package/scripts/likeCypress.ts +9 -6
  236. package/specs/generate.js +83 -0
  237. package/specs/openapi.json +2222 -0
  238. package/specs/openapi.yaml +1530 -0
  239. package/specs/parameters.js +59 -0
  240. package/specs/resources/application.js +101 -0
  241. package/specs/resources/index.js +24 -0
  242. package/specs/resources/misc.js +12 -0
  243. package/specs/resources/query.js +189 -0
  244. package/specs/resources/row.js +125 -0
  245. package/specs/resources/table.js +191 -0
  246. package/specs/resources/user.js +126 -0
  247. package/specs/resources/utils/Resource.js +26 -0
  248. package/specs/resources/utils/index.js +11 -0
  249. package/specs/security.js +7 -0
  250. package/src/api/controllers/application.js +1 -0
  251. package/src/api/controllers/public/applications.ts +74 -0
  252. package/src/api/controllers/public/mapping/applications.ts +32 -0
  253. package/src/api/controllers/public/mapping/index.ts +13 -0
  254. package/src/api/controllers/public/mapping/queries.ts +39 -0
  255. package/src/api/controllers/public/mapping/rows.ts +31 -0
  256. package/src/api/controllers/public/mapping/tables.ts +26 -0
  257. package/src/api/controllers/public/mapping/types.ts +13 -0
  258. package/src/api/controllers/public/mapping/users.ts +32 -0
  259. package/src/api/controllers/public/queries.ts +20 -0
  260. package/src/api/controllers/public/rows.ts +77 -0
  261. package/src/api/controllers/public/tables.ts +56 -0
  262. package/src/api/controllers/public/users.ts +82 -0
  263. package/src/api/controllers/public/utils.ts +38 -0
  264. package/src/api/controllers/row/internal.js +4 -0
  265. package/src/api/controllers/table/index.js +2 -1
  266. package/src/api/controllers/webhook.js +3 -6
  267. package/src/api/index.js +4 -1
  268. package/src/api/routes/automation.js +3 -33
  269. package/src/api/routes/datasource.js +6 -52
  270. package/src/api/routes/index.js +2 -0
  271. package/src/api/routes/permission.js +4 -18
  272. package/src/api/routes/public/applications.ts +156 -0
  273. package/src/api/routes/public/index.ts +82 -0
  274. package/src/api/routes/public/middleware/mapper.ts +81 -0
  275. package/src/api/routes/public/queries.ts +81 -0
  276. package/src/api/routes/public/rows.ts +242 -0
  277. package/src/api/routes/public/tables.ts +169 -0
  278. package/src/api/routes/public/tests/compare.spec.js +184 -0
  279. package/src/api/routes/public/users.ts +144 -0
  280. package/src/api/routes/public/utils/Endpoint.ts +51 -0
  281. package/src/api/routes/role.js +3 -24
  282. package/src/api/routes/row.js +3 -2
  283. package/src/api/routes/screen.js +2 -29
  284. package/src/api/routes/table.js +4 -19
  285. package/src/api/routes/tests/utilities/index.js +24 -0
  286. package/src/api/routes/utils/validators.js +219 -0
  287. package/src/api/routes/webhook.js +2 -18
  288. package/src/automations/steps/filter.js +3 -2
  289. package/src/automations/steps/queryRows.js +1 -1
  290. package/src/automations/utils.js +2 -2
  291. package/src/constants/index.js +4 -0
  292. package/src/db/utils.js +12 -0
  293. package/src/definitions/common.ts +4 -0
  294. package/src/definitions/openapi.ts +943 -0
  295. package/src/integrations/base/datasourcePlus.ts +3 -0
  296. package/src/integrations/googlesheets.ts +5 -2
  297. package/src/integrations/microsoftSqlServer.ts +38 -33
  298. package/src/integrations/mysql.ts +38 -36
  299. package/src/integrations/oracle.ts +27 -35
  300. package/src/integrations/postgres.ts +33 -26
  301. package/src/tests/utilities/TestConfiguration.js +23 -2
  302. package/src/threads/query.js +37 -9
  303. package/src/utilities/workerRequests.js +65 -16
  304. package/builder/assets/index.ab059cf2.js +0 -1352
  305. package/scripts/proxy/generateProxyConfig.js +0 -70
@@ -4,22 +4,8 @@ const tableController = require("../controllers/table");
4
4
  const authorized = require("../../middleware/authorized");
5
5
  const { paramResource, bodyResource } = require("../../middleware/resourceId");
6
6
  const { BUILDER, PermissionLevels, PermissionTypes, } = require("@budibase/backend-core/permissions");
7
- const joiValidator = require("../../middleware/joi-validator");
8
- const Joi = require("joi");
7
+ const { tableValidator } = require("./utils/validators");
9
8
  const router = Router();
10
- function generateSaveValidator() {
11
- // prettier-ignore
12
- return joiValidator.body(Joi.object({
13
- _id: Joi.string(),
14
- _rev: Joi.string(),
15
- type: Joi.string().valid("table", "internal", "external"),
16
- primaryDisplay: Joi.string(),
17
- schema: Joi.object().required(),
18
- name: Joi.string().required(),
19
- views: Joi.object(),
20
- dataImport: Joi.object(),
21
- }).unknown(true));
22
- }
23
9
  router
24
10
  /**
25
11
  * @api {get} /api/tables Fetch all tables
@@ -46,7 +32,7 @@ router
46
32
  *
47
33
  * @apiSuccess {object[]} body The response body will be the table that was found.
48
34
  */
49
- .get("/api/tables/:id", paramResource("id"), authorized(PermissionTypes.TABLE, PermissionLevels.READ), tableController.find)
35
+ .get("/api/tables/:tableId", paramResource("tableId"), authorized(PermissionTypes.TABLE, PermissionLevels.READ), tableController.find)
50
36
  /**
51
37
  * @api {post} /api/tables Save a table
52
38
  * @apiName Save a table
@@ -122,7 +108,7 @@ router
122
108
  */
123
109
  .post("/api/tables",
124
110
  // allows control over updating a table
125
- bodyResource("_id"), authorized(BUILDER), generateSaveValidator(), tableController.save)
111
+ bodyResource("_id"), authorized(BUILDER), tableValidator(), tableController.save)
126
112
  /**
127
113
  * @api {post} /api/tables/csv/validate Validate a CSV for a table
128
114
  * @apiName Validate a CSV for a table
@@ -11,6 +11,17 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
11
11
  const TestConfig = require("../../../../tests/utilities/TestConfiguration");
12
12
  const structures = require("../../../../tests/utilities/structures");
13
13
  const env = require("../../../../environment");
14
+ function user() {
15
+ return {
16
+ _id: "user",
17
+ _rev: "rev",
18
+ createdAt: Date.now(),
19
+ email: "test@test.com",
20
+ roles: {},
21
+ tenantId: "default",
22
+ status: "active",
23
+ };
24
+ }
14
25
  jest.mock("../../../../utilities/workerRequests", () => ({
15
26
  getGlobalUsers: jest.fn(() => {
16
27
  return {
@@ -22,6 +33,18 @@ jest.mock("../../../../utilities/workerRequests", () => ({
22
33
  _id: "us_uuid1",
23
34
  };
24
35
  }),
36
+ allGlobalUsers: jest.fn(() => {
37
+ return [user()];
38
+ }),
39
+ readGlobalUser: jest.fn(() => {
40
+ return user();
41
+ }),
42
+ saveGlobalUser: jest.fn(() => {
43
+ return { _id: "user", _rev: "rev" };
44
+ }),
45
+ deleteGlobalUser: jest.fn(() => {
46
+ return { message: "deleted user" };
47
+ }),
25
48
  removeAppFromUserRoles: jest.fn(),
26
49
  }));
27
50
  exports.delay = ms => new Promise(resolve => setTimeout(resolve, ms));
@@ -0,0 +1,200 @@
1
+ "use strict";
2
+ const joiValidator = require("../../../middleware/joi-validator");
3
+ const { DataSourceOperation } = require("../../../constants");
4
+ const { WebhookType } = require("../../../constants");
5
+ const { BUILTIN_PERMISSION_IDS, PermissionLevels, } = require("@budibase/backend-core/permissions");
6
+ const Joi = require("joi");
7
+ const OPTIONAL_STRING = Joi.string().optional().allow(null).allow("");
8
+ const OPTIONAL_NUMBER = Joi.number().optional().allow(null);
9
+ exports.tableValidator = () => {
10
+ // prettier-ignore
11
+ return joiValidator.body(Joi.object({
12
+ _id: OPTIONAL_STRING,
13
+ _rev: OPTIONAL_STRING,
14
+ type: OPTIONAL_STRING.valid("table", "internal", "external"),
15
+ primaryDisplay: OPTIONAL_STRING,
16
+ schema: Joi.object().required(),
17
+ name: Joi.string().required(),
18
+ views: Joi.object(),
19
+ dataImport: Joi.object(),
20
+ }).unknown(true));
21
+ };
22
+ exports.nameValidator = () => {
23
+ // prettier-ignore
24
+ return joiValidator.body(Joi.object({
25
+ name: OPTIONAL_STRING,
26
+ }));
27
+ };
28
+ exports.datasourceValidator = () => {
29
+ // prettier-ignore
30
+ return joiValidator.body(Joi.object({
31
+ _id: Joi.string(),
32
+ _rev: Joi.string(),
33
+ type: OPTIONAL_STRING.allow("datasource_plus"),
34
+ relationships: Joi.array().items(Joi.object({
35
+ from: Joi.string().required(),
36
+ to: Joi.string().required(),
37
+ cardinality: Joi.valid("1:N", "1:1", "N:N").required()
38
+ })),
39
+ }).unknown(true));
40
+ };
41
+ function filterObject() {
42
+ // prettier-ignore
43
+ return Joi.object({
44
+ string: Joi.object().optional(),
45
+ fuzzy: Joi.object().optional(),
46
+ range: Joi.object().optional(),
47
+ equal: Joi.object().optional(),
48
+ notEqual: Joi.object().optional(),
49
+ empty: Joi.object().optional(),
50
+ notEmpty: Joi.object().optional(),
51
+ oneOf: Joi.object().optional(),
52
+ contains: Joi.object().optional(),
53
+ notContains: Joi.object().optional(),
54
+ }).unknown(true);
55
+ }
56
+ exports.internalSearchValidator = () => {
57
+ // prettier-ignore
58
+ return joiValidator.body(Joi.object({
59
+ tableId: OPTIONAL_STRING,
60
+ query: filterObject(),
61
+ limit: OPTIONAL_NUMBER,
62
+ sort: OPTIONAL_STRING,
63
+ sortOrder: OPTIONAL_STRING,
64
+ sortType: OPTIONAL_STRING,
65
+ paginate: Joi.boolean(),
66
+ bookmark: Joi.alternatives().try(OPTIONAL_STRING, OPTIONAL_NUMBER).optional(),
67
+ }));
68
+ };
69
+ exports.externalSearchValidator = () => {
70
+ return joiValidator.body(Joi.object({
71
+ query: filterObject(),
72
+ paginate: Joi.boolean().optional(),
73
+ bookmark: Joi.alternatives()
74
+ .try(OPTIONAL_STRING, OPTIONAL_NUMBER)
75
+ .optional(),
76
+ limit: OPTIONAL_NUMBER,
77
+ sort: Joi.object({
78
+ column: Joi.string(),
79
+ order: OPTIONAL_STRING.valid("ascending", "descending"),
80
+ type: OPTIONAL_STRING.valid("string", "number"),
81
+ }).optional(),
82
+ }));
83
+ };
84
+ exports.datasourceQueryValidator = () => {
85
+ // prettier-ignore
86
+ return joiValidator.body(Joi.object({
87
+ endpoint: Joi.object({
88
+ datasourceId: Joi.string().required(),
89
+ operation: Joi.string().required().valid(...Object.values(DataSourceOperation)),
90
+ entityId: Joi.string().required(),
91
+ }).required(),
92
+ resource: Joi.object({
93
+ fields: Joi.array().items(Joi.string()).optional(),
94
+ }).optional(),
95
+ body: Joi.object().optional(),
96
+ sort: Joi.object().optional(),
97
+ filters: filterObject().optional(),
98
+ paginate: Joi.object({
99
+ page: Joi.string().alphanum().optional(),
100
+ limit: Joi.number().optional(),
101
+ }).optional(),
102
+ }));
103
+ };
104
+ exports.webhookValidator = () => {
105
+ // prettier-ignore
106
+ return joiValidator.body(Joi.object({
107
+ live: Joi.bool(),
108
+ _id: OPTIONAL_STRING,
109
+ _rev: OPTIONAL_STRING,
110
+ name: Joi.string().required(),
111
+ bodySchema: Joi.object().optional(),
112
+ action: Joi.object({
113
+ type: Joi.string().required().valid(WebhookType.AUTOMATION),
114
+ target: Joi.string().required(),
115
+ }).required(),
116
+ }).unknown(true));
117
+ };
118
+ exports.roleValidator = () => {
119
+ const permLevelArray = Object.values(PermissionLevels);
120
+ // prettier-ignore
121
+ return joiValidator.body(Joi.object({
122
+ _id: OPTIONAL_STRING,
123
+ _rev: OPTIONAL_STRING,
124
+ name: Joi.string().required(),
125
+ // this is the base permission ID (for now a built in)
126
+ permissionId: Joi.string().valid(...Object.values(BUILTIN_PERMISSION_IDS)).required(),
127
+ permissions: Joi.object()
128
+ .pattern(/.*/, [Joi.string().valid(...permLevelArray)])
129
+ .optional(),
130
+ inherits: OPTIONAL_STRING,
131
+ }).unknown(true));
132
+ };
133
+ exports.permissionValidator = () => {
134
+ const permLevelArray = Object.values(PermissionLevels);
135
+ // prettier-ignore
136
+ return joiValidator.params(Joi.object({
137
+ level: Joi.string().valid(...permLevelArray).required(),
138
+ resourceId: Joi.string(),
139
+ roleId: Joi.string(),
140
+ }).unknown(true));
141
+ };
142
+ exports.screenValidator = () => {
143
+ // prettier-ignore
144
+ return joiValidator.body(Joi.object({
145
+ name: Joi.string().required(),
146
+ routing: Joi.object({
147
+ route: Joi.string().required(),
148
+ roleId: Joi.string().required().allow(""),
149
+ }).required().unknown(true),
150
+ props: Joi.object({
151
+ _id: Joi.string().required(),
152
+ _component: Joi.string().required(),
153
+ _children: Joi.array().required(),
154
+ _instanceName: Joi.string().required(),
155
+ _styles: Joi.object().required(),
156
+ type: OPTIONAL_STRING,
157
+ table: OPTIONAL_STRING,
158
+ layoutId: OPTIONAL_STRING,
159
+ }).required().unknown(true),
160
+ }).unknown(true));
161
+ };
162
+ function generateStepSchema(allowStepTypes) {
163
+ // prettier-ignore
164
+ return Joi.object({
165
+ stepId: Joi.string().required(),
166
+ id: Joi.string().required(),
167
+ description: Joi.string().required(),
168
+ name: Joi.string().required(),
169
+ tagline: Joi.string().required(),
170
+ icon: Joi.string().required(),
171
+ params: Joi.object(),
172
+ args: Joi.object(),
173
+ type: Joi.string().required().valid(...allowStepTypes),
174
+ }).unknown(true);
175
+ }
176
+ exports.automationValidator = (existing = false) => {
177
+ // prettier-ignore
178
+ return joiValidator.body(Joi.object({
179
+ _id: existing ? Joi.string().required() : OPTIONAL_STRING,
180
+ _rev: existing ? Joi.string().required() : OPTIONAL_STRING,
181
+ name: Joi.string().required(),
182
+ type: Joi.string().valid("automation").required(),
183
+ definition: Joi.object({
184
+ steps: Joi.array().required().items(generateStepSchema(["ACTION", "LOGIC"])),
185
+ trigger: generateStepSchema(["TRIGGER"]).allow(null),
186
+ }).required().unknown(true),
187
+ }).unknown(true));
188
+ };
189
+ exports.applicationValidator = () => {
190
+ // prettier-ignore
191
+ return joiValidator.body(Joi.object({
192
+ _id: OPTIONAL_STRING,
193
+ _rev: OPTIONAL_STRING,
194
+ name: Joi.string().required(),
195
+ url: OPTIONAL_STRING,
196
+ template: Joi.object({
197
+ templateString: OPTIONAL_STRING,
198
+ }).unknown(true),
199
+ }).unknown(true));
200
+ };
@@ -2,27 +2,12 @@
2
2
  const Router = require("@koa/router");
3
3
  const controller = require("../controllers/webhook");
4
4
  const authorized = require("../../middleware/authorized");
5
- const joiValidator = require("../../middleware/joi-validator");
6
5
  const { BUILDER } = require("@budibase/backend-core/permissions");
7
- const Joi = require("joi");
6
+ const { webhookValidator } = require("./utils/validators");
8
7
  const router = Router();
9
- function generateSaveValidator() {
10
- // prettier-ignore
11
- return joiValidator.body(Joi.object({
12
- live: Joi.bool(),
13
- _id: Joi.string().optional(),
14
- _rev: Joi.string().optional(),
15
- name: Joi.string().required(),
16
- bodySchema: Joi.object().optional(),
17
- action: Joi.object({
18
- type: Joi.string().required().valid(controller.WebhookType.AUTOMATION),
19
- target: Joi.string().required(),
20
- }).required(),
21
- }).unknown(true));
22
- }
23
8
  router
24
9
  .get("/api/webhooks", authorized(BUILDER), controller.fetch)
25
- .put("/api/webhooks", authorized(BUILDER), generateSaveValidator(), controller.save)
10
+ .put("/api/webhooks", authorized(BUILDER), webhookValidator(), controller.save)
26
11
  .delete("/api/webhooks/:id/:rev", authorized(BUILDER), controller.destroy)
27
12
  .post("/api/webhooks/schema/:instance/:id", authorized(BUILDER), controller.buildSchema)
28
13
  // this shouldn't have authorisation, right now its always public
@@ -23,10 +23,10 @@ const PrettyFilterConditions = {
23
23
  exports.FilterConditions = FilterConditions;
24
24
  exports.PrettyFilterConditions = PrettyFilterConditions;
25
25
  exports.definition = {
26
- name: "Filter",
26
+ name: "Condition",
27
27
  tagline: "{{inputs.field}} {{inputs.condition}} {{inputs.value}}",
28
28
  icon: "Branch2",
29
- description: "Filter any automations which do not meet certain conditions",
29
+ description: "Conditionally halt automations which do not meet certain conditions",
30
30
  type: "LOGIC",
31
31
  internal: true,
32
32
  stepId: "FILTER",
@@ -81,7 +81,7 @@ function getTable(appId, tableId) {
81
81
  return __awaiter(this, void 0, void 0, function* () {
82
82
  const ctx = buildCtx(appId, null, {
83
83
  params: {
84
- id: tableId,
84
+ tableId,
85
85
  },
86
86
  });
87
87
  yield tableController.find(ctx);
@@ -15,7 +15,7 @@ const CouchDB = require("../db");
15
15
  const { queue } = require("./bullboard");
16
16
  const newid = require("../db/newid");
17
17
  const { updateEntityMetadata } = require("../utilities");
18
- const { MetadataTypes } = require("../constants");
18
+ const { MetadataTypes, WebhookType } = require("../constants");
19
19
  const { getProdAppID } = require("@budibase/backend-core/db");
20
20
  const { cloneDeep } = require("lodash/fp");
21
21
  const { getAppDB, getAppId } = require("@budibase/backend-core/context");
@@ -145,7 +145,7 @@ exports.checkForWebhooks = ({ oldAuto, newAuto }) => __awaiter(void 0, void 0, v
145
145
  const ctx = {
146
146
  appId,
147
147
  request: {
148
- body: new webhooks.Webhook("Automation webhook", webhooks.WebhookType.AUTOMATION, newAuto._id),
148
+ body: new webhooks.Webhook("Automation webhook", WebhookType.AUTOMATION, newAuto._id),
149
149
  },
150
150
  };
151
151
  yield webhooks.save(ctx);
@@ -166,5 +166,8 @@ exports.BuildSchemaErrors = {
166
166
  NO_KEY: "no_key",
167
167
  INVALID_COLUMN: "invalid_column",
168
168
  };
169
+ exports.WebhookType = {
170
+ AUTOMATION: "automation",
171
+ };
169
172
  // pass through the list from the auth/core lib
170
173
  exports.ObjectStoreBuckets = ObjectStoreBuckets;
package/dist/db/utils.js CHANGED
@@ -114,6 +114,17 @@ exports.getRowParams = (tableId = null, rowId = null, otherProps = {}) => {
114
114
  const endOfKey = rowId == null ? `${tableId}${SEPARATOR}` : rowId;
115
115
  return getDocParams(DocumentTypes.ROW, endOfKey, otherProps);
116
116
  };
117
+ /**
118
+ * Given a row ID this will find the table ID within it (only works for internal tables).
119
+ * @param {string} rowId The ID of the row.
120
+ * @returns {string} The table ID.
121
+ */
122
+ exports.getTableIDFromRowID = rowId => {
123
+ const components = rowId
124
+ .split(DocumentTypes.TABLE + SEPARATOR)[1]
125
+ .split(SEPARATOR);
126
+ return `${DocumentTypes.TABLE}${SEPARATOR}${components[0]}`;
127
+ };
117
128
  /**
118
129
  * Gets a new row ID for the specified table.
119
130
  * @param {string} tableId The table which the row is being created for.
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ /**
3
+ * This file was auto-generated by openapi-typescript.
4
+ * Do not make direct changes to the file.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -97,6 +97,9 @@ var GoogleSheetsModule;
97
97
  const spreadsheetId = this.cleanSpreadsheetUrl(this.config.spreadsheetId);
98
98
  this.client = new google_spreadsheet_1.GoogleSpreadsheet(spreadsheetId);
99
99
  }
100
+ getBindingIdentifier() {
101
+ return "";
102
+ }
100
103
  /**
101
104
  * Pull the spreadsheet ID out from a valid google sheets URL
102
105
  * @param spreadsheetId - the URL or standard spreadsheetId of the google sheet
@@ -63,32 +63,10 @@ var MSSQLModule;
63
63
  },
64
64
  },
65
65
  };
66
- function internalQuery(client, query, operation = undefined) {
67
- return __awaiter(this, void 0, void 0, function* () {
68
- const request = client.request();
69
- try {
70
- if (Array.isArray(query.bindings)) {
71
- let count = 0;
72
- for (let binding of query.bindings) {
73
- request.input(`p${count++}`, binding);
74
- }
75
- }
76
- // this is a hack to get the inserted ID back,
77
- // no way to do this with Knex nicely
78
- const sql = operation === datasource_1.Operation.CREATE
79
- ? `${query.sql}; SELECT SCOPE_IDENTITY() AS id;`
80
- : query.sql;
81
- return yield request.query(sql);
82
- }
83
- catch (err) {
84
- // @ts-ignore
85
- throw new Error(err);
86
- }
87
- });
88
- }
89
66
  class SqlServerIntegration extends Sql {
90
67
  constructor(config) {
91
68
  super(utils_1.SqlClients.MS_SQL);
69
+ this.index = 0;
92
70
  this.tables = {};
93
71
  this.schemaErrors = {};
94
72
  this.MASTER_TABLES = [
@@ -109,6 +87,31 @@ var MSSQLModule;
109
87
  this.pool = new sqlServer.ConnectionPool(clientCfg);
110
88
  }
111
89
  }
90
+ internalQuery(query, operation = undefined) {
91
+ return __awaiter(this, void 0, void 0, function* () {
92
+ const client = this.client;
93
+ const request = client.request();
94
+ this.index = 0;
95
+ try {
96
+ if (Array.isArray(query.bindings)) {
97
+ let count = 0;
98
+ for (let binding of query.bindings) {
99
+ request.input(`p${count++}`, binding);
100
+ }
101
+ }
102
+ // this is a hack to get the inserted ID back,
103
+ // no way to do this with Knex nicely
104
+ const sql = operation === datasource_1.Operation.CREATE
105
+ ? `${query.sql}; SELECT SCOPE_IDENTITY() AS id;`
106
+ : query.sql;
107
+ return yield request.query(sql);
108
+ }
109
+ catch (err) {
110
+ // @ts-ignore
111
+ throw new Error(err);
112
+ }
113
+ });
114
+ }
112
115
  getDefinitionSQL(tableName) {
113
116
  return `select *
114
117
  from INFORMATION_SCHEMA.COLUMNS
@@ -134,6 +137,9 @@ var MSSQLModule;
134
137
  FROM INFORMATION_SCHEMA.COLUMNS
135
138
  WHERE TABLE_NAME='${tableName}'`;
136
139
  }
140
+ getBindingIdentifier() {
141
+ return `(@p${this.index++})`;
142
+ }
137
143
  connect() {
138
144
  return __awaiter(this, void 0, void 0, function* () {
139
145
  try {
@@ -147,7 +153,7 @@ var MSSQLModule;
147
153
  }
148
154
  runSQL(sql) {
149
155
  return __awaiter(this, void 0, void 0, function* () {
150
- return (yield internalQuery(this.client, utils_1.getSqlQuery(sql))).recordset;
156
+ return (yield this.internalQuery(utils_1.getSqlQuery(sql))).recordset;
151
157
  });
152
158
  }
153
159
  /**
@@ -207,28 +213,28 @@ var MSSQLModule;
207
213
  read(query) {
208
214
  return __awaiter(this, void 0, void 0, function* () {
209
215
  yield this.connect();
210
- const response = yield internalQuery(this.client, utils_1.getSqlQuery(query));
216
+ const response = yield this.internalQuery(utils_1.getSqlQuery(query));
211
217
  return response.recordset;
212
218
  });
213
219
  }
214
220
  create(query) {
215
221
  return __awaiter(this, void 0, void 0, function* () {
216
222
  yield this.connect();
217
- const response = yield internalQuery(this.client, utils_1.getSqlQuery(query));
223
+ const response = yield this.internalQuery(utils_1.getSqlQuery(query));
218
224
  return response.recordset || [{ created: true }];
219
225
  });
220
226
  }
221
227
  update(query) {
222
228
  return __awaiter(this, void 0, void 0, function* () {
223
229
  yield this.connect();
224
- const response = yield internalQuery(this.client, utils_1.getSqlQuery(query));
230
+ const response = yield this.internalQuery(utils_1.getSqlQuery(query));
225
231
  return response.recordset || [{ updated: true }];
226
232
  });
227
233
  }
228
234
  delete(query) {
229
235
  return __awaiter(this, void 0, void 0, function* () {
230
236
  yield this.connect();
231
- const response = yield internalQuery(this.client, utils_1.getSqlQuery(query));
237
+ const response = yield this.internalQuery(utils_1.getSqlQuery(query));
232
238
  return response.recordset || [{ deleted: true }];
233
239
  });
234
240
  }
@@ -236,7 +242,7 @@ var MSSQLModule;
236
242
  return __awaiter(this, void 0, void 0, function* () {
237
243
  yield this.connect();
238
244
  const operation = this._operation(json);
239
- const queryFn = (query, op) => internalQuery(this.client, query, op);
245
+ const queryFn = (query, op) => this.internalQuery(query, op);
240
246
  const processFn = (result) => result.recordset ? result.recordset : [{ [operation]: true }];
241
247
  return this.queryWithReturning(json, queryFn, processFn);
242
248
  });
@@ -65,25 +65,6 @@ var MySQLModule;
65
65
  },
66
66
  },
67
67
  };
68
- function internalQuery(client, query, connect = true) {
69
- // Node MySQL is callback based, so we must wrap our call in a promise
70
- return new Promise((resolve, reject) => {
71
- if (connect) {
72
- client.connect();
73
- }
74
- return client.query(query.sql, query.bindings || {}, (error, results) => {
75
- if (error) {
76
- reject(error);
77
- }
78
- else {
79
- resolve(results);
80
- }
81
- if (connect) {
82
- client.end();
83
- }
84
- });
85
- });
86
- }
87
68
  class MySQLIntegration extends Sql {
88
69
  constructor(config) {
89
70
  super(utils_1.SqlClients.MY_SQL);
@@ -95,19 +76,42 @@ var MySQLModule;
95
76
  }
96
77
  this.client = mysql.createConnection(config);
97
78
  }
79
+ getBindingIdentifier() {
80
+ return "?";
81
+ }
82
+ internalQuery(query, connect = true) {
83
+ const client = this.client;
84
+ // Node MySQL is callback based, so we must wrap our call in a promise
85
+ return new Promise((resolve, reject) => {
86
+ if (connect) {
87
+ client.connect();
88
+ }
89
+ return client.query(query.sql, query.bindings || {}, (error, results) => {
90
+ if (error) {
91
+ reject(error);
92
+ }
93
+ else {
94
+ resolve(results);
95
+ }
96
+ if (connect) {
97
+ client.end();
98
+ }
99
+ });
100
+ });
101
+ }
98
102
  buildSchema(datasourceId, entities) {
99
103
  return __awaiter(this, void 0, void 0, function* () {
100
104
  const tables = {};
101
105
  const database = this.config.database;
102
106
  this.client.connect();
103
107
  // get the tables first
104
- const tablesResp = yield internalQuery(this.client, { sql: "SHOW TABLES;" }, false);
108
+ const tablesResp = yield this.internalQuery({ sql: "SHOW TABLES;" }, false);
105
109
  const tableNames = tablesResp.map((obj) => obj[`Tables_in_${database}`] ||
106
110
  obj[`Tables_in_${database.toLowerCase()}`]);
107
111
  for (let tableName of tableNames) {
108
112
  const primaryKeys = [];
109
113
  const schema = {};
110
- const descResp = yield internalQuery(this.client, { sql: `DESCRIBE \`${tableName}\`;` }, false);
114
+ const descResp = yield this.internalQuery({ sql: `DESCRIBE \`${tableName}\`;` }, false);
111
115
  for (let column of descResp) {
112
116
  const columnName = column.Field;
113
117
  if (column.Key === "PRI" && primaryKeys.indexOf(column.Key) === -1) {
@@ -143,31 +147,31 @@ var MySQLModule;
143
147
  }
144
148
  create(query) {
145
149
  return __awaiter(this, void 0, void 0, function* () {
146
- const results = yield internalQuery(this.client, utils_1.getSqlQuery(query));
150
+ const results = yield this.internalQuery(utils_1.getSqlQuery(query));
147
151
  return results.length ? results : [{ created: true }];
148
152
  });
149
153
  }
150
154
  read(query) {
151
155
  return __awaiter(this, void 0, void 0, function* () {
152
- return internalQuery(this.client, utils_1.getSqlQuery(query));
156
+ return this.internalQuery(utils_1.getSqlQuery(query));
153
157
  });
154
158
  }
155
159
  update(query) {
156
160
  return __awaiter(this, void 0, void 0, function* () {
157
- const results = yield internalQuery(this.client, utils_1.getSqlQuery(query));
161
+ const results = yield this.internalQuery(utils_1.getSqlQuery(query));
158
162
  return results.length ? results : [{ updated: true }];
159
163
  });
160
164
  }
161
165
  delete(query) {
162
166
  return __awaiter(this, void 0, void 0, function* () {
163
- const results = yield internalQuery(this.client, utils_1.getSqlQuery(query));
167
+ const results = yield this.internalQuery(utils_1.getSqlQuery(query));
164
168
  return results.length ? results : [{ deleted: true }];
165
169
  });
166
170
  }
167
171
  query(json) {
168
172
  return __awaiter(this, void 0, void 0, function* () {
169
173
  this.client.connect();
170
- const queryFn = (query) => internalQuery(this.client, query, false);
174
+ const queryFn = (query) => this.internalQuery(query, false);
171
175
  const output = yield this.queryWithReturning(json, queryFn);
172
176
  this.client.end();
173
177
  return output;