@budibase/server 1.0.80 → 1.0.81-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 (322) hide show
  1. package/__mocks__/node-fetch.ts +1 -0
  2. package/builder/assets/{index.c8d1e8f0.css → index.8b1dc06c.css} +2 -2
  3. package/builder/assets/index.e4d4c510.js +1291 -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 +2531 -2440
  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 +86 -23
  30. package/coverage/lcov-report/api/controllers/row/index.html +46 -46
  31. package/coverage/lcov-report/api/controllers/row/index.js.html +76 -49
  32. package/coverage/lcov-report/api/controllers/row/internal.js.html +144 -84
  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 +62 -20
  40. package/coverage/lcov-report/api/controllers/table/index.html +20 -20
  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 +80 -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 +91 -76
  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 +3555 -3411
  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/external.js +18 -0
  194. package/dist/api/controllers/row/index.js +11 -0
  195. package/dist/api/controllers/row/internal.js +15 -1
  196. package/dist/api/controllers/table/external.js +8 -2
  197. package/dist/api/controllers/table/index.js +2 -1
  198. package/dist/api/controllers/webhook.js +3 -5
  199. package/dist/api/index.js +3 -1
  200. package/dist/api/routes/automation.js +3 -31
  201. package/dist/api/routes/datasource.js +3 -50
  202. package/dist/api/routes/index.js +2 -0
  203. package/dist/api/routes/permission.js +4 -14
  204. package/dist/api/routes/public/applications.js +141 -0
  205. package/dist/api/routes/public/index.js +101 -0
  206. package/dist/api/routes/public/middleware/mapper.js +94 -0
  207. package/dist/api/routes/public/queries.js +77 -0
  208. package/dist/api/routes/public/rows.js +229 -0
  209. package/dist/api/routes/public/tables.js +154 -0
  210. package/dist/api/routes/public/users.js +137 -0
  211. package/dist/api/routes/public/utils/Endpoint.js +36 -0
  212. package/dist/api/routes/role.js +3 -19
  213. package/dist/api/routes/row.js +18 -5
  214. package/dist/api/routes/screen.js +2 -23
  215. package/dist/api/routes/table.js +3 -17
  216. package/dist/api/routes/tests/utilities/index.js +23 -0
  217. package/dist/api/routes/utils/validators.js +200 -0
  218. package/dist/api/routes/webhook.js +2 -17
  219. package/dist/automations/steps/filter.js +2 -2
  220. package/dist/automations/steps/queryRows.js +1 -1
  221. package/dist/automations/utils.js +2 -2
  222. package/dist/constants/index.js +3 -0
  223. package/dist/db/utils.js +11 -0
  224. package/dist/definitions/openapi.js +6 -0
  225. package/dist/environment.js +1 -0
  226. package/dist/integrations/base/sql.js +16 -1
  227. package/dist/integrations/base/sqlTable.js +21 -9
  228. package/dist/integrations/googlesheets.js +3 -0
  229. package/dist/integrations/microsoftSqlServer.js +60 -43
  230. package/dist/integrations/mysql.js +3 -0
  231. package/dist/integrations/oracle.js +14 -19
  232. package/dist/integrations/postgres.js +34 -28
  233. package/dist/integrations/utils.js +32 -15
  234. package/dist/package.json +11 -7
  235. package/dist/tests/utilities/TestConfiguration.js +25 -8
  236. package/dist/threads/query.js +33 -8
  237. package/dist/tsconfig.tsbuildinfo +1 -1
  238. package/dist/utilities/workerRequests.js +50 -15
  239. package/package.json +12 -8
  240. package/scripts/integrations/mssql/data/setup.sql +18 -1
  241. package/scripts/integrations/oracle/oracle.md +2 -2
  242. package/scripts/integrations/postgres/init.sql +11 -3
  243. package/scripts/likeCypress.ts +9 -6
  244. package/specs/generate.js +94 -0
  245. package/specs/openapi.json +2232 -0
  246. package/specs/openapi.yaml +1538 -0
  247. package/specs/parameters.js +59 -0
  248. package/specs/resources/application.js +101 -0
  249. package/specs/resources/index.js +24 -0
  250. package/specs/resources/misc.js +12 -0
  251. package/specs/resources/query.js +189 -0
  252. package/specs/resources/row.js +125 -0
  253. package/specs/resources/table.js +191 -0
  254. package/specs/resources/user.js +126 -0
  255. package/specs/resources/utils/Resource.js +26 -0
  256. package/specs/resources/utils/index.js +11 -0
  257. package/specs/security.js +7 -0
  258. package/src/api/controllers/application.js +1 -0
  259. package/src/api/controllers/public/applications.ts +74 -0
  260. package/src/api/controllers/public/mapping/applications.ts +32 -0
  261. package/src/api/controllers/public/mapping/index.ts +13 -0
  262. package/src/api/controllers/public/mapping/queries.ts +39 -0
  263. package/src/api/controllers/public/mapping/rows.ts +31 -0
  264. package/src/api/controllers/public/mapping/tables.ts +26 -0
  265. package/src/api/controllers/public/mapping/types.ts +13 -0
  266. package/src/api/controllers/public/mapping/users.ts +32 -0
  267. package/src/api/controllers/public/queries.ts +20 -0
  268. package/src/api/controllers/public/rows.ts +77 -0
  269. package/src/api/controllers/public/tables.ts +56 -0
  270. package/src/api/controllers/public/users.ts +82 -0
  271. package/src/api/controllers/public/utils.ts +38 -0
  272. package/src/api/controllers/row/ExternalRequest.ts +1 -1
  273. package/src/api/controllers/row/external.js +21 -0
  274. package/src/api/controllers/row/index.js +9 -0
  275. package/src/api/controllers/row/internal.js +20 -0
  276. package/src/api/controllers/table/external.js +16 -2
  277. package/src/api/controllers/table/index.js +2 -1
  278. package/src/api/controllers/webhook.js +3 -6
  279. package/src/api/index.js +4 -1
  280. package/src/api/routes/automation.js +3 -33
  281. package/src/api/routes/datasource.js +6 -52
  282. package/src/api/routes/index.js +2 -0
  283. package/src/api/routes/permission.js +4 -18
  284. package/src/api/routes/public/applications.ts +156 -0
  285. package/src/api/routes/public/index.ts +118 -0
  286. package/src/api/routes/public/middleware/mapper.ts +81 -0
  287. package/src/api/routes/public/queries.ts +81 -0
  288. package/src/api/routes/public/rows.ts +242 -0
  289. package/src/api/routes/public/tables.ts +169 -0
  290. package/src/api/routes/public/tests/compare.spec.js +184 -0
  291. package/src/api/routes/public/users.ts +144 -0
  292. package/src/api/routes/public/utils/Endpoint.ts +51 -0
  293. package/src/api/routes/role.js +3 -24
  294. package/src/api/routes/row.js +24 -2
  295. package/src/api/routes/screen.js +2 -29
  296. package/src/api/routes/table.js +4 -19
  297. package/src/api/routes/tests/utilities/index.js +24 -0
  298. package/src/api/routes/utils/validators.js +219 -0
  299. package/src/api/routes/webhook.js +2 -18
  300. package/src/automations/steps/filter.js +3 -2
  301. package/src/automations/steps/queryRows.js +1 -1
  302. package/src/automations/utils.js +2 -2
  303. package/src/constants/index.js +4 -0
  304. package/src/db/utils.js +12 -0
  305. package/src/definitions/common.ts +4 -0
  306. package/src/definitions/datasource.ts +7 -0
  307. package/src/definitions/openapi.ts +943 -0
  308. package/src/environment.js +1 -0
  309. package/src/integrations/base/datasourcePlus.ts +3 -0
  310. package/src/integrations/base/sql.ts +16 -1
  311. package/src/integrations/base/sqlTable.ts +35 -13
  312. package/src/integrations/googlesheets.ts +5 -2
  313. package/src/integrations/microsoftSqlServer.ts +86 -61
  314. package/src/integrations/mysql.ts +4 -0
  315. package/src/integrations/oracle.ts +27 -35
  316. package/src/integrations/postgres.ts +33 -26
  317. package/src/integrations/utils.ts +43 -15
  318. package/src/tests/utilities/TestConfiguration.js +23 -2
  319. package/src/threads/query.js +37 -9
  320. package/src/utilities/workerRequests.js +65 -16
  321. package/builder/assets/index.22a39cc9.js +0 -1352
  322. package/scripts/proxy/generateProxyConfig.js +0 -70
