express-post-task-scheduler
Version:
A lightweight npm package to create and manage scheduled tasks using Express middleware. Configure tasks via POST requests and execute them at specified times seamlessly.
230 lines (229 loc) • 7.24 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.timeRangeObject = timeRangeObject;
exports.taskFilter = taskFilter;
exports.getTasksQueryConditions = getTasksQueryConditions;
exports.recordFilter = recordFilter;
exports.getRecordQueryConditions = getRecordQueryConditions;
const time_1 = require("./time");
/**
* If execute | start | finish exists and the time format is valid, generate the object
*/
function timeRangeObject(timeRange) {
let after = undefined, before = undefined, at = undefined;
// If after or before exists
if (typeof timeRange?.after === "string") {
const { isValid, formattedTime } = (0, time_1.timeConvertor)(timeRange.after, false);
if (isValid)
after = formattedTime;
}
if (typeof timeRange?.before === "string") {
const { isValid, formattedTime } = (0, time_1.timeConvertor)(timeRange.before, false);
if (isValid)
before = formattedTime;
}
// If at exists, ignore after and before
// Because of precision, at is converted to after and before
if (typeof timeRange?.at === "string") {
const { isValid, dayjsObject, formattedTime } = (0, time_1.timeConvertor)(timeRange.at, false);
if (isValid) {
after = formattedTime;
before = dayjsObject?.add(1, "second").format("YYYY-MM-DD HH:mm:ss");
}
}
if (after || before || at) {
return { after, before, at };
}
}
/**
* Generate the filter object for getTasks method inside DB
*/
function taskFilter(filter) {
const filterObject = {
status: undefined,
taskName: undefined,
taskDescription: undefined,
execute: undefined,
start: undefined,
finish: undefined,
};
try {
const parsedFilter = JSON.parse(filter);
// status
if (["waiting", "executing", "finished"].includes(parsedFilter?.status?.toLowerCase())) {
filterObject.status = parsedFilter.status.toLowerCase();
}
// taskName
if (typeof parsedFilter?.taskName === "string") {
filterObject.taskName = parsedFilter.taskName;
}
// taskDescription
if (typeof parsedFilter?.taskDescription === "string") {
filterObject.taskDescription = parsedFilter.taskDescription;
}
// execute time range
if (parsedFilter?.execute) {
const executeTimeRange = timeRangeObject(parsedFilter.execute);
if (executeTimeRange) {
filterObject.execute = executeTimeRange;
}
}
// start time range
if (parsedFilter?.start) {
const startTimeRange = timeRangeObject(parsedFilter.start);
if (startTimeRange) {
filterObject.start = startTimeRange;
}
}
// finish time range
if (parsedFilter?.finish) {
const finishTimeRange = timeRangeObject(parsedFilter.finish);
if (finishTimeRange) {
filterObject.finish = finishTimeRange;
}
}
return filterObject;
}
catch {
return filterObject;
}
}
/**
* To generate the object fits Prisma query structure
* @param filter The returned value of taskFilter
*/
function getTasksQueryConditions(filter) {
const executeTime = timeRangeObject(filter.execute);
const startTime = timeRangeObject(filter.start);
const finishTime = timeRangeObject(filter.finish);
const conditions = {
taskName: {
contains: filter.taskName,
},
taskDescription: {
contains: filter.taskDescription,
},
};
const executeTimeConditions = [];
const startTimeConditions = [];
const finishTimeConditions = [];
if (filter.status === "waiting") {
executeTimeConditions.push({
executeTime: {
gt: new Date(),
},
});
}
else if (filter.status === "executing") {
startTimeConditions.push({
startTime: {
lte: new Date(),
},
finishTime: null,
});
}
else if (filter.status === "finished") {
finishTimeConditions.push({
finishTime: {
lte: new Date(),
},
});
}
executeTimeConditions.push({
executeTime: {
gte: executeTime?.after ? new Date(executeTime.after) : undefined,
lte: executeTime?.before ? new Date(executeTime.before) : undefined,
},
});
startTimeConditions.push({
startTime: {
gte: startTime?.after ? new Date(startTime.after) : undefined,
lte: startTime?.before ? new Date(startTime.before) : undefined,
},
});
finishTimeConditions.push({
finishTime: {
gte: finishTime?.after ? new Date(finishTime.after) : undefined,
lte: finishTime?.before ? new Date(finishTime.before) : undefined,
},
});
conditions.AND = [
...executeTimeConditions,
...startTimeConditions,
...finishTimeConditions,
];
return conditions;
}
/**
* Generate the filter object for getTasks method inside DB
*/
function recordFilter(filter) {
const filterObject = {
status: undefined,
taskName: undefined,
taskId: undefined,
finish: undefined,
};
try {
const parsedFilter = JSON.parse(filter);
// status
if (["successful", "failed"].includes(parsedFilter?.status?.toLowerCase())) {
filterObject.status = parsedFilter.status.toLowerCase();
}
// taskName
if (typeof parsedFilter?.taskName === "string") {
filterObject.taskName = parsedFilter.taskName;
}
// taskId
if (typeof parsedFilter?.taskId === "number") {
filterObject.taskId = parsedFilter.taskId;
}
// finish time range
if (parsedFilter?.finish) {
const finishTimeRange = timeRangeObject(parsedFilter.finish);
if (finishTimeRange) {
filterObject.finish = finishTimeRange;
}
}
return filterObject;
}
catch {
return filterObject;
}
}
/**
* To generate the object fits Prisma query structure
* @param filter The returned value of taskFilter
*/
function getRecordQueryConditions(filter) {
const condition = {
taskId: filter.taskId,
task: {
taskName: {
contains: filter.taskName,
},
},
};
// status
if (filter.status === "failed") {
condition.error = {
not: {
equals: null,
},
};
}
else if (filter.status === "successful") {
condition.error = {
equals: null,
};
}
// finish
const finishTime = timeRangeObject(filter.finish);
if (finishTime) {
condition.finishTime = {
gte: finishTime.after ? new Date(finishTime.after) : undefined,
lte: finishTime.before ? new Date(finishTime.before) : undefined,
};
}
return condition;
}