@budibase/server 0.9.125-alpha.4 → 0.9.125-alpha.8

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 (270) hide show
  1. package/builder/assets/{index.dc48c234.js → index.cf133375.js} +2 -2
  2. package/builder/assets/{vendor.4af73c18.js → vendor.d8e1ee7b.js} +1 -1
  3. package/builder/index.html +2 -2
  4. package/coverage/clover.xml +1659 -1493
  5. package/coverage/coverage-final.json +101 -87
  6. package/coverage/lcov-report/api/controllers/analytics.js.html +3 -3
  7. package/coverage/lcov-report/api/controllers/apikeys.js.html +6 -6
  8. package/coverage/lcov-report/api/controllers/application.js.html +39 -39
  9. package/coverage/lcov-report/api/controllers/auth.js.html +6 -6
  10. package/coverage/lcov-report/api/controllers/automation.js.html +151 -361
  11. package/coverage/lcov-report/api/controllers/backup.js.html +3 -3
  12. package/coverage/lcov-report/api/controllers/component.js.html +5 -5
  13. package/coverage/lcov-report/api/controllers/datasource.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/dev.js.html +15 -15
  15. package/coverage/lcov-report/api/controllers/hosting.js.html +8 -8
  16. package/coverage/lcov-report/api/controllers/index.html +39 -24
  17. package/coverage/lcov-report/api/controllers/integration.js.html +4 -4
  18. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/metadata.js.html +218 -0
  20. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/query.js.html +6 -12
  22. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/routing.js.html +9 -9
  24. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/row/index.html +20 -20
  26. package/coverage/lcov-report/api/controllers/row/index.js.html +14 -14
  27. package/coverage/lcov-report/api/controllers/row/internal.js.html +95 -62
  28. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  29. package/coverage/lcov-report/api/controllers/row/utils.js.html +10 -10
  30. package/coverage/lcov-report/api/controllers/screen.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  32. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  33. package/coverage/lcov-report/api/controllers/table/index.js.html +24 -24
  34. package/coverage/lcov-report/api/controllers/table/utils.js.html +32 -32
  35. package/coverage/lcov-report/api/controllers/templates.js.html +5 -5
  36. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  39. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  40. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  41. package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
  42. package/coverage/lcov-report/api/index.html +1 -1
  43. package/coverage/lcov-report/api/index.js.html +23 -23
  44. package/coverage/lcov-report/api/routes/analytics.js.html +6 -6
  45. package/coverage/lcov-report/api/routes/apikeys.js.html +8 -8
  46. package/coverage/lcov-report/api/routes/application.js.html +8 -8
  47. package/coverage/lcov-report/api/routes/auth.js.html +6 -6
  48. package/coverage/lcov-report/api/routes/automation.js.html +41 -26
  49. package/coverage/lcov-report/api/routes/backup.js.html +8 -8
  50. package/coverage/lcov-report/api/routes/component.js.html +8 -8
  51. package/coverage/lcov-report/api/routes/datasource.js.html +13 -13
  52. package/coverage/lcov-report/api/routes/deploy.js.html +8 -8
  53. package/coverage/lcov-report/api/routes/dev.js.html +11 -11
  54. package/coverage/lcov-report/api/routes/hosting.js.html +8 -8
  55. package/coverage/lcov-report/api/routes/index.html +24 -9
  56. package/coverage/lcov-report/api/routes/index.js.html +36 -30
  57. package/coverage/lcov-report/api/routes/integration.js.html +8 -8
  58. package/coverage/lcov-report/api/routes/layout.js.html +8 -8
  59. package/coverage/lcov-report/api/routes/metadata.js.html +194 -0
  60. package/coverage/lcov-report/api/routes/permission.js.html +12 -12
  61. package/coverage/lcov-report/api/routes/query.js.html +13 -13
  62. package/coverage/lcov-report/api/routes/role.js.html +12 -12
  63. package/coverage/lcov-report/api/routes/routing.js.html +8 -8
  64. package/coverage/lcov-report/api/routes/row.js.html +10 -10
  65. package/coverage/lcov-report/api/routes/screen.js.html +11 -11
  66. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/static.js.html +13 -13
  68. package/coverage/lcov-report/api/routes/table.js.html +12 -12
  69. package/coverage/lcov-report/api/routes/templates.js.html +8 -8
  70. package/coverage/lcov-report/api/routes/user.js.html +9 -9
  71. package/coverage/lcov-report/api/routes/view.js.html +11 -11
  72. package/coverage/lcov-report/api/routes/webhook.js.html +11 -11
  73. package/coverage/lcov-report/automations/actions.js.html +38 -107
  74. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  75. package/coverage/lcov-report/automations/bullboard.js.html +46 -16
  76. package/coverage/lcov-report/automations/index.html +67 -67
  77. package/coverage/lcov-report/automations/index.js.html +26 -128
  78. package/coverage/lcov-report/automations/steps/bash.js.html +33 -12
  79. package/coverage/lcov-report/automations/steps/createRow.js.html +8 -8
  80. package/coverage/lcov-report/automations/steps/delay.js.html +45 -6
  81. package/coverage/lcov-report/automations/steps/deleteRow.js.html +8 -8
  82. package/coverage/lcov-report/automations/steps/discord.js.html +329 -0
  83. package/coverage/lcov-report/automations/steps/executeQuery.js.html +19 -31
  84. package/coverage/lcov-report/automations/steps/executeScript.js.html +18 -30
  85. package/coverage/lcov-report/automations/steps/filter.js.html +22 -19
  86. package/coverage/lcov-report/automations/steps/index.html +125 -65
  87. package/coverage/lcov-report/automations/steps/integromat.js.html +341 -0
  88. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +26 -32
  89. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +9 -9
  90. package/coverage/lcov-report/automations/steps/serverLog.js.html +20 -8
  91. package/coverage/lcov-report/automations/steps/{sendgridEmail.js.html → slack.js.html} +57 -87
  92. package/coverage/lcov-report/automations/steps/updateRow.js.html +7 -7
  93. package/coverage/lcov-report/automations/steps/utils.js.html +188 -0
  94. package/coverage/lcov-report/automations/steps/zapier.js.html +332 -0
  95. package/coverage/lcov-report/automations/thread.js.html +79 -76
  96. package/coverage/lcov-report/automations/triggerInfo/app.js.html +173 -0
  97. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +173 -0
  98. package/coverage/lcov-report/automations/triggerInfo/index.html +201 -0
  99. package/coverage/lcov-report/automations/triggerInfo/index.js.html +125 -0
  100. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +176 -0
  101. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +200 -0
  102. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +200 -0
  103. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +188 -0
  104. package/coverage/lcov-report/automations/triggers.js.html +54 -819
  105. package/coverage/lcov-report/automations/utils.js.html +557 -0
  106. package/coverage/lcov-report/constants/index.html +5 -5
  107. package/coverage/lcov-report/constants/index.js.html +19 -4
  108. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  109. package/coverage/lcov-report/constants/screens.js.html +2 -2
  110. package/coverage/lcov-report/db/client.js.html +1 -1
  111. package/coverage/lcov-report/db/index.html +19 -19
  112. package/coverage/lcov-report/db/index.js.html +1 -1
  113. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +73 -73
  114. package/coverage/lcov-report/db/linkedRows/index.html +17 -17
  115. package/coverage/lcov-report/db/linkedRows/index.js.html +79 -115
  116. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +31 -31
  117. package/coverage/lcov-report/db/newid.js.html +2 -2
  118. package/coverage/lcov-report/db/utils.js.html +79 -28
  119. package/coverage/lcov-report/events/AutomationEmitter.js.html +7 -7
  120. package/coverage/lcov-report/events/index.html +1 -1
  121. package/coverage/lcov-report/events/index.js.html +2 -2
  122. package/coverage/lcov-report/events/utils.js.html +1 -1
  123. package/coverage/lcov-report/index.html +115 -100
  124. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  125. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  126. package/coverage/lcov-report/{automations/logic.js.html → middleware/appInfo.js.html} +35 -38
  127. package/coverage/lcov-report/middleware/authorized.js.html +16 -16
  128. package/coverage/lcov-report/middleware/builder.js.html +15 -15
  129. package/coverage/lcov-report/middleware/currentapp.js.html +33 -33
  130. package/coverage/lcov-report/middleware/index.html +23 -8
  131. package/coverage/lcov-report/middleware/joi-validator.js.html +6 -6
  132. package/coverage/lcov-report/middleware/resourceId.js.html +28 -28
  133. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  134. package/coverage/lcov-report/middleware/usageQuota.js.html +8 -8
  135. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  136. package/coverage/lcov-report/utilities/budibaseDir.js.html +7 -7
  137. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  138. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  139. package/coverage/lcov-report/utilities/global.js.html +21 -21
  140. package/coverage/lcov-report/utilities/index.html +18 -18
  141. package/coverage/lcov-report/utilities/index.js.html +167 -14
  142. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +12 -12
  143. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  144. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  145. package/coverage/lcov-report/utilities/routing/index.js.html +6 -6
  146. package/coverage/lcov-report/utilities/rowProcessor/index.html +14 -14
  147. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +87 -51
  148. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +8 -8
  149. package/coverage/lcov-report/utilities/security.js.html +2 -2
  150. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  151. package/coverage/lcov-report/utilities/users.js.html +1 -1
  152. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  153. package/coverage/lcov.info +2641 -2357
  154. package/dist/api/controllers/automation.js +49 -127
  155. package/dist/api/controllers/deploy/index.js +17 -1
  156. package/dist/api/controllers/metadata.js +49 -0
  157. package/dist/api/controllers/query.js +0 -2
  158. package/dist/api/controllers/row/internal.js +33 -23
  159. package/dist/api/routes/automation.js +4 -5
  160. package/dist/api/routes/index.js +2 -0
  161. package/dist/api/routes/metadata.js +13 -0
  162. package/dist/api/routes/tests/utilities/TestFunctions.js +13 -0
  163. package/dist/app.js +1 -1
  164. package/dist/automations/actions.js +26 -46
  165. package/dist/automations/bullboard.js +10 -2
  166. package/dist/automations/index.js +11 -48
  167. package/dist/automations/steps/bash.js +11 -5
  168. package/dist/automations/steps/createRow.js +4 -4
  169. package/dist/automations/steps/delay.js +15 -2
  170. package/dist/automations/steps/deleteRow.js +4 -4
  171. package/dist/automations/steps/discord.js +91 -0
  172. package/dist/automations/steps/executeQuery.js +11 -14
  173. package/dist/automations/steps/executeScript.js +11 -14
  174. package/dist/automations/steps/filter.js +18 -17
  175. package/dist/automations/steps/integromat.js +94 -0
  176. package/dist/automations/steps/outgoingWebhook.js +12 -16
  177. package/dist/automations/steps/sendSmtpEmail.js +3 -3
  178. package/dist/automations/steps/serverLog.js +6 -2
  179. package/dist/automations/steps/slack.js +73 -0
  180. package/dist/automations/steps/updateRow.js +3 -3
  181. package/dist/automations/steps/utils.js +46 -0
  182. package/dist/automations/steps/zapier.js +91 -0
  183. package/dist/automations/tests/utilities/index.js +2 -12
  184. package/dist/automations/thread.js +23 -25
  185. package/dist/automations/triggerInfo/app.js +32 -0
  186. package/dist/automations/triggerInfo/cron.js +32 -0
  187. package/dist/automations/triggerInfo/index.js +15 -0
  188. package/dist/automations/triggerInfo/rowDeleted.js +33 -0
  189. package/dist/automations/triggerInfo/rowSaved.js +41 -0
  190. package/dist/automations/triggerInfo/rowUpdated.js +41 -0
  191. package/dist/automations/triggerInfo/webhook.js +37 -0
  192. package/dist/automations/triggers.js +27 -284
  193. package/dist/automations/utils.js +143 -0
  194. package/dist/constants/index.js +4 -0
  195. package/dist/db/linkedRows/index.js +14 -26
  196. package/dist/db/utils.js +14 -1
  197. package/dist/environment.js +1 -0
  198. package/dist/integrations/mysql.js +1 -1
  199. package/dist/middleware/appInfo.js +17 -0
  200. package/dist/middleware/usageQuota.js +1 -1
  201. package/dist/package.json +7 -6
  202. package/dist/tsconfig.tsbuildinfo +1 -1
  203. package/dist/utilities/fileSystem/index.js +0 -26
  204. package/dist/utilities/index.js +54 -0
  205. package/dist/utilities/redis.js +16 -1
  206. package/dist/utilities/rowProcessor/index.js +7 -4
  207. package/package.json +8 -7
  208. package/scripts/selfhost.js +8 -0
  209. package/src/api/controllers/automation.js +75 -145
  210. package/src/api/controllers/deploy/index.js +23 -1
  211. package/src/api/controllers/metadata.js +46 -0
  212. package/src/api/controllers/query.js +0 -2
  213. package/src/api/controllers/row/internal.js +34 -23
  214. package/src/api/routes/automation.js +16 -11
  215. package/src/api/routes/index.js +2 -0
  216. package/src/api/routes/metadata.js +38 -0
  217. package/src/api/routes/tests/automation.spec.js +4 -26
  218. package/src/api/routes/tests/metadata.spec.js +65 -0
  219. package/src/api/routes/tests/utilities/TestFunctions.js +14 -0
  220. package/src/app.ts +1 -1
  221. package/src/automations/actions.js +26 -49
  222. package/src/automations/bullboard.js +12 -2
  223. package/src/automations/index.js +11 -45
  224. package/src/automations/steps/bash.js +12 -5
  225. package/src/automations/steps/createRow.js +4 -4
  226. package/src/automations/steps/delay.js +15 -2
  227. package/src/automations/steps/deleteRow.js +4 -4
  228. package/src/automations/steps/discord.js +83 -0
  229. package/src/automations/steps/executeQuery.js +11 -15
  230. package/src/automations/steps/executeScript.js +11 -15
  231. package/src/automations/steps/filter.js +18 -17
  232. package/src/automations/steps/integromat.js +87 -0
  233. package/src/automations/steps/outgoingWebhook.js +12 -14
  234. package/src/automations/steps/sendSmtpEmail.js +3 -3
  235. package/src/automations/steps/serverLog.js +6 -2
  236. package/src/automations/steps/slack.js +64 -0
  237. package/src/automations/steps/updateRow.js +3 -3
  238. package/src/automations/steps/utils.js +36 -0
  239. package/src/automations/steps/zapier.js +84 -0
  240. package/src/automations/tests/automation.spec.js +3 -66
  241. package/src/automations/tests/delay.spec.js +1 -1
  242. package/src/automations/tests/filter.spec.js +13 -13
  243. package/src/automations/tests/utilities/index.js +2 -13
  244. package/src/automations/thread.js +27 -26
  245. package/src/automations/triggerInfo/app.js +31 -0
  246. package/src/automations/triggerInfo/cron.js +31 -0
  247. package/src/automations/triggerInfo/index.js +15 -0
  248. package/src/automations/triggerInfo/rowDeleted.js +32 -0
  249. package/src/automations/triggerInfo/rowSaved.js +40 -0
  250. package/src/automations/triggerInfo/rowUpdated.js +40 -0
  251. package/src/automations/triggerInfo/webhook.js +36 -0
  252. package/src/automations/triggers.js +33 -288
  253. package/src/automations/utils.js +159 -0
  254. package/src/constants/index.js +5 -0
  255. package/src/db/linkedRows/index.js +15 -27
  256. package/src/db/tests/linkTests.spec.js +0 -12
  257. package/src/db/utils.js +17 -0
  258. package/src/environment.js +1 -0
  259. package/src/integrations/mysql.ts +1 -1
  260. package/src/middleware/appInfo.js +19 -0
  261. package/src/middleware/usageQuota.js +1 -1
  262. package/src/utilities/fileSystem/index.js +0 -30
  263. package/src/utilities/index.js +51 -0
  264. package/src/utilities/redis.js +18 -1
  265. package/src/utilities/rowProcessor/index.js +16 -4
  266. package/dist/automations/logic.js +0 -17
  267. package/dist/automations/steps/sendgridEmail.js +0 -85
  268. package/src/automations/logic.js +0 -20
  269. package/src/automations/steps/sendgridEmail.js +0 -74
  270. package/src/automations/tests/sendEmail.spec.js +0 -36