@@ -20,7 +20,7 @@ var __rest = (this && this.__rest) || function (s, e) {
20
20
  return t;
21
21
  };
22
22
  const linkRows = require("../../../db/linkedRows");
23
- const { generateRowID, getRowParams, DocumentTypes, InternalTables, } = require("../../../db/utils");
23
+ const { generateRowID, getRowParams, getTableIDFromRowID, DocumentTypes, InternalTables, } = require("../../../db/utils");
24
24
  const userController = require("../user");
25
25
  const { inputProcessing, outputProcessing, cleanupAttachments, } = require("../../../utilities/rowProcessor");
26
26
  const { FieldTypes } = require("../../../constants");
@@ -336,6 +336,17 @@ exports.validate = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
336
336
  row: ctx.request.body,
337
337
  });
338
338
  });
339
+ exports.exportRows = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
340
+ const db = getAppDB();
341
+ const table = yield db.get(ctx.params.tableId);
342
+ const rowIds = ctx.request.body.rows;
343
+ let response = (yield db.allDocs({
344
+ include_docs: true,
345
+ keys: rowIds,
346
+ })).rows.map(row => row.doc);
347
+ let rows = yield outputProcessing(table, response);
348
+ return rows;
349
+ });
339
350
  exports.fetchEnrichedRow = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
