UNPKG

openhim-core

Version:

The OpenHIM core application that provides logging and routing of http requests

163 lines (145 loc) 4.22 kB
var AutoRetry, Channel, Channels, Q, Task, autoRetryTask, createRerunTask, getChannels, logger, moment, popTransactions, setupAgenda; logger = require("winston"); moment = require('moment'); Q = require('q'); Channels = require('./model/channels'); Channel = Channels.Channel; AutoRetry = require('./model/autoRetry').AutoRetry; Task = require('./model/tasks').Task; exports.reachedMaxAttempts = function(tx, channel) { return (channel.autoRetryMaxAttempts != null) && channel.autoRetryMaxAttempts > 0 && tx.autoRetryAttempt >= channel.autoRetryMaxAttempts; }; exports.queueForRetry = function(tx) { var retry; retry = new AutoRetry({ transactionID: tx._id, channelID: tx.channelID, requestTimestamp: tx.request.timestamp }); return retry.save(function(err) { if (err) { return logger.error("Failed to queue transaction " + tx._id + " for auto retry: " + err); } }); }; getChannels = function(callback) { return Channel.find({ autoRetryEnabled: true, status: 'enabled' }, callback); }; popTransactions = function(channel, callback) { var query, to; to = moment().subtract(channel.autoRetryPeriodMinutes - 1, 'minutes'); query = { $and: [ { channelID: channel._id }, { 'requestTimestamp': { $lte: to.toDate() } } ] }; logger.debug("Executing query autoRetry.findAndRemove(" + (JSON.stringify(query)) + ")"); return AutoRetry.find(query, function(err, transactions) { if (err) { return callback(err); } if (transactions.length === 0) { return callback(null, []); } return AutoRetry.remove({ _id: { $in: transactions.map(function(t) { return t._id; }) } }, function(err) { if (err) { return callback(err); } return callback(null, transactions); }); }); }; createRerunTask = function(transactionIDs, callback) { var task; logger.info("Rerunning failed transactions: " + transactionIDs); task = new Task({ transactions: transactionIDs.map(function(t) { return { tid: t }; }), totalTransactions: transactionIDs.length, remainingTransactions: transactionIDs.length, user: 'internal' }); return task.save(function(err) { if (err) { logger.error(err); } return callback(); }); }; autoRetryTask = function(job, done) { var _taskStart, transactionsToRerun; _taskStart = new Date(); transactionsToRerun = []; return getChannels(function(err, results) { var channel, fn, i, len, promises; promises = []; fn = function(channel) { var deferred; deferred = Q.defer(); popTransactions(channel, function(err, results) { var j, len1, ref, tid; if (err) { logger.error(err); } else if ((results != null) && results.length > 0) { ref = results.map(function(r) { return r.transactionID; }); for (j = 0, len1 = ref.length; j < len1; j++) { tid = ref[j]; transactionsToRerun.push(tid); } } return deferred.resolve(); }); return promises.push(deferred.promise); }; for (i = 0, len = results.length; i < len; i++) { channel = results[i]; fn(channel); } return (Q.all(promises)).then(function() { var end; end = function() { logger.debug("Auto retry task total time: " + (new Date() - _taskStart) + " ms"); return done(); }; if (transactionsToRerun.length > 0) { return createRerunTask(transactionsToRerun, end); } else { return end(); } }); }); }; setupAgenda = function(agenda) { agenda.define('auto retry failed transactions', function(job, done) { return autoRetryTask(job, done); }); return agenda.every('1 minutes', 'auto retry failed transactions'); }; exports.setupAgenda = setupAgenda; if (process.env.NODE_ENV === "test") { exports.getChannels = getChannels; exports.popTransactions = popTransactions; exports.createRerunTask = createRerunTask; exports.autoRetryTask = autoRetryTask; } //# sourceMappingURL=autoRetry.js.map