From b00f8764cbd1178d89505db3fbe0c1c3d5070028 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Wed, 8 Sep 2021 14:08:22 +0100 Subject: [PATCH] Updating automations system to return the inputs and outputs of each step. --- .../builderStore/store/automation/index.js | 7 ++- .../automation/SetupPanel/SetupPanel.svelte | 2 +- .../server/src/api/controllers/automation.js | 44 ++++++++++++------- packages/server/src/api/routes/automation.js | 6 +++ packages/server/src/automations/thread.js | 17 ++++++- 5 files changed, 57 insertions(+), 19 deletions(-) diff --git a/packages/builder/src/builderStore/store/automation/index.js b/packages/builder/src/builderStore/store/automation/index.js index c372f27bb7..f8e7db04a0 100644 --- a/packages/builder/src/builderStore/store/automation/index.js +++ b/packages/builder/src/builderStore/store/automation/index.js @@ -78,8 +78,11 @@ const automationActions = store => ({ }, trigger: async ({ automation }) => { const { _id } = automation - const TRIGGER_AUTOMATION_URL = `/api/automations/${_id}/trigger` - return await api.post(TRIGGER_AUTOMATION_URL) + return await api.post(`/api/automations/${_id}/trigger`) + }, + test: async ({ automation }) => { + const { _id } = automation + return await api.post(`/api/automations/${_id}/test`) }, select: automation => { store.update(state => { diff --git a/packages/builder/src/components/automation/SetupPanel/SetupPanel.svelte b/packages/builder/src/components/automation/SetupPanel/SetupPanel.svelte index 3ba59f36a6..bf6c45074c 100644 --- a/packages/builder/src/components/automation/SetupPanel/SetupPanel.svelte +++ b/packages/builder/src/components/automation/SetupPanel/SetupPanel.svelte @@ -25,7 +25,7 @@ } async function testAutomation() { - const result = await automationStore.actions.trigger({ + const result = await automationStore.actions.test({ automation: $automationStore.selectedAutomation.automation, }) if (result.status === 200) { diff --git a/packages/server/src/api/controllers/automation.js b/packages/server/src/api/controllers/automation.js index 7261c3a116..81744a6c3a 100644 --- a/packages/server/src/api/controllers/automation.js +++ b/packages/server/src/api/controllers/automation.js @@ -3,7 +3,12 @@ const actions = require("../../automations/actions") const logic = require("../../automations/logic") const triggers = require("../../automations/triggers") const webhooks = require("./webhook") -const { getAutomationParams, generateAutomationID } = require("../../db/utils") +const { + getAutomationParams, + generateAutomationID, + isDevAppID, + isProdAppID, +} = require("../../db/utils") const WH_STEP_ID = triggers.TRIGGER_DEFINITIONS.WEBHOOK.stepId const CRON_STEP_ID = triggers.TRIGGER_DEFINITIONS.CRON.stepId @@ -268,11 +273,19 @@ module.exports.getDefinitionList = async function (ctx) { *********************/ exports.trigger = async function (ctx) { - const db = new CouchDB(ctx.appId) + const appId = ctx.appId + if (isDevAppID(appId)) { + // in dev apps don't throw an error, just don't trigger + ctx.body = { + message: "Automation not triggered, app in development.", + } + return + } + const db = new CouchDB(appId) let automation = await db.get(ctx.params.id) await triggers.externalTrigger(automation, { ...ctx.request.body, - appId: ctx.appId, + appId, }) ctx.body = { message: `Automation ${automation._id} has been triggered.`, @@ -281,17 +294,18 @@ exports.trigger = async function (ctx) { } exports.test = async function (ctx) { - const db = new CouchDB(ctx.appId) - let automation = await db.get(ctx.params.id) - ctx.body = { - automation, - responses: await triggers.externalTrigger( - automation, - { - ...ctx.request.body, - appId: ctx.appId, - }, - { getResponses: true } - ), + const appId = ctx.appId + if (isProdAppID(appId)) { + ctx.throw(400, "Cannot test automations in production app.") } + const db = new CouchDB(appId) + let automation = await db.get(ctx.params.id) + ctx.body = await triggers.externalTrigger( + automation, + { + ...ctx.request.body, + appId, + }, + { getResponses: true } + ) } diff --git a/packages/server/src/api/routes/automation.js b/packages/server/src/api/routes/automation.js index 416d270ea9..78090f2da0 100644 --- a/packages/server/src/api/routes/automation.js +++ b/packages/server/src/api/routes/automation.js @@ -88,6 +88,12 @@ router "/api/automations/:id/trigger", paramResource("id"), authorized(PermissionTypes.AUTOMATION, PermissionLevels.EXECUTE), + controller.trigger + ) + .post( + "/api/automations/:id/test", + paramResource("id"), + authorized(PermissionTypes.AUTOMATION, PermissionLevels.EXECUTE), controller.test ) .delete( diff --git a/packages/server/src/automations/thread.js b/packages/server/src/automations/thread.js index 0b8e2a981b..12e158c20a 100644 --- a/packages/server/src/automations/thread.js +++ b/packages/server/src/automations/thread.js @@ -30,6 +30,11 @@ class Orchestrator { // create an emitter which has the chain count for this automation run in it, so it can block // excessive chaining if required this._emitter = new AutomationEmitter(this._chainCount + 1) + this.executionOutput = { trigger: {}, steps: [] } + // setup the execution output + const triggerStepId = automation.definition.trigger.stepId + const triggerId = automation.definition.trigger.id + this.updateExecutionOutput(triggerId, triggerStepId, null, triggerOutput) } async getStepFunctionality(type, stepId) { @@ -55,6 +60,15 @@ class Orchestrator { return this._app } + updateExecutionOutput(id, stepId, inputs, outputs) { + const stepObj = { id, stepId, inputs, outputs } + // first entry is always the trigger (constructor) + if (this.executionOutput.steps.length === 0) { + this.executionOutput.trigger = stepObj + } + this.executionOutput.steps.push(stepObj) + } + async execute() { let automation = this._automation const app = await this.getApp() @@ -81,12 +95,13 @@ class Orchestrator { break } this._context.steps.push(outputs) + this.updateExecutionOutput(step.id, step.stepId, step.inputs, outputs) } catch (err) { console.error(`Automation error - ${step.stepId} - ${err}`) return err } } - return this._context + return this.executionOutput } }