@budibase/server 1.0.79-alpha.4 → 1.0.79-alpha.7

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 (286) hide show
  1. package/__mocks__/node-fetch.ts +1 -0
  2. package/builder/assets/{index.ca6b3e24.css → index.c57242d4.css} +2 -2
  3. package/builder/assets/index.ef62c13b.js +1288 -0
  4. package/builder/index.html +2 -2
  5. package/coverage/clover.xml +2261 -2213
  6. package/coverage/coverage-final.json +137 -136
  7. package/coverage/lcov-report/api/controllers/analytics.js.html +6 -6
  8. package/coverage/lcov-report/api/controllers/apikeys.js.html +6 -6
  9. package/coverage/lcov-report/api/controllers/application.js.html +152 -149
  10. package/coverage/lcov-report/api/controllers/auth.js.html +7 -7
  11. package/coverage/lcov-report/api/controllers/automation.js.html +21 -21
  12. package/coverage/lcov-report/api/controllers/backup.js.html +3 -3
  13. package/coverage/lcov-report/api/controllers/cloud.js.html +11 -11
  14. package/coverage/lcov-report/api/controllers/component.js.html +5 -5
  15. package/coverage/lcov-report/api/controllers/datasource.js.html +16 -16
  16. package/coverage/lcov-report/api/controllers/dev.js.html +19 -19
  17. package/coverage/lcov-report/api/controllers/index.html +16 -16
  18. package/coverage/lcov-report/api/controllers/integration.js.html +4 -4
  19. package/coverage/lcov-report/api/controllers/layout.js.html +6 -6
  20. package/coverage/lcov-report/api/controllers/metadata.js.html +9 -9
  21. package/coverage/lcov-report/api/controllers/migrations.js.html +4 -4
  22. package/coverage/lcov-report/api/controllers/permission.js.html +15 -15
  23. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  24. package/coverage/lcov-report/api/controllers/query/index.js.html +26 -26
  25. package/coverage/lcov-report/api/controllers/query/validation.js.html +10 -10
  26. package/coverage/lcov-report/api/controllers/role.js.html +9 -9
  27. package/coverage/lcov-report/api/controllers/routing.js.html +9 -9
  28. package/coverage/lcov-report/api/controllers/row/external.js.html +16 -16
  29. package/coverage/lcov-report/api/controllers/row/index.html +27 -27
  30. package/coverage/lcov-report/api/controllers/row/index.js.html +46 -46
  31. package/coverage/lcov-report/api/controllers/row/internal.js.html +94 -82
  32. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +204 -204
  33. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +24 -24
  34. package/coverage/lcov-report/api/controllers/row/utils.js.html +29 -29
  35. package/coverage/lcov-report/api/controllers/screen.js.html +7 -7
  36. package/coverage/lcov-report/api/controllers/script.js.html +4 -4
  37. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +49 -49
  38. package/coverage/lcov-report/api/controllers/table/external.js.html +12 -12
  39. package/coverage/lcov-report/api/controllers/table/index.html +11 -11
  40. package/coverage/lcov-report/api/controllers/table/index.js.html +47 -44
  41. package/coverage/lcov-report/api/controllers/table/internal.js.html +50 -50
  42. package/coverage/lcov-report/api/controllers/table/utils.js.html +80 -80
  43. package/coverage/lcov-report/api/controllers/templates.js.html +5 -5
  44. package/coverage/lcov-report/api/controllers/user.js.html +19 -19
  45. package/coverage/lcov-report/api/controllers/view/exporters.js.html +4 -4
  46. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  47. package/coverage/lcov-report/api/controllers/view/index.js.html +14 -14
  48. package/coverage/lcov-report/api/controllers/view/utils.js.html +12 -12
  49. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +7 -7
  50. package/coverage/lcov-report/api/controllers/webhook.js.html +18 -27
  51. package/coverage/lcov-report/api/index.html +10 -10
  52. package/coverage/lcov-report/api/index.js.html +37 -28
  53. package/coverage/lcov-report/api/routes/analytics.js.html +6 -6
  54. package/coverage/lcov-report/api/routes/apikeys.js.html +8 -8
  55. package/coverage/lcov-report/api/routes/application.js.html +9 -9
  56. package/coverage/lcov-report/api/routes/auth.js.html +6 -6
  57. package/coverage/lcov-report/api/routes/automation.js.html +19 -109
  58. package/coverage/lcov-report/api/routes/backup.js.html +8 -8
  59. package/coverage/lcov-report/api/routes/cloud.js.html +8 -8
  60. package/coverage/lcov-report/api/routes/component.js.html +8 -8
  61. package/coverage/lcov-report/api/routes/datasource.js.html +18 -156
  62. package/coverage/lcov-report/api/routes/deploy.js.html +8 -8
  63. package/coverage/lcov-report/api/routes/dev.js.html +13 -13
  64. package/coverage/lcov-report/api/routes/index.html +35 -35
  65. package/coverage/lcov-report/api/routes/index.js.html +38 -32
  66. package/coverage/lcov-report/api/routes/integration.js.html +8 -8
  67. package/coverage/lcov-report/api/routes/layout.js.html +8 -8
  68. package/coverage/lcov-report/api/routes/metadata.js.html +9 -9
  69. package/coverage/lcov-report/api/routes/migrations.js.html +7 -7
  70. package/coverage/lcov-report/api/routes/permission.js.html +16 -58
  71. package/coverage/lcov-report/api/routes/query.js.html +10 -10
  72. package/coverage/lcov-report/api/routes/role.js.html +15 -78
  73. package/coverage/lcov-report/api/routes/routing.js.html +8 -8
  74. package/coverage/lcov-report/api/routes/row.js.html +17 -14
  75. package/coverage/lcov-report/api/routes/screen.js.html +14 -95
  76. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/static.js.html +13 -13
  78. package/coverage/lcov-report/api/routes/table.js.html +17 -62
  79. package/coverage/lcov-report/api/routes/templates.js.html +8 -8
  80. package/coverage/lcov-report/api/routes/user.js.html +8 -8
  81. package/coverage/lcov-report/api/routes/utils/index.html +111 -0
  82. package/coverage/lcov-report/api/routes/utils/validators.js.html +737 -0
  83. package/coverage/lcov-report/api/routes/view.js.html +10 -10
  84. package/coverage/lcov-report/api/routes/webhook.js.html +14 -62
  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 +7 -7
  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 +40 -28
  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 +123 -87
  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 +79 -64
  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 +1 -1
  151. package/coverage/lcov-report/threads/index.js.html +10 -10
  152. package/coverage/lcov-report/threads/query.js.html +1 -1
  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 +200 -53
  177. package/coverage/lcov.info +3088 -3012
  178. package/dist/api/controllers/application.js +1 -0
  179. package/dist/api/controllers/public/applications.js +94 -0
  180. package/dist/api/controllers/public/mapping/applications.js +29 -0
  181. package/dist/api/controllers/public/mapping/index.js +11 -0
  182. package/dist/api/controllers/public/mapping/queries.js +36 -0
  183. package/dist/api/controllers/public/mapping/rows.js +24 -0
  184. package/dist/api/controllers/public/mapping/tables.js +23 -0
  185. package/dist/api/controllers/public/mapping/types.js +2 -0
  186. package/dist/api/controllers/public/mapping/users.js +29 -0
  187. package/dist/api/controllers/public/queries.js +38 -0
  188. package/dist/api/controllers/public/rows.js +97 -0
  189. package/dist/api/controllers/public/tables.js +75 -0
  190. package/dist/api/controllers/public/users.js +95 -0
  191. package/dist/api/controllers/public/utils.js +49 -0
  192. package/dist/api/controllers/row/internal.js +4 -1
  193. package/dist/api/controllers/table/index.js +2 -1
  194. package/dist/api/controllers/webhook.js +3 -5
  195. package/dist/api/index.js +3 -1
  196. package/dist/api/routes/automation.js +3 -31
  197. package/dist/api/routes/datasource.js +3 -50
  198. package/dist/api/routes/index.js +2 -0
  199. package/dist/api/routes/permission.js +4 -14
  200. package/dist/api/routes/public/applications.js +141 -0
  201. package/dist/api/routes/public/index.js +68 -0
  202. package/dist/api/routes/public/middleware/mapper.js +94 -0
  203. package/dist/api/routes/public/queries.js +77 -0
  204. package/dist/api/routes/public/rows.js +229 -0
  205. package/dist/api/routes/public/tables.js +154 -0
  206. package/dist/api/routes/public/users.js +137 -0
  207. package/dist/api/routes/public/utils/Endpoint.js +36 -0
  208. package/dist/api/routes/role.js +3 -19
  209. package/dist/api/routes/row.js +3 -4
  210. package/dist/api/routes/screen.js +2 -23
  211. package/dist/api/routes/table.js +3 -17
  212. package/dist/api/routes/tests/utilities/index.js +23 -0
  213. package/dist/api/routes/utils/validators.js +200 -0
  214. package/dist/api/routes/webhook.js +2 -17
  215. package/dist/automations/steps/queryRows.js +1 -1
  216. package/dist/automations/utils.js +2 -2
  217. package/dist/constants/index.js +3 -0
  218. package/dist/db/utils.js +11 -0
  219. package/dist/definitions/openapi.js +6 -0
  220. package/dist/package.json +8 -4
  221. package/dist/tests/utilities/TestConfiguration.js +25 -8
  222. package/dist/tsconfig.tsbuildinfo +1 -1
  223. package/dist/utilities/workerRequests.js +50 -15
  224. package/package.json +9 -5
  225. package/scripts/integrations/postgres/init.sql +5 -3
  226. package/specs/generate.js +83 -0
  227. package/specs/openapi.json +2222 -0
  228. package/specs/openapi.yaml +1530 -0
  229. package/specs/parameters.js +59 -0
  230. package/specs/resources/application.js +101 -0
  231. package/specs/resources/index.js +24 -0
  232. package/specs/resources/misc.js +12 -0
  233. package/specs/resources/query.js +189 -0
  234. package/specs/resources/row.js +125 -0
  235. package/specs/resources/table.js +191 -0
  236. package/specs/resources/user.js +126 -0
  237. package/specs/resources/utils/Resource.js +26 -0
  238. package/specs/resources/utils/index.js +11 -0
  239. package/specs/security.js +7 -0
  240. package/src/api/controllers/application.js +1 -0
  241. package/src/api/controllers/public/applications.ts +74 -0
  242. package/src/api/controllers/public/mapping/applications.ts +32 -0
  243. package/src/api/controllers/public/mapping/index.ts +13 -0
  244. package/src/api/controllers/public/mapping/queries.ts +39 -0
  245. package/src/api/controllers/public/mapping/rows.ts +31 -0
  246. package/src/api/controllers/public/mapping/tables.ts +26 -0
  247. package/src/api/controllers/public/mapping/types.ts +13 -0
  248. package/src/api/controllers/public/mapping/users.ts +32 -0
  249. package/src/api/controllers/public/queries.ts +20 -0
  250. package/src/api/controllers/public/rows.ts +77 -0
  251. package/src/api/controllers/public/tables.ts +56 -0
  252. package/src/api/controllers/public/users.ts +82 -0
  253. package/src/api/controllers/public/utils.ts +38 -0
  254. package/src/api/controllers/row/internal.js +4 -0
  255. package/src/api/controllers/table/index.js +2 -1
  256. package/src/api/controllers/webhook.js +3 -6
  257. package/src/api/index.js +4 -1
  258. package/src/api/routes/automation.js +3 -33
  259. package/src/api/routes/datasource.js +6 -52
  260. package/src/api/routes/index.js +2 -0
  261. package/src/api/routes/permission.js +4 -18
  262. package/src/api/routes/public/applications.ts +156 -0
  263. package/src/api/routes/public/index.ts +82 -0
  264. package/src/api/routes/public/middleware/mapper.ts +81 -0
  265. package/src/api/routes/public/queries.ts +81 -0
  266. package/src/api/routes/public/rows.ts +242 -0
  267. package/src/api/routes/public/tables.ts +169 -0
  268. package/src/api/routes/public/tests/compare.spec.js +184 -0
  269. package/src/api/routes/public/users.ts +144 -0
  270. package/src/api/routes/public/utils/Endpoint.ts +51 -0
  271. package/src/api/routes/role.js +3 -24
  272. package/src/api/routes/row.js +3 -2
  273. package/src/api/routes/screen.js +2 -29
  274. package/src/api/routes/table.js +4 -19
  275. package/src/api/routes/tests/utilities/index.js +24 -0
  276. package/src/api/routes/utils/validators.js +219 -0
  277. package/src/api/routes/webhook.js +2 -18
  278. package/src/automations/steps/queryRows.js +1 -1
  279. package/src/automations/utils.js +2 -2
  280. package/src/constants/index.js +4 -0
  281. package/src/db/utils.js +12 -0
  282. package/src/definitions/common.ts +4 -0
  283. package/src/definitions/openapi.ts +943 -0
  284. package/src/tests/utilities/TestConfiguration.js +23 -2
  285. package/src/utilities/workerRequests.js +65 -16
  286. package/builder/assets/index.8bc78df5.js +0 -1287
