@budibase/server 1.0.79 → 1.0.80-alpha.0

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 (308) hide show
  1. package/__mocks__/node-fetch.ts +1 -0
  2. package/builder/assets/index.b37e0ebb.js +1288 -0
  3. package/builder/assets/{index.c8d1e8f0.css → index.c57242d4.css} +2 -2
  4. package/builder/assets/{vendor.20f80cec.js → vendor.a7c6ad0a.js} +190 -216
  5. package/builder/index.html +3 -3
  6. package/coverage/clover.xml +2399 -2336
  7. package/coverage/coverage-final.json +138 -137
  8. package/coverage/lcov-report/api/controllers/analytics.js.html +6 -6
  9. package/coverage/lcov-report/api/controllers/apikeys.js.html +6 -6
  10. package/coverage/lcov-report/api/controllers/application.js.html +152 -149
  11. package/coverage/lcov-report/api/controllers/auth.js.html +7 -7
  12. package/coverage/lcov-report/api/controllers/automation.js.html +21 -21
  13. package/coverage/lcov-report/api/controllers/backup.js.html +3 -3
  14. package/coverage/lcov-report/api/controllers/cloud.js.html +11 -11
  15. package/coverage/lcov-report/api/controllers/component.js.html +5 -5
  16. package/coverage/lcov-report/api/controllers/datasource.js.html +16 -16
  17. package/coverage/lcov-report/api/controllers/dev.js.html +19 -19
  18. package/coverage/lcov-report/api/controllers/index.html +16 -16
  19. package/coverage/lcov-report/api/controllers/integration.js.html +4 -4
  20. package/coverage/lcov-report/api/controllers/layout.js.html +6 -6
  21. package/coverage/lcov-report/api/controllers/metadata.js.html +9 -9
  22. package/coverage/lcov-report/api/controllers/migrations.js.html +4 -4
  23. package/coverage/lcov-report/api/controllers/permission.js.html +15 -15
  24. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  25. package/coverage/lcov-report/api/controllers/query/index.js.html +26 -26
  26. package/coverage/lcov-report/api/controllers/query/validation.js.html +10 -10
  27. package/coverage/lcov-report/api/controllers/role.js.html +9 -9
  28. package/coverage/lcov-report/api/controllers/routing.js.html +9 -9
  29. package/coverage/lcov-report/api/controllers/row/external.js.html +16 -16
  30. package/coverage/lcov-report/api/controllers/row/index.html +27 -27
  31. package/coverage/lcov-report/api/controllers/row/index.js.html +46 -46
  32. package/coverage/lcov-report/api/controllers/row/internal.js.html +94 -82
  33. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +204 -204
  34. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +24 -24
  35. package/coverage/lcov-report/api/controllers/row/utils.js.html +29 -29
  36. package/coverage/lcov-report/api/controllers/screen.js.html +7 -7
  37. package/coverage/lcov-report/api/controllers/script.js.html +4 -4
  38. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +49 -49
  39. package/coverage/lcov-report/api/controllers/table/external.js.html +12 -12
  40. package/coverage/lcov-report/api/controllers/table/index.html +11 -11
  41. package/coverage/lcov-report/api/controllers/table/index.js.html +47 -44
  42. package/coverage/lcov-report/api/controllers/table/internal.js.html +50 -50
  43. package/coverage/lcov-report/api/controllers/table/utils.js.html +80 -80
  44. package/coverage/lcov-report/api/controllers/templates.js.html +5 -5
  45. package/coverage/lcov-report/api/controllers/user.js.html +19 -19
  46. package/coverage/lcov-report/api/controllers/view/exporters.js.html +4 -4
  47. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  48. package/coverage/lcov-report/api/controllers/view/index.js.html +14 -14
  49. package/coverage/lcov-report/api/controllers/view/utils.js.html +12 -12
  50. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +7 -7
  51. package/coverage/lcov-report/api/controllers/webhook.js.html +18 -27
  52. package/coverage/lcov-report/api/index.html +10 -10
  53. package/coverage/lcov-report/api/index.js.html +37 -28
  54. package/coverage/lcov-report/api/routes/analytics.js.html +6 -6
  55. package/coverage/lcov-report/api/routes/apikeys.js.html +8 -8
  56. package/coverage/lcov-report/api/routes/application.js.html +9 -9
  57. package/coverage/lcov-report/api/routes/auth.js.html +6 -6
  58. package/coverage/lcov-report/api/routes/automation.js.html +19 -109
  59. package/coverage/lcov-report/api/routes/backup.js.html +8 -8
  60. package/coverage/lcov-report/api/routes/cloud.js.html +8 -8
  61. package/coverage/lcov-report/api/routes/component.js.html +8 -8
  62. package/coverage/lcov-report/api/routes/datasource.js.html +18 -156
  63. package/coverage/lcov-report/api/routes/deploy.js.html +8 -8
  64. package/coverage/lcov-report/api/routes/dev.js.html +13 -13
  65. package/coverage/lcov-report/api/routes/index.html +35 -35
  66. package/coverage/lcov-report/api/routes/index.js.html +38 -32
  67. package/coverage/lcov-report/api/routes/integration.js.html +8 -8
  68. package/coverage/lcov-report/api/routes/layout.js.html +8 -8
  69. package/coverage/lcov-report/api/routes/metadata.js.html +9 -9
  70. package/coverage/lcov-report/api/routes/migrations.js.html +7 -7
  71. package/coverage/lcov-report/api/routes/permission.js.html +16 -58
  72. package/coverage/lcov-report/api/routes/query.js.html +10 -10
  73. package/coverage/lcov-report/api/routes/role.js.html +15 -78
  74. package/coverage/lcov-report/api/routes/routing.js.html +8 -8
  75. package/coverage/lcov-report/api/routes/row.js.html +17 -14
  76. package/coverage/lcov-report/api/routes/screen.js.html +14 -95
  77. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/static.js.html +13 -13
  79. package/coverage/lcov-report/api/routes/table.js.html +17 -62
  80. package/coverage/lcov-report/api/routes/templates.js.html +8 -8
  81. package/coverage/lcov-report/api/routes/user.js.html +8 -8
  82. package/coverage/lcov-report/api/routes/utils/index.html +111 -0
  83. package/coverage/lcov-report/api/routes/utils/validators.js.html +737 -0
  84. package/coverage/lcov-report/api/routes/view.js.html +10 -10
  85. package/coverage/lcov-report/api/routes/webhook.js.html +14 -62
  86. package/coverage/lcov-report/automations/actions.js.html +24 -24
  87. package/coverage/lcov-report/automations/automationUtils.js.html +5 -5
  88. package/coverage/lcov-report/automations/bullboard.js.html +16 -16
  89. package/coverage/lcov-report/automations/index.html +1 -1
  90. package/coverage/lcov-report/automations/index.js.html +7 -7
  91. package/coverage/lcov-report/automations/steps/bash.js.html +6 -6
  92. package/coverage/lcov-report/automations/steps/createRow.js.html +7 -7
  93. package/coverage/lcov-report/automations/steps/delay.js.html +4 -4
  94. package/coverage/lcov-report/automations/steps/deleteRow.js.html +7 -7
  95. package/coverage/lcov-report/automations/steps/discord.js.html +7 -7
  96. package/coverage/lcov-report/automations/steps/executeQuery.js.html +6 -6
  97. package/coverage/lcov-report/automations/steps/executeScript.js.html +6 -6
  98. package/coverage/lcov-report/automations/steps/filter.js.html +12 -9
  99. package/coverage/lcov-report/automations/steps/index.html +1 -1
  100. package/coverage/lcov-report/automations/steps/integromat.js.html +5 -5
  101. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +8 -8
  102. package/coverage/lcov-report/automations/steps/queryRows.js.html +11 -11
  103. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +5 -5
  104. package/coverage/lcov-report/automations/steps/serverLog.js.html +3 -3
  105. package/coverage/lcov-report/automations/steps/slack.js.html +5 -5
  106. package/coverage/lcov-report/automations/steps/updateRow.js.html +6 -6
  107. package/coverage/lcov-report/automations/steps/utils.js.html +3 -3
  108. package/coverage/lcov-report/automations/steps/zapier.js.html +5 -5
  109. package/coverage/lcov-report/automations/triggerInfo/app.js.html +2 -2
  110. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +2 -2
  111. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  112. package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -8
  113. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +2 -2
  114. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +2 -2
  115. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +2 -2
  116. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +2 -2
  117. package/coverage/lcov-report/automations/triggers.js.html +26 -26
  118. package/coverage/lcov-report/automations/utils.js.html +35 -35
  119. package/coverage/lcov-report/constants/index.html +5 -5
  120. package/coverage/lcov-report/constants/index.js.html +40 -28
  121. package/coverage/lcov-report/constants/layouts.js.html +5 -5
  122. package/coverage/lcov-report/constants/screens.js.html +4 -4
  123. package/coverage/lcov-report/db/client.js.html +18 -18
  124. package/coverage/lcov-report/db/inMemoryView.js.html +7 -7
  125. package/coverage/lcov-report/db/index.html +15 -15
  126. package/coverage/lcov-report/db/index.js.html +3 -3
  127. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +21 -21
  128. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  129. package/coverage/lcov-report/db/linkedRows/index.js.html +36 -36
  130. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +30 -30
  131. package/coverage/lcov-report/db/newid.js.html +4 -4
  132. package/coverage/lcov-report/db/utils.js.html +123 -87
  133. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  134. package/coverage/lcov-report/events/index.html +1 -1
  135. package/coverage/lcov-report/events/index.js.html +8 -8
  136. package/coverage/lcov-report/events/utils.js.html +18 -18
  137. package/coverage/lcov-report/index.html +89 -74
  138. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  139. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  140. package/coverage/lcov-report/middleware/appInfo.js.html +5 -5
  141. package/coverage/lcov-report/middleware/authorized.js.html +29 -29
  142. package/coverage/lcov-report/middleware/builder.js.html +16 -16
  143. package/coverage/lcov-report/middleware/currentapp.js.html +44 -44
  144. package/coverage/lcov-report/middleware/index.html +1 -1
  145. package/coverage/lcov-report/middleware/joi-validator.js.html +14 -14
  146. package/coverage/lcov-report/middleware/resourceId.js.html +29 -29
  147. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  148. package/coverage/lcov-report/middleware/usageQuota.js.html +17 -17
  149. package/coverage/lcov-report/middleware/utils.js.html +4 -4
  150. package/coverage/lcov-report/threads/automation.js.html +1 -1
  151. package/coverage/lcov-report/threads/index.html +19 -19
  152. package/coverage/lcov-report/threads/index.js.html +10 -10
  153. package/coverage/lcov-report/threads/query.js.html +123 -39
  154. package/coverage/lcov-report/threads/utils.js.html +14 -14
  155. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  156. package/coverage/lcov-report/utilities/budibaseDir.js.html +7 -7
  157. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  158. package/coverage/lcov-report/utilities/csvParser.js.html +6 -6
  159. package/coverage/lcov-report/utilities/global.js.html +28 -28
  160. package/coverage/lcov-report/utilities/index.html +18 -18
  161. package/coverage/lcov-report/utilities/index.js.html +24 -24
  162. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +9 -9
  163. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  164. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  165. package/coverage/lcov-report/utilities/routing/index.js.html +6 -6
  166. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  167. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +60 -60
  168. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +13 -13
  169. package/coverage/lcov-report/utilities/scriptRunner.js.html +5 -5
  170. package/coverage/lcov-report/utilities/security.js.html +8 -8
  171. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  172. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  173. package/coverage/lcov-report/utilities/usageQuota/index.js.html +12 -12
  174. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +8 -8
  175. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  176. package/coverage/lcov-report/utilities/users.js.html +5 -5
  177. package/coverage/lcov-report/utilities/workerRequests.js.html +200 -53
  178. package/coverage/lcov.info +3323 -3224
  179. package/dist/api/controllers/application.js +1 -0
  180. package/dist/api/controllers/public/applications.js +94 -0
  181. package/dist/api/controllers/public/mapping/applications.js +29 -0
  182. package/dist/api/controllers/public/mapping/index.js +11 -0
  183. package/dist/api/controllers/public/mapping/queries.js +36 -0
  184. package/dist/api/controllers/public/mapping/rows.js +24 -0
  185. package/dist/api/controllers/public/mapping/tables.js +23 -0
  186. package/dist/api/controllers/public/mapping/types.js +2 -0
  187. package/dist/api/controllers/public/mapping/users.js +29 -0
  188. package/dist/api/controllers/public/queries.js +38 -0
  189. package/dist/api/controllers/public/rows.js +97 -0
  190. package/dist/api/controllers/public/tables.js +75 -0
  191. package/dist/api/controllers/public/users.js +95 -0
  192. package/dist/api/controllers/public/utils.js +49 -0
  193. package/dist/api/controllers/row/internal.js +4 -1
  194. package/dist/api/controllers/table/index.js +2 -1
  195. package/dist/api/controllers/webhook.js +3 -5
  196. package/dist/api/index.js +3 -1
  197. package/dist/api/routes/automation.js +3 -31
  198. package/dist/api/routes/datasource.js +3 -50
  199. package/dist/api/routes/index.js +2 -0
  200. package/dist/api/routes/permission.js +4 -14
  201. package/dist/api/routes/public/applications.js +141 -0
  202. package/dist/api/routes/public/index.js +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/googlesheets.js +3 -0
  224. package/dist/integrations/microsoftSqlServer.js +35 -29
  225. package/dist/integrations/mysql.js +3 -0
  226. package/dist/integrations/oracle.js +14 -19
  227. package/dist/integrations/postgres.js +34 -28
  228. package/dist/package.json +11 -7
  229. package/dist/tests/utilities/TestConfiguration.js +25 -8
  230. package/dist/threads/query.js +33 -8
  231. package/dist/tsconfig.tsbuildinfo +1 -1
  232. package/dist/utilities/workerRequests.js +50 -15
  233. package/package.json +12 -8
  234. package/scripts/integrations/oracle/oracle.md +2 -2
  235. package/scripts/integrations/postgres/init.sql +5 -3
  236. package/scripts/likeCypress.ts +9 -6
  237. package/specs/generate.js +83 -0
  238. package/specs/openapi.json +2222 -0
  239. package/specs/openapi.yaml +1530 -0
  240. package/specs/parameters.js +59 -0
  241. package/specs/resources/application.js +101 -0
  242. package/specs/resources/index.js +24 -0
  243. package/specs/resources/misc.js +12 -0
  244. package/specs/resources/query.js +189 -0
  245. package/specs/resources/row.js +125 -0
  246. package/specs/resources/table.js +191 -0
  247. package/specs/resources/user.js +126 -0
  248. package/specs/resources/utils/Resource.js +26 -0
  249. package/specs/resources/utils/index.js +11 -0
  250. package/specs/security.js +7 -0
  251. package/src/api/controllers/application.js +1 -0
  252. package/src/api/controllers/public/applications.ts +74 -0
  253. package/src/api/controllers/public/mapping/applications.ts +32 -0
  254. package/src/api/controllers/public/mapping/index.ts +13 -0
  255. package/src/api/controllers/public/mapping/queries.ts +39 -0
  256. package/src/api/controllers/public/mapping/rows.ts +31 -0
  257. package/src/api/controllers/public/mapping/tables.ts +26 -0
  258. package/src/api/controllers/public/mapping/types.ts +13 -0
  259. package/src/api/controllers/public/mapping/users.ts +32 -0
  260. package/src/api/controllers/public/queries.ts +20 -0
  261. package/src/api/controllers/public/rows.ts +77 -0
  262. package/src/api/controllers/public/tables.ts +56 -0
  263. package/src/api/controllers/public/users.ts +82 -0
  264. package/src/api/controllers/public/utils.ts +38 -0
  265. package/src/api/controllers/row/ExternalRequest.ts +1 -1
  266. package/src/api/controllers/row/internal.js +4 -0
  267. package/src/api/controllers/table/index.js +2 -1
  268. package/src/api/controllers/webhook.js +3 -6
  269. package/src/api/index.js +4 -1
  270. package/src/api/routes/automation.js +3 -33
  271. package/src/api/routes/datasource.js +6 -52
  272. package/src/api/routes/index.js +2 -0
  273. package/src/api/routes/permission.js +4 -18
  274. package/src/api/routes/public/applications.ts +156 -0
  275. package/src/api/routes/public/index.ts +118 -0
  276. package/src/api/routes/public/middleware/mapper.ts +81 -0
  277. package/src/api/routes/public/queries.ts +81 -0
  278. package/src/api/routes/public/rows.ts +242 -0
  279. package/src/api/routes/public/tables.ts +169 -0
  280. package/src/api/routes/public/tests/compare.spec.js +184 -0
  281. package/src/api/routes/public/users.ts +144 -0
  282. package/src/api/routes/public/utils/Endpoint.ts +51 -0
  283. package/src/api/routes/role.js +3 -24
  284. package/src/api/routes/row.js +3 -2
  285. package/src/api/routes/screen.js +2 -29
  286. package/src/api/routes/table.js +4 -19
  287. package/src/api/routes/tests/utilities/index.js +24 -0
  288. package/src/api/routes/utils/validators.js +219 -0
  289. package/src/api/routes/webhook.js +2 -18
  290. package/src/automations/steps/filter.js +3 -2
  291. package/src/automations/steps/queryRows.js +1 -1
  292. package/src/automations/utils.js +2 -2
  293. package/src/constants/index.js +4 -0
  294. package/src/db/utils.js +12 -0
  295. package/src/definitions/common.ts +4 -0
  296. package/src/definitions/openapi.ts +943 -0
  297. package/src/environment.js +1 -0
  298. package/src/integrations/base/datasourcePlus.ts +3 -0
  299. package/src/integrations/googlesheets.ts +5 -2
  300. package/src/integrations/microsoftSqlServer.ts +38 -33
  301. package/src/integrations/mysql.ts +4 -0
  302. package/src/integrations/oracle.ts +27 -35
  303. package/src/integrations/postgres.ts +33 -26
  304. package/src/tests/utilities/TestConfiguration.js +23 -2
  305. package/src/threads/query.js +37 -9
  306. package/src/utilities/workerRequests.js +65 -16
  307. package/builder/assets/index.f28c5d54.js +0 -1352
  308. package/scripts/proxy/generateProxyConfig.js +0 -70
