@budibase/server 1.0.80 → 1.0.81-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 (322) hide show
  1. package/__mocks__/node-fetch.ts +1 -0
  2. package/builder/assets/index.57958259.js +1290 -0
  3. package/builder/assets/{index.c8d1e8f0.css → index.dd19c61c.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 +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
@@ -0,0 +1,38 @@
1
+ const { getAppDB } = require("@budibase/backend-core/context")
2
+ import { isExternalTable } from "../../../integrations/utils"
3
+
4
+ export async function addRev(
5
+ body: { _id?: string; _rev?: string },
6
+ tableId?: string
7
+ ) {
8
+ if (!body._id || (tableId && isExternalTable(tableId))) {
9
+ return body
10
+ }
11
+ const db = getAppDB()
12
+ const dbDoc = await db.get(body._id)
13
+ body._rev = dbDoc._rev
14
+ return body
15
+ }
16
+
17
+ /**
18
+ * Performs a case insensitive search on the provided documents, using the
19
+ * provided key and value. This will be a string based search, using the
20
+ * startsWith function.
21
+ */
22
+ export function search(docs: any[], value: any, key = "name") {
23
+ if (!value || typeof value !== "string") {
24
+ return docs
25
+ }
26
+ value = value.toLowerCase()
27
+ const filtered = []
28
+ for (let doc of docs) {
29
+ if (typeof doc[key] !== "string") {
30
+ continue
31
+ }
32
+ const toTest = doc[key].toLowerCase()
33
+ if (toTest.startsWith(value)) {
34
+ filtered.push(doc)
35
+ }
36
+ }
37
+ return filtered
38
+ }
@@ -58,7 +58,7 @@ module External {
58
58
  ) {
59
59
  const primary = table.primary
60
60
  // if passed in array need to copy for shifting etc
61
- let idCopy = cloneDeep(id)
61
+ let idCopy: undefined | string | any[] = cloneDeep(id)
62
62
  if (filters) {
63
63
  // need to map over the filters and make sure the _id field isn't present
64
64
  for (let filter of Object.values(filters)) {
@@ -152,6 +152,27 @@ exports.validate = async () => {
152
152
  return { valid: true }
153
153
  }
154
154
 
155
+ exports.exportRows = async ctx => {
156
+ const { datasourceId, tableName } = breakExternalTableId(ctx.params.tableId)
157
+ const db = getAppDB()
158
+ const datasource = await db.get(datasourceId)
159
+ if (!datasource || !datasource.entities) {
160
+ ctx.throw(400, "Datasource has not been configured for plus API.")
161
+ }
162
+ const tables = datasource.entities
163
+ const table = tables[tableName]
164
+ ctx.request.body = {
165
+ query: {
166
+ oneOf: {
167
+ [table.primaryDisplay]: ctx.request.body.map(
168
+ id => breakRowIdField(id)[0]
169
+ ),
170
+ },
171
+ },
172
+ }
173
+ return exports.search(ctx)
174
+ }
175
+
155
176
  exports.fetchEnrichedRow = async ctx => {
156
177
  const id = ctx.params.rowId
157
178
  const tableId = ctx.params.tableId
@@ -137,3 +137,12 @@ exports.fetchEnrichedRow = async function (ctx) {
137
137
  ctx.throw(400, err)
138
138
  }
139
139
  }
140
+
141
+ exports.export = async function (ctx) {
142
+ const tableId = getTableId(ctx)
143
+ try {
144
+ ctx.body = await pickApi(tableId).exportRows(ctx)
145
+ } catch (err) {
146
+ ctx.throw(400, err)
147
+ }
148
+ }
@@ -2,6 +2,7 @@ const linkRows = require("../../../db/linkedRows")
2
2
  const {
3
3
  generateRowID,
4
4
  getRowParams,
5
+ getTableIDFromRowID,
5
6
  DocumentTypes,
6
7
  InternalTables,
7
8
  } = require("../../../db/utils")
@@ -361,6 +362,22 @@ exports.validate = async ctx => {
361
362
  })
362
363
  }
363
364
 
365
+ exports.exportRows = async ctx => {
366
+ const db = getAppDB()
367
+ const table = await db.get(ctx.params.tableId)
368
+ const rowIds = ctx.request.body.rows
369
+ let response = (
370
+ await db.allDocs({
371
+ include_docs: true,
372
+ keys: rowIds,
373
+ })
374
+ ).rows.map(row => row.doc)
375
+
376
+ let rows = await outputProcessing(table, response)
377
+
378
+ return rows
379
+ }
380
+
364
381
  exports.fetchEnrichedRow = async ctx => {
365
382
  const db = getAppDB()
366
383
  const tableId = ctx.params.tableId
@@ -386,6 +403,9 @@ exports.fetchEnrichedRow = async ctx => {
386
403
  let groups = {},
387
404
  tables = {}
388
405
  for (let row of response) {
406
+ if (!row.tableId) {
407
+ row.tableId = getTableIDFromRowID(row._id)
408
+ }
389
409
  const linkedTableId = row.tableId
390
410
  if (groups[linkedTableId] == null) {
391
411
  groups[linkedTableId] = [row]
@@ -25,7 +25,8 @@ async function makeTableRequest(
25
25
  operation,
26
26
  table,
27
27
  tables,
28
- oldTable = null
28
+ oldTable = null,
29
+ renamed = null
29
30
  ) {
30
31
  const json = {
31
32
  endpoint: {
@@ -41,6 +42,9 @@ async function makeTableRequest(
41
42
  if (oldTable) {
42
43
  json.meta.table = oldTable
43
44
  }
45
+ if (renamed) {
46
+ json.meta.renamed = renamed
47
+ }
44
48
  return makeExternalQuery(datasource, json)
45
49
  }
46
50
 
@@ -160,6 +164,7 @@ function isRelationshipSetup(column) {
160
164
 
161
165
  exports.save = async function (ctx) {
162
166
  const table = ctx.request.body
167
+ const { _rename: renamed } = table
163
168
  // can't do this right now
164
169
  delete table.dataImport
165
170
  const datasourceId = getDatasourceId(ctx.request.body)
@@ -241,7 +246,14 @@ exports.save = async function (ctx) {
241
246
  const operation = oldTable
242
247
  ? DataSourceOperation.UPDATE_TABLE
243
248
  : DataSourceOperation.CREATE_TABLE
244
- await makeTableRequest(datasource, operation, tableToSave, tables, oldTable)
249
+ await makeTableRequest(
250
+ datasource,
251
+ operation,
252
+ tableToSave,
253
+ tables,
254
+ oldTable,
255
+ renamed
256
+ )
245
257
  // update any extra tables (like foreign keys in other tables)
246
258
  for (let extraTable of extraTablesToUpdate) {
247
259
  const oldExtraTable = oldTables[extraTable.name]
@@ -258,6 +270,8 @@ exports.save = async function (ctx) {
258
270
  )
259
271
  }
260
272
 
273
+ // remove the rename prop
274
+ delete tableToSave._rename
261
275
  // store it into couch now for budibase reference
262
276
  datasource.entities[tableToSave.name] = tableToSave
263
277
  await db.put(datasource)
@@ -48,7 +48,7 @@ exports.fetch = async function (ctx) {
48
48
  }
49
49
 
50
50
  exports.find = async function (ctx) {
51
- const tableId = ctx.params.id
51
+ const tableId = ctx.params.tableId
52
52
  ctx.body = await getTable(tableId)
53
53
  }
54
54
 
@@ -70,6 +70,7 @@ exports.destroy = async function (ctx) {
70
70
  ctx.eventEmitter &&
71
71
  ctx.eventEmitter.emitTable(`table:delete`, appId, deletedTable)
72
72
  ctx.status = 200
73
+ ctx.table = deletedTable
73
74
  ctx.body = { message: `Table ${tableId} deleted.` }
74
75
  }
75
76
 
@@ -1,6 +1,7 @@
1
1
  const { generateWebhookID, getWebhookParams } = require("../../db/utils")
2
2
  const toJsonSchema = require("to-json-schema")
3
3
  const validate = require("jsonschema").validate
4
+ const { WebhookType } = require("../../constants")
4
5
  const triggers = require("../../automations/triggers")
5
6
  const { getProdAppID } = require("@budibase/backend-core/db")
6
7
  const { getAppDB, updateAppId } = require("@budibase/backend-core/context")
@@ -18,10 +19,6 @@ function Webhook(name, type, target) {
18
19
 
19
20
  exports.Webhook = Webhook
20
21
 
21
- exports.WebhookType = {
22
- AUTOMATION: "automation",
23
- }
24
-
25
22
  exports.fetch = async ctx => {
26
23
  const db = getAppDB()
27
24
  const response = await db.allDocs(
@@ -62,7 +59,7 @@ exports.buildSchema = async ctx => {
62
59
  const webhook = await db.get(ctx.params.id)
63
60
  webhook.bodySchema = toJsonSchema(ctx.request.body)
64
61
  // update the automation outputs
65
- if (webhook.action.type === exports.WebhookType.AUTOMATION) {
62
+ if (webhook.action.type === WebhookType.AUTOMATION) {
66
63
  let automation = await db.get(webhook.action.target)
67
64
  const autoOutputs = automation.definition.trigger.schema.outputs
68
65
  let properties = webhook.bodySchema.properties
@@ -92,7 +89,7 @@ exports.trigger = async ctx => {
92
89
  validate(ctx.request.body, webhook.bodySchema)
93
90
  }
94
91
  const target = await db.get(webhook.action.target)
95
- if (webhook.action.type === exports.WebhookType.AUTOMATION) {
92
+ if (webhook.action.type === WebhookType.AUTOMATION) {
96
93
  // trigger with both the pure request and then expand it
97
94
  // incase the user has produced a schema to bind to
98
95
  await triggers.externalTrigger(target, {
package/src/api/index.js CHANGED
@@ -8,7 +8,7 @@ const {
8
8
  const currentApp = require("../middleware/currentapp")
9
9
  const compress = require("koa-compress")
10
10
  const zlib = require("zlib")
11
- const { mainRoutes, staticRoutes } = require("./routes")
11
+ const { mainRoutes, staticRoutes, publicRoutes } = require("./routes")
12
12
  const pkg = require("../../package.json")
13
13
  const env = require("../environment")
14
14
 
@@ -82,6 +82,9 @@ for (let route of mainRoutes) {
82
82
  router.use(route.allowedMethods())
83
83
  }
84
84
 
85
+ router.use(publicRoutes.routes())
86
+ router.use(publicRoutes.allowedMethods())
87
+
85
88
  // WARNING - static routes will catch everything else after them this must be last
86
89
  router.use(staticRoutes.routes())
87
90
  router.use(staticRoutes.allowedMethods())
@@ -1,50 +1,20 @@
1
1
  const Router = require("@koa/router")
2
2
  const controller = require("../controllers/automation")
3
3
  const authorized = require("../../middleware/authorized")
4
- const joiValidator = require("../../middleware/joi-validator")
5
4
  const {
6
5
  BUILDER,
7
6
  PermissionLevels,
8
7
  PermissionTypes,
9
8
  } = require("@budibase/backend-core/permissions")
10
- const Joi = require("joi")
11
9
  const { bodyResource, paramResource } = require("../../middleware/resourceId")
12
10
  const {
13
11
  middleware: appInfoMiddleware,
14
12
  AppType,
15
13
  } = require("../../middleware/appInfo")
14
+ const { automationValidator } = require("./utils/validators")
16
15
 
17
16
  const router = Router()
18
17
 
19
- // prettier-ignore
20
- function generateStepSchema(allowStepTypes) {
21
- return Joi.object({
22
- stepId: Joi.string().required(),
23
- id: Joi.string().required(),
24
- description: Joi.string().required(),
25
- name: Joi.string().required(),
26
- tagline: Joi.string().required(),
27
- icon: Joi.string().required(),
28
- params: Joi.object(),
29
- args: Joi.object(),
30
- type: Joi.string().required().valid(...allowStepTypes),
31
- }).unknown(true)
32
- }
33
-
34
- function generateValidator(existing = false) {
35
- // prettier-ignore
36
- return joiValidator.body(Joi.object({
37
- _id: existing ? Joi.string().required() : Joi.string(),
38
- _rev: existing ? Joi.string().required() : Joi.string(),
39
- name: Joi.string().required(),
40
- type: Joi.string().valid("automation").required(),
41
- definition: Joi.object({
42
- steps: Joi.array().required().items(generateStepSchema(["ACTION", "LOGIC"])),
43
- trigger: generateStepSchema(["TRIGGER"]).allow(null),
44
- }).required().unknown(true),
45
- }).unknown(true))
46
- }
47
-
48
18
  router
49
19
  .get(
50
20
  "/api/automations/trigger/list",
@@ -72,13 +42,13 @@ router
72
42
  "/api/automations",
73
43
  bodyResource("_id"),
74
44
  authorized(BUILDER),
75
- generateValidator(true),
45
+ automationValidator(true),
76
46
  controller.update
77
47
  )
78
48
  .post(
79
49
  "/api/automations",
80
50
  authorized(BUILDER),
81
- generateValidator(false),
51
+ automationValidator(false),
82
52
  controller.create
83
53
  )
84
54
  .delete(
@@ -1,64 +1,18 @@
1
1
  const Router = require("@koa/router")
2
2
  const datasourceController = require("../controllers/datasource")
3
3
  const authorized = require("../../middleware/authorized")
4
- const joiValidator = require("../../middleware/joi-validator")
5
4
  const {
6
5
  BUILDER,
7
6
  PermissionLevels,
8
7
  PermissionTypes,
9
8
  } = require("@budibase/backend-core/permissions")
10
- const Joi = require("joi")
11
- const { DataSourceOperation } = require("../../constants")
9
+ const {
10
+ datasourceValidator,
11
+ datasourceQueryValidator,
12
+ } = require("./utils/validators")
12
13
 
13
14
  const router = Router()
14
15
 
15
- function generateDatasourceSchema() {
16
- // prettier-ignore
17
- return joiValidator.body(Joi.object({
18
- _id: Joi.string(),
19
- _rev: Joi.string(),
20
- // source: Joi.string().valid("POSTGRES_PLUS"),
21
- type: Joi.string().allow("datasource_plus"),
22
- relationships: Joi.array().items(Joi.object({
23
- from: Joi.string().required(),
24
- to: Joi.string().required(),
25
- cardinality: Joi.valid("1:N", "1:1", "N:N").required()
26
- })),
27
- // entities: Joi.array().items(Joi.object({
28
- // type: Joi.string().valid(...Object.values(FieldTypes)).required(),
29
- // name: Joi.string().required(),
30
- // })),
31
- }).unknown(true))
32
- }
33
-
34
- function generateQueryDatasourceSchema() {
35
- // prettier-ignore
36
- return joiValidator.body(Joi.object({
37
- endpoint: Joi.object({
38
- datasourceId: Joi.string().required(),
39
- operation: Joi.string().required().valid(...Object.values(DataSourceOperation)),
40
- entityId: Joi.string().required(),
41
- }).required(),
42
- resource: Joi.object({
43
- fields: Joi.array().items(Joi.string()).optional(),
44
- }).optional(),
45
- body: Joi.object().optional(),
46
- sort: Joi.object().optional(),
47
- filters: Joi.object({
48
- string: Joi.object().optional(),
49
- range: Joi.object().optional(),
50
- equal: Joi.object().optional(),
51
- notEqual: Joi.object().optional(),
52
- empty: Joi.object().optional(),
53
- notEmpty: Joi.object().optional(),
54
- }).optional(),
55
- paginate: Joi.object({
56
- page: Joi.string().alphanum().optional(),
57
- limit: Joi.number().optional(),
58
- }).optional(),
59
- }))
60
- }
61
-
62
16
  router
63
17
  .get("/api/datasources", authorized(BUILDER), datasourceController.fetch)
64
18
  .get(
@@ -74,7 +28,7 @@ router
74
28
  .post(
75
29
  "/api/datasources/query",
76
30
  authorized(PermissionTypes.TABLE, PermissionLevels.READ),
77
- generateQueryDatasourceSchema(),
31
+ datasourceQueryValidator(),
78
32
  datasourceController.query
79
33
  )
80
34
  .post(
@@ -85,7 +39,7 @@ router
85
39
  .post(
86
40
  "/api/datasources",
87
41
  authorized(BUILDER),
88
- generateDatasourceSchema(),
42
+ datasourceValidator(),
89
43
  datasourceController.save
90
44
  )
91
45
  .delete(
@@ -25,6 +25,7 @@ const metadataRoutes = require("./metadata")
25
25
  const devRoutes = require("./dev")
26
26
  const cloudRoutes = require("./cloud")
27
27
  const migrationRoutes = require("./migrations")
28
+ const publicRoutes = require("./public")
28
29
 
29
30
  exports.mainRoutes = [
30
31
  authRoutes,
@@ -57,4 +58,5 @@ exports.mainRoutes = [
57
58
  migrationRoutes,
58
59
  ]
59
60
 
61
+ exports.publicRoutes = publicRoutes
60
62
  exports.staticRoutes = staticRoutes
@@ -1,25 +1,11 @@
1
1
  const Router = require("@koa/router")
2
2
  const controller = require("../controllers/permission")
3
3
  const authorized = require("../../middleware/authorized")
4
- const {
5
- BUILDER,
6
- PermissionLevels,
7
- } = require("@budibase/backend-core/permissions")
8
- const Joi = require("joi")
9
- const joiValidator = require("../../middleware/joi-validator")
4
+ const { BUILDER } = require("@budibase/backend-core/permissions")
5
+ const { permissionValidator } = require("./utils/validators")
10
6
 
11
7
  const router = Router()
12
8
 
13
- function generateValidator() {
14
- const permLevelArray = Object.values(PermissionLevels)
15
- // prettier-ignore
16
- return joiValidator.params(Joi.object({
17
- level: Joi.string().valid(...permLevelArray).required(),
18
- resourceId: Joi.string(),
19
- roleId: Joi.string(),
20
- }).unknown(true))
21
- }
22
-
23
9
  router
24
10
  .get("/api/permission/builtin", authorized(BUILDER), controller.fetchBuiltin)
25
11
  .get("/api/permission/levels", authorized(BUILDER), controller.fetchLevels)
@@ -33,14 +19,14 @@ router
33
19
  .post(
34
20
  "/api/permission/:roleId/:resourceId/:level",
35
21
  authorized(BUILDER),
36
- generateValidator(),
22
+ permissionValidator(),
37
23
  controller.addPermission
38
24
  )
39
25
  // deleting the level defaults it back the underlying access control for the resource
40
26
  .delete(
41
27
  "/api/permission/:roleId/:resourceId/:level",
42
28
  authorized(BUILDER),
43
- generateValidator(),
29
+ permissionValidator(),
44
30
  controller.removePermission
45
31
  )
46
32
 
@@ -0,0 +1,156 @@
1
+ import controller from "../../controllers/public/applications"
2
+ import Endpoint from "./utils/Endpoint"
3
+ const { nameValidator, applicationValidator } = require("../utils/validators")
4
+
5
+ const read = [],
6
+ write = []
7
+
8
+ /**
9
+ * @openapi
10
+ * /applications:
11
+ * post:
12
+ * summary: Create an application
13
+ * tags:
14
+ * - applications
15
+ * parameters:
16
+ * - $ref: '#/components/parameters/appId'
17
+ * requestBody:
18
+ * required: true
19
+ * content:
20
+ * application/json:
21
+ * schema:
22
+ * $ref: '#/components/schemas/application'
23
+ * responses:
24
+ * 200:
25
+ * description: Returns the created application.
26
+ * content:
27
+ * application/json:
28
+ * schema:
29
+ * $ref: '#/components/schemas/applicationOutput'
30
+ * examples:
31
+ * application:
32
+ * $ref: '#/components/examples/application'
33
+ */
34
+ write.push(
35
+ new Endpoint("post", "/applications", controller.create).addMiddleware(
36
+ applicationValidator()
37
+ )
38
+ )
39
+
40
+ /**
41
+ * @openapi
42
+ * /applications/{appId}:
43
+ * put:
44
+ * summary: Update an application
45
+ * tags:
46
+ * - applications
47
+ * parameters:
48
+ * - $ref: '#/components/parameters/appIdUrl'
49
+ * requestBody:
50
+ * required: true
51
+ * content:
52
+ * application/json:
53
+ * schema:
54
+ * $ref: '#/components/schemas/application'
55
+ * responses:
56
+ * 200:
57
+ * description: Returns the updated application.
58
+ * content:
59
+ * application/json:
60
+ * schema:
61
+ * $ref: '#/components/schemas/applicationOutput'
62
+ * examples:
63
+ * application:
64
+ * $ref: '#/components/examples/application'
65
+ */
66
+ write.push(
67
+ new Endpoint("put", "/applications/:appId", controller.update).addMiddleware(
68
+ applicationValidator()
69
+ )
70
+ )
71
+
72
+ /**
73
+ * @openapi
74
+ * /applications/{appId}:
75
+ * delete:
76
+ * summary: Delete an application
77
+ * tags:
78
+ * - applications
79
+ * parameters:
80
+ * - $ref: '#/components/parameters/appIdUrl'
81
+ * responses:
82
+ * 200:
83
+ * description: Returns the deleted application.
84
+ * content:
85
+ * application/json:
86
+ * schema:
87
+ * $ref: '#/components/schemas/applicationOutput'
88
+ * examples:
89
+ * application:
90
+ * $ref: '#/components/examples/application'
91
+ */
92
+ write.push(new Endpoint("delete", "/applications/:appId", controller.destroy))
93
+
94
+ /**
95
+ * @openapi
96
+ * /applications/{appId}:
97
+ * get:
98
+ * summary: Retrieve an application
99
+ * tags:
100
+ * - applications
101
+ * parameters:
102
+ * - $ref: '#/components/parameters/appIdUrl'
103
+ * responses:
104
+ * 200:
105
+ * description: Returns the retrieved application.
106
+ * content:
107
+ * application/json:
108
+ * schema:
109
+ * $ref: '#/components/schemas/applicationOutput'
110
+ * examples:
111
+ * application:
112
+ * $ref: '#/components/examples/application'
113
+ */
114
+ read.push(new Endpoint("get", "/applications/:appId", controller.read))
115
+
116
+ /**
117
+ * @openapi
118
+ * /applications/search:
119
+ * post:
120
+ * summary: Search for applications
121
+ * description: Based on application properties (currently only name) search for applications.
122
+ * tags:
123
+ * - applications
124
+ * parameters:
125
+ * - $ref: '#/components/parameters/appId'
126
+ * requestBody:
127
+ * required: true
128
+ * content:
129
+ * application/json:
130
+ * schema:
131
+ * $ref: '#/components/schemas/nameSearch'
132
+ * responses:
133
+ * 200:
134
+ * description: Returns the applications that were found based on the search parameters.
135
+ * content:
136
+ * application/json:
137
+ * schema:
138
+ * type: object
139
+ * required:
140
+ * - data
141
+ * properties:
142
+ * data:
143
+ * type: array
144
+ * items:
145
+ * $ref: '#/components/schemas/application'
146
+ * examples:
147
+ * applications:
148
+ * $ref: '#/components/examples/applications'
149
+ */
150
+ read.push(
151
+ new Endpoint("post", "/applications/search", controller.search).addMiddleware(
152
+ nameValidator()
153
+ )
154
+ )
155
+
156
+ export default { read, write }