alphascript-server
Version:
CRUD operations for mongo and other functionalities to get started quickly in any CMS project
223 lines (189 loc) • 5.24 kB
JavaScript
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 run = api.jobs.find(function (run) {
return run.job == context;
});
if (!run) return callback('Could not find run in RAM');
//job found itself
api.common.Task.findOne({ _id: run.task._id }, function (err, task) {
if (err) {
api.error.log(err);
return callback(err);
}
if (!task) return callback("No task found in database");
task.runs = task.runs || [];
task.runs.unshift(run._id);
new api.common.Run().save(function (err, savedRun) {
if (err) {
api.error.log(err);
return callback(err, run._id);
}
run.runid = savedRun._id;
task.save(function (err) {
if (err) {
api.error.log(err);
return callback(err, run._id);
}
console.log('JOB STARTED > task: ' + run.task.type + ', runid: ' + run.runid);
callback(undefined, run._id);
});
});
});
}
function LogFinishTask() {
var context = this;
var customError = context.customError;
delete context.customError;
//search for this job in array
var run = api.jobs.find(function (run) {
return run.job == context;
});
if (!run) return console.error('could not find run');
//job found itself
api.common.Run.findOne({ _id: run.runid }, function (err, data) {
if (err) {
return api.error.log(err);
}
if (!data) return console.error("could not find run");
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: ' + run.task.type + ', runid: ' + run.runid);
run.runid = null;
if (run.task.isActive) {
setTimeout(function () {
context.start();
}, 5000);
}
});
});
}