@@ -10,17 +10,23 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  };
11
11
  const CouchDB = require("../../db");
12
12
  const actions = require("../../automations/actions");
13
- const logic = require("../../automations/logic");
14
13
  const triggers = require("../../automations/triggers");
15
- const webhooks = require("./webhook");
16
14
  const { getAutomationParams, generateAutomationID } = require("../../db/utils");
17
- const WH_STEP_ID = triggers.BUILTIN_DEFINITIONS.WEBHOOK.stepId;
18
- const CRON_STEP_ID = triggers.BUILTIN_DEFINITIONS.CRON.stepId;
15
+ const { checkForWebhooks, updateTestHistory, } = require("../../automations/utils");
16
+ const { deleteEntityMetadata } = require("../../utilities");
17
+ const { MetadataTypes } = require("../../constants");
18
+ const { setTestFlag, clearTestFlag } = require("../../utilities/redis");
19
19
  /*************************
20
20
  * *
21
21
  * BUILDER FUNCTIONS *
22
22
  * *
23
23
  *************************/
24
+ function cleanupAutomationMetadata(appId, automationId) {
25
+ return __awaiter(this, void 0, void 0, function* () {
26
+ yield deleteEntityMetadata(appId, MetadataTypes.AUTOMATION_TEST_INPUT, automationId);
27
+ yield deleteEntityMetadata(appId, MetadataTypes.AUTOMATION_TEST_HISTORY, automationId);
28
+ });
29
+ }
24
30
  function cleanAutomationInputs(automation) {
25
31
  if (automation == null) {
26
32
  return automation;
@@ -28,6 +34,10 @@ function cleanAutomationInputs(automation) {
28
34
  let steps = automation.definition.steps;
29
35
  let trigger = automation.definition.trigger;
30
36
  let allSteps = [...steps, trigger];
37
+ // live is not a property used anymore
38
+ if (automation.live != null) {
39
+ delete automation.live;
40
+ }
31
41
  for (let step of allSteps) {
32
42
  if (step == null) {
33
43
  continue;
@@ -40,101 +50,6 @@ function cleanAutomationInputs(automation) {
40
50
  }
41
51
  return automation;
42
52
  }
43
- /**
44
- * This function handles checking of any cron jobs need to be created or deleted for automations.
45
- * @param {string} appId The ID of the app in which we are checking for webhooks
46
- * @param {object|undefined} oldAuto The old automation object if updating/deleting
47
- * @param {object|undefined} newAuto The new automation object if creating/updating
48
- */
49
- function checkForCronTriggers({ appId, oldAuto, newAuto }) {
50
- return __awaiter(this, void 0, void 0, function* () {
51
- const oldTrigger = oldAuto ? oldAuto.definition.trigger : null;
52
- const newTrigger = newAuto ? newAuto.definition.trigger : null;
53
- function isCronTrigger(auto) {
54
- return (auto &&
55
- auto.definition.trigger &&
56
- auto.definition.trigger.stepId === CRON_STEP_ID);
57
- }
58
- const isLive = auto => auto && auto.live;
59
- const cronTriggerRemoved = isCronTrigger(oldAuto) && !isCronTrigger(newAuto) && oldTrigger.cronJobId;
60
- const cronTriggerDeactivated = !isLive(newAuto) && isLive(oldAuto);
61
- const cronTriggerActivated = isLive(newAuto) && !isLive(oldAuto);
62
- if (cronTriggerRemoved || (cronTriggerDeactivated && oldTrigger.cronJobId)) {
63
- yield triggers.automationQueue.removeRepeatableByKey(oldTrigger.cronJobId);
64
- }
65
- // need to create cron job
66
- else if (isCronTrigger(newAuto) && cronTriggerActivated) {
67
- const job = yield triggers.automationQueue.add({
68
- automation: newAuto,
69
- event: { appId, timestamp: Date.now() },
70
- }, { repeat: { cron: newTrigger.inputs.cron } });
71
- // Assign cron job ID from bull so we can remove it later if the cron trigger is removed
72
- newTrigger.cronJobId = job.id;
73
- }
74
- return newAuto;
75
- });
76
- }
77
- /**
78
- * This function handles checking if any webhooks need to be created or deleted for automations.
79
- * @param {string} appId The ID of the app in which we are checking for webhooks
80
- * @param {object|undefined} oldAuto The old automation object if updating/deleting
81
- * @param {object|undefined} newAuto The new automation object if creating/updating
82
- * @returns {Promise<object|undefined>} After this is complete the new automation object may have been updated and should be
83
- * written to DB (this does not write to DB as it would be wasteful to repeat).
84
- */
85
- function checkForWebhooks({ appId, oldAuto, newAuto }) {
86
- return __awaiter(this, void 0, void 0, function* () {
87
- const oldTrigger = oldAuto ? oldAuto.definition.trigger : null;
88
- const newTrigger = newAuto ? newAuto.definition.trigger : null;
89
- const triggerChanged = oldTrigger && newTrigger && oldTrigger.id !== newTrigger.id;
90
- function isWebhookTrigger(auto) {
91
- return (auto &&
92
- auto.definition.trigger &&
93
- auto.definition.trigger.stepId === WH_STEP_ID);
94
- }
95
- // need to delete webhook
96
- if (isWebhookTrigger(oldAuto) &&
97
- (!isWebhookTrigger(newAuto) || triggerChanged) &&
98
- oldTrigger.webhookId) {
99
- try {
100
- let db = new CouchDB(appId);
101
- // need to get the webhook to get the rev
102
- const webhook = yield db.get(oldTrigger.webhookId);
103
- const ctx = {
104
- appId,
105
- params: { id: webhook._id, rev: webhook._rev },
106
- };
107
- // might be updating - reset the inputs to remove the URLs
108
- if (newTrigger) {
109
- delete newTrigger.webhookId;
110
- newTrigger.inputs = {};
111
- }
112
- yield webhooks.destroy(ctx);
113
- }
114
- catch (err) {
115
- // don't worry about not being able to delete, if it doesn't exist all good
116
- }
117
- }
118
- // need to create webhook
119
- if ((!isWebhookTrigger(oldAuto) || triggerChanged) &&
120
- isWebhookTrigger(newAuto)) {
121
- const ctx = {
122
- appId,
123
- request: {
124
- body: new webhooks.Webhook("Automation webhook", webhooks.WebhookType.AUTOMATION, newAuto._id),
125
- },
126
- };
127
- yield webhooks.save(ctx);
128
- const id = ctx.body.webhook._id;
129
- newTrigger.webhookId = id;
130
- newTrigger.inputs = {
131
- schemaUrl: `api/webhooks/schema/${appId}/${id}`,
132
- triggerUrl: `api/webhooks/trigger/${appId}/${id}`,
133
- };
134
- }
135
- return newAuto;
136
- });
137
- }
138
53
  exports.create = function (ctx) {
139
54
  return __awaiter(this, void 0, void 0, function* () {
140
55
  const db = new CouchDB(ctx.appId);
@@ -151,10 +66,6 @@ exports.create = function (ctx) {
151
66
  appId: ctx.appId,
152
67
  newAuto: automation,
153
68
  });
154
- automation = yield checkForCronTriggers({
155
- appId: ctx.appId,
156
- newAuto: automation,
157
- });
158
69
  const response = yield db.put(automation);
159
70
  automation._rev = response.rev;
160
71
  ctx.status = 200;
@@ -176,13 +87,18 @@ exports.update = function (ctx) {
176
87
  oldAuto: oldAutomation,
177
88
  newAuto: automation,
178
89
  });
179
- automation = yield checkForCronTriggers({
180
- appId: ctx.appId,
181
- oldAuto: oldAutomation,
182
- newAuto: automation,
183
- });
184
90
  const response = yield db.put(automation);
185
91
  automation._rev = response.rev;
92
+ const oldAutoTrigger = oldAutomation && oldAutomation.definition.trigger
93
+ ? oldAutomation.definition.trigger
94
+ : {};
95
+ const newAutoTrigger = automation && automation.definition.trigger
96
+ ? automation.definition.trigger
97
+ : {};
98
+ // trigger has been updated, remove the test inputs
99
+ if (oldAutoTrigger.id !== newAutoTrigger.id) {
100
+ yield deleteEntityMetadata(ctx.appId, MetadataTypes.AUTOMATION_TEST_INPUT, automation._id);
101
+ }
186
102
  ctx.status = 200;
187
103
  ctx.body = {
188
104
  message: `Automation ${automation._id} updated successfully.`,
@@ -208,39 +124,32 @@ exports.find = function (ctx) {
208
124
  exports.destroy = function (ctx) {
209
125
  return __awaiter(this, void 0, void 0, function* () {
210
126
  const db = new CouchDB(ctx.appId);
211
- const oldAutomation = yield db.get(ctx.params.id);
127
+ const automationId = ctx.params.id;
128
+ const oldAutomation = yield db.get(automationId);
212
129
  yield checkForWebhooks({
213
130
  appId: ctx.appId,
214
131
  oldAuto: oldAutomation,
215
132
  });
216
- yield checkForCronTriggers({
217
- appId: ctx.appId,
218
- oldAuto: oldAutomation,
219
- });
220
- ctx.body = yield db.remove(ctx.params.id, ctx.params.rev);
133
+ // delete metadata first
134
+ yield cleanupAutomationMetadata(ctx.appId, automationId);
135
+ ctx.body = yield db.remove(automationId, ctx.params.rev);
221
136
  });
222
137
  };
223
138
  exports.getActionList = function (ctx) {
224
139
  return __awaiter(this, void 0, void 0, function* () {
225
- ctx.body = actions.DEFINITIONS;
140
+ ctx.body = actions.ACTION_DEFINITIONS;
226
141
  });
227
142
  };
228
143
  exports.getTriggerList = function (ctx) {
229
144
  return __awaiter(this, void 0, void 0, function* () {
230
- ctx.body = triggers.BUILTIN_DEFINITIONS;
231
- });
232
- };
233
- exports.getLogicList = function (ctx) {
234
- return __awaiter(this, void 0, void 0, function* () {
235
- ctx.body = logic.BUILTIN_DEFINITIONS;
145
+ ctx.body = triggers.TRIGGER_DEFINITIONS;
236
146
  });
237
147
  };
238
148
  module.exports.getDefinitionList = function (ctx) {
239
149
  return __awaiter(this, void 0, void 0, function* () {
240
150
  ctx.body = {
241
- logic: logic.BUILTIN_DEFINITIONS,
242
- trigger: triggers.BUILTIN_DEFINITIONS,
243
- action: actions.DEFINITIONS,
151
+ trigger: triggers.TRIGGER_DEFINITIONS,
152
+ action: actions.ACTION_DEFINITIONS,
244
153
  };
245
154
  });
246
155
  };
@@ -251,13 +160,26 @@ module.exports.getDefinitionList = function (ctx) {
251
160
  *********************/
252
161
  exports.trigger = function (ctx) {
253
162
  return __awaiter(this, void 0, void 0, function* () {
254
- const db = new CouchDB(ctx.appId);
163
+ const appId = ctx.appId;
164
+ const db = new CouchDB(appId);
255
165
  let automation = yield db.get(ctx.params.id);
256
- yield triggers.externalTrigger(automation, Object.assign(Object.assign({}, ctx.request.body), { appId: ctx.appId }));
257
- ctx.status = 200;
166
+ yield triggers.externalTrigger(automation, Object.assign(Object.assign({}, ctx.request.body), { appId }));
258
167
  ctx.body = {
259
168
  message: `Automation ${automation._id} has been triggered.`,
260
169
  automation,
261
170
  };
262
171
  });
263
172
  };
173
+ exports.test = function (ctx) {
174
+ return __awaiter(this, void 0, void 0, function* () {
175
+ const appId = ctx.appId;
176
+ const db = new CouchDB(appId);
177
+ let automation = yield db.get(ctx.params.id);
178
+ yield setTestFlag(automation._id);
179
+ const response = yield triggers.externalTrigger(automation, Object.assign(Object.assign({}, ctx.request.body), { appId }), { getResponses: true });
180
+ // save a test history run
181
+ yield updateTestHistory(ctx.appId, automation, Object.assign(Object.assign({}, ctx.request.body), { occurredAt: new Date().getTime() }));
182
+ yield clearTestFlag(automation._id);
183
+ ctx.body = response;
184
+ });
185
+ };
@@ -11,7 +11,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
11
11
  const CouchDB = require("../../../db");
12
12
  const Deployment = require("./Deployment");
13
13
  const { Replication } = require("@budibase/auth/db");
14
- const { DocumentTypes } = require("../../../db/utils");
14
+ const { DocumentTypes, getAutomationParams } = require("../../../db/utils");
15
+ const { disableAllCrons, enableCronTrigger, } = require("../../../automations/utils");
15
16
  // the max time we can wait for an invalidation to complete before considering it failed
16
17
  const MAX_PENDING_TIME_MS = 30 * 60000;
17
18
  const DeploymentStatus = {
@@ -58,6 +59,20 @@ function storeDeploymentHistory(deployment) {
58
59
  return deployment;
59
60
  });
60
61
  }
62
+ function initDeployedApp(prodAppId) {
63
+ return __awaiter(this, void 0, void 0, function* () {
64
+ const db = new CouchDB(prodAppId);
65
+ const automations = (yield db.allDocs(getAutomationParams(null, {
66
+ include_docs: true,
67
+ }))).rows.map(row => row.doc);
68
+ const promises = [];
69
+ yield disableAllCrons(prodAppId);
70
+ for (let automation of automations) {
71
+ promises.push(enableCronTrigger(prodAppId, automation));
72
+ }
73
+ yield Promise.all(promises);
74
+ });
75
+ }
61
76
  function deployApp(deployment) {
62
77
  return __awaiter(this, void 0, void 0, function* () {
63
78
  try {
@@ -82,6 +97,7 @@ function deployApp(deployment) {
82
97
  return doc._id !== DocumentTypes.APP_METADATA;
83
98
  },
84
99
  });
100
+ yield initDeployedApp(productionAppId);
85
101
  deployment.setStatus(DeploymentStatus.SUCCESS);
86
102
  yield storeDeploymentHistory(deployment);
87
103
  }
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ const { MetadataTypes } = require("../../constants");
12
+ const CouchDB = require("../../db");
13
+ const { generateMetadataID } = require("../../db/utils");
14
+ const { saveEntityMetadata, deleteEntityMetadata } = require("../../utilities");
15
+ exports.getTypes = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
16
+ ctx.body = {
17
+ types: MetadataTypes,
18
+ };
19
+ });
20
+ exports.saveMetadata = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
21
+ const { type, entityId } = ctx.params;
22
+ if (type === MetadataTypes.AUTOMATION_TEST_HISTORY) {
23
+ ctx.throw(400, "Cannot save automation history type");
24
+ }
25
+ ctx.body = yield saveEntityMetadata(ctx.appId, type, entityId, ctx.request.body);
26
+ });
27
+ exports.deleteMetadata = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
28
+ const { type, entityId } = ctx.params;
29
+ yield deleteEntityMetadata(ctx.appId, type, entityId);
30
+ ctx.body = {
31
+ message: "Metadata deleted successfully",
32
+ };
33
+ });
34
+ exports.getMetadata = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
35
+ const { type, entityId } = ctx.params;
36
+ const db = new CouchDB(ctx.appId);
37
+ const id = generateMetadataID(type, entityId);
38
+ try {
39
+ ctx.body = yield db.get(id);
40
+ }
41
+ catch (err) {
42
+ if (err.status === 404) {
43
+ ctx.body = {};
44
+ }
45
+ else {
46
+ ctx.throw(err.status, err);
47
+ }
48
+ }
49
+ });
@@ -146,8 +146,6 @@ exports.execute = function (ctx) {
146
146
  }