@@ -0,0 +1,184 @@
1
+ const jestOpenAPI = require("jest-openapi").default
2
+ const generateSchema = require("../../../../../specs/generate")
3
+ const setup = require("../../tests/utilities")
4
+ const { checkSlashesInUrl } = require("../../../../utilities")
5
+
6
+ const yamlPath = generateSchema()
7
+ jestOpenAPI(yamlPath)
8
+
9
+ let request = setup.getRequest()
10
+ let config = setup.getConfig()
11
+ let apiKey, table, app
12
+
13
+ beforeAll(async () => {
14
+ app = await config.init()
15
+ table = await config.updateTable()
16
+ apiKey = await config.generateApiKey()
17
+ })
18
+
19
+ afterAll(setup.afterAll)
20
+
21
+ async function makeRequest(method, endpoint, body, appId = config.getAppId()) {
22
+ const extraHeaders = {
23
+ "x-budibase-api-key": apiKey,
24
+ }
25
+ if (appId) {
26
+ extraHeaders["x-budibase-app-id"] = appId
27
+ }
28
+ const req = request
29
+ [method](checkSlashesInUrl(`/api/public/v1/${endpoint}`))
30
+ .set(config.defaultHeaders(extraHeaders))
31
+ if (body) {
32
+ req.send(body)
33
+ }
34
+ const res = await req.expect("Content-Type", /json/).expect(200)
35
+ expect(res.body).toBeDefined()
36
+ return res
37
+ }
38
+
39
+ describe("check the applications endpoints", () => {
40
+ it("should allow retrieving applications through search", async () => {
41
+ const res = await makeRequest("post", "/applications/search")
42
+ expect(res).toSatisfyApiSpec()
43
+ })
44
+
45
+ it("should allow creating an application", async () => {
46
+ const res = await makeRequest("post", "/applications", {
47
+ name: "new App"
48
+ }, null)
49
+ expect(res).toSatisfyApiSpec()
50
+ })
51
+
52
+ it("should allow updating an application", async () => {
53
+ const app = config.getApp()
54
+ const appId = config.getAppId()
55
+ const res = await makeRequest("put", `/applications/${appId}`, {
56
+ ...app,
57
+ name: "updated app name",
58
+ }, appId)
59
+ expect(res).toSatisfyApiSpec()
60
+ })
61
+
62
+ it("should allow retrieving an application", async () => {
63
+ const res = await makeRequest("get", `/applications/${config.getAppId()}`)
64
+ expect(res).toSatisfyApiSpec()
65
+ })
66
+
67
+ it("should allow deleting an application", async () => {
68
+ const res = await makeRequest("delete", `/applications/${config.getAppId()}`)
69
+ expect(res).toSatisfyApiSpec()
70
+ })
71
+ })
72
+
73
+ describe("check the tables endpoints", () => {
74
+ it("should allow retrieving tables through search", async () => {
75
+ await config.createApp("new app 1")
76
+ table = await config.updateTable()
77
+ const res = await makeRequest("post", "/tables/search")
78
+ expect(res).toSatisfyApiSpec()
79
+ })
80
+
81
+ it("should allow creating a table", async () => {
82
+ const res = await makeRequest("post", "/tables", {
83
+ name: "table name",
84
+ primaryDisplay: "column1",
85
+ schema: {
86
+ column1: {
87
+ type: "string",
88
+ constraints: {},
89
+ }
90
+ }
91
+ })
92
+ expect(res).toSatisfyApiSpec()
93
+ })
94
+
95
+ it("should allow updating a table", async () => {
96
+ const updated = { ...table, _rev: undefined, name: "new name" }
97
+ const res = await makeRequest("put", `/tables/${table._id}`, updated)
98
+ expect(res).toSatisfyApiSpec()
99
+ })
100
+
101
+ it("should allow retrieving a table", async () => {
102
+ const res = await makeRequest("get", `/tables/${table._id}`)
103
+ expect(res).toSatisfyApiSpec()
104
+ })
105
+
106
+ it("should allow deleting a table", async () => {
107
+ const res = await makeRequest("delete", `/tables/${table._id}`)
108
+ expect(res).toSatisfyApiSpec()
109
+ })
110
+ })
111
+
112
+ describe("check the rows endpoints", () => {
113
+ let row
114
+ it("should allow retrieving rows through search", async () => {
115
+ table = await config.updateTable()
116
+ const res = await makeRequest("post", `/tables/${table._id}/rows/search`, {
117
+ query: {
118
+ },
119
+ })
120
+ expect(res).toSatisfyApiSpec()
121
+ })
122
+
123
+ it("should allow creating a row", async () => {
124
+ const res = await makeRequest("post", `/tables/${table._id}/rows`, {
125
+ name: "test row",
126
+ })
127
+ expect(res).toSatisfyApiSpec()
128
+ row = res.body.data
129
+ })
130
+
131
+ it("should allow updating a row", async () => {
132
+ const res = await makeRequest("put", `/tables/${table._id}/rows/${row._id}`, {
133
+ name: "test row updated",
134
+ })
135
+ expect(res).toSatisfyApiSpec()
136
+ })
137
+
138
+ it("should allow retrieving a row", async () => {
139
+ const res = await makeRequest("get", `/tables/${table._id}/rows/${row._id}`)
140
+ expect(res).toSatisfyApiSpec()
141
+ })
142
+
143
+ it("should allow deleting a row", async () => {
144
+ const res = await makeRequest("delete", `/tables/${table._id}/rows/${row._id}`)
145
+ expect(res).toSatisfyApiSpec()
146
+ })
147
+ })
148
+
149
+ describe("check the users endpoints", () => {
150
+ let user
151
+ it("should allow retrieving users through search", async () => {
152
+ user = await config.createUser()
153
+ const res = await makeRequest("post", "/users/search")
154
+ expect(res).toSatisfyApiSpec()
155
+ })
156
+
157
+ it("should allow creating a user", async () => {
158
+ const res = await makeRequest("post", "/users")
159
+ expect(res).toSatisfyApiSpec()
160
+ })
161
+
162
+ it("should allow updating a user", async () => {
163
+ const res = await makeRequest("put", `/users/${user._id}`)
164
+ expect(res).toSatisfyApiSpec()
165
+ })
166
+
167
+ it("should allow retrieving a user", async () => {
168
+ const res = await makeRequest("get", `/users/${user._id}`)
169
+ expect(res).toSatisfyApiSpec()
170
+ })
171
+
172
+ it("should allow deleting a user", async () => {
173
+ const res = await makeRequest("delete", `/users/${user._id}`)
174
+ expect(res).toSatisfyApiSpec()
175
+ })
176
+ })
177
+
178
+ describe("check the queries endpoints", () => {
179
+ it("should allow retrieving queries through search", async () => {
180
+ const res = await makeRequest("post", "/queries/search")
181
+ expect(res).toSatisfyApiSpec()
182
+ })
183
+ })
184
+
@@ -0,0 +1,144 @@
1
+ import controller from "../../controllers/public/users"
2
+ import Endpoint from "./utils/Endpoint"
3
+ import { nameValidator } from "../utils/validators"
4
+
5
+ const read = [],
6
+ write = []
7
+
8
+ /**
9
+ * @openapi
10
+ * /users:
11
+ * post:
12
+ * summary: Create a user
13
+ * tags:
14
+ * - users
15
+ * requestBody:
16
+ * required: true
17
+ * content:
18
+ * application/json:
19
+ * schema:
20
+ * $ref: '#/components/schemas/user'
21
+ * responses:
22
+ * 200:
23
+ * description: Returns the created user.
24
+ * content:
25
+ * application/json:
26
+ * schema:
27
+ * $ref: '#/components/schemas/userOutput'
28
+ * examples:
29
+ * user:
30
+ * $ref: '#/components/examples/user'
31
+ */
32
+ write.push(new Endpoint("post", "/users", controller.create))
33
+
34
+ /**
35
+ * @openapi
36
+ * /users/{userId}:
37
+ * put:
38
+ * summary: Update a user
39
+ * tags:
40
+ * - users
41
+ * parameters:
42
+ * - $ref: '#/components/parameters/userId'
43
+ * requestBody:
44
+ * required: true
45
+ * content:
46
+ * application/json:
47
+ * schema:
48
+ * $ref: '#/components/schemas/user'
49
+ * responses:
50
+ * 200:
51
+ * description: Returns the updated user.
52
+ * content:
53
+ * application/json:
54
+ * schema:
55
+ * $ref: '#/components/schemas/userOutput'
56
+ * examples:
57
+ * user:
58
+ * $ref: '#/components/examples/user'
59
+ */
60
+ write.push(new Endpoint("put", "/users/:userId", controller.update))
61
+
62
+ /**
63
+ * @openapi
64
+ * /users/{userId}:
65
+ * delete:
66
+ * summary: Delete a user
67
+ * tags:
68
+ * - users
69
+ * parameters:
70
+ * - $ref: '#/components/parameters/userId'
71
+ * responses:
72
+ * 200:
73
+ * description: Returns the deleted user.
74
+ * content:
75
+ * application/json:
76
+ * schema:
77
+ * $ref: '#/components/schemas/userOutput'
78
+ * examples:
79
+ * user:
80
+ * $ref: '#/components/examples/user'
81
+ */
82
+ write.push(new Endpoint("delete", "/users/:userId", controller.destroy))
83
+
84
+ /**
85
+ * @openapi
86
+ * /users/{userId}:
87
+ * get:
88
+ * summary: Retrieve a user
89
+ * tags:
90
+ * - users
91
+ * parameters:
92
+ * - $ref: '#/components/parameters/userId'
93
+ * responses:
94
+ * 200:
95
+ * description: Returns the retrieved user.
96
+ * content:
97
+ * application/json:
98
+ * schema:
99
+ * $ref: '#/components/schemas/userOutput'
100
+ * examples:
101
+ * user:
102
+ * $ref: '#/components/examples/user'
103
+ */
104
+ read.push(new Endpoint("get", "/users/:userId", controller.read))
105
+
106
+ /**
107
+ * @openapi
108
+ * /users/search:
109
+ * post:
110
+ * summary: Search for users
111
+ * description: Based on user properties (currently only name) search for users.
112
+ * tags:
113
+ * - users
114
+ * requestBody:
115
+ * required: true
116
+ * content:
117
+ * application/json:
118
+ * schema:
119
+ * $ref: '#/components/schemas/nameSearch'
120
+ * responses:
121
+ * 200:
122
+ * description: Returns the found users based on search parameters.
123
+ * content:
124
+ * application/json:
125
+ * schema:
126
+ * type: object
127
+ * required:
128
+ * - data
129
+ * properties:
130
+ * data:
131
+ * type: array
132
+ * items:
133
+ * $ref: '#/components/schemas/user'
134
+ * examples:
135
+ * users:
136
+ * $ref: '#/components/examples/users'
137
+ */
138
+ read.push(
139
+ new Endpoint("post", "/users/search", controller.search).addMiddleware(
140
+ nameValidator()
141
+ )
142
+ )
143
+
144
+ export default { read, write }
@@ -0,0 +1,51 @@
1
+ import Router from "koa-router"
2
+
3
+ export type CtxFn = (ctx: any, next?: any) => void | Promise<any>
4
+
5
+ class Endpoint {
6
+ method: string
7
+ url: string
8
+ controller: CtxFn
9
+ middlewares: CtxFn[]
10
+ outputMiddlewares: CtxFn[]
11
+
12
+ constructor(method: string, url: string, controller: CtxFn) {
13
+ this.method = method
14
+ this.url = url
15
+ this.controller = controller
16
+ this.middlewares = []
17
+ this.outputMiddlewares = []
18
+ }
19
+
20
+ addMiddleware(middleware: CtxFn) {
21
+ this.middlewares.push(middleware)
22
+ return this
23
+ }
24
+
25
+ addOutputMiddleware(middleware: CtxFn) {
26
+ this.outputMiddlewares.push(middleware)
27
+ return this
28
+ }
29
+
30
+ apply(router: Router) {
31
+ const method = this.method,
32
+ url = this.url
33
+ const middlewares = this.middlewares,
34
+ controller = this.controller,
35
+ outputMiddlewares = this.outputMiddlewares
36
+ // need a function to do nothing to stop the execution at the end
37
+ // middlewares are circular so if they always keep calling next, it'll just keep looping
38
+ const complete = () => {}
39
+ const params = [
40
+ url,
41
+ ...middlewares,
42
+ controller,
43
+ ...outputMiddlewares,
44
+ complete,
45
+ ]
46
+ // @ts-ignore
47
+ router[method](...params)
48
+ }
49
+ }
50
+
51
+ export default Endpoint
@@ -1,34 +1,13 @@
1
1
  const Router = require("@koa/router")
