@budibase/server 1.0.27-alpha.10 → 1.0.27-alpha.14

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 (331) hide show
  1. package/builder/assets/{index.0dce895b.css → index.39e01193.css} +1 -1
  2. package/builder/assets/{index.39751e34.js → index.411e6960.js} +239 -239
  3. package/builder/index.html +2 -2
  4. package/coverage/clover.xml +909 -890
  5. package/coverage/coverage-final.json +68 -68
  6. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  7. package/coverage/lcov-report/api/controllers/apikeys.js.html +3 -3
  8. package/coverage/lcov-report/api/controllers/application.js.html +71 -62
  9. package/coverage/lcov-report/api/controllers/auth.js.html +2 -2
  10. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  11. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/cloud.js.html +13 -4
  13. package/coverage/lcov-report/api/controllers/component.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/datasource.js.html +138 -36
  15. package/coverage/lcov-report/api/controllers/dev.js.html +3 -3
  16. package/coverage/lcov-report/api/controllers/hosting.js.html +3 -3
  17. package/coverage/lcov-report/api/controllers/index.html +19 -19
  18. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/permission.js.html +3 -3
  22. package/coverage/lcov-report/api/controllers/query/index.html +21 -21
  23. package/coverage/lcov-report/api/controllers/query/index.js.html +51 -48
  24. package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/role.js.html +2 -2
  26. package/coverage/lcov-report/api/controllers/routing.js.html +2 -2
  27. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/index.html +1 -1
  29. package/coverage/lcov-report/api/controllers/row/index.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +2 -2
  32. package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/screen.js.html +2 -2
  34. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  35. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  36. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  37. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/table/internal.js.html +1 -1
  39. package/coverage/lcov-report/api/controllers/table/utils.js.html +1 -1
  40. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  41. package/coverage/lcov-report/api/controllers/user.js.html +14 -5
  42. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  43. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  44. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  45. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  46. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  47. package/coverage/lcov-report/api/controllers/webhook.js.html +2 -2
  48. package/coverage/lcov-report/api/index.html +1 -1
  49. package/coverage/lcov-report/api/index.js.html +6 -6
  50. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  51. package/coverage/lcov-report/api/routes/apikeys.js.html +2 -2
  52. package/coverage/lcov-report/api/routes/application.js.html +2 -2
  53. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/automation.js.html +2 -2
  55. package/coverage/lcov-report/api/routes/backup.js.html +2 -2
  56. package/coverage/lcov-report/api/routes/cloud.js.html +2 -2
  57. package/coverage/lcov-report/api/routes/component.js.html +2 -2
  58. package/coverage/lcov-report/api/routes/datasource.js.html +2 -2
  59. package/coverage/lcov-report/api/routes/deploy.js.html +2 -2
  60. package/coverage/lcov-report/api/routes/dev.js.html +2 -2
  61. package/coverage/lcov-report/api/routes/hosting.js.html +2 -2
  62. package/coverage/lcov-report/api/routes/index.html +1 -1
  63. package/coverage/lcov-report/api/routes/index.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/integration.js.html +2 -2
  65. package/coverage/lcov-report/api/routes/layout.js.html +2 -2
  66. package/coverage/lcov-report/api/routes/metadata.js.html +2 -2
  67. package/coverage/lcov-report/api/routes/permission.js.html +12 -3
  68. package/coverage/lcov-report/api/routes/query.js.html +2 -2
  69. package/coverage/lcov-report/api/routes/role.js.html +2 -2
  70. package/coverage/lcov-report/api/routes/routing.js.html +2 -2
  71. package/coverage/lcov-report/api/routes/row.js.html +2 -2
  72. package/coverage/lcov-report/api/routes/screen.js.html +2 -2
  73. package/coverage/lcov-report/api/routes/script.js.html +2 -2
  74. package/coverage/lcov-report/api/routes/static.js.html +2 -2
  75. package/coverage/lcov-report/api/routes/table.js.html +2 -2
  76. package/coverage/lcov-report/api/routes/templates.js.html +2 -2
  77. package/coverage/lcov-report/api/routes/user.js.html +2 -2
  78. package/coverage/lcov-report/api/routes/view.js.html +2 -2
  79. package/coverage/lcov-report/api/routes/webhook.js.html +2 -2
  80. package/coverage/lcov-report/automations/actions.js.html +1 -1
  81. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  82. package/coverage/lcov-report/automations/bullboard.js.html +2 -2
  83. package/coverage/lcov-report/automations/index.html +1 -1
  84. package/coverage/lcov-report/automations/index.js.html +1 -1
  85. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/createRow.js.html +1 -1
  87. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/executeQuery.js.html +2 -2
  91. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/index.html +1 -1
  94. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  97. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  98. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  99. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  100. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  101. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  102. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  103. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  104. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  105. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  106. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  107. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  108. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  109. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  110. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  111. package/coverage/lcov-report/automations/triggers.js.html +1 -1
  112. package/coverage/lcov-report/automations/utils.js.html +6 -6
  113. package/coverage/lcov-report/constants/index.html +1 -1
  114. package/coverage/lcov-report/constants/index.js.html +4 -4
  115. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  116. package/coverage/lcov-report/constants/screens.js.html +2 -2
  117. package/coverage/lcov-report/db/client.js.html +2 -2
  118. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  119. package/coverage/lcov-report/db/index.html +1 -1
  120. package/coverage/lcov-report/db/index.js.html +1 -1
  121. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  122. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  123. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  124. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  125. package/coverage/lcov-report/db/newid.js.html +2 -2
  126. package/coverage/lcov-report/db/utils.js.html +19 -19
  127. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  128. package/coverage/lcov-report/events/index.html +1 -1
  129. package/coverage/lcov-report/events/index.js.html +1 -1
  130. package/coverage/lcov-report/events/utils.js.html +1 -1
  131. package/coverage/lcov-report/index.html +38 -38
  132. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  133. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  134. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  135. package/coverage/lcov-report/middleware/authorized.js.html +11 -11
  136. package/coverage/lcov-report/middleware/builder.js.html +10 -10
  137. package/coverage/lcov-report/middleware/currentapp.js.html +48 -36
  138. package/coverage/lcov-report/middleware/index.html +1 -1
  139. package/coverage/lcov-report/middleware/joi-validator.js.html +9 -9
  140. package/coverage/lcov-report/middleware/resourceId.js.html +7 -7
  141. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  142. package/coverage/lcov-report/middleware/usageQuota.js.html +2 -2
  143. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  144. package/coverage/lcov-report/threads/automation.js.html +3 -3
  145. package/coverage/lcov-report/threads/index.html +28 -28
  146. package/coverage/lcov-report/threads/index.js.html +12 -12
  147. package/coverage/lcov-report/threads/query.js.html +253 -85
  148. package/coverage/lcov-report/threads/utils.js.html +31 -181
  149. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  150. package/coverage/lcov-report/utilities/budibaseDir.js.html +2 -2
  151. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  152. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  153. package/coverage/lcov-report/utilities/global.js.html +27 -18
  154. package/coverage/lcov-report/utilities/index.html +4 -4
  155. package/coverage/lcov-report/utilities/index.js.html +13 -13
  156. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +2 -2
  157. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  158. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  159. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  160. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  161. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +15 -3
  162. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  163. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  164. package/coverage/lcov-report/utilities/security.js.html +13 -4
  165. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  166. package/coverage/lcov-report/utilities/users.js.html +1 -1
  167. package/coverage/lcov-report/utilities/workerRequests.js.html +22 -22
  168. package/coverage/lcov.info +1566 -1528
  169. package/dist/api/controllers/apikeys.js +2 -2
  170. package/dist/api/controllers/application.js +4 -4
  171. package/dist/api/controllers/auth.js +1 -1
  172. package/dist/api/controllers/cloud.js +2 -2
  173. package/dist/api/controllers/datasource.js +29 -0
  174. package/dist/api/controllers/deploy/index.js +2 -2
  175. package/dist/api/controllers/dev.js +2 -2
  176. package/dist/api/controllers/hosting.js +2 -2
  177. package/dist/api/controllers/permission.js +2 -2
  178. package/dist/api/controllers/query/index.js +3 -2
  179. package/dist/api/controllers/role.js +1 -1
  180. package/dist/api/controllers/routing.js +1 -1
  181. package/dist/api/controllers/row/internalSearch.js +1 -1
  182. package/dist/api/controllers/screen.js +1 -1
  183. package/dist/api/controllers/user.js +3 -3
  184. package/dist/api/controllers/webhook.js +1 -1
  185. package/dist/api/index.js +1 -1
  186. package/dist/api/routes/apikeys.js +1 -1
  187. package/dist/api/routes/application.js +1 -1
  188. package/dist/api/routes/automation.js +1 -1
  189. package/dist/api/routes/backup.js +1 -1
  190. package/dist/api/routes/cloud.js +1 -1
  191. package/dist/api/routes/component.js +1 -1
  192. package/dist/api/routes/datasource.js +1 -1
  193. package/dist/api/routes/deploy.js +1 -1
  194. package/dist/api/routes/dev.js +1 -1
  195. package/dist/api/routes/hosting.js +1 -1
  196. package/dist/api/routes/integration.js +1 -1
  197. package/dist/api/routes/layout.js +1 -1
  198. package/dist/api/routes/metadata.js +1 -1
  199. package/dist/api/routes/permission.js +1 -1
  200. package/dist/api/routes/query.js +1 -1
  201. package/dist/api/routes/role.js +1 -1
  202. package/dist/api/routes/routing.js +1 -1
  203. package/dist/api/routes/row.js +1 -1
  204. package/dist/api/routes/screen.js +1 -1
  205. package/dist/api/routes/script.js +1 -1
  206. package/dist/api/routes/static.js +1 -1
  207. package/dist/api/routes/table.js +1 -1
  208. package/dist/api/routes/templates.js +1 -1
  209. package/dist/api/routes/tests/utilities/TestFunctions.js +1 -1
  210. package/dist/api/routes/user.js +1 -1
  211. package/dist/api/routes/view.js +1 -1
  212. package/dist/api/routes/webhook.js +1 -1
  213. package/dist/app.js +1 -1
  214. package/dist/automations/bullboard.js +1 -1
  215. package/dist/automations/steps/executeQuery.js +1 -1
  216. package/dist/automations/utils.js +1 -1
  217. package/dist/constants/index.js +3 -3
  218. package/dist/constants/screens.js +1 -1
  219. package/dist/db/client.js +1 -1
  220. package/dist/db/utils.js +1 -1
  221. package/dist/environment.js +1 -0
  222. package/dist/integrations/dynamodb.js +19 -0
  223. package/dist/integrations/rest.js +68 -19
  224. package/dist/integrations/s3.js +17 -8
  225. package/dist/middleware/authorized.js +2 -2
  226. package/dist/middleware/builder.js +2 -2
  227. package/dist/middleware/currentapp.js +6 -6
  228. package/dist/middleware/usageQuota.js +1 -1
  229. package/dist/package.json +4 -4
  230. package/dist/tests/utilities/TestConfiguration.js +48 -8
  231. package/dist/tests/utilities/structures.js +2 -2
  232. package/dist/threads/automation.js +2 -2
  233. package/dist/threads/query.js +52 -3
  234. package/dist/threads/utils.js +3 -47
  235. package/dist/tsconfig.tsbuildinfo +1 -1
  236. package/dist/utilities/budibaseDir.js +1 -1
  237. package/dist/utilities/fileSystem/utilities.js +1 -1
  238. package/dist/utilities/global.js +5 -5
  239. package/dist/utilities/index.js +2 -2
  240. package/dist/utilities/redis.js +1 -1
  241. package/dist/utilities/rowProcessor/index.js +1 -1
  242. package/dist/utilities/security.js +2 -2
  243. package/dist/utilities/usageQuota.js +2 -2
  244. package/dist/utilities/workerRequests.js +3 -3
  245. package/package.json +5 -5
  246. package/scripts/replicateApp.js +1 -1
  247. package/src/api/controllers/apikeys.js +2 -2
  248. package/src/api/controllers/application.js +7 -4
  249. package/src/api/controllers/auth.js +1 -1
  250. package/src/api/controllers/cloud.js +5 -2
  251. package/src/api/controllers/datasource.js +34 -0
  252. package/src/api/controllers/deploy/index.js +2 -2
  253. package/src/api/controllers/dev.js +2 -2
  254. package/src/api/controllers/hosting.js +2 -2
  255. package/src/api/controllers/permission.js +2 -2
  256. package/src/api/controllers/query/index.js +3 -2
  257. package/src/api/controllers/role.js +1 -1
  258. package/src/api/controllers/routing.js +1 -1
  259. package/src/api/controllers/row/internalSearch.js +1 -1
  260. package/src/api/controllers/screen.js +1 -1
  261. package/src/api/controllers/user.js +6 -3
  262. package/src/api/controllers/webhook.js +1 -1
  263. package/src/api/index.js +1 -1
  264. package/src/api/routes/apikeys.js +1 -1
  265. package/src/api/routes/application.js +1 -1
  266. package/src/api/routes/automation.js +1 -1
  267. package/src/api/routes/backup.js +1 -1
  268. package/src/api/routes/cloud.js +1 -1
  269. package/src/api/routes/component.js +1 -1
  270. package/src/api/routes/datasource.js +1 -1
  271. package/src/api/routes/deploy.js +1 -1
  272. package/src/api/routes/dev.js +1 -1
  273. package/src/api/routes/hosting.js +1 -1
  274. package/src/api/routes/integration.js +1 -1
  275. package/src/api/routes/layout.js +1 -1
  276. package/src/api/routes/metadata.js +1 -1
  277. package/src/api/routes/permission.js +4 -1
  278. package/src/api/routes/query.js +1 -1
  279. package/src/api/routes/role.js +1 -1
  280. package/src/api/routes/routing.js +1 -1
  281. package/src/api/routes/row.js +1 -1
  282. package/src/api/routes/screen.js +1 -1
  283. package/src/api/routes/script.js +1 -1
  284. package/src/api/routes/static.js +1 -1
  285. package/src/api/routes/table.js +1 -1
  286. package/src/api/routes/templates.js +1 -1
  287. package/src/api/routes/tests/datasource.spec.js +45 -0
  288. package/src/api/routes/tests/permissions.spec.js +1 -1
  289. package/src/api/routes/tests/query.spec.js +25 -44
  290. package/src/api/routes/tests/role.spec.js +2 -2
  291. package/src/api/routes/tests/routing.spec.js +1 -1
  292. package/src/api/routes/tests/user.spec.js +1 -1
  293. package/src/api/routes/tests/utilities/TestFunctions.js +1 -1
  294. package/src/api/routes/user.js +1 -1
  295. package/src/api/routes/view.js +1 -1
  296. package/src/api/routes/webhook.js +1 -1
  297. package/src/app.ts +1 -1
  298. package/src/automations/bullboard.js +1 -1
  299. package/src/automations/steps/executeQuery.js +1 -1
  300. package/src/automations/utils.js +1 -1
  301. package/src/constants/index.js +3 -3
  302. package/src/constants/screens.js +1 -1
  303. package/src/db/client.js +1 -1
  304. package/src/db/utils.js +1 -1
  305. package/src/definitions/datasource.ts +15 -0
  306. package/src/environment.js +1 -0
  307. package/src/integrations/dynamodb.ts +18 -0
  308. package/src/integrations/rest.ts +78 -17
  309. package/src/integrations/s3.ts +18 -7
  310. package/src/integrations/tests/rest.spec.js +287 -24
  311. package/src/middleware/authorized.js +2 -2
  312. package/src/middleware/builder.js +2 -2
  313. package/src/middleware/currentapp.js +11 -7
  314. package/src/middleware/tests/authorized.spec.js +2 -2
  315. package/src/middleware/tests/currentapp.spec.js +35 -41
  316. package/src/middleware/tests/usageQuota.spec.js +1 -1
  317. package/src/middleware/usageQuota.js +1 -1
  318. package/src/tests/utilities/TestConfiguration.js +55 -8
  319. package/src/tests/utilities/structures.js +2 -2
  320. package/src/threads/automation.js +2 -2
  321. package/src/threads/query.js +59 -3
  322. package/src/threads/utils.js +3 -53
  323. package/src/utilities/budibaseDir.js +1 -1
  324. package/src/utilities/fileSystem/utilities.js +1 -1
  325. package/src/utilities/global.js +8 -5
  326. package/src/utilities/index.js +2 -2
  327. package/src/utilities/redis.js +1 -1
  328. package/src/utilities/rowProcessor/index.js +5 -1
  329. package/src/utilities/security.js +5 -2
  330. package/src/utilities/usageQuota.js +2 -2
  331. package/src/utilities/workerRequests.js +3 -3
