refactor: rewrite scheduler as functional

This commit is contained in:
Ali BARIN
2022-10-06 23:11:14 +02:00
committed by Faruk AYDIN
parent 0f3d1f0173
commit 45c0995d9d
16 changed files with 749 additions and 822 deletions

View File

@@ -1,40 +0,0 @@
import { DateTime } from 'luxon';
import type { IStep, IJSONValue, ITrigger } from '@automatisch/types';
import { cronTimes, getNextCronDateTime, getDateTimeObjectRepresentation } from '../utils';
export default class EveryDay implements ITrigger {
triggersOnWeekend?: boolean;
hour?: number;
constructor(parameters: IStep["parameters"]) {
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;
}
}

View File

@@ -0,0 +1,170 @@
import { DateTime } from 'luxon';
import { IGlobalVariable, IJSONValue } from '@automatisch/types';
import cronTimes from '../../common/cron-times';
import getNextCronDateTime from '../../common/get-next-cron-date-time';
import getDateTimeObjectRepresentation from '../../common/get-date-time-object';
export default {
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'
}
],
getInterval(parameters: IGlobalVariable["db"]["step"]["parameters"]) {
if (parameters.triggersOnWeekend as boolean) {
return cronTimes.everyDayAt(parameters.hour as number);
}
return cronTimes.everyDayExcludingWeekendsAt(parameters.hour as number);
},
async run($: IGlobalVariable, startDateTime: Date) {
const dateTime = DateTime.fromJSDate(startDateTime);
const dateTimeObjectRepresentation = getDateTimeObjectRepresentation(dateTime) as IJSONValue;
return [dateTimeObjectRepresentation] as IJSONValue;
},
async testRun($: IGlobalVariable) {
const nextCronDateTime = getNextCronDateTime(this.getInterval($.db.step.parameters));
const dateTimeObjectRepresentation = getDateTimeObjectRepresentation(nextCronDateTime) as IJSONValue;
return [dateTimeObjectRepresentation] as IJSONValue;
},
};

View File

@@ -1,35 +0,0 @@
import { DateTime } from 'luxon';
import type { IStep, IJSONValue, ITrigger } from '@automatisch/types';
import { cronTimes, getNextCronDateTime, getDateTimeObjectRepresentation } from '../utils';
export default class EveryHour implements ITrigger {
triggersOnWeekend?: boolean | string;
constructor(parameters: IStep["parameters"]) {
if (parameters.triggersOnWeekend) {
this.triggersOnWeekend = parameters.triggersOnWeekend as string;
}
}
get interval() {
if (this.triggersOnWeekend) {
return cronTimes.everyHour;
}
return cronTimes.everyHourExcludingWeekends;
}
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;
}
}

View File

@@ -0,0 +1,64 @@
import { DateTime } from 'luxon';
import { IGlobalVariable, IJSONValue } from '@automatisch/types';
import cronTimes from '../../common/cron-times';
import getNextCronDateTime from '../../common/get-next-cron-date-time';
import getDateTimeObjectRepresentation from '../../common/get-date-time-object';
export default {
name: 'Every hour',
key: 'everyHour',
description: 'Triggers every hour.',
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
}
]
}
]
},
{
key: 'testStep',
name: 'Test trigger'
}
],
getInterval(parameters: IGlobalVariable["db"]["step"]["parameters"]) {
if (parameters.triggersOnWeekend) {
return cronTimes.everyHour
}
return cronTimes.everyHourExcludingWeekends;
},
async run($: IGlobalVariable, startDateTime: Date) {
const dateTime = DateTime.fromJSDate(startDateTime);
const dateTimeObjectRepresentation = getDateTimeObjectRepresentation(dateTime) as IJSONValue;
return [dateTimeObjectRepresentation] as IJSONValue;
},
async testRun($: IGlobalVariable) {
const nextCronDateTime = getNextCronDateTime(this.getInterval($.db.step.parameters));
const dateTimeObjectRepresentation = getDateTimeObjectRepresentation(nextCronDateTime) as IJSONValue;
return [dateTimeObjectRepresentation] as IJSONValue;
},
};

View File

@@ -1,36 +0,0 @@
import { DateTime } from 'luxon';
import type { IStep, IJSONValue, ITrigger } from '@automatisch/types';
import { cronTimes, getNextCronDateTime, getDateTimeObjectRepresentation } from '../utils';
export default class EveryMonth implements ITrigger {
day?: number;
hour?: number;
constructor(parameters: IStep["parameters"]) {
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;
}
}

View File

@@ -0,0 +1,283 @@
import { DateTime } from 'luxon';
import { IGlobalVariable, IJSONValue } from '@automatisch/types';
import cronTimes from '../../common/cron-times';
import getNextCronDateTime from '../../common/get-next-cron-date-time';
import getDateTimeObjectRepresentation from '../../common/get-date-time-object';
export default {
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'
}
],
getInterval(parameters: IGlobalVariable["db"]["step"]["parameters"]) {
const interval = cronTimes.everyMonthOnAndAt(parameters.day as number, parameters.hour as number);
return interval;
},
async run($: IGlobalVariable, startDateTime: Date) {
const dateTime = DateTime.fromJSDate(startDateTime);
const dateTimeObjectRepresentation = getDateTimeObjectRepresentation(dateTime) as IJSONValue;
return [dateTimeObjectRepresentation] as IJSONValue;
},
async testRun($: IGlobalVariable) {
const nextCronDateTime = getNextCronDateTime(this.getInterval($.db.step.parameters));
const dateTimeObjectRepresentation = getDateTimeObjectRepresentation(nextCronDateTime) as IJSONValue;
return [dateTimeObjectRepresentation] as IJSONValue;
},
};

View File

@@ -1,36 +0,0 @@
import { DateTime } from 'luxon';
import type { IStep, IJSONValue, ITrigger } from '@automatisch/types';
import { cronTimes, getNextCronDateTime, getDateTimeObjectRepresentation } from '../utils';
export default class EveryWeek implements ITrigger {
weekday?: number;
hour?: number;
constructor(parameters: IStep["parameters"]) {
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;
}
}

View File

@@ -0,0 +1,187 @@
import { DateTime } from 'luxon';
import { IGlobalVariable, IJSONValue } from '@automatisch/types';
import cronTimes from '../../common/cron-times';
import getNextCronDateTime from '../../common/get-next-cron-date-time';
import getDateTimeObjectRepresentation from '../../common/get-date-time-object';
export default {
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'
}
],
getInterval(parameters: IGlobalVariable["db"]["step"]["parameters"]) {
const interval = cronTimes.everyWeekOnAndAt(parameters.weekday as number, parameters.hour as number);
return interval;
},
async run($: IGlobalVariable, startDateTime: Date) {
const dateTime = DateTime.fromJSDate(startDateTime);
const dateTimeObjectRepresentation = getDateTimeObjectRepresentation(dateTime) as IJSONValue;
return [dateTimeObjectRepresentation] as IJSONValue;
},
async testRun($: IGlobalVariable) {
const nextCronDateTime = getNextCronDateTime(this.getInterval($.db.step.parameters));
const dateTimeObjectRepresentation = getDateTimeObjectRepresentation(nextCronDateTime) as IJSONValue;
return [dateTimeObjectRepresentation] as IJSONValue;
},
};