From c3dc5bae768c44ceabbf654a37af4a58bfcb2a8a Mon Sep 17 00:00:00 2001 From: Martin McKeaveney Date: Tue, 18 May 2021 21:03:26 +0100 Subject: [PATCH] cron automation trigger end to end --- .../src/components/deploy/DeployModal.svelte | 1 - .../server/src/api/controllers/automation.js | 51 ++++++------------- packages/server/src/automations/thread.js | 2 +- packages/server/src/automations/triggers.js | 19 ++----- packages/server/src/constants/index.js | 2 +- 5 files changed, 23 insertions(+), 52 deletions(-) diff --git a/packages/builder/src/components/deploy/DeployModal.svelte b/packages/builder/src/components/deploy/DeployModal.svelte index 869f4d02ce..48a958dd4b 100644 --- a/packages/builder/src/components/deploy/DeployModal.svelte +++ b/packages/builder/src/components/deploy/DeployModal.svelte @@ -61,7 +61,6 @@ // Required to check any updated deployment statuses between polls function checkIncomingDeploymentStatus(current, incoming) { - console.log(current, incoming) for (let incomingDeployment of incoming) { if ( incomingDeployment.status === DeploymentStatus.FAILURE || diff --git a/packages/server/src/api/controllers/automation.js b/packages/server/src/api/controllers/automation.js index 28c8b515df..4d0dd9023e 100644 --- a/packages/server/src/api/controllers/automation.js +++ b/packages/server/src/api/controllers/automation.js @@ -4,11 +4,6 @@ const logic = require("../../automations/logic") const triggers = require("../../automations/triggers") const webhooks = require("./webhook") const { getAutomationParams, generateAutomationID } = require("../../db/utils") -const { JobQueues } = require("../../constants") -const { utils } = require("@budibase/auth/redis") -const Queue = env.isTest() - ? require("../utilities/queue/inMemoryQueue") - : require("bull") const WH_STEP_ID = triggers.BUILTIN_DEFINITIONS.WEBHOOK.stepId const CRON_STEP_ID = triggers.BUILTIN_DEFINITIONS.CRON.stepId @@ -58,39 +53,21 @@ async function checkForCronTriggers({ appId, oldAuto, newAuto }) { ) } - // TODO: AUTO GENERATED ID THAT CAN BE USED TO KILL THE CRON JOB ON CHANGE + const cronTriggerRemoved = + isCronTrigger(oldAuto) && !isCronTrigger(newAuto) && oldTrigger.cronJobId + const cronTriggerAdded = !isCronTrigger(oldAuto) && isCronTrigger(newAuto) - // need to delete cron trigger - if ( - isCronTrigger(oldAuto) && - !isCronTrigger(newAuto) && - oldTrigger.webhookId - ) { - triggers.automationQueue.add("cron", { repeat: { cron: newAuto.inputs.cron } }); - // let db = new CouchDB(appId) - // // need to get the webhook to get the rev - // const webhook = await db.get(oldTrigger.webhookId) - // const ctx = { - // appId, - // params: { id: webhook._id, rev: webhook._rev }, - // } - // // might be updating - reset the inputs to remove the URLs - // if (newTrigger) { - // delete newTrigger.webhookId - // newTrigger.inputs = {} - // } - // await webhooks.destroy(ctx) + if (cronTriggerRemoved) { + await triggers.automationQueue.removeRepeatableByKey(oldTrigger.cronJobId) } // need to create cron job - else if (!isCronTrigger(oldAuto) && isCronTrigger(newAuto)) { - automationQueue.add(newAuto, { repeat: { cron: newAuto.inputs.cron } }); - - const id = ctx.body.webhook._id - // newTrigger.webhookId = id - // newTrigger.inputs = { - // schemaUrl: `api/webhooks/schema/${appId}/${id}`, - // triggerUrl: `api/webhooks/trigger/${appId}/${id}`, - // } + else if (cronTriggerAdded) { + const job = await triggers.automationQueue.add( + { automation: newAuto, event: { appId } }, + { repeat: { cron: newTrigger.inputs.cron } } + ) + // Assign cron job ID from bull so we can remove it later if the cron trigger is removed + newTrigger.cronJobId = job.id } return newAuto } @@ -243,6 +220,10 @@ exports.destroy = async function (ctx) { appId: ctx.appId, oldAuto: oldAutomation, }) + await checkForCronTriggers({ + appId: ctx.appId, + oldAuto: oldAutomation, + }) ctx.body = await db.remove(ctx.params.id, ctx.params.rev) } diff --git a/packages/server/src/automations/thread.js b/packages/server/src/automations/thread.js index d4c89ac349..7b6d969a98 100644 --- a/packages/server/src/automations/thread.js +++ b/packages/server/src/automations/thread.js @@ -12,7 +12,7 @@ const FILTER_STEP_ID = logic.BUILTIN_DEFINITIONS.FILTER.stepId * inputs and handles any outputs. */ class Orchestrator { - constructor(automation, triggerOutput) { + constructor(automation, triggerOutput = {}) { this._metadata = triggerOutput.metadata this._chainCount = this._metadata ? this._metadata.automationChainCount : 0 this._appId = triggerOutput.appId diff --git a/packages/server/src/automations/triggers.js b/packages/server/src/automations/triggers.js index 6e1cf274aa..65a095890d 100644 --- a/packages/server/src/automations/triggers.js +++ b/packages/server/src/automations/triggers.js @@ -201,7 +201,7 @@ const BUILTIN_DEFINITIONS = { name: "Cron Trigger", event: "cron:trigger", icon: "ri-timer-line", - tagline: "Cron expression", + tagline: "Cron Trigger - {{inputs.cron}}", description: "Triggers automation on a cron schedule.", stepId: "CRON", inputs: {}, @@ -218,19 +218,10 @@ const BUILTIN_DEFINITIONS = { }, outputs: { properties: { - // row: { - // type: "object", - // customType: "row", - // description: "The row that was updated", - // }, - // id: { - // type: "string", - // description: "Row ID - can be used for updating", - // }, - // revision: { - // type: "string", - // description: "Revision of row", - // }, + body: { + type: "object", + description: "Body of the request which hit the webhook", + }, }, // required: ["row", "id"], }, diff --git a/packages/server/src/constants/index.js b/packages/server/src/constants/index.js index 67a6460aad..de1f72d4c6 100644 --- a/packages/server/src/constants/index.js +++ b/packages/server/src/constants/index.js @@ -6,7 +6,7 @@ exports.LOGO_URL = "https://d33wubrfki0l68.cloudfront.net/aac32159d7207b5085e74a7ef67afbb7027786c5/2b1fd/img/logo/bb-emblem.svg" exports.JobQueues = { - AUTOMATIONS: "automationQueue" + AUTOMATIONS: "automationQueue", } exports.FieldTypes = {