340
351
  const db = getAppDB();
341
352
  const tableId = ctx.params.tableId;
@@ -358,6 +369,9 @@ exports.fetchEnrichedRow = (ctx) => __awaiter(void 0, void 0, void 0, function*
358
369
  // group responses by table
359
370
  let groups = {}, tables = {};
360
371
  for (let row of response) {
372
+ if (!row.tableId) {
373
+ row.tableId = getTableIDFromRowID(row._id);
374
+ }
361
375
  const linkedTableId = row.tableId;
362
376
  if (groups[linkedTableId] == null) {
363
377
  groups[linkedTableId] = [row];
@@ -16,7 +16,7 @@ const { cloneDeep } = require("lodash/fp");
16
16
  const csvParser = require("../../../utilities/csvParser");
17
17
  const { handleRequest } = require("../row/external");
18
18
  const { getAppDB } = require("@budibase/backend-core/context");
19
- function makeTableRequest(datasource, operation, table, tables, oldTable = null) {
19
+ function makeTableRequest(datasource, operation, table, tables, oldTable = null, renamed = null) {
20
20
  return __awaiter(this, void 0, void 0, function* () {
21
21
  const json = {
22
22
  endpoint: {
@@ -32,6 +32,9 @@ function makeTableRequest(datasource, operation, table, tables, oldTable = null)
32
32
  if (oldTable) {
33
33
  json.meta.table = oldTable;
34
34
  }
35
+ if (renamed) {
36
+ json.meta.renamed = renamed;
37
+ }
35
38
  return makeExternalQuery(datasource, json);
36
39
  });
37
40
  }
@@ -135,6 +138,7 @@ function isRelationshipSetup(column) {
135
138
  exports.save = function (ctx) {
136
139
  return __awaiter(this, void 0, void 0, function* () {
137
140
  const table = ctx.request.body;
141
+ const { _rename: renamed } = table;
138
142
  // can't do this right now
139
143
  delete table.dataImport;
140
144
  const datasourceId = getDatasourceId(ctx.request.body);
@@ -193,7 +197,7 @@ exports.save = function (ctx) {
193
197
  const operation = oldTable
194
198
  ? DataSourceOperation.UPDATE_TABLE
195
199
  : DataSourceOperation.CREATE_TABLE;
196
- yield makeTableRequest(datasource, operation, tableToSave, tables, oldTable);
200
+ yield makeTableRequest(datasource, operation, tableToSave, tables, oldTable, renamed);
197
201
  // update any extra tables (like foreign keys in other tables)
198
202
  for (let extraTable of extraTablesToUpdate) {
199
203
  const oldExtraTable = oldTables[extraTable.name];
@@ -206,6 +210,8 @@ exports.save = function (ctx) {
206
210
  if (Array.isArray(tableToSave.constrained)) {
207
211
  tableToSave.constrained = tableToSave.constrained.filter(constraint => Object.keys(tableToSave.schema).includes(constraint));
208
212
  }
213
+ // remove the rename prop
214
+ delete tableToSave._rename;
209
215
  // store it into couch now for budibase reference
210
216
  datasource.entities[tableToSave.name] = tableToSave;
211
217
  yield db.put(datasource);
@@ -49,7 +49,7 @@ exports.fetch = function (ctx) {
49
49
  };
50
50
  exports.find = function (ctx) {
51
51
  return __awaiter(this, void 0, void 0, function* () {
52
- const tableId = ctx.params.id;
52
+ const tableId = ctx.params.tableId;
53
53
  ctx.body = yield getTable(tableId);
54
54
  });
55
55
  };
@@ -73,6 +73,7 @@ exports.destroy = function (ctx) {
73
73
  ctx.eventEmitter &&
74
74
  ctx.eventEmitter.emitTable(`table:delete`, appId, deletedTable);
75
75
  ctx.status = 200;
76
+ ctx.table = deletedTable;
76
77
  ctx.body = { message: `Table ${tableId} deleted.` };
77
78
  });
78
79
  };
@@ -11,6 +11,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
11
11
  const { generateWebhookID, getWebhookParams } = require("../../db/utils");
12
12
  const toJsonSchema = require("to-json-schema");
13
13
  const validate = require("jsonschema").validate;
14
+ const { WebhookType } = require("../../constants");
14
15
  const triggers = require("../../automations/triggers");
15
16
  const { getProdAppID } = require("@budibase/backend-core/db");
16
17
  const { getAppDB, updateAppId } = require("@budibase/backend-core/context");
@@ -24,9 +25,6 @@ function Webhook(name, type, target) {
24
25
  };
25
26
  }
26
27
  exports.Webhook = Webhook;
27
- exports.WebhookType = {
28
- AUTOMATION: "automation",
29
- };
30
28
  exports.fetch = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
31
29
  const db = getAppDB();
32
30
  const response = yield db.allDocs(getWebhookParams(null, {
@@ -62,7 +60,7 @@ exports.buildSchema = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
62
60
  const webhook = yield db.get(ctx.params.id);
63
61
  webhook.bodySchema = toJsonSchema(ctx.request.body);
64
62
  // update the automation outputs
65
- if (webhook.action.type === exports.WebhookType.AUTOMATION) {
63
+ if (webhook.action.type === WebhookType.AUTOMATION) {
66
64
  let automation = yield db.get(webhook.action.target);
67
65
  const autoOutputs = automation.definition.trigger.schema.outputs;
68
66
  let properties = webhook.bodySchema.properties;
@@ -91,7 +89,7 @@ exports.trigger = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
91
89
  validate(ctx.request.body, webhook.bodySchema);
92
90
  }
93
91
  const target = yield db.get(webhook.action.target);
94
- if (webhook.action.type === exports.WebhookType.AUTOMATION) {
92
+ if (webhook.action.type === WebhookType.AUTOMATION) {
95
93
  // trigger with both the pure request and then expand it
96
94
  // incase the user has produced a schema to bind to
97
95
  yield triggers.externalTrigger(target, Object.assign(Object.assign({ body: ctx.request.body }, ctx.request.body), { appId: prodAppId }));
package/dist/api/index.js CHANGED
@@ -13,7 +13,7 @@ const { buildAuthMiddleware, auditLog, buildTenancyMiddleware, buildAppTenancyMi
13
13
  const currentApp = require("../middleware/currentapp");
14
14
  const compress = require("koa-compress");
15
15
  const zlib = require("zlib");
16
- const { mainRoutes, staticRoutes } = require("./routes");
16
+ const { mainRoutes, staticRoutes, publicRoutes } = require("./routes");
17
17
  const pkg = require("../../package.json");
18
18
  const env = require("../environment");
19
19
  const router = new Router();
@@ -76,6 +76,8 @@ for (let route of mainRoutes) {
76
76
  router.use(route.routes());
77
77
  router.use(route.allowedMethods());
78
78
  }
79
+ router.use(publicRoutes.routes());
80
+ router.use(publicRoutes.allowedMethods());
79
81
  // WARNING - static routes will catch everything else after them this must be last
80
82
  router.use(staticRoutes.routes());
81
83
  router.use(staticRoutes.allowedMethods());
@@ -2,47 +2,19 @@
2
2
  const Router = require("@koa/router");
3
3
  const controller = require("../controllers/automation");
4
4
  const authorized = require("../../middleware/authorized");
5
- const joiValidator = require("../../middleware/joi-validator");
6
5
  const { BUILDER, PermissionLevels, PermissionTypes, } = require("@budibase/backend-core/permissions");
7
- const Joi = require("joi");
8
6
  const { bodyResource, paramResource } = require("../../middleware/resourceId");
9
7
  const { middleware: appInfoMiddleware, AppType, } = require("../../middleware/appInfo");
8
+ const { automationValidator } = require("./utils/validators");
10
9
  const router = Router();
11
- // prettier-ignore
12
- function generateStepSchema(allowStepTypes) {
13
- return Joi.object({
14
- stepId: Joi.string().required(),
15
- id: Joi.string().required(),
16
- description: Joi.string().required(),
17
- name: Joi.string().required(),
18
- tagline: Joi.string().required(),
19
- icon: Joi.string().required(),
20
- params: Joi.object(),
21
- args: Joi.object(),
22
- type: Joi.string().required().valid(...allowStepTypes),
23
- }).unknown(true);
24
- }
25
- function generateValidator(existing = false) {
26
- // prettier-ignore
27
- return joiValidator.body(Joi.object({
28
- _id: existing ? Joi.string().required() : Joi.string(),
29
- _rev: existing ? Joi.string().required() : Joi.string(),
30
- name: Joi.string().required(),
31
- type: Joi.string().valid("automation").required(),
32
- definition: Joi.object({
33
- steps: Joi.array().required().items(generateStepSchema(["ACTION", "LOGIC"])),
34
- trigger: generateStepSchema(["TRIGGER"]).allow(null),
35
- }).required().unknown(true),
36
- }).unknown(true));
37
- }
38
10
  router
39
11
  .get("/api/automations/trigger/list", authorized(BUILDER), controller.getTriggerList)
40
12
  .get("/api/automations/action/list", authorized(BUILDER), controller.getActionList)
41
13
  .get("/api/automations/definitions/list", authorized(BUILDER), controller.getDefinitionList)
42
14
  .get("/api/automations", authorized(BUILDER), controller.fetch)
43
15
  .get("/api/automations/:id", paramResource("id"), authorized(BUILDER), controller.find)
44
- .put("/api/automations", bodyResource("_id"), authorized(BUILDER), generateValidator(true), controller.update)
45
- .post("/api/automations", authorized(BUILDER), generateValidator(false), controller.create)
16
+ .put("/api/automations", bodyResource("_id"), authorized(BUILDER), automationValidator(true), controller.update)
17
+ .post("/api/automations", authorized(BUILDER), automationValidator(false), controller.create)
46
18
  .delete("/api/automations/:id/:rev", paramResource("id"), authorized(BUILDER), controller.destroy)
47
19
  .post("/api/automations/:id/trigger", appInfoMiddleware({ appType: AppType.PROD }), paramResource("id"), authorized(PermissionTypes.AUTOMATION, PermissionLevels.EXECUTE), controller.trigger)
48
20
  .post("/api/automations/:id/test", appInfoMiddleware({ appType: AppType.DEV }), paramResource("id"), authorized(PermissionTypes.AUTOMATION, PermissionLevels.EXECUTE), controller.test);
@@ -2,62 +2,15 @@
2
2
  const Router = require("@koa/router");
3
3
  const datasourceController = require("../controllers/datasource");
4
4
  const authorized = require("../../middleware/authorized");
5
- const joiValidator = require("../../middleware/joi-validator");
6
5
  const { BUILDER, PermissionLevels, PermissionTypes, } = require("@budibase/backend-core/permissions");
7
- const Joi = require("joi");
8
- const { DataSourceOperation } = require("../../constants");
6
+ const { datasourceValidator, datasourceQueryValidator, } = require("./utils/validators");
9
7
  const router = Router();
10
- function generateDatasourceSchema() {
11
- // prettier-ignore
12
- return joiValidator.body(Joi.object({
13
- _id: Joi.string(),
14
- _rev: Joi.string(),
15
- // source: Joi.string().valid("POSTGRES_PLUS"),
16
- type: Joi.string().allow("datasource_plus"),
17
- relationships: Joi.array().items(Joi.object({
18
- from: Joi.string().required(),
19
- to: Joi.string().required(),
20
- cardinality: Joi.valid("1:N", "1:1", "N:N").required()
21
- })),
22
- // entities: Joi.array().items(Joi.object({
23
- // type: Joi.string().valid(...Object.values(FieldTypes)).required(),
24
- // name: Joi.string().required(),
25
- // })),
26
- }).unknown(true));
27
- }
28
- function generateQueryDatasourceSchema() {
29
- // prettier-ignore
30
- return joiValidator.body(Joi.object({
31
- endpoint: Joi.object({
32
- datasourceId: Joi.string().required(),
33
- operation: Joi.string().required().valid(...Object.values(DataSourceOperation)),
34
- entityId: Joi.string().required(),
35
- }).required(),
36
- resource: Joi.object({
37
- fields: Joi.array().items(Joi.string()).optional(),
38
- }).optional(),
39
- body: Joi.object().optional(),
40
- sort: Joi.object().optional(),
41
- filters: Joi.object({
42
- string: Joi.object().optional(),
43
- range: Joi.object().optional(),
44
- equal: Joi.object().optional(),
45
- notEqual: Joi.object().optional(),
46
- empty: Joi.object().optional(),
47
- notEmpty: Joi.object().optional(),
48
- }).optional(),
49
- paginate: Joi.object({
50
- page: Joi.string().alphanum().optional(),
51
- limit: Joi.number().optional(),
52
- }).optional(),
53
- }));
54
- }
55
8
  router
56
9
  .get("/api/datasources", authorized(BUILDER), datasourceController.fetch)
57
10
  .get("/api/datasources/:datasourceId", authorized(PermissionTypes.TABLE, PermissionLevels.READ), datasourceController.find)
58
11
  .put("/api/datasources/:datasourceId", authorized(PermissionTypes.TABLE, PermissionLevels.READ), datasourceController.update)
59
- .post("/api/datasources/query", authorized(PermissionTypes.TABLE, PermissionLevels.READ), generateQueryDatasourceSchema(), datasourceController.query)
12
+ .post("/api/datasources/query", authorized(PermissionTypes.TABLE, PermissionLevels.READ), datasourceQueryValidator(), datasourceController.query)
60
13
  .post("/api/datasources/:datasourceId/schema", authorized(BUILDER), datasourceController.buildSchemaFromDb)
61
- .post("/api/datasources", authorized(BUILDER), generateDatasourceSchema(), datasourceController.save)
14
+ .post("/api/datasources", authorized(BUILDER), datasourceValidator(), datasourceController.save)
62
15
  .delete("/api/datasources/:datasourceId/:revId", authorized(BUILDER), datasourceController.destroy);
63
16
  module.exports = router;
@@ -26,6 +26,7 @@ const metadataRoutes = require("./metadata");
26
26
  const devRoutes = require("./dev");
27
27
  const cloudRoutes = require("./cloud");
28
28
  const migrationRoutes = require("./migrations");
29
+ const publicRoutes = require("./public");
29
30
  exports.mainRoutes = [
30
31
  authRoutes,
31
32
  deployRoutes,
@@ -56,4 +57,5 @@ exports.mainRoutes = [
56
57
  rowRoutes,
57
58
  migrationRoutes,
58
59
  ];
60
+ exports.publicRoutes = publicRoutes;
59
61
  exports.staticRoutes = staticRoutes;
@@ -2,26 +2,16 @@
2
2
  const Router = require("@koa/router");
3
3
  const controller = require("../controllers/permission");
4
4
  const authorized = require("../../middleware/authorized");
5
- const { BUILDER, PermissionLevels, } = require("@budibase/backend-core/permissions");
6
- const Joi = require("joi");
7
- const joiValidator = require("../../middleware/joi-validator");
5
+ const { BUILDER } = require("@budibase/backend-core/permissions");
6
+ const { permissionValidator } = require("./utils/validators");
8
7
  const router = Router();
9
- function generateValidator() {
10
- const permLevelArray = Object.values(PermissionLevels);
11
- // prettier-ignore
12
- return joiValidator.params(Joi.object({
13
- level: Joi.string().valid(...permLevelArray).required(),
14
- resourceId: Joi.string(),
15
- roleId: Joi.string(),
16
- }).unknown(true));
17
- }
18
8
  router
19
9
  .get("/api/permission/builtin", authorized(BUILDER), controller.fetchBuiltin)
20
10
  .get("/api/permission/levels", authorized(BUILDER), controller.fetchLevels)
21
11
  .get("/api/permission", authorized(BUILDER), controller.fetch)
22
12
  .get("/api/permission/:resourceId", authorized(BUILDER), controller.getResourcePerms)
23
13
  // adding a specific role/level for the resource overrides the underlying access control
24
- .post("/api/permission/:roleId/:resourceId/:level", authorized(BUILDER), generateValidator(), controller.addPermission)
14
+ .post("/api/permission/:roleId/:resourceId/:level", authorized(BUILDER), permissionValidator(), controller.addPermission)
25
15
  // deleting the level defaults it back the underlying access control for the resource
26
- .delete("/api/permission/:roleId/:resourceId/:level", authorized(BUILDER), generateValidator(), controller.removePermission);
16
+ .delete("/api/permission/:roleId/:resourceId/:level", authorized(BUILDER), permissionValidator(), controller.removePermission);
27
17
  module.exports = router;
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const applications_1 = __importDefault(require("../../controllers/public/applications"));
7
+ const Endpoint_1 = __importDefault(require("./utils/Endpoint"));
8
+ const { nameValidator, applicationValidator } = require("../utils/validators");
9
+ const read = [], write = [];
10
+ /**
11
+ * @openapi
12
+ * /applications:
13
+ * post:
14
+ * summary: Create an application
15
+ * tags:
16
+ * - applications
17
+ * parameters:
18
+ * - $ref: '#/components/parameters/appId'
19
+ * requestBody:
20
+ * required: true
21
+ * content:
22
+ * application/json:
23
+ * schema:
24
+ * $ref: '#/components/schemas/application'
25
+ * responses:
26
+ * 200:
27
+ * description: Returns the created application.
28
+ * content:
29
+ * application/json:
30
+ * schema:
31
+ * $ref: '#/components/schemas/applicationOutput'
32
+ * examples:
33
+ * application:
34
+ * $ref: '#/components/examples/application'
35
+ */
36
+ write.push(new Endpoint_1.default("post", "/applications", applications_1.default.create).addMiddleware(applicationValidator()));
37
+ /**
38
+ * @openapi
39
+ * /applications/{appId}:
40
+ * put:
41
+ * summary: Update an application
42
+ * tags:
43
+ * - applications
44
+ * parameters:
45
+ * - $ref: '#/components/parameters/appIdUrl'
46
+ * requestBody:
47
+ * required: true
48
+ * content:
49
+ * application/json:
50
+ * schema:
51
+ * $ref: '#/components/schemas/application'
52
+ * responses:
53
+ * 200:
54
+ * description: Returns the updated application.
55
+ * content:
56
+ * application/json:
57
+ * schema:
58
+ * $ref: '#/components/schemas/applicationOutput'
59
+ * examples:
60
+ * application:
61
+ * $ref: '#/components/examples/application'
62
+ */
63
+ write.push(new Endpoint_1.default("put", "/applications/:appId", applications_1.default.update).addMiddleware(applicationValidator()));
64
+ /**
65
+ * @openapi
66
+ * /applications/{appId}:
67
+ * delete:
68
+ * summary: Delete an application
69
+ * tags:
70
+ * - applications
71
+ * parameters:
72
+ * - $ref: '#/components/parameters/appIdUrl'
73
+ * responses:
74
+ * 200:
75
+ * description: Returns the deleted application.
76
+ * content:
77
+ * application/json:
78
+ * schema:
79
+ * $ref: '#/components/schemas/applicationOutput'
80
+ * examples:
81
+ * application:
82
+ * $ref: '#/components/examples/application'
83
+ */
84
+ write.push(new Endpoint_1.default("delete", "/applications/:appId", applications_1.default.destroy));
85
+ /**
86
+ * @openapi
87
+ * /applications/{appId}:
88
+ * get:
89
+ * summary: Retrieve an application
90
+ * tags:
91
+ * - applications
92
+ * parameters:
93
+ * - $ref: '#/components/parameters/appIdUrl'
94
+ * responses:
95
+ * 200:
96
+ * description: Returns the retrieved application.
97
+ * content:
98
+ * application/json:
99
+ * schema:
100
+ * $ref: '#/components/schemas/applicationOutput'
101
+ * examples:
102
+ * application:
103
+ * $ref: '#/components/examples/application'
104
+ */
105
+ read.push(new Endpoint_1.default("get", "/applications/:appId", applications_1.default.read));
106
+ /**
107
+ * @openapi
108
+ * /applications/search:
109
+ * post:
110
+ * summary: Search for applications
111
+ * description: Based on application properties (currently only name) search for applications.
112
+ * tags:
113
+ * - applications
114
+ * parameters:
115
+ * - $ref: '#/components/parameters/appId'
116
+ * requestBody:
117
+ * required: true
118
+ * content:
119
+ * application/json:
120
+ * schema:
121
+ * $ref: '#/components/schemas/nameSearch'
122
+ * responses:
123
+ * 200:
124
+ * description: Returns the applications that were found based on the search parameters.
125
+ * content:
126
+ * application/json:
127
+ * schema:
128
+ * type: object
129
+ * required:
130
+ * - data
131
+ * properties:
132
+ * data:
133
+ * type: array
134
+ * items:
135
+ * $ref: '#/components/schemas/application'
136
+ * examples:
137
+ * applications:
138
+ * $ref: '#/components/examples/applications'
139
+ */
140
+ read.push(new Endpoint_1.default("post", "/applications/search", applications_1.default.search).addMiddleware(nameValidator()));
141
+ exports.default = { read, write };
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const applications_1 = __importDefault(require("./applications"));
7
+ const queries_1 = __importDefault(require("./queries"));
8
+ const tables_1 = __importDefault(require("./tables"));
9
+ const rows_1 = __importDefault(require("./rows"));
10
+ const users_1 = __importDefault(require("./users"));
11
+ const usageQuota_1 = __importDefault(require("../../../middleware/usageQuota"));
12
+ const authorized_1 = __importDefault(require("../../../middleware/authorized"));
13
+ const resourceId_1 = require("../../../middleware/resourceId");
14
+ const mapper_1 = __importDefault(require("./middleware/mapper"));
15
+ const environment_1 = __importDefault(require("../../../environment"));
16
+ // below imports don't have declaration files
17
+ const Router = require("@koa/router");
18
+ const { RateLimit, Stores } = require("koa2-ratelimit");
19
+ const { PermissionLevels, PermissionTypes, } = require("@budibase/backend-core/permissions");
20
+ const { getRedisOptions } = require("@budibase/backend-core/redis").utils;
21
+ const PREFIX = "/api/public/v1";
22
+ // allow a lot more requests when in test
23
+ const DEFAULT_API_REQ_LIMIT_PER_SEC = environment_1.default.isTest() ? 100 : 10;
24
+ function getApiLimitPerSecond() {
25
+ if (!environment_1.default.API_REQ_LIMIT_PER_SEC) {
26
+ return DEFAULT_API_REQ_LIMIT_PER_SEC;
27
+ }
28
+ return parseInt(environment_1.default.API_REQ_LIMIT_PER_SEC);
29
+ }
30
+ if (!environment_1.default.isTest()) {
31
+ const REDIS_OPTS = getRedisOptions();
32
+ RateLimit.defaultOptions({
33
+ store: new Stores.Redis({
34
+ // @ts-ignore
35
+ socket: {
36
+ host: REDIS_OPTS.host,
37
+ port: REDIS_OPTS.port,
38
+ },
39
+ password: REDIS_OPTS.opts.password,
40
+ database: 1,
41
+ }),
42
+ });
43
+ }
44
+ // rate limiting, allows for 2 requests per second
45
+ const limiter = RateLimit.middleware({
46
+ interval: { sec: 1 },
47
+ // per ip, per interval
48
+ max: getApiLimitPerSecond(),
49
+ });
50
+ const publicRouter = new Router({
51
+ prefix: PREFIX,
52
+ });
53
+ publicRouter.use(limiter);
54
+ function addMiddleware(endpoints, middleware, opts = { output: false }) {
55
+ if (!endpoints) {
56
+ return;
57
+ }
58
+ if (!Array.isArray(endpoints)) {
59
+ endpoints = [endpoints];
60
+ }
61
+ for (let endpoint of endpoints) {
62
+ if (opts === null || opts === void 0 ? void 0 : opts.output) {
63
+ endpoint.addOutputMiddleware(middleware);
64
+ }
65
+ else {
66
+ endpoint.addMiddleware(middleware);
67
+ }
68
+ }
69
+ }
70
+ function addToRouter(endpoints) {
71
+ if (endpoints) {
72
+ for (let endpoint of endpoints) {
73
+ endpoint.apply(publicRouter);
74
+ }
75
+ }
76
+ }
77
+ function applyRoutes(endpoints, permType, resource, subResource) {
78
+ const paramMiddleware = subResource
79
+ ? resourceId_1.paramSubResource(resource, subResource)
80
+ : resourceId_1.paramResource(resource);
81
+ // add the parameter capture middleware
82
+ addMiddleware(endpoints.read, paramMiddleware);
83
+ addMiddleware(endpoints.write, paramMiddleware);
84
+ // add the authorization middleware, using the correct perm type
85
+ addMiddleware(endpoints.read, authorized_1.default(permType, PermissionLevels.READ));
86
+ addMiddleware(endpoints.write, authorized_1.default(permType, PermissionLevels.WRITE));
87
+ // add the usage quota middleware
88
+ addMiddleware(endpoints.write, usageQuota_1.default);
89
+ // add the output mapper middleware
90
+ addMiddleware(endpoints.read, mapper_1.default, { output: true });
91
+ addMiddleware(endpoints.write, mapper_1.default, { output: true });
92
+ addToRouter(endpoints.read);
93
+ addToRouter(endpoints.write);
94
+ }
95
+ applyRoutes(applications_1.default, PermissionTypes.APP, "appId");
96
+ applyRoutes(tables_1.default, PermissionTypes.TABLE, "tableId");
97
+ applyRoutes(users_1.default, PermissionTypes.USER, "userId");
98
+ applyRoutes(queries_1.default, PermissionTypes.QUERY, "queryId");
99
+ // needs to be applied last for routing purposes, don't override other endpoints
100
+ applyRoutes(rows_1.default, PermissionTypes.TABLE, "tableId", "rowId");
101
+ module.exports = publicRouter;
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const mapping_1 = __importDefault(require("../../../controllers/public/mapping"));
16
+ var Resources;
17
+ (function (Resources) {
18
+ Resources["APPLICATION"] = "applications";
19
+ Resources["TABLES"] = "tables";
20
+ Resources["ROWS"] = "rows";
21
+ Resources["USERS"] = "users";
22
+ Resources["QUERIES"] = "queries";
23
+ Resources["SEARCH"] = "search";
24
+ })(Resources || (Resources = {}));
25
+ function isArrayResponse(ctx) {
26
+ return ctx.url.endsWith(Resources.SEARCH) || Array.isArray(ctx.body);
27
+ }
28
+ function processApplications(ctx) {
29
+ if (isArrayResponse(ctx)) {
30
+ return mapping_1.default.mapApplications(ctx);
31
+ }
32
+ else {
33
+ return mapping_1.default.mapApplication(ctx);
34
+ }
35
+ }
36
+ function processTables(ctx) {
37
+ if (isArrayResponse(ctx)) {
38
+ return mapping_1.default.mapTables(ctx);
39
+ }
40
+ else {
41
+ return mapping_1.default.mapTable(ctx);
42
+ }
43
+ }
44
+ function processRows(ctx) {
45
+ if (isArrayResponse(ctx)) {
46
+ return mapping_1.default.mapRowSearch(ctx);
47
+ }
48
+ else {
49
+ return mapping_1.default.mapRow(ctx);
50
+ }
51
+ }
52
+ function processUsers(ctx) {
53
+ if (isArrayResponse(ctx)) {
54
+ return mapping_1.default.mapUsers(ctx);
55
+ }
56
+ else {
57
+ return mapping_1.default.mapUser(ctx);
58
+ }
59
+ }
60
+ function processQueries(ctx) {
61
+ if (isArrayResponse(ctx)) {
62
+ return mapping_1.default.mapQueries(ctx);
63
+ }
64
+ else {
65
+ return mapping_1.default.mapQueryExecution(ctx);
66
+ }
67
+ }
68
+ exports.default = (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
69
+ let urlParts = ctx.url.split("/");
70
+ urlParts = urlParts.slice(4, urlParts.length);
71
+ let body = {};
72
+ switch (urlParts[0]) {
73
+ case Resources.APPLICATION:
74
+ body = processApplications(ctx);
75
+ break;
76
+ case Resources.TABLES:
77
+ if (urlParts[2] === Resources.ROWS) {
78
+ body = processRows(ctx);
79
+ }
80
+ else {
81
+ body = processTables(ctx);
82
+ }
83
+ break;
84
+ case Resources.USERS:
85
+ body = processUsers(ctx);
86
+ break;
87
+ case Resources.QUERIES:
88
+ body = processQueries(ctx);
89
+ break;
90
+ }
91
+ // update the body based on what has occurred in the mapper
92
+ ctx.body = body;
93
+ yield next();
94
+ });