UNPKG

alphascript-server

Version:

CRUD operations for mongo and other functionalities to get started quickly in any CMS project

240 lines (204 loc) 6.42 kB
var api = require('../../'); var CronJob = require('cron').CronJob; module.exports = { run: function (req, res) { var taskid = req.params.id; var i; for (i = 0; i < api.jobs.length; i++) { if (api.jobs[i].task._id == taskid) { break; } } if (i >= api.jobs.length) { res.status(404); return res.send("Não foi possível iniciar a tarefa: " + taskid); } if (api.jobs[i].runid) { res.status(403); return res.send("Esta tarefa já se encontra a correr. Id: " + taskid); } var job = api.jobs[i]; api.activity.log("task.run", taskid, req); res.end(); api.taskMap[job.task.type].main('', function (err) { if (err) { api.error.log(err); return api.options.io.emit(req.user._id, null); } api.options.io.emit(req.user._id, null); }); }, toggle: function (req, res) { var taskid = req.params.id; api.common.Task.findOne({ _id: taskid }, function (err, data) { if (err) { api.error.log(err); return res.sendStatus(500); } var isActive = !data.isActive; data.isActive = isActive; data.save(function (err) { if (err) { api.error.log(err); return res.sendStatus(500); } var i; for (i = 0; i < api.jobs.length; i++) { if (api.jobs[i].task._id == taskid) { break; } } if (i >= api.jobs.length) { res.status(404); return res.send("Impossível localizar tarefa. Id: " + taskid); } api.jobs[i].task.isActive = isActive; if (isActive && !api.jobs[i].runid) { api.jobs[i].job.start(); } api.activity.log("task.toggle", data._id, req); res.end(); }); }); }, getTypes: function (req, res) { var taskTypes = []; for (var task in api.taskMap) { taskTypes.push(task); } res.json(taskTypes); }, load: function () { api.common.Task.find(function (err, items) { if (err) { return api.error.log(err); } api.jobs = []; items.forEach(function (item) { AddJob(item); }); var log = []; api.jobs.forEach(function (job) { log.push(job.task.type + " (" + job.job.cronTime.source + ")"); }); console.log('cronjobs: ' + log.join()); }); } }; function AddJob(taskData) { var onTick = function () { var context = this; LogStartTask(context, function (err, runid) { if (err) { api.error.log(err); context.customError = err; context.stop(); return; } api.taskMap[taskData.type].main(runid, function (err) { if (err) { api.error.log(err); context.customError = err; context.stop(); return; } context.stop(); return; }); }); }; var t = taskData.criteria; var cronTime = '00 ' + t.minute + ' ' + t.hour + ' ' + t.monthday + ' ' + t.month + ' ' + t.weekday; api.jobs.push({ task: taskData, runid: null, job: new CronJob({ cronTime: cronTime, onTick: onTick, onComplete: LogFinishTask, start: taskData.isActive }) }); } function LogStartTask(context, callback) { //search for this job in array var i; for (i = 0; i < api.jobs.length; i++) { if (api.jobs[i].job != context) { continue; } break; } if (i >= api.jobs.length) { callback('could not find job', null); return; } //job found itself api.common.Task.findOne({ _id: api.jobs[i].task._id }, function (err, data) { if (err) { api.error.log(err); return callback(err, null); } if (!data.runs) { data.runs = []; } var run = new api.common.Run({}); api.jobs[i].runid = run._id; data.runs.splice(0, 0, run._id); run.save(function (err) { if (err) { api.error.log(err); return callback(err, run._id); } data.save(function (err) { if (err) { api.error.log(err); return callback(err, run._id); } console.log('JOB STARTED > task: ' + api.jobs[i].task.type + ', runid: ' + api.jobs[i].runid); callback(null, run._id); }); }); }); } function LogFinishTask() { var context = this; var customError = context.customError; delete context.customError; //search for this job in array var i; for (i = 0; i < api.jobs.length; i++) { if (api.jobs[i].job != context) { continue; } break; } if (i >= api.jobs.length) { console.log('could not find job'); return; } //job found itself api.common.Run.findOne({ _id: api.jobs[i].runid }, function (err, data) { if (err) { return api.error.log(err); } data.isRunning = false; data.success = true; data.endTimestamp = new Date(); if (customError) { data.error = customError; } data.save(function (err) { if (err) { return api.error.log(err); } console.log('JOB ENDED > task: ' + api.jobs[i].task.type + ', runid: ' + api.jobs[i].runid); api.jobs[i].runid = null; if (api.jobs[i].task.isActive) { setTimeout(function () { context.start(); }, 5000); } }); }); }