@budibase/server 0.9.138 → 0.9.140-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 (296) hide show
  1. package/builder/assets/discord.c14881e9.svg +10 -0
  2. package/builder/assets/{index.b18ab99b.js → index.1d1fa051.js} +35 -35
  3. package/builder/assets/{index.121692c9.css → index.79907e5c.css} +5 -5
  4. package/builder/assets/integromat.42212f11.png +0 -0
  5. package/builder/assets/slack.1e1f7cfb.svg +33 -0
  6. package/builder/assets/{vendor.7177f366.js → vendor.d39b3c1e.js} +2 -2
  7. package/builder/assets/zapier.3fbd8f5c.png +0 -0
  8. package/builder/index.html +3 -3
  9. package/coverage/clover.xml +2138 -2091
  10. package/coverage/coverage-final.json +120 -106
  11. package/coverage/lcov-report/api/controllers/analytics.js.html +3 -3
  12. package/coverage/lcov-report/api/controllers/apikeys.js.html +6 -6
  13. package/coverage/lcov-report/api/controllers/application.js.html +84 -84
  14. package/coverage/lcov-report/api/controllers/auth.js.html +6 -6
  15. package/coverage/lcov-report/api/controllers/automation.js.html +182 -356
  16. package/coverage/lcov-report/api/controllers/backup.js.html +3 -3
  17. package/coverage/lcov-report/api/controllers/component.js.html +5 -5
  18. package/coverage/lcov-report/api/controllers/datasource.js.html +12 -12
  19. package/coverage/lcov-report/api/controllers/dev.js.html +15 -15
  20. package/coverage/lcov-report/api/controllers/hosting.js.html +8 -8
  21. package/coverage/lcov-report/api/controllers/index.html +47 -32
  22. package/coverage/lcov-report/api/controllers/integration.js.html +4 -4
  23. package/coverage/lcov-report/api/controllers/layout.js.html +6 -6
  24. package/coverage/lcov-report/api/controllers/metadata.js.html +218 -0
  25. package/coverage/lcov-report/api/controllers/permission.js.html +14 -14
  26. package/coverage/lcov-report/api/controllers/query.js.html +17 -23
  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 +15 -15
  30. package/coverage/lcov-report/api/controllers/row/index.html +29 -44
  31. package/coverage/lcov-report/api/controllers/row/index.js.html +48 -45
  32. package/coverage/lcov-report/api/controllers/row/internal.js.html +159 -126
  33. package/coverage/lcov-report/api/controllers/row/utils.js.html +17 -17
  34. package/coverage/lcov-report/api/controllers/screen.js.html +7 -7
  35. package/coverage/lcov-report/api/controllers/script.js.html +5 -5
  36. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  37. package/coverage/lcov-report/api/controllers/table/index.js.html +40 -40
  38. package/coverage/lcov-report/api/controllers/table/utils.js.html +48 -48
  39. package/coverage/lcov-report/api/controllers/templates.js.html +5 -5
  40. package/coverage/lcov-report/api/controllers/user.js.html +14 -11
  41. package/coverage/lcov-report/api/controllers/view/exporters.js.html +3 -3
  42. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  43. package/coverage/lcov-report/api/controllers/view/index.js.html +9 -9
  44. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +6 -6
  45. package/coverage/lcov-report/api/controllers/webhook.js.html +14 -14
  46. package/coverage/lcov-report/api/index.html +1 -1
  47. package/coverage/lcov-report/api/index.js.html +23 -23
  48. package/coverage/lcov-report/api/routes/analytics.js.html +6 -6
  49. package/coverage/lcov-report/api/routes/apikeys.js.html +8 -8
  50. package/coverage/lcov-report/api/routes/application.js.html +8 -8
  51. package/coverage/lcov-report/api/routes/auth.js.html +6 -6
  52. package/coverage/lcov-report/api/routes/automation.js.html +41 -26
  53. package/coverage/lcov-report/api/routes/backup.js.html +8 -8
  54. package/coverage/lcov-report/api/routes/component.js.html +8 -8
  55. package/coverage/lcov-report/api/routes/datasource.js.html +13 -13
  56. package/coverage/lcov-report/api/routes/deploy.js.html +8 -8
  57. package/coverage/lcov-report/api/routes/dev.js.html +11 -11
  58. package/coverage/lcov-report/api/routes/hosting.js.html +8 -8
  59. package/coverage/lcov-report/api/routes/index.html +24 -9
  60. package/coverage/lcov-report/api/routes/index.js.html +36 -30
  61. package/coverage/lcov-report/api/routes/integration.js.html +8 -8
  62. package/coverage/lcov-report/api/routes/layout.js.html +8 -8
  63. package/coverage/lcov-report/api/routes/metadata.js.html +194 -0
  64. package/coverage/lcov-report/api/routes/permission.js.html +12 -12
  65. package/coverage/lcov-report/api/routes/query.js.html +13 -13
  66. package/coverage/lcov-report/api/routes/role.js.html +12 -12
  67. package/coverage/lcov-report/api/routes/routing.js.html +8 -8
  68. package/coverage/lcov-report/api/routes/row.js.html +10 -10
  69. package/coverage/lcov-report/api/routes/screen.js.html +11 -11
  70. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/static.js.html +13 -16
  72. package/coverage/lcov-report/api/routes/table.js.html +12 -12
  73. package/coverage/lcov-report/api/routes/templates.js.html +8 -8
  74. package/coverage/lcov-report/api/routes/user.js.html +9 -9
  75. package/coverage/lcov-report/api/routes/view.js.html +11 -11
  76. package/coverage/lcov-report/api/routes/webhook.js.html +11 -11
  77. package/coverage/lcov-report/automations/actions.js.html +57 -117
  78. package/coverage/lcov-report/automations/automationUtils.js.html +7 -7
  79. package/coverage/lcov-report/automations/bullboard.js.html +49 -16
  80. package/coverage/lcov-report/automations/index.html +67 -67
  81. package/coverage/lcov-report/automations/index.js.html +26 -128
  82. package/coverage/lcov-report/automations/steps/bash.js.html +37 -16
  83. package/coverage/lcov-report/automations/steps/createRow.js.html +15 -15
  84. package/coverage/lcov-report/automations/steps/delay.js.html +48 -9
  85. package/coverage/lcov-report/automations/steps/deleteRow.js.html +14 -14
  86. package/coverage/lcov-report/automations/steps/discord.js.html +329 -0
  87. package/coverage/lcov-report/automations/steps/executeQuery.js.html +22 -34
  88. package/coverage/lcov-report/automations/steps/executeScript.js.html +21 -33
  89. package/coverage/lcov-report/automations/steps/filter.js.html +28 -25
  90. package/coverage/lcov-report/automations/steps/index.html +140 -65
  91. package/coverage/lcov-report/automations/steps/integromat.js.html +341 -0
  92. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +44 -38
  93. package/coverage/lcov-report/automations/steps/queryRows.js.html +437 -0
  94. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +13 -13
  95. package/coverage/lcov-report/automations/steps/serverLog.js.html +23 -11
  96. package/coverage/lcov-report/automations/steps/{sendgridEmail.js.html → slack.js.html} +58 -88
  97. package/coverage/lcov-report/automations/steps/updateRow.js.html +12 -12
  98. package/coverage/lcov-report/automations/steps/utils.js.html +188 -0
  99. package/coverage/lcov-report/automations/steps/zapier.js.html +332 -0
  100. package/coverage/lcov-report/automations/thread.js.html +79 -76
  101. package/coverage/lcov-report/automations/triggerInfo/app.js.html +173 -0
  102. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +173 -0
  103. package/coverage/lcov-report/automations/triggerInfo/index.html +201 -0
  104. package/coverage/lcov-report/automations/triggerInfo/index.js.html +125 -0
  105. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +176 -0
  106. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +200 -0
  107. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +200 -0
  108. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +188 -0
  109. package/coverage/lcov-report/automations/triggers.js.html +67 -838
  110. package/coverage/lcov-report/automations/utils.js.html +557 -0
  111. package/coverage/lcov-report/constants/index.html +5 -5
  112. package/coverage/lcov-report/constants/index.js.html +32 -17
  113. package/coverage/lcov-report/constants/layouts.js.html +5 -5
  114. package/coverage/lcov-report/constants/screens.js.html +4 -4
  115. package/coverage/lcov-report/db/client.js.html +18 -18
  116. package/coverage/lcov-report/db/index.html +19 -19
  117. package/coverage/lcov-report/db/index.js.html +3 -3
  118. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +79 -79
  119. package/coverage/lcov-report/db/linkedRows/index.html +18 -18
  120. package/coverage/lcov-report/db/linkedRows/index.js.html +107 -149
  121. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +43 -43
  122. package/coverage/lcov-report/db/newid.js.html +4 -4
  123. package/coverage/lcov-report/db/utils.js.html +127 -76
  124. package/coverage/lcov-report/events/AutomationEmitter.js.html +7 -7
  125. package/coverage/lcov-report/events/index.html +1 -1
  126. package/coverage/lcov-report/events/index.js.html +6 -6
  127. package/coverage/lcov-report/events/utils.js.html +3 -3
  128. package/coverage/lcov-report/index.html +116 -101
  129. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  130. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  131. package/coverage/lcov-report/{automations/logic.js.html → middleware/appInfo.js.html} +35 -38
  132. package/coverage/lcov-report/middleware/authorized.js.html +16 -16
  133. package/coverage/lcov-report/middleware/builder.js.html +15 -15
  134. package/coverage/lcov-report/middleware/currentapp.js.html +33 -33
  135. package/coverage/lcov-report/middleware/index.html +23 -8
  136. package/coverage/lcov-report/middleware/joi-validator.js.html +6 -6
  137. package/coverage/lcov-report/middleware/resourceId.js.html +28 -28
  138. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  139. package/coverage/lcov-report/middleware/usageQuota.js.html +8 -8
  140. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  141. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  142. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  143. package/coverage/lcov-report/utilities/csvParser.js.html +6 -6
  144. package/coverage/lcov-report/utilities/global.js.html +33 -33
  145. package/coverage/lcov-report/utilities/index.html +28 -28
  146. package/coverage/lcov-report/utilities/index.js.html +178 -25
  147. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +18 -18
  148. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  149. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  150. package/coverage/lcov-report/utilities/routing/index.js.html +6 -6
  151. package/coverage/lcov-report/utilities/rowProcessor/index.html +14 -14
  152. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +87 -51
  153. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +10 -10
  154. package/coverage/lcov-report/utilities/security.js.html +9 -9
  155. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  156. package/coverage/lcov-report/utilities/users.js.html +5 -5
  157. package/coverage/lcov-report/utilities/workerRequests.js.html +52 -52
  158. package/coverage/lcov.info +3255 -3218
  159. package/dist/api/controllers/automation.js +60 -127
  160. package/dist/api/controllers/deploy/index.js +17 -1
  161. package/dist/api/controllers/metadata.js +49 -0
  162. package/dist/api/controllers/query.js +0 -2
  163. package/dist/api/controllers/row/ExternalRequest.js +1 -1
  164. package/dist/api/controllers/row/index.js +1 -0
  165. package/dist/api/controllers/row/internal.js +33 -23
  166. package/dist/api/controllers/static/index.js +1 -28
  167. package/dist/api/controllers/static/templates/BudibaseApp.svelte +4 -1
  168. package/dist/api/controllers/user.js +1 -1
  169. package/dist/api/routes/automation.js +4 -5
  170. package/dist/api/routes/index.js +2 -0
  171. package/dist/api/routes/metadata.js +13 -0
  172. package/dist/api/routes/static.js +0 -1
  173. package/dist/api/routes/tests/utilities/TestFunctions.js +13 -0
  174. package/dist/app.js +1 -1
  175. package/dist/automations/actions.js +29 -46
  176. package/dist/automations/bullboard.js +11 -2
  177. package/dist/automations/index.js +11 -48
  178. package/dist/automations/steps/bash.js +12 -6
  179. package/dist/automations/steps/createRow.js +5 -5
  180. package/dist/automations/steps/delay.js +16 -3
  181. package/dist/automations/steps/deleteRow.js +5 -5
  182. package/dist/automations/steps/discord.js +91 -0
  183. package/dist/automations/steps/executeQuery.js +12 -15
  184. package/dist/automations/steps/executeScript.js +12 -15
  185. package/dist/automations/steps/filter.js +19 -18
  186. package/dist/automations/steps/integromat.js +94 -0
  187. package/dist/automations/steps/outgoingWebhook.js +19 -20
  188. package/dist/automations/steps/queryRows.js +129 -0
  189. package/dist/automations/steps/sendSmtpEmail.js +4 -4
  190. package/dist/automations/steps/serverLog.js +7 -3
  191. package/dist/automations/steps/slack.js +73 -0
  192. package/dist/automations/steps/updateRow.js +4 -4
  193. package/dist/automations/steps/utils.js +46 -0
  194. package/dist/automations/steps/zapier.js +91 -0
  195. package/dist/automations/tests/utilities/index.js +2 -12
  196. package/dist/automations/thread.js +23 -25
  197. package/dist/automations/triggerInfo/app.js +32 -0
  198. package/dist/automations/triggerInfo/cron.js +32 -0
  199. package/dist/automations/triggerInfo/index.js +15 -0
  200. package/dist/automations/triggerInfo/rowDeleted.js +33 -0
  201. package/dist/automations/triggerInfo/rowSaved.js +41 -0
  202. package/dist/automations/triggerInfo/rowUpdated.js +41 -0
  203. package/dist/automations/triggerInfo/webhook.js +37 -0
  204. package/dist/automations/triggers.js +27 -285
  205. package/dist/automations/utils.js +143 -0
  206. package/dist/constants/index.js +4 -0
  207. package/dist/db/linkedRows/index.js +20 -34
  208. package/dist/db/utils.js +14 -1
  209. package/dist/environment.js +2 -1
  210. package/dist/integrations/mysql.js +14 -2
  211. package/dist/middleware/appInfo.js +17 -0
  212. package/dist/middleware/usageQuota.js +1 -1
  213. package/dist/package.json +12 -11
  214. package/dist/tsconfig.tsbuildinfo +1 -1
  215. package/dist/utilities/appDirectoryTemplate/package.json +1 -1
  216. package/dist/utilities/fileSystem/clientLibrary.js +2 -2
  217. package/dist/utilities/fileSystem/index.js +2 -27
  218. package/dist/utilities/index.js +54 -0
  219. package/dist/utilities/redis.js +16 -1
  220. package/dist/utilities/rowProcessor/index.js +7 -4
  221. package/package.json +13 -12
  222. package/scripts/jestSetup.js +1 -0
  223. package/scripts/selfhost.js +8 -0
  224. package/src/api/controllers/automation.js +87 -145
  225. package/src/api/controllers/deploy/index.js +23 -1
  226. package/src/api/controllers/metadata.js +46 -0
  227. package/src/api/controllers/query.js +0 -2
  228. package/src/api/controllers/row/ExternalRequest.ts +1 -1
  229. package/src/api/controllers/row/index.js +1 -0
  230. package/src/api/controllers/row/internal.js +34 -23
  231. package/src/api/controllers/static/index.js +1 -39
  232. package/src/api/controllers/static/templates/BudibaseApp.svelte +4 -1
  233. package/src/api/controllers/user.js +1 -0
  234. package/src/api/routes/automation.js +16 -11
  235. package/src/api/routes/index.js +2 -0
  236. package/src/api/routes/metadata.js +38 -0
  237. package/src/api/routes/static.js +0 -1
  238. package/src/api/routes/tests/automation.spec.js +4 -26
  239. package/src/api/routes/tests/metadata.spec.js +65 -0
  240. package/src/api/routes/tests/utilities/TestFunctions.js +14 -0
  241. package/src/app.ts +1 -1
  242. package/src/automations/actions.js +29 -49
  243. package/src/automations/bullboard.js +13 -2
  244. package/src/automations/index.js +11 -45
  245. package/src/automations/steps/bash.js +13 -6
  246. package/src/automations/steps/createRow.js +5 -5
  247. package/src/automations/steps/delay.js +16 -3
  248. package/src/automations/steps/deleteRow.js +5 -5
  249. package/src/automations/steps/discord.js +83 -0
  250. package/src/automations/steps/executeQuery.js +12 -16
  251. package/src/automations/steps/executeScript.js +12 -16
  252. package/src/automations/steps/filter.js +19 -18
  253. package/src/automations/steps/integromat.js +87 -0
  254. package/src/automations/steps/outgoingWebhook.js +20 -18
  255. package/src/automations/steps/queryRows.js +119 -0
  256. package/src/automations/steps/sendSmtpEmail.js +4 -4
  257. package/src/automations/steps/serverLog.js +7 -3
  258. package/src/automations/steps/slack.js +64 -0
  259. package/src/automations/steps/updateRow.js +4 -4
  260. package/src/automations/steps/utils.js +36 -0
  261. package/src/automations/steps/zapier.js +84 -0
  262. package/src/automations/tests/automation.spec.js +4 -67
  263. package/src/automations/tests/delay.spec.js +2 -2
  264. package/src/automations/tests/filter.spec.js +14 -14
  265. package/src/automations/tests/queryRows.spec.js +51 -0
  266. package/src/automations/tests/utilities/index.js +2 -13
  267. package/src/automations/thread.js +27 -26
  268. package/src/automations/triggerInfo/app.js +31 -0
  269. package/src/automations/triggerInfo/cron.js +31 -0
  270. package/src/automations/triggerInfo/index.js +15 -0
  271. package/src/automations/triggerInfo/rowDeleted.js +32 -0
  272. package/src/automations/triggerInfo/rowSaved.js +40 -0
  273. package/src/automations/triggerInfo/rowUpdated.js +40 -0
  274. package/src/automations/triggerInfo/webhook.js +36 -0
  275. package/src/automations/triggers.js +33 -290
  276. package/src/automations/utils.js +159 -0
  277. package/src/constants/index.js +5 -0
  278. package/src/db/linkedRows/index.js +21 -35
  279. package/src/db/tests/linkTests.spec.js +0 -12
  280. package/src/db/utils.js +17 -0
  281. package/src/environment.js +2 -1
  282. package/src/integrations/mysql.ts +15 -2
  283. package/src/middleware/appInfo.js +19 -0
  284. package/src/middleware/usageQuota.js +1 -1
  285. package/src/utilities/appDirectoryTemplate/package.json +1 -1
  286. package/src/utilities/fileSystem/clientLibrary.js +2 -2
  287. package/src/utilities/fileSystem/index.js +2 -36
  288. package/src/utilities/index.js +51 -0
  289. package/src/utilities/redis.js +18 -1
  290. package/src/utilities/rowProcessor/index.js +16 -4
  291. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +0 -1244
  292. package/dist/automations/logic.js +0 -17
  293. package/dist/automations/steps/sendgridEmail.js +0 -85
  294. package/src/automations/logic.js +0 -20
  295. package/src/automations/steps/sendgridEmail.js +0 -74
  296. package/src/automations/tests/sendEmail.spec.js +0 -36
