From 8117089f342c53f1417a44581d8e3106001901f6 Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Sat, 7 May 2022 13:56:57 +0200 Subject: [PATCH] feat: add every day trigger in schedule integration --- packages/backend/src/apps/schedule/info.json | 142 ++++++++++++++++++ .../backend/src/apps/schedule/triggers.ts | 3 + .../src/apps/schedule/triggers/every-day.ts | 40 +++++ packages/backend/src/apps/schedule/utils.ts | 2 + .../web/src/components/InputCreator/index.tsx | 2 +- 5 files changed, 188 insertions(+), 1 deletion(-) create mode 100644 packages/backend/src/apps/schedule/triggers/every-day.ts diff --git a/packages/backend/src/apps/schedule/info.json b/packages/backend/src/apps/schedule/info.json index d9ef1af1..779c0516 100644 --- a/packages/backend/src/apps/schedule/info.json +++ b/packages/backend/src/apps/schedule/info.json @@ -41,6 +41,148 @@ "name": "Test trigger" } ] + }, + { + "name": "Every day", + "key": "everyDay", + "description": "Triggers every day.", + "substeps": [ + { + "key": "chooseTrigger", + "name": "Set up a trigger", + "arguments": [ + { + "label": "Trigger on weekends?", + "key": "triggersOnWeekend", + "type": "dropdown", + "description": "Should this flow trigger on Saturday and Sunday?", + "required": true, + "value": true, + "variables": false, + "options": [ + { + "label": "Yes", + "value": true + }, + { + "label": "No", + "value": false + } + ] + }, + { + "label": "Time of day", + "key": "hour", + "type": "dropdown", + "required": true, + "value": null, + "variables": false, + "options": [ + { + "label": "00:00", + "value": 0 + }, + { + "label": "01:00", + "value": 1 + }, + { + "label": "02:00", + "value": 2 + }, + { + "label": "03:00", + "value": 3 + }, + { + "label": "04:00", + "value": 4 + }, + { + "label": "05:00", + "value": 5 + }, + { + "label": "06:00", + "value": 6 + }, + { + "label": "07:00", + "value": 7 + }, + { + "label": "08:00", + "value": 8 + }, + { + "label": "09:00", + "value": 9 + }, + { + "label": "10:00", + "value": 10 + }, + { + "label": "11:00", + "value": 11 + }, + { + "label": "12:00", + "value": 12 + }, + { + "label": "13:00", + "value": 13 + }, + { + "label": "14:00", + "value": 14 + }, + { + "label": "15:00", + "value": 15 + }, + { + "label": "16:00", + "value": 16 + }, + { + "label": "17:00", + "value": 17 + }, + { + "label": "18:00", + "value": 18 + }, + { + "label": "19:00", + "value": 19 + }, + { + "label": "20:00", + "value": 20 + }, + { + "label": "21:00", + "value": 21 + }, + { + "label": "22:00", + "value": 22 + }, + { + "label": "23:00", + "value": 23 + } + ] + } + ] + }, + { + "key": "testStep", + "name": "Test trigger" + } + ] } ] } diff --git a/packages/backend/src/apps/schedule/triggers.ts b/packages/backend/src/apps/schedule/triggers.ts index f638f88e..6f23104b 100644 --- a/packages/backend/src/apps/schedule/triggers.ts +++ b/packages/backend/src/apps/schedule/triggers.ts @@ -1,10 +1,13 @@ import { IJSONObject } from '@automatisch/types'; import EveryHour from './triggers/every-hour'; +import EveryDay from './triggers/every-day'; export default class Triggers { everyHour: EveryHour; + everyDay: EveryDay; constructor(connectionData: IJSONObject, parameters: IJSONObject) { this.everyHour = new EveryHour(parameters); + this.everyDay = new EveryDay(parameters); } } diff --git a/packages/backend/src/apps/schedule/triggers/every-day.ts b/packages/backend/src/apps/schedule/triggers/every-day.ts new file mode 100644 index 00000000..7b8b3490 --- /dev/null +++ b/packages/backend/src/apps/schedule/triggers/every-day.ts @@ -0,0 +1,40 @@ +import { DateTime } from 'luxon'; +import type { IJSONObject, IJSONValue, ITrigger } from '@automatisch/types'; +import { cronTimes, getNextCronDateTime, getDateTimeObjectRepresentation } from '../utils'; + +export default class EveryDay implements ITrigger { + triggersOnWeekend?: boolean; + hour?: number; + + constructor(parameters: IJSONObject) { + if (parameters.triggersOnWeekend) { + this.triggersOnWeekend = parameters.triggersOnWeekend as boolean; + } + + if (parameters.hour) { + this.hour = parameters.hour as number; + } + } + + get interval() { + if (this.triggersOnWeekend) { + return cronTimes.everyDayAt(this.hour); + } + + return cronTimes.everyDayExcludingWeekendsAt(this.hour); + } + + async run(startDateTime: Date) { + const dateTime = DateTime.fromJSDate(startDateTime); + const dateTimeObjectRepresentation = getDateTimeObjectRepresentation(dateTime) as IJSONValue; + + return [dateTimeObjectRepresentation] as IJSONValue; + } + + async testRun() { + const nextCronDateTime = getNextCronDateTime(this.interval); + const dateTimeObjectRepresentation = getDateTimeObjectRepresentation(nextCronDateTime) as IJSONValue; + + return [dateTimeObjectRepresentation] as IJSONValue; + } +} diff --git a/packages/backend/src/apps/schedule/utils.ts b/packages/backend/src/apps/schedule/utils.ts index fff96627..8b95e66a 100644 --- a/packages/backend/src/apps/schedule/utils.ts +++ b/packages/backend/src/apps/schedule/utils.ts @@ -4,6 +4,8 @@ import cronParser from 'cron-parser'; export const cronTimes = { everyHour: '0 * * * *', everyHourExcludingWeekends: '0 * * * 1-5', + everyDayAt: (hour: number) => `0 ${hour} * * *`, + everyDayExcludingWeekendsAt: (hour: number) => `0 ${hour} * * 1-5`, }; export function getNextCronDateTime(cronString: string) { diff --git a/packages/web/src/components/InputCreator/index.tsx b/packages/web/src/components/InputCreator/index.tsx index fee1bb22..f1b74fd1 100644 --- a/packages/web/src/components/InputCreator/index.tsx +++ b/packages/web/src/components/InputCreator/index.tsx @@ -51,7 +51,7 @@ export default function InputCreator(props: InputCreatorProps): React.ReactEleme const computedName = namePrefix ? `${namePrefix}.${name}` : name; if (type === 'dropdown') { - const preparedOptions = schema.options || optionGenerator(data?.getData); + const preparedOptions = schema.options || optionGenerator(data); return (