@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
@@ -1,12 +1,13 @@
1
1
  const rowController = require("../../api/controllers/row")
2
2
  const automationUtils = require("../automationUtils")
3
3
 
4
- module.exports.definition = {
4
+ exports.definition = {
5
5
  name: "Update Row",
6
6
  tagline: "Update a {{inputs.enriched.table.name}} row",
7
7
  icon: "ri-refresh-line",
8
8
  description: "Update a row in your database",
9
9
  type: "ACTION",
10
+ internal: true,
10
11
  stepId: "UPDATE_ROW",
11
12
  inputs: {},
12
13
  schema: {
@@ -53,7 +54,7 @@ module.exports.definition = {
53
54
  },
54
55
  }
55
56
 
56
- module.exports.run = async function ({ inputs, appId, emitter }) {
57
+ exports.run = async function ({ inputs, appId, emitter }) {
57
58
  if (inputs.rowId == null || inputs.row == null) {
58
59
  return {
59
60
  success: false,
@@ -100,7 +101,6 @@ module.exports.run = async function ({ inputs, appId, emitter }) {
100
101
  success: ctx.status === 200,
101
102
  }
102
103
  } catch (err) {
103
- console.error(err)
104
104
  return {
105
105
  success: false,
106
106
  response: err,
@@ -0,0 +1,36 @@
1
+ exports.getFetchResponse = async fetched => {
2
+ let status = fetched.status,
3
+ message
4
+ const contentType = fetched.headers.get("content-type")
5
+ try {
6
+ if (contentType && contentType.indexOf("application/json") !== -1) {
7
+ message = await fetched.json()
8
+ } else {
9
+ message = await fetched.text()
10
+ }
11
+ } catch (err) {
12
+ message = "Failed to retrieve response"
13
+ }
14
+ return { status, message }
15
+ }
16
+
17
+ // need to make sure all ctx structures have the
18
+ // throw added to them, so that controllers don't
19
+ // throw a ctx.throw undefined when error occurs
20
+ exports.buildCtx = (appId, emitter, { body, params } = {}) => {
21
+ const ctx = {
22
+ appId,
23
+ user: { appId },
24
+ eventEmitter: emitter,
25
+ throw: (code, error) => {
26
+ throw error
27
+ },
28
+ }
29
+ if (body) {
30
+ ctx.request = { body }
31
+ }
32
+ if (params) {
33
+ ctx.params = params
34
+ }
35
+ return ctx
36
+ }
@@ -0,0 +1,84 @@
1
+ const fetch = require("node-fetch")
2
+ const { getFetchResponse } = require("./utils")
3
+
4
+ exports.definition = {
5
+ name: "Zapier Webhook",
6
+ stepId: "zapier",
7
+ type: "ACTION",
8
+ internal: false,
9
+ description: "Trigger a Zapier Zap via webhooks",
10
+ tagline: "Trigger a Zapier Zap",
11
+ icon: "ri-flashlight-line",
12
+ schema: {
13
+ inputs: {
14
+ properties: {
15
+ url: {
16
+ type: "string",
17
+ title: "Webhook URL",
18
+ },
19
+ value1: {
20
+ type: "string",
21
+ title: "Payload Value 1",
22
+ },
23
+ value2: {
24
+ type: "string",
25
+ title: "Payload Value 2",
26
+ },
27
+ value3: {
28
+ type: "string",
29
+ title: "Payload Value 3",
30
+ },
31
+ value4: {
32
+ type: "string",
33
+ title: "Payload Value 4",
34
+ },
35
+ value5: {
36
+ type: "string",
37
+ title: "Payload Value 5",
38
+ },
39
+ },
40
+ required: ["url"],
41
+ },
42
+ outputs: {
43
+ properties: {
44
+ httpStatus: {
45
+ type: "number",
46
+ description: "The HTTP status code of the request",
47
+ },
48
+ response: {
49
+ type: "string",
50
+ description: "The response from Zapier",
51
+ },
52
+ },
53
+ },
54
+ },
55
+ }
56
+
57
+ exports.run = async function ({ inputs }) {
58
+ const { url, value1, value2, value3, value4, value5 } = inputs
59
+
60
+ // send the platform to make sure zaps always work, even
61
+ // if no values supplied
62
+ const response = await fetch(url, {
63
+ method: "post",
64
+ body: JSON.stringify({
65
+ platform: "budibase",
66
+ value1,
67
+ value2,
68
+ value3,
69
+ value4,
70
+ value5,
71
+ }),
72
+ headers: {
73
+ "Content-Type": "application/json",
74
+ },
75
+ })
76
+
77
+ const { status, message } = await getFetchResponse(response)
78
+
79
+ return {
80
+ success: status === 200,
81
+ httpStatus: status,
82
+ response: message,
83
+ }
84
+ }
@@ -1,34 +1,18 @@
1
1
  jest.mock("../../utilities/usageQuota")
2
2
  jest.mock("../thread")
3
3
  jest.spyOn(global.console, "error")
4
- jest.mock("worker-farm", () => {
5
- return () => {
6
- const value = jest
7
- .fn()
8
- .mockReturnValueOnce(undefined)
9
- .mockReturnValueOnce("Error")
10
- return (input, callback) => {
11
- workerJob = input
12
- if (callback) {
13
- callback(value())
14
- }
15
- }
16
- }
17
- })
18
4
 
19
5
  require("../../environment")
20
6
  const automation = require("../index")
21
7
  const usageQuota = require("../../utilities/usageQuota")
22
8
  const thread = require("../thread")
23
9
  const triggers = require("../triggers")
24
- const { basicAutomation, basicTable } = require("../../tests/utilities/structures")
10
+ const { basicAutomation } = require("../../tests/utilities/structures")
25
11
  const { wait } = require("../../utilities")
26
12
  const { makePartial } = require("../../tests/utilities")
27
13
  const { cleanInputValues } = require("../automationUtils")
28
14
  const setup = require("./utilities")
29
15
 
30
- let workerJob
31
-
32
16
  usageQuota.getAPIKey.mockReturnValue({ apiKey: "test" })
33
17
 
34
18
  describe("Run through some parts of the automations system", () => {
@@ -44,59 +28,12 @@ describe("Run through some parts of the automations system", () => {
44
28
  it("should be able to init in builder", async () => {
45
29
  await triggers.externalTrigger(basicAutomation(), { a: 1 })
46
30
  await wait(100)
47
- expect(workerJob).toBeUndefined()
48
31
  expect(thread).toHaveBeenCalled()
49
32
  })
50
33
 
51
34
  it("should be able to init in prod", async () => {
52
- await setup.runInProd(async () => {
53
- await triggers.externalTrigger(basicAutomation(), { a: 1 })
54
- await wait(100)
55
- // haven't added a mock implementation so getAPIKey of usageQuota just returns undefined
56
- expect(usageQuota.update).toHaveBeenCalledWith("test", "automationRuns", 1)
57
- expect(workerJob).toBeDefined()
58
- })
59
- })
60
-
61
- it("try error scenario", async () => {
62
- await setup.runInProd(async () => {
63
- // the second call will throw an error
64
- await triggers.externalTrigger(basicAutomation(), { a: 1 })
65
- await wait(100)
66
- expect(console.error).toHaveBeenCalled()
67
- })
68
- })
69
-
70
- it("should be able to check triggering row filling", async () => {
71
- const automation = basicAutomation()
72
- let table = basicTable()
73
- table.schema.boolean = {
74
- type: "boolean",
75
- constraints: {
76
- type: "boolean",
77
- },
78
- }
79
- table.schema.number = {
80
- type: "number",
81
- constraints: {
82
- type: "number",
83
- },
84
- }
85
- table.schema.datetime = {
86
- type: "datetime",
87
- constraints: {
88
- type: "datetime",
89
- },
90
- }
91
- table = await config.createTable(table)
92
- automation.definition.trigger.inputs.tableId = table._id
93
- const params = await triggers.fillRowOutput(automation, { appId: config.getAppId() })
94
- expect(params.row).toBeDefined()
95
- const date = new Date(params.row.datetime)
96
- expect(typeof params.row.name).toBe("string")
97
- expect(typeof params.row.boolean).toBe("boolean")
98
- expect(typeof params.row.number).toBe("number")
99
- expect(date.getFullYear()).toBe(1970)
35
+ await triggers.externalTrigger(basicAutomation(), { a: 1 })
36
+ await wait(100)
100
37
  })
101
38
 
102
39
  it("should check coercion", async () => {
@@ -4,7 +4,7 @@ describe("test the delay logic", () => {
4
4
  it("should be able to run the delay", async () => {
5
5
  const time = 100
6
6
  const before = Date.now()
7
- await setup.runStep(setup.logic.DELAY.stepId, { time: time })
7
+ await setup.runStep(setup.actions.DELAY.stepId, { time: time })
8
8
  const now = Date.now()
9
9
  // divide by two just so that test will always pass as long as there was some sort of delay
10
10
  expect(now - before).toBeGreaterThanOrEqual(time / 2)
@@ -1,48 +1,48 @@
1
1
  const setup = require("./utilities")
2
- const { LogicConditions } = require("../steps/filter")
2
+ const { FilterConditions } = require("../steps/filter")
3
3
 
4
4
  describe("test the filter logic", () => {
5
5
  async function checkFilter(field, condition, value, pass = true) {
6
- let res = await setup.runStep(setup.logic.FILTER.stepId,
6
+ let res = await setup.runStep(setup.actions.FILTER.stepId,
7
7
  { field, condition, value }
8
8
  )
9
9
  expect(res.success).toEqual(pass)
10
10
  }
11
11
 
12
12
  it("should be able test equality", async () => {
13
- await checkFilter("hello", LogicConditions.EQUAL, "hello", true)
14
- await checkFilter("hello", LogicConditions.EQUAL, "no", false)
13
+ await checkFilter("hello", FilterConditions.EQUAL, "hello", true)
14
+ await checkFilter("hello", FilterConditions.EQUAL, "no", false)
15
15
  })
16
16
 
17
17
  it("should be able to test greater than", async () => {
18
- await checkFilter(10, LogicConditions.GREATER_THAN, 5, true)
19
- await checkFilter(10, LogicConditions.GREATER_THAN, 15, false)
18
+ await checkFilter(10, FilterConditions.GREATER_THAN, 5, true)
19
+ await checkFilter(10, FilterConditions.GREATER_THAN, 15, false)
20
20
  })
21
21
 
22
22
  it("should be able to test less than", async () => {
23
- await checkFilter(5, LogicConditions.LESS_THAN, 10, true)
24
- await checkFilter(15, LogicConditions.LESS_THAN, 10, false)
23
+ await checkFilter(5, FilterConditions.LESS_THAN, 10, true)
24
+ await checkFilter(15, FilterConditions.LESS_THAN, 10, false)
25
25
  })
26
26
 
27
27
  it("should be able to in-equality", async () => {
28
- await checkFilter("hello", LogicConditions.NOT_EQUAL, "no", true)
29
- await checkFilter(10, LogicConditions.NOT_EQUAL, 10, false)
28
+ await checkFilter("hello", FilterConditions.NOT_EQUAL, "no", true)
29
+ await checkFilter(10, FilterConditions.NOT_EQUAL, 10, false)
30
30
  })
31
31
 
32
32
  it("check number coercion", async () => {
33
- await checkFilter("10", LogicConditions.GREATER_THAN, "5", true)
33
+ await checkFilter("10", FilterConditions.GREATER_THAN, "5", true)
34
34
  })
35
35
 
36
36
  it("check date coercion", async () => {
37
37
  await checkFilter(
38
38
  (new Date()).toISOString(),
39
- LogicConditions.GREATER_THAN,
39
+ FilterConditions.GREATER_THAN,
40
40
  (new Date(-10000)).toISOString(),
41
41
  true
42
42
  )
43
43
  })
44
44
 
45
45
  it("check objects always false", async () => {
46
- await checkFilter({}, LogicConditions.EQUAL, {}, false)
46
+ await checkFilter({}, FilterConditions.EQUAL, {}, false)
47
47
  })
48
48
  })
@@ -1,6 +1,5 @@
1
1
  const TestConfig = require("../../../tests/utilities/TestConfiguration")
2
2
  const actions = require("../../actions")
3
- const logic = require("../../logic")
4
3
  const emitter = require("../../../events/index")
5
4
  const env = require("../../../environment")
6
5
 
@@ -34,16 +33,7 @@ exports.runInProd = async fn => {
34
33
  }
35
34
 
36
35
  exports.runStep = async function runStep(stepId, inputs) {
37
- let step
38
- if (
39
- Object.values(exports.actions)
40
- .map(action => action.stepId)
41
- .includes(stepId)
42
- ) {
43
- step = await actions.getAction(stepId)
44
- } else {
45
- step = logic.getLogic(stepId)
46
- }
36
+ let step = await actions.getAction(stepId)
47
37
  expect(step).toBeDefined()
48
38
  return step({
49
39
  inputs,
@@ -56,5 +46,4 @@ exports.runStep = async function runStep(stepId, inputs) {
56
46
 
57
47
  exports.apiKey = "test"
58
48
 
59
- exports.actions = actions.BUILTIN_DEFINITIONS
60
- exports.logic = logic.BUILTIN_DEFINITIONS
49
+ exports.actions = actions.ACTION_DEFINITIONS
@@ -1,5 +1,4 @@
1
1
  const actions = require("./actions")
2
- const logic = require("./logic")
3
2
  const automationUtils = require("./automationUtils")
4
3
  const AutomationEmitter = require("../events/AutomationEmitter")
5
4
  const { processObject } = require("@budibase/string-templates")
@@ -8,7 +7,7 @@ const CouchDB = require("../db")
8
7
  const { DocumentTypes } = require("../db/utils")
9
8
  const { doInTenant } = require("@budibase/auth/tenancy")
10
9
 
11
- const FILTER_STEP_ID = logic.BUILTIN_DEFINITIONS.FILTER.stepId
10
+ const FILTER_STEP_ID = actions.ACTION_DEFINITIONS.FILTER.stepId
12
11
 
13
12
  /**
14
13
  * The automation orchestrator is a class responsible for executing automations.
@@ -30,15 +29,15 @@ class Orchestrator {
30
29
  // create an emitter which has the chain count for this automation run in it, so it can block
31
30
  // excessive chaining if required
32
31
  this._emitter = new AutomationEmitter(this._chainCount + 1)
32
+ this.executionOutput = { trigger: {}, steps: [] }
33
+ // setup the execution output
34
+ const triggerStepId = automation.definition.trigger.stepId
35
+ const triggerId = automation.definition.trigger.id
36
+ this.updateExecutionOutput(triggerId, triggerStepId, null, triggerOutput)
33
37
  }
34
38
 
35
- async getStepFunctionality(type, stepId) {
36
- let step = null
37
- if (type === "ACTION") {
38
- step = await actions.getAction(stepId)
39
- } else if (type === "LOGIC") {
40
- step = logic.getLogic(stepId)
41
- }
39
+ async getStepFunctionality(stepId) {
40
+ let step = await actions.getAction(stepId)
42
41
  if (step == null) {
43
42
  throw `Cannot find automation step by name ${stepId}`
44
43
  }
@@ -55,11 +54,20 @@ class Orchestrator {
55
54
  return this._app
56
55
  }
57
56
 
57
+ updateExecutionOutput(id, stepId, inputs, outputs) {
58
+ const stepObj = { id, stepId, inputs, outputs }
59
+ // first entry is always the trigger (constructor)
60
+ if (this.executionOutput.steps.length === 0) {
61
+ this.executionOutput.trigger = stepObj
62
+ }
63
+ this.executionOutput.steps.push(stepObj)
64
+ }
65
+
58
66
  async execute() {
59
67
  let automation = this._automation
60
68
  const app = await this.getApp()
61
69
  for (let step of automation.definition.steps) {
62
- let stepFn = await this.getStepFunctionality(step.type, step.stepId)
70
+ let stepFn = await this.getStepFunctionality(step.stepId)
63
71
  step.inputs = await processObject(step.inputs, this._context)
64
72
  step.inputs = automationUtils.cleanInputValues(
65
73
  step.inputs,
@@ -81,27 +89,20 @@ class Orchestrator {
81
89
  break
82
90
  }
83
91
  this._context.steps.push(outputs)
92
+ this.updateExecutionOutput(step.id, step.stepId, step.inputs, outputs)
84
93
  } catch (err) {
85
94
  console.error(`Automation error - ${step.stepId} - ${err}`)
95
+ return err
86
96
  }
87
97
  }
98
+ return this.executionOutput
88
99
  }
89
100
  }
90
101
 
91
- // callback is required for worker-farm to state that the worker thread has completed
92
- module.exports = async (job, cb = null) => {
93
- try {
94
- const automationOrchestrator = new Orchestrator(
95
- job.data.automation,
96
- job.data.event
97
- )
98
- await automationOrchestrator.execute()
99
- if (cb) {
100
- cb()
101
- }
102
- } catch (err) {
103
- if (cb) {
104
- cb(err)
105
- }
106
- }
102
+ module.exports = async job => {
103
+ const automationOrchestrator = new Orchestrator(
104
+ job.data.automation,
105
+ job.data.event
106
+ )
107
+ return automationOrchestrator.execute()
107
108
  }