@budibase/server 1.0.79-alpha.9 → 1.0.79

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