@budibase/server 1.0.79 → 1.0.80-alpha.2

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 (316) hide show
  1. package/__mocks__/node-fetch.ts +1 -0
  2. package/builder/assets/{index.c8d1e8f0.css → index.c57242d4.css} +2 -2
  3. package/builder/assets/index.f3e82852.js +1288 -0
  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 +101 -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/environment.js +1 -0
  223. package/dist/integrations/base/sql.js +16 -1
  224. package/dist/integrations/base/sqlTable.js +8 -4
  225. package/dist/integrations/googlesheets.js +3 -0
  226. package/dist/integrations/microsoftSqlServer.js +60 -43
  227. package/dist/integrations/mysql.js +3 -0
  228. package/dist/integrations/oracle.js +14 -19
  229. package/dist/integrations/postgres.js +34 -28
  230. package/dist/integrations/utils.js +32 -15
  231. package/dist/package.json +11 -7
  232. package/dist/tests/utilities/TestConfiguration.js +25 -8
  233. package/dist/threads/query.js +33 -8
  234. package/dist/tsconfig.tsbuildinfo +1 -1
  235. package/dist/utilities/workerRequests.js +50 -15
  236. package/package.json +12 -8
  237. package/scripts/integrations/mssql/data/setup.sql +18 -1
  238. package/scripts/integrations/oracle/oracle.md +2 -2
  239. package/scripts/integrations/postgres/init.sql +11 -3
  240. package/scripts/likeCypress.ts +9 -6
  241. package/specs/generate.js +83 -0
  242. package/specs/openapi.json +2222 -0
  243. package/specs/openapi.yaml +1530 -0
  244. package/specs/parameters.js +59 -0
  245. package/specs/resources/application.js +101 -0
  246. package/specs/resources/index.js +24 -0
  247. package/specs/resources/misc.js +12 -0
  248. package/specs/resources/query.js +189 -0
  249. package/specs/resources/row.js +125 -0
  250. package/specs/resources/table.js +191 -0
  251. package/specs/resources/user.js +126 -0
  252. package/specs/resources/utils/Resource.js +26 -0
  253. package/specs/resources/utils/index.js +11 -0
  254. package/specs/security.js +7 -0
  255. package/src/api/controllers/application.js +1 -0
  256. package/src/api/controllers/public/applications.ts +74 -0
  257. package/src/api/controllers/public/mapping/applications.ts +32 -0
  258. package/src/api/controllers/public/mapping/index.ts +13 -0
  259. package/src/api/controllers/public/mapping/queries.ts +39 -0
  260. package/src/api/controllers/public/mapping/rows.ts +31 -0
  261. package/src/api/controllers/public/mapping/tables.ts +26 -0
  262. package/src/api/controllers/public/mapping/types.ts +13 -0
  263. package/src/api/controllers/public/mapping/users.ts +32 -0
  264. package/src/api/controllers/public/queries.ts +20 -0
  265. package/src/api/controllers/public/rows.ts +77 -0
  266. package/src/api/controllers/public/tables.ts +56 -0
  267. package/src/api/controllers/public/users.ts +82 -0
  268. package/src/api/controllers/public/utils.ts +38 -0
  269. package/src/api/controllers/row/ExternalRequest.ts +1 -1
  270. package/src/api/controllers/row/internal.js +4 -0
  271. package/src/api/controllers/table/index.js +2 -1
  272. package/src/api/controllers/webhook.js +3 -6
  273. package/src/api/index.js +4 -1
  274. package/src/api/routes/automation.js +3 -33
  275. package/src/api/routes/datasource.js +6 -52
  276. package/src/api/routes/index.js +2 -0
  277. package/src/api/routes/permission.js +4 -18
  278. package/src/api/routes/public/applications.ts +156 -0
  279. package/src/api/routes/public/index.ts +118 -0
  280. package/src/api/routes/public/middleware/mapper.ts +81 -0
  281. package/src/api/routes/public/queries.ts +81 -0
  282. package/src/api/routes/public/rows.ts +242 -0
  283. package/src/api/routes/public/tables.ts +169 -0
  284. package/src/api/routes/public/tests/compare.spec.js +184 -0
  285. package/src/api/routes/public/users.ts +144 -0
  286. package/src/api/routes/public/utils/Endpoint.ts +51 -0
  287. package/src/api/routes/role.js +3 -24
  288. package/src/api/routes/row.js +3 -2
  289. package/src/api/routes/screen.js +2 -29
  290. package/src/api/routes/table.js +4 -19
  291. package/src/api/routes/tests/utilities/index.js +24 -0
  292. package/src/api/routes/utils/validators.js +219 -0
  293. package/src/api/routes/webhook.js +2 -18
  294. package/src/automations/steps/filter.js +3 -2
  295. package/src/automations/steps/queryRows.js +1 -1
  296. package/src/automations/utils.js +2 -2
  297. package/src/constants/index.js +4 -0
  298. package/src/db/utils.js +12 -0
  299. package/src/definitions/common.ts +4 -0
  300. package/src/definitions/datasource.ts +1 -0
  301. package/src/definitions/openapi.ts +943 -0
  302. package/src/environment.js +1 -0
  303. package/src/integrations/base/datasourcePlus.ts +3 -0
  304. package/src/integrations/base/sql.ts +16 -1
  305. package/src/integrations/base/sqlTable.ts +11 -7
  306. package/src/integrations/googlesheets.ts +5 -2
  307. package/src/integrations/microsoftSqlServer.ts +86 -61
  308. package/src/integrations/mysql.ts +4 -0
  309. package/src/integrations/oracle.ts +27 -35
  310. package/src/integrations/postgres.ts +33 -26
  311. package/src/integrations/utils.ts +43 -15
  312. package/src/tests/utilities/TestConfiguration.js +23 -2
  313. package/src/threads/query.js +37 -9
  314. package/src/utilities/workerRequests.js +65 -16
  315. package/builder/assets/index.f28c5d54.js +0 -1352
  316. 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 });