@@ -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
@@ -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 });
package/dist/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@budibase/server",
3
3
  "email": "hi@budibase.com",
4
- "version": "1.0.79-alpha.3",
4
+ "version": "1.0.79-alpha.6",
5
5
  "description": "Budibase Web Server",
6
6
  "main": "src/index.ts",
7
7
  "repository": {
@@ -25,6 +25,7 @@
25
25
  "generate:proxy:preprod": "node scripts/proxy/generateProxyConfig preprod",
26
26
  "generate:proxy:prod": "node scripts/proxy/generateProxyConfig prod",
27
27
  "format": "prettier --config ../../.prettierrc.json 'src/**/*.ts' --write",
28
+ "specs": "node specs/generate.js && openapi-typescript specs/openapi.yaml --output src/definitions/openapi.ts",
28
29
  "lint": "eslint --fix src/",
29
30
  "lint:fix": "yarn run format && yarn run lint",
30
31
  "initialise": "node scripts/initialise.js",
@@ -73,9 +74,9 @@
73
74
  "license": "GPL-3.0",
74
75
  "dependencies": {
75
76
  "@apidevtools/swagger-parser": "^10.0.3",
76
- "@budibase/backend-core": "^1.0.79-alpha.3",
77
- "@budibase/client": "^1.0.79-alpha.3",
78
- "@budibase/string-templates": "^1.0.79-alpha.3",
77
+ "@budibase/backend-core": "^1.0.79-alpha.6",
78
+ "@budibase/client": "^1.0.79-alpha.6",
79
+ "@budibase/string-templates": "^1.0.79-alpha.6",
79
80
  "@bull-board/api": "^3.7.0",
80
81
  "@bull-board/koa": "^3.7.0",
81
82
  "@elastic/elasticsearch": "7.10.0",
@@ -157,12 +158,15 @@
157
158
  "docker-compose": "^0.23.6",
158
159
  "eslint": "^6.8.0",
159
160
  "jest": "^27.0.5",
161
+ "jest-openapi": "^0.14.2",
160
162
  "nodemon": "^2.0.4",
161
163
  "openapi-types": "^9.3.1",
164
+ "openapi-typescript": "^5.2.0",
162
165
  "path-to-regexp": "^6.2.0",
163
166
  "prettier": "^2.3.1",
164
167
  "rimraf": "^3.0.2",
165
168
  "supertest": "^4.0.2",
169
+ "swagger-jsdoc": "^6.1.0",
166
170
  "ts-jest": "^27.0.3",
167
171
  "ts-node": "^10.0.0",
168
172
  "typescript": "^4.3.5",
@@ -24,6 +24,8 @@ const { createASession } = require("@budibase/backend-core/sessions");
24
24
  const { user: userCache } = require("@budibase/backend-core/cache");
25
25
  const newid = require("../../db/newid");
26
26
  const context = require("@budibase/backend-core/context");
27
+ const { generateDevInfoID, SEPARATOR } = require("@budibase/backend-core/db");
28
+ const { encrypt } = require("@budibase/backend-core/encryption");
27
29
  const GLOBAL_USER_ID = "us_uuid1";
28
30
  const EMAIL = "babs@babs.com";
29
31
  const CSRF_TOKEN = "e3727778-7af0-4226-b5eb-f43cbe60a306";
@@ -42,6 +44,9 @@ class TestConfiguration {
42
44
  getRequest() {
43
45
  return this.request;
44
46
  }
47
+ getApp() {
48
+ return this.app;
49
+ }
45
50
  getAppId() {
46
51
  return this.appId;
47
52
  }
@@ -80,6 +85,22 @@ class TestConfiguration {
80
85
  }
81
86
  });
82
87
  }
