Merge pull request #323 from automatisch/new-every-week-trigger
feat: add every week trigger in schedule integration
This commit is contained in:
@@ -183,6 +183,424 @@
|
||||
"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"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Every month",
|
||||
"key": "everyMonth",
|
||||
"description": "Triggers every month.",
|
||||
"substeps": [
|
||||
{
|
||||
"key": "chooseTrigger",
|
||||
"name": "Set up a trigger",
|
||||
"arguments": [
|
||||
{
|
||||
"label": "Day of the month",
|
||||
"key": "day",
|
||||
"type": "dropdown",
|
||||
"required": true,
|
||||
"value": null,
|
||||
"variables": false,
|
||||
"options": [
|
||||
{
|
||||
"label": 1,
|
||||
"value": 1
|
||||
},
|
||||
{
|
||||
"label": 2,
|
||||
"value": 2
|
||||
},
|
||||
{
|
||||
"label": 3,
|
||||
"value": 3
|
||||
},
|
||||
{
|
||||
"label": 4,
|
||||
"value": 4
|
||||
},
|
||||
{
|
||||
"label": 5,
|
||||
"value": 5
|
||||
},
|
||||
{
|
||||
"label": 6,
|
||||
"value": 6
|
||||
},
|
||||
{
|
||||
"label": 7,
|
||||
"value": 7
|
||||
},
|
||||
{
|
||||
"label": 8,
|
||||
"value": 8
|
||||
},
|
||||
{
|
||||
"label": 9,
|
||||
"value": 9
|
||||
},
|
||||
{
|
||||
"label": 10,
|
||||
"value": 10
|
||||
},
|
||||
{
|
||||
"label": 11,
|
||||
"value": 11
|
||||
},
|
||||
{
|
||||
"label": 12,
|
||||
"value": 12
|
||||
},
|
||||
{
|
||||
"label": 13,
|
||||
"value": 13
|
||||
},
|
||||
{
|
||||
"label": 14,
|
||||
"value": 14
|
||||
},
|
||||
{
|
||||
"label": 15,
|
||||
"value": 15
|
||||
},
|
||||
{
|
||||
"label": 16,
|
||||
"value": 16
|
||||
},
|
||||
{
|
||||
"label": 17,
|
||||
"value": 17
|
||||
},
|
||||
{
|
||||
"label": 18,
|
||||
"value": 18
|
||||
},
|
||||
{
|
||||
"label": 19,
|
||||
"value": 19
|
||||
},
|
||||
{
|
||||
"label": 20,
|
||||
"value": 20
|
||||
},
|
||||
{
|
||||
"label": 21,
|
||||
"value": 21
|
||||
},
|
||||
{
|
||||
"label": 22,
|
||||
"value": 22
|
||||
},
|
||||
{
|
||||
"label": 23,
|
||||
"value": 23
|
||||
},
|
||||
{
|
||||
"label": 24,
|
||||
"value": 24
|
||||
},
|
||||
{
|
||||
"label": 25,
|
||||
"value": 25
|
||||
},
|
||||
{
|
||||
"label": 26,
|
||||
"value": 26
|
||||
},
|
||||
{
|
||||
"label": 27,
|
||||
"value": 27
|
||||
},
|
||||
{
|
||||
"label": 28,
|
||||
"value": 28
|
||||
},
|
||||
{
|
||||
"label": 29,
|
||||
"value": 29
|
||||
},
|
||||
{
|
||||
"label": 30,
|
||||
"value": 30
|
||||
},
|
||||
{
|
||||
"label": 31,
|
||||
"value": 31
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"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"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
@@ -1,13 +1,19 @@
|
||||
import { IJSONObject } from '@automatisch/types';
|
||||
import EveryHour from './triggers/every-hour';
|
||||
import EveryDay from './triggers/every-day';
|
||||
import EveryWeek from './triggers/every-week';
|
||||
import EveryMonth from './triggers/every-month';
|
||||
|
||||
export default class Triggers {
|
||||
everyHour: EveryHour;
|
||||
everyDay: EveryDay;
|
||||
everyWeek: EveryWeek;
|
||||
everyMonth: EveryMonth;
|
||||
|
||||
constructor(connectionData: IJSONObject, parameters: IJSONObject) {
|
||||
this.everyHour = new EveryHour(parameters);
|
||||
this.everyDay = new EveryDay(parameters);
|
||||
this.everyWeek = new EveryWeek(parameters);
|
||||
this.everyMonth = new EveryMonth(parameters);
|
||||
}
|
||||
}
|
||||
|
36
packages/backend/src/apps/schedule/triggers/every-month.ts
Normal file
36
packages/backend/src/apps/schedule/triggers/every-month.ts
Normal file
@@ -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 EveryMonth implements ITrigger {
|
||||
day?: number;
|
||||
hour?: number;
|
||||
|
||||
constructor(parameters: IJSONObject) {
|
||||
if (parameters.day) {
|
||||
this.day = parameters.day as number;
|
||||
}
|
||||
|
||||
if (parameters.hour) {
|
||||
this.hour = parameters.hour as number;
|
||||
}
|
||||
}
|
||||
|
||||
get interval() {
|
||||
return cronTimes.everyMonthOnAndAt(this.day, 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;
|
||||
}
|
||||
}
|
36
packages/backend/src/apps/schedule/triggers/every-week.ts
Normal file
36
packages/backend/src/apps/schedule/triggers/every-week.ts
Normal file
@@ -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;
|
||||
}
|
||||
}
|
@@ -6,6 +6,8 @@ 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}`,
|
||||
everyMonthOnAndAt: (day: number, hour: number) => `0 ${hour} ${day} * *`,
|
||||
};
|
||||
|
||||
export function getNextCronDateTime(cronString: string) {
|
||||
|
Reference in New Issue
Block a user