@@ -37,6 +37,7 @@ module.exports = {
37
37
  INTERNAL_API_KEY: process.env.INTERNAL_API_KEY,
38
38
  MULTI_TENANCY: process.env.MULTI_TENANCY,
39
39
  HTTP_MIGRATIONS: process.env.HTTP_MIGRATIONS,
40
+ API_REQ_LIMIT_PER_SEC: process.env.API_REQ_LIMIT_PER_SEC,
40
41
  // environment
41
42
  NODE_ENV: process.env.NODE_ENV,
42
43
  JEST_WORKER_ID: process.env.JEST_WORKER_ID,
@@ -232,6 +232,9 @@ class InternalBuilder {
232
232
  create(knex, json, opts) {
233
233
  const { endpoint, body } = json;
234
234
  let query = knex(endpoint.entityId);
235
+ if (endpoint.schema) {
236
+ query = query.withSchema(endpoint.schema);
237
+ }
235
238
  const parsedBody = parseBody(body);
236
239
  // make sure no null values in body for creation
237
240
  for (let [key, value] of Object.entries(parsedBody)) {
@@ -250,6 +253,9 @@ class InternalBuilder {
250
253
  bulkCreate(knex, json) {
251
254
  const { endpoint, body } = json;
252
255
  let query = knex(endpoint.entityId);
256
+ if (endpoint.schema) {
257
+ query = query.withSchema(endpoint.schema);
258
+ }
253
259
  if (!Array.isArray(body)) {
254
260
  return query;
255
261
  }
@@ -257,7 +263,7 @@ class InternalBuilder {
257
263
  return query.insert(parsedBody);
258
264
  }
259
265
  read(knex, json, limit) {
260
- let { endpoint, resource, filters, sort, paginate, relationships } = json;
266
+ let { endpoint, resource, filters, paginate, relationships } = json;
261
267
  const tableName = endpoint.entityId;
262
268
  // select all if not specified
263
269
  if (!resource) {
@@ -285,6 +291,9 @@ class InternalBuilder {
285
291
  }
286
292
  // start building the query
287
293
  let query = knex(tableName).limit(foundLimit);
294
+ if (endpoint.schema) {
295
+ query = query.withSchema(endpoint.schema);
296
+ }
288
297
  if (foundOffset) {
289
298
  query = query.offset(foundOffset);
290
299
  }
@@ -307,6 +316,9 @@ class InternalBuilder {
307
316
  update(knex, json, opts) {
308
317
  const { endpoint, body, filters } = json;
309
318
  let query = knex(endpoint.entityId);
319
+ if (endpoint.schema) {
320
+ query = query.withSchema(endpoint.schema);
321
+ }
310
322
  const parsedBody = parseBody(body);
311
323
  query = this.addFilters(query, filters, { tableName: endpoint.entityId });
312
324
  // mysql can't use returning
@@ -320,6 +332,9 @@ class InternalBuilder {
320
332
  delete(knex, json, opts) {
321
333
  const { endpoint, filters } = json;
322
334
  let query = knex(endpoint.entityId);
335
+ if (endpoint.schema) {
336
+ query = query.withSchema(endpoint.schema);
337
+ }
323
338
  query = this.addFilters(query, filters, { tableName: endpoint.entityId });
324
339
  // mysql can't use returning
325
340
  if (opts.disableReturning) {
@@ -87,17 +87,17 @@ function generateSchema(schema, table, tables, oldTable = null) {
87
87
  return schema;
88
88
  }
89
89
  function buildCreateTable(knex, table, tables) {
90
- return knex.schema.createTable(table.name, schema => {
90
+ return knex.createTable(table.name, schema => {
91
91
  generateSchema(schema, table, tables);
92
92
  });
93
93
  }
94
94
  function buildUpdateTable(knex, table, tables, oldTable) {
95
- return knex.schema.alterTable(table.name, schema => {
95
+ return knex.alterTable(table.name, schema => {
96
96
  generateSchema(schema, table, tables, oldTable);
97
97
  });
98
98
  }
99
99
  function buildDeleteTable(knex, table) {
100
- return knex.schema.dropTable(table.name);
100
+ return knex.dropTable(table.name);
101
101
  }
102
102
  class SqlTableQueryBuilder {
103
103
  // pass through client to get flavour of SQL
@@ -115,7 +115,11 @@ class SqlTableQueryBuilder {
115
115
  return json.endpoint.operation;
116
116
  }
117
117
  _tableQuery(json) {
118
- const client = knex_1.knex({ client: this.sqlClient });
118
+ var _a;
119
+ let client = knex_1.knex({ client: this.sqlClient }).schema;
120
+ if ((_a = json === null || json === void 0 ? void 0 : json.endpoint) === null || _a === void 0 ? void 0 : _a.schema) {
121
+ client = client.withSchema(json.endpoint.schema);
122
+ }
119
123
  let query;
120
124
  if (!json.table || !json.meta || !json.meta.tables) {
121
125
  throw "Cannot execute without table being specified";
@@ -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