88
+ generateApiKey(userId = GLOBAL_USER_ID) {
89
+ return __awaiter(this, void 0, void 0, function* () {
90
+ const db = getGlobalDB(TENANT_ID);
91
+ const id = generateDevInfoID(userId);
92
+ let devInfo;
93
+ try {
94
+ devInfo = yield db.get(id);
95
+ }
96
+ catch (err) {
97
+ devInfo = { _id: id, userId };
98
+ }
99
+ devInfo.apiKey = encrypt(`${TENANT_ID}${SEPARATOR}${newid()}`);
100
+ yield db.put(devInfo);
101
+ return devInfo.apiKey;
102
+ });
103
+ }
83
104
  globalUser({ id = GLOBAL_USER_ID, builder = true, email = EMAIL, roles, } = {}) {
84
105
  return __awaiter(this, void 0, void 0, function* () {
85
106
  const db = getGlobalDB(TENANT_ID);
@@ -122,7 +143,7 @@ class TestConfiguration {
122
143
  }
123
144
  cleanup(this.allApps.map(app => app.appId));
124
145
  }
125
- defaultHeaders() {
146
+ defaultHeaders(extras = {}) {
126
147
  const auth = {
127
148
  userId: GLOBAL_USER_ID,
128
149
  sessionId: "sessionid",
@@ -134,14 +155,10 @@ class TestConfiguration {
134
155
  };
135
156
  const authToken = jwt.sign(auth, env.JWT_SECRET);
136
157
  const appToken = jwt.sign(app, env.JWT_SECRET);
137
- const headers = {
138
- Accept: "application/json",
139
- Cookie: [
158
+ const headers = Object.assign({ Accept: "application/json", Cookie: [
140
159
  `${Cookies.Auth}=${authToken}`,
141
160
  `${Cookies.CurrentApp}=${appToken}`,
142
- ],
143
- [Headers.CSRF_TOKEN]: CSRF_TOKEN,
144
- };
161
+ ], [Headers.CSRF_TOKEN]: CSRF_TOKEN }, extras);
145
162
  if (this.appId) {
146
163
  headers[Headers.APP_ID] = this.appId;
147
164
  }
@@ -204,7 +221,7 @@ class TestConfiguration {
204
221
  getTable(tableId = null) {
205
222
  return __awaiter(this, void 0, void 0, function* () {
206
223
  tableId = tableId || this.table._id;
207
- return this._req(null, { id: tableId }, controllers.table.find);
224
+ return this._req(null, { tableId }, controllers.table.find);
208
225
  });
209
226
  }
210
227
  createLinkedTable(relationshipType = null, links = ["link"]) {