@@ -5,6 +5,6 @@
5
5
  "author": "",
6
6
  "license": "ISC",
7
7
  "dependencies": {
8
- "@budibase/standard-components": "0.x"
8
+ "@budibase/client": "0.x"
9
9
  }
10
10
  }
@@ -17,7 +17,7 @@ const env = require("../../environment");
17
17
  const TOP_LEVEL_PATH = join(__dirname, "..", "..", "..");
18
18
  /**
19
19
  * Client library paths in the object store:
20
- * Previously, the entire standard-components package was downloaded from NPM
20
+ * Previously, the entire client library package was downloaded from NPM
21
21
  * as a tarball and extracted to the object store, even though only the manifest
22
22
  * was ever needed. Therefore we need to support old apps which may still have
23
23
  * the manifest at this location for the first update.
@@ -79,7 +79,7 @@ exports.updateClientLibrary = (appId) => __awaiter(void 0, void 0, void 0, funct
79
79
  let manifest, client;
80
80
  if (env.isDev()) {
81
81
  // Load the symlinked version in dev which is always the newest
82
- manifest = require.resolve("@budibase/standard-components/manifest.json");
82
+ manifest = require.resolve("@budibase/client/manifest.json");
83
83
  client = require.resolve("@budibase/client");
84
84
  }
85
85
  else {
@@ -17,13 +17,8 @@ const CouchDB = require("../../db");
17
17
  const { ObjectStoreBuckets } = require("../../constants");
18
18
  const { upload, retrieve, retrieveToTmp, streamUpload, deleteFolder, downloadTarball, } = require("./utilities");
19
19
  const { updateClientLibrary } = require("./clientLibrary");
20
- const download = require("download");
21
20
  const env = require("../../environment");
22
- const { homedir } = require("os");
23
- const fetch = require("node-fetch");
24
21
  const { USER_METDATA_PREFIX, LINK_USER_METADATA_PREFIX, } = require("../../db/utils");
25
- const DEFAULT_AUTOMATION_BUCKET = "https://prod-budi-automations.s3-eu-west-1.amazonaws.com";
26
- const DEFAULT_AUTOMATION_DIRECTORY = ".budibase-automations";
27
22
  const TOP_LEVEL_PATH = join(__dirname, "..", "..", "..");
28
23
  const NODE_MODULES_PATH = join(TOP_LEVEL_PATH, "node_modules");
29
24
  /**
@@ -160,12 +155,13 @@ exports.getComponentLibraryManifest = (appId, library) => __awaiter(void 0, void
160
155
  // when testing in cypress and so on we need to get the package
161
156
  // as the environment may not be fully fleshed out for dev or prod
162
157
  if (env.isTest()) {
158
+ library = library.replace("standard-components", "client");
163
159
  const lib = library.split("/")[1];
164
160
  const path = require.resolve(library).split(lib)[0];
165
161
  return require(join(path, lib, filename));
166
162
  }
167
163
  else if (env.isDev()) {
168
- const path = join(NODE_MODULES_PATH, "@budibase", "standard-components", filename);
164
+ const path = join(NODE_MODULES_PATH, "@budibase", "client", filename);
169
165
  // always load from new so that updates are refreshed
170
166
  delete require.cache[require.resolve(path)];
171
167
  return require(path);
@@ -186,27 +182,6 @@ exports.getComponentLibraryManifest = (appId, library) => __awaiter(void 0, void
186
182
  }
187
183
  return JSON.parse(resp);
188
184
  });
189
- exports.automationInit = () => __awaiter(void 0, void 0, void 0, function* () {
190
- const directory = env.AUTOMATION_DIRECTORY || join(homedir(), DEFAULT_AUTOMATION_DIRECTORY);
191
- const bucket = env.AUTOMATION_BUCKET || DEFAULT_AUTOMATION_BUCKET;
192
- if (!fs.existsSync(directory)) {
193
- fs.mkdirSync(directory, { recursive: true });
194
- }
195
- // env setup to get async packages
196
- let response = yield fetch(`${bucket}/manifest.json`);
197
- return response.json();
198
- });
199
- exports.getExternalAutomationStep = (name, version, bundleName) => __awaiter(void 0, void 0, void 0, function* () {
200
- const directory = env.AUTOMATION_DIRECTORY || join(homedir(), DEFAULT_AUTOMATION_DIRECTORY);
201
- const bucket = env.AUTOMATION_BUCKET || DEFAULT_AUTOMATION_BUCKET;
202
- try {
203
- return require(join(directory, bundleName));
204
- }
205
- catch (err) {
206
- yield download(`${bucket}/${name}/${version}/${bundleName}`, directory);
207
- return require(join(directory, bundleName));
208
- }
209
- });
210
185
  /**
211
186
  * All file reads come through here just to make sure all of them make sense
212
187
  * allows a centralised location to check logic is all good.
@@ -1,7 +1,18 @@
1
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
+ };
2
11
  const env = require("../environment");
3
12
  const { OBJ_STORE_DIRECTORY } = require("../constants");
4
13
  const { sanitizeKey } = require("@budibase/auth/src/objectStore");
14
+ const CouchDB = require("../db");
15
+ const { generateMetadataID } = require("../db/utils");
5
16
  const BB_CDN = "https://cdn.budi.live";
6
17
  exports.wait = ms => new Promise(resolve => setTimeout(resolve, ms));
7
18
  exports.isDev = env.isDev;
@@ -47,3 +58,46 @@ exports.clientLibraryPath = appId => {
47
58
  exports.attachmentsRelativeURL = attachmentKey => {
48
59
  return exports.checkSlashesInUrl(`${exports.objectStoreUrl()}/${attachmentKey}`);
49
60
  };
61
+ exports.updateEntityMetadata = (appId, type, entityId, updateFn) => __awaiter(void 0, void 0, void 0, function* () {
62
+ const db = new CouchDB(appId);
63
+ const id = generateMetadataID(type, entityId);
64
+ // read it to see if it exists, we'll overwrite it no matter what
65
+ let rev, metadata = {};
66
+ try {
67
+ const oldMetadata = yield db.get(id);
68
+ rev = oldMetadata._rev;
69
+ metadata = updateFn(oldMetadata);
70
+ }
71
+ catch (err) {
72
+ rev = null;
73
+ metadata = updateFn({});
74
+ }
75
+ metadata._id = id;
76
+ if (rev) {
77
+ metadata._rev = rev;
78
+ }
79
+ const response = yield db.put(metadata);
80
+ return Object.assign(Object.assign({}, metadata), { _id: id, _rev: response.rev });
81
+ });
82
+ exports.saveEntityMetadata = (appId, type, entityId, metadata) => __awaiter(void 0, void 0, void 0, function* () {
83
+ return exports.updateEntityMetadata(appId, type, entityId, () => {
84
+ return metadata;
85
+ });
86
+ });
87
+ exports.deleteEntityMetadata = (appId, type, entityId) => __awaiter(void 0, void 0, void 0, function* () {
88
+ const db = new CouchDB(appId);
89
+ const id = generateMetadataID(type, entityId);
90
+ let rev;
91
+ try {
92
+ const metadata = yield db.get(id);
93
+ if (metadata) {
94
+ rev = metadata._rev;
95
+ }
96
+ }
97
+ catch (err) {
98
+ // don't need to error if it doesn't exist
99
+ }
100
+ if (id && rev) {
101
+ yield db.remove(id, rev);
102
+ }
103
+ });
@@ -11,20 +11,25 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
11
11
  const { Client, utils } = require("@budibase/auth/redis");
12
12
  const { getGlobalIDFromUserMetadataID } = require("../db/utils");
13
13
  const APP_DEV_LOCK_SECONDS = 600;
14
- let devAppClient, debounceClient;
14
+ const AUTOMATION_TEST_FLAG_SECONDS = 60;
15
+ let devAppClient, debounceClient, flagClient;
15
16
  // we init this as we want to keep the connection open all the time
16
17
  // reduces the performance hit
17
18
  exports.init = () => __awaiter(void 0, void 0, void 0, function* () {
18
19
  devAppClient = new Client(utils.Databases.DEV_LOCKS);
19
20
  debounceClient = new Client(utils.Databases.DEBOUNCE);
21
+ flagClient = new Client(utils.Databases.FLAGS);
20
22
  yield devAppClient.init();
21
23
  yield debounceClient.init();
24
+ yield flagClient.init();
22
25
  });
23
26
  exports.shutdown = () => __awaiter(void 0, void 0, void 0, function* () {
24
27
  if (devAppClient)
25
28
  yield devAppClient.finish();
26
29
  if (debounceClient)
27
30
  yield debounceClient.finish();
31
+ if (flagClient)
32
+ yield flagClient.finish();
28
33
  });
29
34
  exports.doesUserHaveLock = (devAppId, user) => __awaiter(void 0, void 0, void 0, function* () {
30
35
  const value = yield devAppClient.get(devAppId);
@@ -66,3 +71,13 @@ exports.checkDebounce = (id) => __awaiter(void 0, void 0, void 0, function* () {
66
71
  exports.setDebounce = (id, seconds) => __awaiter(void 0, void 0, void 0, function* () {
67
72
  yield debounceClient.store(id, "debouncing", seconds);
68
73
  });
74
+ exports.setTestFlag = (id) => __awaiter(void 0, void 0, void 0, function* () {
75
+ yield flagClient.store(id, { testing: true }, AUTOMATION_TEST_FLAG_SECONDS);
76
+ });
77
+ exports.checkTestFlag = (id) => __awaiter(void 0, void 0, void 0, function* () {
78
+ const flag = yield flagClient.get(id);
79
+ return !!(flag && flag.testing);
80
+ });
81
+ exports.clearTestFlag = (id) => __awaiter(void 0, void 0, void 0, function* () {
82
+ yield devAppClient.delete(id);
83
+ });
@@ -190,10 +190,11 @@ exports.inputProcessing = (user = {}, table, row) => {
190
190
  * @param {object} ctx the request which is looking for enriched rows.
191
191
  * @param {object} table the table from which these rows came from originally, this is used to determine
192
192
  * the schema of the rows and then enrich.
193
- * @param {object[]} rows the rows which are to be enriched.
194
- * @returns {object[]} the enriched rows will be returned.
193
+ * @param {object[]|object} rows the rows which are to be enriched.
194
+ * @param {object} opts used to set some options for the output, such as disabling relationship squashing.
195
+ * @returns {object[]|object} the enriched rows will be returned.
195
196
  */