@@ -1,7 +1,7 @@
1
1
  const Router = require("@koa/router")
2
2
  const controller = require("../controllers/script")
3
3
  const authorized = require("../../middleware/authorized")
4
- const { BUILDER } = require("@budibase/auth/permissions")
4
+ const { BUILDER } = require("@budibase/backend-core/permissions")
5
5
 
6
6
  const router = Router()
7
7
 
@@ -6,7 +6,7 @@ const {
6
6
  BUILDER,
7
7
  PermissionTypes,
8
8
  PermissionLevels,
9
- } = require("@budibase/auth/permissions")
9
+ } = require("@budibase/backend-core/permissions")
10
10
  const env = require("../../environment")
11
11
  const { paramResource } = require("../../middleware/resourceId")
12
12
 
@@ -6,7 +6,7 @@ const {
6
6
  BUILDER,
7
7
  PermissionLevels,
8
8
  PermissionTypes,
9
- } = require("@budibase/auth/permissions")
9
+ } = require("@budibase/backend-core/permissions")
10
10
  const joiValidator = require("../../middleware/joi-validator")
11
11
  const Joi = require("joi")
12
12
 
@@ -1,7 +1,7 @@
1
1
  const Router = require("@koa/router")
2
2
  const controller = require("../controllers/templates")