147
147
  const enrichedQuery = yield enrichQueryFields(query.fields, ctx.request.body.parameters);
148
148
  const integration = new Integration(datasource.config);
149
- console.log(query);
150
- // ctx.body = {}
151
149
  // call the relevant CRUD method on the integration class
152
150
  ctx.body = formatResponse(yield integration[query.queryVerb](enrichedQuery));
153
151
  // cleanup
@@ -34,6 +34,20 @@ const CALCULATION_TYPES = {
34
34
  COUNT: "count",
35
35
  STATS: "stats",
36
36
  };
37
+ function storeResponse(ctx, db, row, oldTable, table) {
38
+ return __awaiter(this, void 0, void 0, function* () {
39
+ row.type = "row";
40
+ const response = yield db.put(row);
41
+ // don't worry about rev, tables handle rev/lastID updates
42
+ if (!isEqual(oldTable, table)) {
43
+ yield db.put(table);
44
+ }
45
+ row._rev = response.rev;
46
+ // process the row before return, to include relationships
47
+ row = yield outputProcessing(ctx, table, row, { squash: false });
48
+ return { row, table };
49
+ });
50
+ }
37
51
  exports.patch = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
38
52
  const appId = ctx.appId;
39
53
  const db = new CouchDB(appId);
@@ -86,14 +100,7 @@ exports.patch = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
86
100
  yield userController.updateMetadata(ctx);
