From d065d119c4b15656a3385d57e9ebd739296f41e7 Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Sat, 7 May 2022 15:18:32 +0200 Subject: [PATCH] feat: add every week trigger in schedule integration --- packages/backend/src/apps/schedule/info.json | 161 ++++++++++++++++++ .../backend/src/apps/schedule/triggers.ts | 3 + .../src/apps/schedule/triggers/every-week.ts | 36 ++++ packages/backend/src/apps/schedule/utils.ts | 1 + 4 files changed, 201 insertions(+) create mode 100644 packages/backend/src/apps/schedule/triggers/every-week.ts diff --git a/packages/backend/src/apps/schedule/info.json b/packages/backend/src/apps/schedule/info.json index 779c0516..458366cb 100644 --- a/packages/backend/src/apps/schedule/info.json +++ b/packages/backend/src/apps/schedule/info.json @@ -183,6 +183,167 @@ "name": "Test trigger" } ] + }, + { + "name": "Every week", + "key": "everyWeek", + "description": "Triggers every week.", + "substeps": [ + { + "key": "chooseTrigger", + "name": "Set up a trigger", + "arguments": [ + { + "label": "Day of the week", + "key": "weekday", + "type": "dropdown", + "required": true, + "value": null, + "variables": false, + "options": [ + { + "label": "Monday", + "value": 1 + }, + { + "label": "Tuesday", + "value": 2 + }, + { + "label": "Wednesday", + "value": 3 + }, + { + "label": "Thursday", + "value": 4 + }, + { + "label": "Friday", + "value": 5 + }, + { + "label": "Saturday", + "value": 6 + }, + { + "label": "Sunday", + "value": 0 + } + ] + }, + { + "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 6f23104b..0b692280 100644 --- a/packages/backend/src/apps/schedule/triggers.ts +++ b/packages/backend/src/apps/schedule/triggers.ts @@ -1,13 +1,16 @@ import { IJSONObject } from '@automatisch/types'; import EveryHour from './triggers/every-hour'; import EveryDay from './triggers/every-day'; +import EveryWeek from './triggers/every-week'; export default class Triggers { everyHour: EveryHour; everyDay: EveryDay; + everyWeek: EveryWeek; constructor(connectionData: IJSONObject, parameters: IJSONObject) { this.everyHour = new EveryHour(parameters); this.everyDay = new EveryDay(parameters); + this.everyWeek = new EveryWeek(parameters); } } diff --git a/packages/backend/src/apps/schedule/triggers/every-week.ts b/packages/backend/src/apps/schedule/triggers/every-week.ts new file mode 100644 index 00000000..c92cd647 --- /dev/null +++ b/packages/backend/src/apps/schedule/triggers/every-week.ts @@ -0,0 +1,36 @@ +import { DateTime } from 'luxon'; +import type { IJSONObject, IJSONValue, ITrigger } from '@automatisch/types'; +import { cronTimes, getNextCronDateTime, getDateTimeObjectRepresentation } from '../utils'; + +export default class EveryWeek implements ITrigger { + weekday?: number; + hour?: number; + + constructor(parameters: IJSONObject) { + if (parameters.weekday) { + this.weekday = parameters.weekday as number; + } + + if (parameters.hour) { + this.hour = parameters.hour as number; + } + } + + get interval() { + return cronTimes.everyWeekOnAndAt(this.weekday, 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 8b95e66a..0f03d339 100644 --- a/packages/backend/src/apps/schedule/utils.ts +++ b/packages/backend/src/apps/schedule/utils.ts @@ -6,6 +6,7 @@ export const cronTimes = { everyHourExcludingWeekends: '0 * * * 1-5', everyDayAt: (hour: number) => `0 ${hour} * * *`, everyDayExcludingWeekendsAt: (hour: number) => `0 ${hour} * * 1-5`, + everyWeekOnAndAt: (weekday: number, hour: number) => `0 ${hour} * * ${weekday}`, }; export function getNextCronDateTime(cronString: string) {