3
3
  const authorized = require("../../middleware/authorized")
4
- const { BUILDER } = require("@budibase/auth/permissions")
4
+ const { BUILDER } = require("@budibase/backend-core/permissions")
5
5
 
6
6
  const router = Router()
7
7
 
@@ -4,6 +4,7 @@ let setup = require("./utilities")
4
4
  let { basicDatasource } = setup.structures
5
5
  let { checkBuilderEndpoint } = require("./utilities/TestFunctions")
6
6
  const pg = require("pg")
7
+ const { checkCacheForDynamicVariable } = require("../../../threads/utils")
7
8
 
8
9
  describe("/datasources", () => {
9
10
  let request = setup.getRequest()
@@ -31,6 +32,50 @@ describe("/datasources", () => {
31
32
  })
32
33
  })
33
34
 
35
+ describe("update", () => {
36
+ it("should update an existing datasource", async () => {
37
+ datasource.name = "Updated Test"
38
+ const res = await request
39
+ .put(`/api/datasources/${datasource._id}`)
40
+ .send(datasource)
41
+ .set(config.defaultHeaders())
42
+ .expect('Content-Type', /json/)
43
+ .expect(200)
44
+
45
+ expect(res.body.datasource.name).toEqual("Updated Test")
46
+ expect(res.body.errors).toBeUndefined()
47
+ })
48
+
49
+ describe("dynamic variables", () => {
50
+ async function preview(datasource, fields) {
51
+ return config.previewQuery(request, config, datasource, fields)
52
+ }
53
+
54
+ it("should invalidate changed or removed variables", async () => {
55
+ const { datasource, query } = await config.dynamicVariableDatasource()
56
+ // preview once to cache variables
57
+ await preview(datasource, { path: "www.test.com", queryString: "test={{ variable3 }}" })
58
+ // check variables in cache
59
+ let contents = await checkCacheForDynamicVariable(query._id, "variable3")
60
+ expect(contents.rows.length).toEqual(1)
61
+
62
+ // update the datasource to remove the variables
63
+ datasource.config.dynamicVariables = []
64
+ const res = await request
65
+ .put(`/api/datasources/${datasource._id}`)
66
+ .send(datasource)
67
+ .set(config.defaultHeaders())
68
+ .expect('Content-Type', /json/)
69
+ .expect(200)
70
+ expect(res.body.errors).toBeUndefined()
71
+
72
+ // check variables no longer in cache
73
+ contents = await checkCacheForDynamicVariable(query._id, "variable3")
74
+ expect(contents).toBe(null)
75
+ })
76
+ })
77
+ })
78
+
34
79
  describe("fetch", () => {
35
80
  it("returns all the datasources from the server", async () => {
36
81
  const res = await request
@@ -1,4 +1,4 @@
1
- const { BUILTIN_ROLE_IDS } = require("@budibase/auth/roles")
1
+ const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles")
2
2
  const setup = require("./utilities")
3
3
  const { basicRow } = setup.structures
4
4
 
@@ -4,7 +4,7 @@ jest.mock("node-fetch")
4
4
 
5
5
  // Mock isProdAppID to we can later mock the implementation and pretend we are
6
6
  // using prod app IDs
7
- const authDb = require("@budibase/auth/db")
7
+ const authDb = require("@budibase/backend-core/db")
8
8
  const { isProdAppID } = authDb
9
9
  const mockIsProdAppID = jest.fn(isProdAppID)
10
10
  authDb.isProdAppID = mockIsProdAppID
@@ -229,52 +229,14 @@ describe("/queries", () => {
229
229
  })
230
230
  })
231
231
 
232
- describe("test variables", () => {
233
- async function restDatasource(cfg) {
234
- return await config.createDatasource({
235
- datasource: {
236
- ...basicDatasource().datasource,
237
- source: "REST",
238
- config: cfg || {},
239
- },
240
- })
241
- }
242
-
243
- async function dynamicVariableDatasource() {
244
- const datasource = await restDatasource()
245
- const basedOnQuery = await config.createQuery({
246
- ...basicQuery(datasource._id),
247
- fields: {
248
- path: "www.google.com",
249
- },
250
- })
251
- await config.updateDatasource({
252
- ...datasource,
253
- config: {
254
- dynamicVariables: [
255
- { queryId: basedOnQuery._id, name: "variable3", value: "{{ data.0.[value] }}" }
256
- ]
257
- }
258
- })
259
- return { datasource, query: basedOnQuery }
260
- }
232
+ describe("variables", () => {
261
233
 
262
234
  async function preview(datasource, fields) {
263
- return await request
264
- .post(`/api/queries/preview`)
265
- .send({
266
- datasourceId: datasource._id,
267
- parameters: {},
268
- fields,
269
- queryVerb: "read",
270
- })
271
- .set(config.defaultHeaders())
272
- .expect("Content-Type", /json/)
273
- .expect(200)
235
+ return config.previewQuery(request, config, datasource, fields)
274
236
  }
275
237
 
276
238
  it("should work with static variables", async () => {
277
- const datasource = await restDatasource({
239
+ const datasource = await config.restDatasource({
278
240
  staticVariables: {
279
241
  variable: "google",
280
242
  variable2: "1",
@@ -290,7 +252,7 @@ describe("/queries", () => {
290
252
  })
291
253
 
292
254
  it("should work with dynamic variables", async () => {
293
- const { datasource } = await dynamicVariableDatasource()
255
+ const { datasource } = await config.dynamicVariableDatasource()
294
256
  const res = await preview(datasource, {
295
257
  path: "www.google.com",
296
258
  queryString: "test={{ variable3 }}",
@@ -300,7 +262,7 @@ describe("/queries", () => {
300
262
  })
301
263
 
302
264
  it("check that it automatically retries on fail with cached dynamics", async () => {
303
- const { datasource, query: base } = await dynamicVariableDatasource()
265
+ const { datasource, query: base } = await config.dynamicVariableDatasource()
304
266
  // preview once to cache
305
267
  await preview(datasource, { path: "www.google.com", queryString: "test={{ variable3 }}" })
306
268
  // check its in cache
@@ -313,5 +275,24 @@ describe("/queries", () => {
313
275
  expect(res.body.schemaFields).toEqual(["fails", "url", "opts"])
314
276
  expect(res.body.rows[0].fails).toEqual(1)
315
277
  })
278
+
279
+ it("deletes variables when linked query is deleted", async () => {
280
+ const { datasource, query: base } = await config.dynamicVariableDatasource()
281
+ // preview once to cache
282
+ await preview(datasource, { path: "www.google.com", queryString: "test={{ variable3 }}" })
283
+ // check its in cache
284
+ let contents = await checkCacheForDynamicVariable(base._id, "variable3")
285
+ expect(contents.rows.length).toEqual(1)
286
+
287
+ // delete the query
288
+ await request
289
+ .delete(`/api/queries/${base._id}/${base._rev}`)
290
+ .set(config.defaultHeaders())
291
+ .expect(200)
292
+
293
+ // check variables no longer in cache
294
+ contents = await checkCacheForDynamicVariable(base._id, "variable3")
295
+ expect(contents).toBe(null)
296
+ })
316
297
  })
317
298
  })
@@ -1,7 +1,7 @@
1
- const { BUILTIN_ROLE_IDS } = require("@budibase/auth/roles")
1
+ const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles")
2
2
  const {
3
3
  BUILTIN_PERMISSION_IDS,
4
- } = require("@budibase/auth/permissions")
4
+ } = require("@budibase/backend-core/permissions")
5
5
  const setup = require("./utilities")
6
6
  const { basicRole } = setup.structures
7
7
 
@@ -1,7 +1,7 @@
1
1
  const setup = require("./utilities")
2
2
  const { basicScreen } = setup.structures
3
3
  const { checkBuilderEndpoint } = require("./utilities/TestFunctions")
4
- const { BUILTIN_ROLE_IDS } = require("@budibase/auth/roles")
4
+ const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles")
5
5
 
6
6
  const route = "/test"
7
7
 
@@ -1,4 +1,4 @@
1
- const { BUILTIN_ROLE_IDS } = require("@budibase/auth/roles")
1
+ const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles")
2
2
  const { checkPermissionsEndpoint } = require("./utilities/TestFunctions")
3
3
  const setup = require("./utilities")
4
4
 
@@ -2,7 +2,7 @@ const rowController = require("../../../controllers/row")
2
2
  const appController = require("../../../controllers/application")
3
3
  const CouchDB = require("../../../../db")
4
4
  const { AppStatus } = require("../../../../db/utils")
5
- const { BUILTIN_ROLE_IDS } = require("@budibase/auth/roles")
5
+ const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles")
6
6
  const { TENANT_ID } = require("../../../../tests/utilities/structures")
7
7
 
8
8
  function Request(appId, params) {
@@ -4,7 +4,7 @@ const authorized = require("../../middleware/authorized")
4
4
  const {
5
5
  PermissionLevels,
6
6
  PermissionTypes,
7
- } = require("@budibase/auth/permissions")
7
+ } = require("@budibase/backend-core/permissions")
8
8
 
9
9
  const router = Router()
10
10
 
@@ -7,7 +7,7 @@ const {
7
7
  BUILDER,
8
8
  PermissionTypes,
9
9
  PermissionLevels,
10
- } = require("@budibase/auth/permissions")
10
+ } = require("@budibase/backend-core/permissions")
11
11
 
12
12
  const router = Router()
13
13
 
@@ -2,7 +2,7 @@ const Router = require("@koa/router")
2
2
  const controller = require("../controllers/webhook")
3
3
  const authorized = require("../../middleware/authorized")
4
4
  const joiValidator = require("../../middleware/joi-validator")
5
- const { BUILDER } = require("@budibase/auth/permissions")
5
+ const { BUILDER } = require("@budibase/backend-core/permissions")
6
6
  const Joi = require("joi")
7
7
 
8
8
  const router = Router()
package/src/app.ts CHANGED
@@ -3,7 +3,7 @@ import { ExtendableContext } from "koa"
3
3
 
4
4
  const env = require("./environment")
5
5
  const CouchDB = require("./db")
6
- require("@budibase/auth").init(CouchDB)
6
+ require("@budibase/backend-core").init(CouchDB)
7
7
  const Koa = require("koa")
8
8
  const destroyable = require("server-destroy")
9
9
  const koaBody = require("koa-body")
@@ -6,7 +6,7 @@ const Queue = env.isTest()
6
6
  ? require("../utilities/queue/inMemoryQueue")
7
7
  : require("bull")
8
8
  const { JobQueues } = require("../constants")
9
- const { utils } = require("@budibase/auth/redis")
9
+ const { utils } = require("@budibase/backend-core/redis")
10
10
  const { opts, redisProtocolUrl } = utils.getRedisOptions()
11
11
 
12
12
  const CLEANUP_PERIOD_MS = 60 * 1000
@@ -72,7 +72,7 @@ exports.run = async function ({ inputs, appId, emitter }) {
72
72
  })
73
73
 
74
74
  try {
75
- await queryController.execute(ctx)
75
+ await queryController.executeV1(ctx)
76
76
  const { data, ...rest } = ctx.body
77
77
  return {
78
78
  response: data,
@@ -6,7 +6,7 @@ const { queue } = require("./bullboard")
6
6
  const newid = require("../db/newid")
7
7
  const { updateEntityMetadata } = require("../utilities")
8
8
  const { MetadataTypes } = require("../constants")
9
- const { getDeployedAppID } = require("@budibase/auth/db")
9
+ const { getDeployedAppID } = require("@budibase/backend-core/db")
10
10
  const { cloneDeep } = require("lodash/fp")
11
11
 
12
12
  const WH_STEP_ID = definitions.WEBHOOK.stepId
@@ -1,6 +1,6 @@
1
- const { BUILTIN_ROLE_IDS } = require("@budibase/auth/roles")
2
- const { UserStatus } = require("@budibase/auth").constants
3
- const { ObjectStoreBuckets } = require("@budibase/auth").objectStore
1
+ const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles")
2
+ const { UserStatus } = require("@budibase/backend-core/constants")
3
+ const { ObjectStoreBuckets } = require("@budibase/backend-core/objectStore")
4
4
 
5
5
  exports.JobQueues = {
6
6
  AUTOMATIONS: "automationQueue",
@@ -1,4 +1,4 @@
1
- const { BUILTIN_ROLE_IDS } = require("@budibase/auth/roles")
1
+ const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles")
2
2
  const { BASE_LAYOUT_PROP_IDS } = require("./layouts")
3
3
 
4
4
  exports.createHomeScreen = () => ({
package/src/db/client.js CHANGED
@@ -1,5 +1,5 @@
1
1
  const PouchDB = require("pouchdb")
2
- const { getCouchUrl } = require("@budibase/auth/db")
2
+ const { getCouchUrl } = require("@budibase/backend-core/db")
3
3
  const replicationStream = require("pouchdb-replication-stream")
4
4
  const allDbs = require("pouchdb-all-dbs")
5
5
  const find = require("pouchdb-find")
package/src/db/utils.js CHANGED
@@ -9,7 +9,7 @@ const {
9
9
  StaticDatabases,
10
10
  isDevAppID,
11
11
  isProdAppID,
12
- } = require("@budibase/auth/db")
12
+ } = require("@budibase/backend-core/db")
13
13
 
14
14
  const UNICODE_MAX = "\ufff0"
15
15
 
@@ -232,6 +232,8 @@ export interface RestQueryFields {
232
232
  json: object
233
233
  method: string
234
234
  authConfigId: string
235
+ pagination: PaginationConfig | null
236
+ paginationValues: PaginationValues | null
235
237
  }
236
238
 
237
239
  export interface RestConfig {
@@ -252,6 +254,19 @@ export interface RestConfig {
252
254
  ]
253
255
  }
254
256
 
257
+ export interface PaginationConfig {
258
+ type: string
259
+ location: string
260
+ pageParam: string
261
+ sizeParam: string | null
262
+ responseParam: string | null
263
+ }
264
+
265
+ export interface PaginationValues {
266
+ page: string | number | null
267
+ limit: number | null
268
+ }
269
+
255
270
  export interface Query {
256
271
  _id?: string
257
272
  datasourceId: string
@@ -65,6 +65,7 @@ module.exports = {
65
65
  DEPLOYMENT_CREDENTIALS_URL: process.env.DEPLOYMENT_CREDENTIALS_URL,
66
66
  ALLOW_DEV_AUTOMATIONS: process.env.ALLOW_DEV_AUTOMATIONS,
67
67
  DISABLE_THREADING: process.env.DISABLE_THREADING,
68
+ QUERY_THREAD_TIMEOUT: process.env.QUERY_THREAD_TIMEOUT,
68
69
  _set(key, value) {
69
70
  process.env[key] = value
70
71
  module.exports[key] = value
@@ -80,6 +80,17 @@ module DynamoModule {
80
80
  },
81
81
  },
82
82
  },
83
+ describe: {
84
+ type: QueryTypes.FIELDS,
85
+ customisable: true,
86
+ readable: true,
87
+ fields: {
88
+ table: {
89
+ type: DatasourceFieldTypes.STRING,
90
+ required: true,
91
+ },
92
+ },
93
+ },
83
94
  get: {
84
95
  type: QueryTypes.FIELDS,
85
96
  customisable: true,
@@ -180,6 +191,13 @@ module DynamoModule {
180
191
  return response
181
192
  }
182
193
 
194
+ async describe(query: { table: string }) {
195
+ const params = {
196
+ TableName: query.table,
197
+ }
198
+ return new AWS.DynamoDB().describeTable(params).promise()
199
+ }
200
+
183
201
  async get(query: { table: string; json: object }) {
184
202
  const params = {
185
203
  TableName: query.table,
@@ -4,9 +4,11 @@ import {
4
4
  QueryTypes,
5
5
  RestConfig,
6
6
  RestQueryFields as RestQuery,
7
+ PaginationConfig,
7
8
  AuthType,
8
9
  BasicAuthConfig,
9
10
  BearerAuthConfig,
11
+ PaginationValues,
10
12
  } from "../definitions/datasource"
11
13
  import { IntegrationBase } from "./base/IntegrationBase"
12
14
 
@@ -40,6 +42,9 @@ const coreFields = {
40
42
  type: DatasourceFieldTypes.STRING,
41
43
  enum: Object.values(BodyTypes),
42
44
  },
45
+ pagination: {
46
+ type: DatasourceFieldTypes.OBJECT
47
+ }
43
48
  }
44
49
 
45
50
  module RestModule {
@@ -115,7 +120,7 @@ module RestModule {
115
120
  this.config = config
116
121
  }
117
122
 
118
- async parseResponse(response: any) {
123
+ async parseResponse(response: any, pagination: PaginationConfig | null) {
119
124
  let data, raw, headers
120
125
  const contentType = response.headers.get("content-type") || ""
121
126
  try {
@@ -154,6 +159,13 @@ module RestModule {
154
159
  for (let [key, value] of Object.entries(headers)) {
155
160
  headers[key] = Array.isArray(value) ? value[0] : value
156
161
  }
162
+
163
+ // Check if a pagination cursor exists in the response
164
+ let nextCursor = null
165
+ if (pagination?.responseParam) {
166
+ nextCursor = data?.[pagination.responseParam]
167
+ }
168
+
157
169
  return {
158
170
  data,
159
171
  info: {
@@ -165,10 +177,35 @@ module RestModule {
165
177
  raw,
166
178
  headers,
167
179
  },
180
+ pagination: {
181
+ cursor: nextCursor
182
+ }
168
183
  }
169
184
  }
170
185
 
171
- getUrl(path: string, queryString: string): string {
186
+ getUrl(path: string, queryString: string, pagination: PaginationConfig | null, paginationValues: PaginationValues | null): string {
187
+ // Add pagination params to query string if required
188
+ if (pagination?.location === "query" && paginationValues) {
189
+ const { pageParam, sizeParam } = pagination
190
+ const params = new URLSearchParams()
191
+
192
+ // Append page number or cursor param if configured
193
+ if (pageParam && paginationValues.page != null) {
194
+ params.append(pageParam, paginationValues.page)
195
+ }
196
+
197
+ // Append page size param if configured
198
+ if (sizeParam && paginationValues.limit != null) {
199
+ params.append(sizeParam, paginationValues.limit)
200
+ }
201
+
202
+ // Prepend query string with pagination params
203
+ let paginationString = params.toString()
204
+ if (paginationString) {
205
+ queryString = `${paginationString}&${queryString}`
206
+ }
207
+ }
208
+
172
209
  const main = `${path}?${queryString}`
173
210
  let complete = main
174
211
  if (this.config.url && !main.startsWith("http")) {
@@ -180,20 +217,36 @@ module RestModule {
180
217
  return complete
181
218
  }
182
219
 
183
- addBody(bodyType: string, body: string | any, input: any) {
184
- let error, object, string
220
+ addBody(bodyType: string, body: string | any, input: any, pagination: PaginationConfig | null, paginationValues: PaginationValues | null) {
221
+ if (!input.headers) {
222
+ input.headers = {}
223
+ }
224
+ if (bodyType === BodyTypes.NONE) {
225
+ return input
226
+ }
227
+ let error, object: any = {}, string = ""
185
228
  try {
186
- string = typeof body !== "string" ? JSON.stringify(body) : body
187
- object = typeof body === "object" ? body : JSON.parse(body)
229
+ if (body) {
230
+ string = typeof body !== "string" ? JSON.stringify(body) : body
231
+ object = typeof body === "object" ? body : JSON.parse(body)
232
+ }
188
233
  } catch (err) {
189
234
  error = err
190
235
  }
191
- if (!input.headers) {
192
- input.headers = {}
236
+
237
+ // Util to add pagination values to a certain body type
238
+ const addPaginationToBody = (insertFn: Function) => {
239
+ if (pagination?.location === "body") {
240
+ if (pagination?.pageParam && paginationValues?.page != null) {
241
+ insertFn(pagination.pageParam, paginationValues.page)
242
+ }
243
+ if (pagination?.sizeParam && paginationValues?.limit != null) {
244
+ insertFn(pagination.sizeParam, paginationValues.limit)
245
+ }
246
+ }
193
247
  }
248
+
194
249
  switch (bodyType) {
195
- case BodyTypes.NONE:
196
- break
197
250
  case BodyTypes.TEXT:
198
251
  // content type defaults to plaintext
199
252
  input.body = string
@@ -203,6 +256,9 @@ module RestModule {
203
256
  for (let [key, value] of Object.entries(object)) {
204
257
  params.append(key, value)
205
258
  }
259
+ addPaginationToBody((key: string, value: any) => {
260
+ params.append(key, value)
261
+ })
206
262
  input.body = params
207
263
  break
208
264
  case BodyTypes.FORM_DATA:
@@ -210,6 +266,9 @@ module RestModule {
210
266
  for (let [key, value] of Object.entries(object)) {
211
267
  form.append(key, value)
212
268
  }
269
+ addPaginationToBody((key: string, value: any) => {
270
+ form.append(key, value)
271
+ })
213
272
  input.body = form
214
273
  break
215
274
  case BodyTypes.XML:
@@ -219,13 +278,15 @@ module RestModule {
219
278
  input.body = string
220
279
  input.headers["Content-Type"] = "application/xml"
221
280
  break
222
- default:
223
281
  case BodyTypes.JSON:
224
282
  // if JSON error, throw it
225
283
  if (error) {
226
284
  throw "Invalid JSON for request body"
227
285
  }
228
- input.body = string
286
+ addPaginationToBody((key: string, value: any) => {
287
+ object[key] = value
288
+ })
289
+ input.body = JSON.stringify(object)
229
290
  input.headers["Content-Type"] = "application/json"
230
291
  break
231
292
  }
@@ -271,6 +332,8 @@ module RestModule {
271
332
  bodyType,
272
333
  requestBody,
273
334
  authConfigId,
335
+ pagination,
336
+ paginationValues
274
337
  } = query
275
338
  const authHeaders = this.getAuthHeaders(authConfigId)
276
339
 
@@ -289,14 +352,12 @@ module RestModule {
289
352
  }
290
353
 
291
354
  let input: any = { method, headers: this.headers }
292
- if (requestBody) {
293
- input = this.addBody(bodyType, requestBody, input)
294
- }
355
+ input = this.addBody(bodyType, requestBody, input, pagination, paginationValues)
295
356
 
296
357
  this.startTimeMs = performance.now()
297
- const url = this.getUrl(path, queryString)
358
+ const url = this.getUrl(path, queryString, pagination, paginationValues)
298
359
  const response = await fetch(url, input)
299
- return await this.parseResponse(response)
360
+ return await this.parseResponse(response, pagination)
300
361
  }
301
362
 
302
363
  async create(opts: RestQuery) {