2
2
  const controller = require("../controllers/role")
3
3
  const authorized = require("../../middleware/authorized")
4
- const Joi = require("joi")
5
- const joiValidator = require("../../middleware/joi-validator")
6
- const {
7
- BUILTIN_PERMISSION_IDS,
8
- BUILDER,
9
- PermissionLevels,
10
- } = require("@budibase/backend-core/permissions")
4
+ const { BUILDER } = require("@budibase/backend-core/permissions")
5
+ const { roleValidator } = require("./utils/validators")
11
6
 
12
7
  const router = Router()
13
8
 
14
- function generateValidator() {
15
- const permLevelArray = Object.values(PermissionLevels)
16
- // prettier-ignore
17
- return joiValidator.body(Joi.object({
18
- _id: Joi.string().optional(),
19
- _rev: Joi.string().optional(),
20
- name: Joi.string().required(),
21
- // this is the base permission ID (for now a built in)
22
- permissionId: Joi.string().valid(...Object.values(BUILTIN_PERMISSION_IDS)).required(),
23
- permissions: Joi.object()
24
- .pattern(/.*/, [Joi.string().valid(...permLevelArray)])
25
- .optional(),
26
- inherits: Joi.string().optional(),
27
- }).unknown(true))
28
- }
29
-
30
9
  router