87
101
  return { row: ctx.body, table };
88
102
  }
89
- const response = yield db.put(row);
90
- // don't worry about rev, tables handle rev/lastID updates
91
- if (!isEqual(dbTable, table)) {
92
- yield db.put(table);
93
- }
94
- row._rev = response.rev;
95
- row.type = "row";
96
- return { row, table };
103
+ return storeResponse(ctx, db, row, dbTable, table);
97
104
  });
98
105
  exports.save = function (ctx) {
99
106
  return __awaiter(this, void 0, void 0, function* () {
@@ -122,14 +129,7 @@ exports.save = function (ctx) {
122
129
  tableId: row.tableId,
123
130
  table,
124
131
  });
125
- row.type = "row";
126
- const response = yield db.put(row);
127
- // don't worry about rev, tables handle rev/lastID updates
128
- if (!isEqual(dbTable, table)) {
129
- yield db.put(table);
130
- }
131
- row._rev = response.rev;
132
- return { row, table };
132
+ return storeResponse(ctx, db, row, dbTable, table);
133
133
  });
134
134
  };
135
135
  exports.fetchView = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
@@ -209,41 +209,51 @@ exports.destroy = function (ctx) {
209
209
  const appId = ctx.appId;
210
210
  const db = new CouchDB(appId);
211
211
  const { _id, _rev } = ctx.request.body;
212
- const row = yield db.get(_id);
212
+ let row = yield db.get(_id);
213
213
  if (row.tableId !== ctx.params.tableId) {
214
214
  throw "Supplied tableId doesn't match the row's tableId";
215
215
  }
216
+ const table = yield db.get(row.tableId);
217
+ // update the row to include full relationships before deleting them
218
+ row = yield outputProcessing(ctx, table, row, { squash: false });
219
+ // now remove the relationships
216
220
  yield linkRows.updateLinks({
217
221
  appId,
218
222
  eventType: linkRows.EventType.ROW_DELETE,
219
223
  row,
220
224
  tableId: row.tableId,
221
225
  });
226
+ let response;
222
227
  if (ctx.params.tableId === InternalTables.USER_METADATA) {
223
228
  ctx.params = {
224
229
  id: _id,
225
230
  };
226
231
  yield userController.destroyMetadata(ctx);
227
- return { response: ctx.body, row };
232
+ response = ctx.body;
228
233
  }
229
234
  else {
230
- const response = yield db.remove(_id, _rev);
231
- return { response, row };
235
+ response = yield db.remove(_id, _rev);
232
236
  }
237
+ return { response, row };
233
238
  });
234
239
  };
235
240
  exports.bulkDestroy = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
236
241
  const appId = ctx.appId;
237
- const { rows } = ctx.request.body;
238
242
  const db = new CouchDB(appId);
243
+ const tableId = ctx.params.tableId;
244
+ const table = yield db.get(tableId);
245
+ let { rows } = ctx.request.body;
246
+ // before carrying out any updates, make sure the rows are ready to be returned
247
+ // they need to be the full rows (including previous relationships) for automations
248
+ rows = yield outputProcessing(ctx, table, rows, { squash: false });
249
+ // remove the relationships first
239
250
  let updates = rows.map(row => linkRows.updateLinks({
240
251
  appId,
241
252
  eventType: linkRows.EventType.ROW_DELETE,
242
253
  row,
243
254
  tableId: row.tableId,
244
255
  }));
245
- // TODO remove special user case in future
246
- if (ctx.params.tableId === InternalTables.USER_METADATA) {
256
+ if (tableId === InternalTables.USER_METADATA) {
247
257
  updates = updates.concat(rows.map(row => {
248
258
  ctx.params = {
249
259
  id: row._id,