196
- exports.outputProcessing = (ctx, table, rows) => __awaiter(void 0, void 0, void 0, function* () {
197
+ exports.outputProcessing = (ctx, table, rows, opts = { squash: true }) => __awaiter(void 0, void 0, void 0, function* () {
197
198
  const appId = ctx.appId;
198
199
  let wasArray = true;
199
200
  if (!(rows instanceof Array)) {
@@ -217,6 +218,8 @@ exports.outputProcessing = (ctx, table, rows) => __awaiter(void 0, void 0, void
217
218
  }
218
219
  }
219
220
  }
220
- enriched = yield linkRows.squashLinksToPrimaryDisplay(appId, table, enriched);
221
+ if (opts.squash) {
222
+ enriched = yield linkRows.squashLinksToPrimaryDisplay(appId, table, enriched);
223
+ }
221
224
  return wasArray ? enriched : enriched[0];
222
225
  });
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@budibase/server",
3
3
  "email": "hi@budibase.com",
4
- "version": "0.9.138",
4
+ "version": "0.9.140-alpha.2",
5
5
  "description": "Budibase Web Server",
6
6
  "main": "src/index.js",
7
7
  "repository": {
@@ -13,7 +13,7 @@
13
13
  "postbuild": "copyfiles -u 1 src/**/*.svelte dist/ && copyfiles -u 1 src/**/*.hbs dist/ && copyfiles -u 1 src/**/*.json dist/",
14
14
  "test": "jest --coverage --maxWorkers=2",
15
15
  "test:watch": "jest --watch",
16
- "predocker": "copyfiles -f ../client/dist/budibase-client.js ../standard-components/manifest.json client",
16
+ "predocker": "copyfiles -f ../client/dist/budibase-client.js ../client/manifest.json client",
17
17
  "build:docker": "yarn run predocker && docker build . -t app-service",
18
18
  "run:docker": "node dist/index.js",
19
19
  "dev:stack:up": "node scripts/dev/manage.js up",
@@ -23,9 +23,10 @@
23
23
  "format": "prettier --config ../../.prettierrc.json 'src/**/*.ts' --write",
24
24
  "lint": "eslint --fix src/",
25
25
  "lint:fix": "yarn run format && yarn run lint",
26
- "initialise": "node scripts/initialise.js",
27
26
  "multi:enable": "node scripts/multiTenancy.js enable",
28
- "multi:disable": "node scripts/multiTenancy.js disable"
27
+ "multi:disable": "node scripts/multiTenancy.js disable",
28
+ "selfhost:enable": "node scripts/selfhost.js enable",
29
+ "selfhost:disable": "node scripts/selfhost.js disable"
29
30
  },
30
31
  "jest": {
31
32
  "preset": "ts-jest",
@@ -48,7 +49,8 @@
48
49
  "!src/automations/tests/**/*",
49
50
  "!src/utilities/fileProcessor.js",
50
51
  "!src/utilities/fileSystem/**/*",
51
- "!src/utilities/redis.js"
52
+ "!src/utilities/redis.js",
53
+ "!src/api/controllers/row/internalSearch.js"
52
54
  ],
53
55
  "coverageReporters": [
54
56
  "lcov",
@@ -62,9 +64,9 @@
62
64
  "author": "Budibase",
63
65
  "license": "AGPL-3.0-or-later",
64
66
  "dependencies": {
65
- "@budibase/auth": "^0.9.138",
66
- "@budibase/client": "^0.9.138",
67
- "@budibase/string-templates": "^0.9.138",
67
+ "@budibase/auth": "^0.9.140-alpha.2",
68
+ "@budibase/client": "^0.9.140-alpha.2",
69
+ "@budibase/string-templates": "^0.9.140-alpha.2",
68
70
  "@elastic/elasticsearch": "7.10.0",
69
71
  "@koa/router": "8.0.0",
70
72
  "@sendgrid/mail": "7.1.1",
@@ -96,7 +98,7 @@
96
98
  "lodash": "4.17.21",
97
99
  "mongodb": "3.6.3",
98
100
  "mssql": "6.2.3",
99
- "mysql": "2.18.1",
101
+ "mysql": "^2.18.1",
100
102
  "node-fetch": "2.6.0",
101
103
  "open": "7.3.0",
102
104
  "pg": "8.5.1",
@@ -110,14 +112,13 @@
110
112
  "to-json-schema": "0.2.5",
111
113
  "uuid": "3.3.2",
112
114
  "validate.js": "0.13.1",
113
- "worker-farm": "1.7.0",
114
115
  "yargs": "13.2.4",
115
116
  "zlib": "1.0.5"
116
117
  },
117
118
  "devDependencies": {
118
119
  "@babel/core": "^7.14.3",
119
120
  "@babel/preset-env": "^7.14.4",
120
- "@budibase/standard-components": "^0.9.138",
121
+ "@budibase/standard-components": "^0.9.139",
121
122
  "@jest/test-sequencer": "^24.8.0",
122
123
  "@types/bull": "^3.15.1",
123
124
  "@types/jest": "^26.0.23",
@@ -141,5 +142,5 @@
141
142
  "typescript": "^4.3.5",
142
143
  "update-dotenv": "^1.1.1"
143
144
  },
144
- "gitHead": "eaba4c2698bbd64f2513d7ff1ce27cf49d9e4394"
145
+ "gitHead": "53660cfe29eaaa7e89348c367382d04f8f90b2c8"
145
146
  }
@@ -1,6 +1,7 @@
1
1
  const { tmpdir } = require("os")
2
2
  const env = require("../src/environment")
3
3
 
4
+ env._set("SELF_HOSTED", "1")
4
5
  env._set("NODE_ENV", "jest")
5
6
  env._set("JWT_SECRET", "test-jwtsecret")
6
7
  env._set("CLIENT_ID", "test-client-id")
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ const updateDotEnv = require("update-dotenv")
3
+
4
+ const arg = process.argv.slice(2)[0]
5
+
6
+ updateDotEnv({
7
+ SELF_HOSTED: arg === "enable" ? "1" : "0",
8
+ }).then(() => console.log("Updated server!"))
@@ -1,12 +1,14 @@
1
1
  const CouchDB = require("../../db")
2
2
  const actions = require("../../automations/actions")
3
- const logic = require("../../automations/logic")
4
3
  const triggers = require("../../automations/triggers")
5
- const webhooks = require("./webhook")
6
4
  const { getAutomationParams, generateAutomationID } = require("../../db/utils")
7
-
8
- const WH_STEP_ID = triggers.BUILTIN_DEFINITIONS.WEBHOOK.stepId
9
- const CRON_STEP_ID = triggers.BUILTIN_DEFINITIONS.CRON.stepId
5
+ const {
6
+ checkForWebhooks,
7
+ updateTestHistory,
8
+ } = require("../../automations/utils")
9
+ const { deleteEntityMetadata } = require("../../utilities")
10
+ const { MetadataTypes } = require("../../constants")
11
+ const { setTestFlag, clearTestFlag } = require("../../utilities/redis")
10
12
 
11
13
  /*************************
12
14
  * *
@@ -14,6 +16,19 @@ const CRON_STEP_ID = triggers.BUILTIN_DEFINITIONS.CRON.stepId
14
16
  * *
15
17
  *************************/
16
18
 
19
+ async function cleanupAutomationMetadata(appId, automationId) {
20
+ await deleteEntityMetadata(
21
+ appId,
22
+ MetadataTypes.AUTOMATION_TEST_INPUT,
23
+ automationId
24
+ )
25
+ await deleteEntityMetadata(
26
+ appId,
27
+ MetadataTypes.AUTOMATION_TEST_HISTORY,
28
+ automationId
29
+ )
30
+ }
31
+
17
32
  function cleanAutomationInputs(automation) {
18
33
  if (automation == null) {
19
34
  return automation
@@ -21,6 +36,10 @@ function cleanAutomationInputs(automation) {
21
36
  let steps = automation.definition.steps
22
37
  let trigger = automation.definition.trigger
23
38
  let allSteps = [...steps, trigger]
39
+ // live is not a property used anymore
40
+ if (automation.live != null) {
41
+ delete automation.live
42
+ }
24
43
  for (let step of allSteps) {
25
44
  if (step == null) {
26
45
  continue
@@ -34,119 +53,6 @@ function cleanAutomationInputs(automation) {
34
53
  return automation
35
54
  }
36
55
 
37
- /**
38
- * This function handles checking of any cron jobs need to be created or deleted for automations.
39
- * @param {string} appId The ID of the app in which we are checking for webhooks
40
- * @param {object|undefined} oldAuto The old automation object if updating/deleting
41
- * @param {object|undefined} newAuto The new automation object if creating/updating
42
- */
43
- async function checkForCronTriggers({ appId, oldAuto, newAuto }) {
44
- const oldTrigger = oldAuto ? oldAuto.definition.trigger : null
45
- const newTrigger = newAuto ? newAuto.definition.trigger : null
46
- function isCronTrigger(auto) {
47
- return (
48
- auto &&
49
- auto.definition.trigger &&
50
- auto.definition.trigger.stepId === CRON_STEP_ID
51
- )
52
- }
53
-
54
- const isLive = auto => auto && auto.live
55
-
56
- const cronTriggerRemoved =
57
- isCronTrigger(oldAuto) && !isCronTrigger(newAuto) && oldTrigger.cronJobId
58
- const cronTriggerDeactivated = !isLive(newAuto) && isLive(oldAuto)
59
-
60
- const cronTriggerActivated = isLive(newAuto) && !isLive(oldAuto)
61
-
62
- if (cronTriggerRemoved || (cronTriggerDeactivated && oldTrigger.cronJobId)) {
63
- await triggers.automationQueue.removeRepeatableByKey(oldTrigger.cronJobId)
64
- }
65
- // need to create cron job
66
- else if (isCronTrigger(newAuto) && cronTriggerActivated) {
67
- const job = await triggers.automationQueue.add(
68
- {
69
- automation: newAuto,
70
- event: { appId, timestamp: Date.now() },
71
- },
72
- { repeat: { cron: newTrigger.inputs.cron } }
73
- )
74
- // Assign cron job ID from bull so we can remove it later if the cron trigger is removed
75
- newTrigger.cronJobId = job.id
76
- }
77
- return newAuto
78
- }
79
-
80
- /**
81
- * This function handles checking if any webhooks need to be created or deleted for automations.
82
- * @param {string} appId The ID of the app in which we are checking for webhooks
83
- * @param {object|undefined} oldAuto The old automation object if updating/deleting
84
- * @param {object|undefined} newAuto The new automation object if creating/updating
85
- * @returns {Promise<object|undefined>} After this is complete the new automation object may have been updated and should be
86
- * written to DB (this does not write to DB as it would be wasteful to repeat).
87
- */
88
- async function checkForWebhooks({ appId, oldAuto, newAuto }) {
89
- const oldTrigger = oldAuto ? oldAuto.definition.trigger : null
90
- const newTrigger = newAuto ? newAuto.definition.trigger : null
91
- const triggerChanged =
92
- oldTrigger && newTrigger && oldTrigger.id !== newTrigger.id
93
- function isWebhookTrigger(auto) {
94
- return (
95
- auto &&
96
- auto.definition.trigger &&
97
- auto.definition.trigger.stepId === WH_STEP_ID
98
- )
99
- }
100
- // need to delete webhook
101
- if (
102
- isWebhookTrigger(oldAuto) &&
103
- (!isWebhookTrigger(newAuto) || triggerChanged) &&
104
- oldTrigger.webhookId
105
- ) {
106
- try {
107
- let db = new CouchDB(appId)
108
- // need to get the webhook to get the rev
109
- const webhook = await db.get(oldTrigger.webhookId)
110
- const ctx = {
111
- appId,
112
- params: { id: webhook._id, rev: webhook._rev },
113
- }
114
- // might be updating - reset the inputs to remove the URLs
115
- if (newTrigger) {
116
- delete newTrigger.webhookId
117
- newTrigger.inputs = {}
118
- }
119
- await webhooks.destroy(ctx)
120
- } catch (err) {
121
- // don't worry about not being able to delete, if it doesn't exist all good
122
- }
123
- }
124
- // need to create webhook
125
- if (
126
- (!isWebhookTrigger(oldAuto) || triggerChanged) &&
127
- isWebhookTrigger(newAuto)
128
- ) {
129
- const ctx = {
130
- appId,
131
- request: {
132
- body: new webhooks.Webhook(
133
- "Automation webhook",
134
- webhooks.WebhookType.AUTOMATION,
135
- newAuto._id
136
- ),
137
- },
138
- }
139
- await webhooks.save(ctx)
140
- const id = ctx.body.webhook._id
141
- newTrigger.webhookId = id
142
- newTrigger.inputs = {
143
- schemaUrl: `api/webhooks/schema/${appId}/${id}`,
144
- triggerUrl: `api/webhooks/trigger/${appId}/${id}`,
145
- }
146
- }
147
- return newAuto
148
- }
149
-
150
56
  exports.create = async function (ctx) {
151
57
  const db = new CouchDB(ctx.appId)
152
58
  let automation = ctx.request.body
@@ -165,10 +71,6 @@ exports.create = async function (ctx) {
165
71
  appId: ctx.appId,
166
72
  newAuto: automation,
167
73
  })
168
- automation = await checkForCronTriggers({
169
- appId: ctx.appId,
170
- newAuto: automation,
171
- })
172
74
  const response = await db.put(automation)
173
75
  automation._rev = response.rev
174
76
 
@@ -193,14 +95,26 @@ exports.update = async function (ctx) {
193
95
  oldAuto: oldAutomation,
194
96
  newAuto: automation,
195
97
  })
196
- automation = await checkForCronTriggers({
197
- appId: ctx.appId,
198
- oldAuto: oldAutomation,
199
- newAuto: automation,
200
- })
201
98
  const response = await db.put(automation)
202
99
  automation._rev = response.rev
203
100
 
101
+ const oldAutoTrigger =
102
+ oldAutomation && oldAutomation.definition.trigger
103
+ ? oldAutomation.definition.trigger
104
+ : {}
105
+ const newAutoTrigger =
106
+ automation && automation.definition.trigger
107
+ ? automation.definition.trigger
108
+ : {}
109
+ // trigger has been updated, remove the test inputs
110
+ if (oldAutoTrigger.id !== newAutoTrigger.id) {
111
+ await deleteEntityMetadata(
112
+ ctx.appId,
113
+ MetadataTypes.AUTOMATION_TEST_INPUT,
114
+ automation._id
115
+ )
116
+ }
117
+
204
118
  ctx.status = 200
205
119
  ctx.body = {
206
120
  message: `Automation ${automation._id} updated successfully.`,
@@ -229,35 +143,29 @@ exports.find = async function (ctx) {
229
143
 
230
144
  exports.destroy = async function (ctx) {
231
145
  const db = new CouchDB(ctx.appId)
232
- const oldAutomation = await db.get(ctx.params.id)
146
+ const automationId = ctx.params.id
147
+ const oldAutomation = await db.get(automationId)
233
148
  await checkForWebhooks({
234
149
  appId: ctx.appId,
235
150
  oldAuto: oldAutomation,
236
151
  })
237
- await checkForCronTriggers({
238
- appId: ctx.appId,
239
- oldAuto: oldAutomation,
240
- })
241
- ctx.body = await db.remove(ctx.params.id, ctx.params.rev)
152
+ // delete metadata first
153
+ await cleanupAutomationMetadata(ctx.appId, automationId)
154
+ ctx.body = await db.remove(automationId, ctx.params.rev)
242
155
  }
243
156
 
244
157
  exports.getActionList = async function (ctx) {
245
- ctx.body = actions.DEFINITIONS
158
+ ctx.body = actions.ACTION_DEFINITIONS
246
159
  }
247
160
 
248
161
  exports.getTriggerList = async function (ctx) {
249
- ctx.body = triggers.BUILTIN_DEFINITIONS
250
- }
251
-
252
- exports.getLogicList = async function (ctx) {
253
- ctx.body = logic.BUILTIN_DEFINITIONS
162
+ ctx.body = triggers.TRIGGER_DEFINITIONS
254
163
  }
255
164
 
256
165
  module.exports.getDefinitionList = async function (ctx) {
257
166
  ctx.body = {
258
- logic: logic.BUILTIN_DEFINITIONS,
259
- trigger: triggers.BUILTIN_DEFINITIONS,
260
- action: actions.DEFINITIONS,
167
+ trigger: triggers.TRIGGER_DEFINITIONS,
168
+ action: actions.ACTION_DEFINITIONS,
261
169
  }
262
170
  }
263
171
 
@@ -268,15 +176,49 @@ module.exports.getDefinitionList = async function (ctx) {
268
176
  *********************/
269
177
 
270
178
  exports.trigger = async function (ctx) {
271
- const db = new CouchDB(ctx.appId)
179
+ const appId = ctx.appId
180
+ const db = new CouchDB(appId)
272
181
  let automation = await db.get(ctx.params.id)
273
182
  await triggers.externalTrigger(automation, {
274
183
  ...ctx.request.body,
275
- appId: ctx.appId,
184
+ appId,
276
185
  })
277
- ctx.status = 200
278
186
  ctx.body = {
279
187
  message: `Automation ${automation._id} has been triggered.`,
280
188
  automation,
281
189
  }
282
190
  }
191
+
192
+ function prepareTestInput(input) {
193
+ // prepare the test parameters
194
+ if (input.id && input.row) {
195
+ input.row._id = input.id
196
+ }
197
+ if (input.revision && input.row) {
198
+ input.row._rev = input.revision
199
+ }
200
+ return input
201
+ }
202
+
203
+ exports.test = async function (ctx) {
204
+ const appId = ctx.appId
205
+ const db = new CouchDB(appId)
206
+ let automation = await db.get(ctx.params.id)
207
+ await setTestFlag(automation._id)
208
+ const testInput = prepareTestInput(ctx.request.body)
209
+ const response = await triggers.externalTrigger(
210
+ automation,
211
+ {
212
+ ...testInput,
213
+ appId,
214
+ },
215
+ { getResponses: true }
216
+ )
217
+ // save a test history run
218
+ await updateTestHistory(ctx.appId, automation, {
219
+ ...ctx.request.body,
220
+ occurredAt: new Date().getTime(),
221
+ })
222
+ await clearTestFlag(automation._id)
223
+ ctx.body = response
224
+ }
@@ -1,7 +1,11 @@
1
1
  const CouchDB = require("../../../db")
2
2
  const Deployment = require("./Deployment")
3
3
  const { Replication } = require("@budibase/auth/db")
4
- const { DocumentTypes } = require("../../../db/utils")
4
+ const { DocumentTypes, getAutomationParams } = require("../../../db/utils")
5
+ const {
6
+ disableAllCrons,
7
+ enableCronTrigger,
8
+ } = require("../../../automations/utils")
5
9
 
6
10
  // the max time we can wait for an invalidation to complete before considering it failed
7
11
  const MAX_PENDING_TIME_MS = 30 * 60000
@@ -58,6 +62,23 @@ async function storeDeploymentHistory(deployment) {
58
62
  return deployment
59
63
  }
60
64
 
65
+ async function initDeployedApp(prodAppId) {
66
+ const db = new CouchDB(prodAppId)
67
+ const automations = (
68
+ await db.allDocs(
69
+ getAutomationParams(null, {
70
+ include_docs: true,
71
+ })
72
+ )
73
+ ).rows.map(row => row.doc)
74
+ const promises = []
75
+ await disableAllCrons(prodAppId)
76
+ for (let automation of automations) {
77
+ promises.push(enableCronTrigger(prodAppId, automation))
78
+ }
79
+ await Promise.all(promises)
80
+ }
81
+
61
82
  async function deployApp(deployment) {
62
83
  try {
63
84
  const productionAppId = deployment.appId.replace("_dev", "")
@@ -85,6 +106,7 @@ async function deployApp(deployment) {
85
106
  },
86
107
  })
87
108
 
109
+ await initDeployedApp(productionAppId)
88
110
  deployment.setStatus(DeploymentStatus.SUCCESS)
89
111
  await storeDeploymentHistory(deployment)
90
112
  } catch (err) {