31
- .post("/api/roles", authorized(BUILDER), generateValidator(), controller.save)
10
+ .post("/api/roles", authorized(BUILDER), roleValidator(), controller.save)
32
11
  .get("/api/roles", authorized(BUILDER), controller.fetch)
33
12
  .get("/api/roles/:roleId", authorized(BUILDER), controller.find)
34
13
  .delete("/api/roles/:roleId/:rev", authorized(BUILDER), controller.destroy)
@@ -10,6 +10,7 @@ const {
10
10
  PermissionLevels,
11
11
  PermissionTypes,
12
12
  } = require("@budibase/backend-core/permissions")
13
+ const { internalSearchValidator } = require("./utils/validators")
13
14
 
14
15
  const router = Router()
15
16
 
@@ -119,8 +120,6 @@ router
119
120
  * "notEqual": {},
120
121
  * "empty": {},
121
122
  * "notEmpty": {},
122
- * "contains": {},
123
- * "notContains": {}
124
123
  * "oneOf": {
125
124
  * "columnName": ["value"]
126
125
  * }
@@ -140,6 +139,7 @@ router
140
139
  */
141
140
  .post(
142
141
  "/api/:tableId/search",
142
+ internalSearchValidator(),
143
143
  paramResource("tableId"),
144
144
  authorized(PermissionTypes.TABLE, PermissionLevels.READ),
145
145
  rowController.search
@@ -195,6 +195,7 @@ router
195
195
  "/api/:tableId/rows",
196
196
  paramResource("tableId"),
197
197
  authorized(PermissionTypes.TABLE, PermissionLevels.WRITE),
198
+ usage,
198
199
  rowController.patch
199
200
  )
200
201
  /**
@@ -2,40 +2,13 @@ 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 joiValidator = require("../../middleware/joi-validator")
6
- const Joi = require("joi")
5
+ const { screenValidator } = require("./utils/validators")
7
6
 
8
7
  const router = Router()
9
8
 
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
-
31
9
  router
32
10
  .get("/api/screens", authorized(BUILDER), controller.fetch)
33
- .post(
34
- "/api/screens",
35
- authorized(BUILDER),
36
- generateSaveValidation(),
37
- controller.save
38
- )
11
+ .post("/api/screens", authorized(BUILDER), screenValidator(), controller.save)
39
12
  .delete(
40
13
  "/api/screens/:screenId/:screenRev",
41
14
  authorized(BUILDER),
@@ -7,25 +7,10 @@ const {
7
7
  PermissionLevels,
8
8
  PermissionTypes,
9
9
  } = require("@budibase/backend-core/permissions")
10
- const joiValidator = require("../../middleware/joi-validator")
11
- const Joi = require("joi")
10
+ const { tableValidator } = require("./utils/validators")
12
11
 
13
12
  const router = Router()
14
13
 
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
-
29
14
  router
30
15
  /**
31
16
  * @api {get} /api/tables Fetch all tables
@@ -53,8 +38,8 @@ router
53
38
  * @apiSuccess {object[]} body The response body will be the table that was found.
54
39
  */
55
40
  .get(
56
- "/api/tables/:id",
57
- paramResource("id"),
41
+ "/api/tables/:tableId",
42
+ paramResource("tableId"),
58
43
  authorized(PermissionTypes.TABLE, PermissionLevels.READ),
59
44
  tableController.find
60
45
  )
@@ -136,7 +121,7 @@ router
136
121
  // allows control over updating a table
137
122
  bodyResource("_id"),
138
123
  authorized(BUILDER),
139
- generateSaveValidator(),
124
+ tableValidator(),
140
125
  tableController.save
141
126
  )
142
127
  /**
@@ -2,6 +2,18 @@ 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
+
5
17
  jest.mock("../../../../utilities/workerRequests", () => ({
6
18
  getGlobalUsers: jest.fn(() => {
7
19
  return {
@@ -13,6 +25,18 @@ jest.mock("../../../../utilities/workerRequests", () => ({
13
25
  _id: "us_uuid1",
14
26
  }
15
27
  }),
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
+ }),
16
40
  removeAppFromUserRoles: jest.fn(),
17
41
  }))
18
42