UNPKG

openhim-core

Version:

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

263 lines (245 loc) 8.97 kB
var Channel, Q, Task, Transaction, areTransactionChannelsValid, authMiddleware, authorisation, buildFilteredTransactionsArray, isRerunPermissionsValid, logger, utils; Task = require('../model/tasks').Task; Transaction = require('../model/transactions').Transaction; Channel = require('../model/channels').Channel; Q = require('q'); logger = require('winston'); authorisation = require('./authorisation'); authMiddleware = require('../middleware/authorisation'); utils = require('../utils'); isRerunPermissionsValid = function(user, transactions, callback) { if (authorisation.inGroup("admin", user) === true) { return callback(null, true); } else { return Transaction.distinct("channelID", { _id: { $in: transactions.tids } }, function(err, transChannels) { return Channel.distinct("_id", { txRerunAcl: { $in: user.groups } }, function(err, allowedChannels) { var chan, j, k, len, len1, matchFound, trx; for (j = 0, len = transChannels.length; j < len; j++) { trx = transChannels[j]; matchFound = false; for (k = 0, len1 = allowedChannels.length; k < len1; k++) { chan = allowedChannels[k]; if (trx.equals(chan)) { matchFound = true; } } if (!matchFound) { return callback(null, false); } } return callback(null, true); }); }); } }; exports.getTasks = function*() { var err, filterLimit, filterPage, filterSkip, filters, filtersObject, projectionFiltersObject; if (!authorisation.inGroup('admin', this.authenticated)) { utils.logAndSetResponse(this, 403, "User " + this.authenticated.email + " is not an admin, API access to getTasks denied.", 'info'); return; } try { filtersObject = this.request.query; filterLimit = filtersObject.filterLimit; filterPage = filtersObject.filterPage; filterSkip = filterPage * filterLimit; filters = JSON.parse(filtersObject.filters); if (filters['created']) { filters['created'] = JSON.parse(filters['created']); } projectionFiltersObject = { 'transactions': 0 }; this.body = (yield Task.find({}).exec()); return this.body = (yield Task.find(filters, projectionFiltersObject).skip(filterSkip).limit(filterLimit).sort({ 'created': -1 }).exec()); } catch (_error) { err = _error; return utils.logAndSetResponse(this, 500, "Could not fetch all tasks via the API: " + err, 'error'); } }; areTransactionChannelsValid = function(transactions, callback) { return Transaction.distinct("channelID", { _id: { $in: transactions.tids } }, function(err, trxChannelIDs) { if (err) { return callback(err); } return Channel.find({ _id: { $in: trxChannelIDs } }, { status: 1 }, function(err, trxChannels) { var chan, j, len; if (err) { return callback(err); } for (j = 0, len = trxChannels.length; j < len; j++) { chan = trxChannels[j]; if (!authMiddleware.isChannelEnabled(chan)) { return callback(null, false); } } return callback(null, true); }); }); }; exports.addTask = function*() { var allowRerunTaskCreation, areTrxChannelsValid, err, isRerunPermsValid, j, len, ref, result, task, taskObject, tid, transactions, transactionsArr, trxChannelsValid; transactions = this.request.body; try { taskObject = {}; transactionsArr = []; taskObject.remainingTransactions = transactions.tids.length; taskObject.user = this.authenticated.email; if (transactions.batchSize != null) { if (transactions.batchSize <= 0) { return utils.logAndSetResponse(this, 400, 'Invalid batch size specified', 'info'); } taskObject.batchSize = transactions.batchSize; } if (transactions.paused) { taskObject.status = 'Paused'; } isRerunPermsValid = Q.denodeify(isRerunPermissionsValid); allowRerunTaskCreation = (yield isRerunPermsValid(this.authenticated, transactions)); if (allowRerunTaskCreation === true) { areTrxChannelsValid = Q.denodeify(areTransactionChannelsValid); trxChannelsValid = (yield areTrxChannelsValid(transactions)); if (!trxChannelsValid) { utils.logAndSetResponse(this, 400, 'Cannot queue task as there are transactions with disabled or deleted channels', 'info'); return; } ref = transactions.tids; for (j = 0, len = ref.length; j < len; j++) { tid = ref[j]; transactionsArr.push({ tid: tid }); } taskObject.transactions = transactionsArr; taskObject.totalTransactions = transactionsArr.length; task = new Task(taskObject); result = (yield Q.ninvoke(task, 'save')); return utils.logAndSetResponse(this, 201, "User " + this.authenticated.email + " created task with id " + task.id, 'info'); } else { return utils.logAndSetResponse(this, 403, "Insufficient permissions prevents this rerun task from being created", 'error'); } } catch (_error) { err = _error; return utils.logAndSetResponse(this, 500, "Could not add Task via the API: " + err, 'error'); } }; buildFilteredTransactionsArray = function(filters, transactions) { var filtersFailed, i, tempTransactions; tempTransactions = []; i = 0; while (i < transactions.length) { filtersFailed = false; if (filters.tstatus) { if (filters.tstatus !== transactions[i].tstatus) { filtersFailed = true; } } if (filters.rerunStatus) { if (filters.rerunStatus !== transactions[i].rerunStatus) { filtersFailed = true; } } if (filters.hasErrors) { if (filters.hasErrors === 'yes' && !transactions[i].hasErrors) { filtersFailed = true; } else if (filters.hasErrors === 'no' && transactions[i].hasErrors) { filtersFailed = true; } } if (filtersFailed === false) { tempTransactions.push(transactions[i]); } i++; } return tempTransactions; }; exports.getTask = function*(taskId) { var err, filterLimit, filterPage, filterSkip, filters, filtersObject, result, sliceFrom, sliceTo, tempTransactions, totalFilteredTransactions; taskId = unescape(taskId); try { filtersObject = this.request.query; filterLimit = filtersObject.filterLimit; filterPage = filtersObject.filterPage; filterSkip = filterPage * filterLimit; filters = JSON.parse(filtersObject.filters); result = (yield Task.findById(taskId).lean().exec()); tempTransactions = result.transactions; if (Object.keys(filters).length > 0) { tempTransactions = buildFilteredTransactionsArray(filters, result.transactions); } totalFilteredTransactions = tempTransactions.length; result.totalFilteredTransactions = totalFilteredTransactions; sliceFrom = filterSkip; sliceTo = filterSkip + parseInt(filterLimit); result.transactions = tempTransactions.slice(sliceFrom, sliceTo); if (result === null) { return utils.logAndSetResponse(this, 404, "We could not find a Task with this ID: " + taskId + ".", 'info'); } else { return this.body = result; } } catch (_error) { err = _error; return utils.logAndSetResponse(this, 500, "Could not fetch Task by ID {taskId} via the API: " + err, 'error'); } }; exports.updateTask = function*(taskId) { var err, taskData; if (!authorisation.inGroup('admin', this.authenticated)) { utils.logAndSetResponse(this, 403, "User " + this.authenticated.email + " is not an admin, API access to updateTask denied.", 'info'); return; } taskId = unescape(taskId); taskData = this.request.body; if (taskData._id != null) { delete taskData._id; } try { (yield Task.findOneAndUpdate({ _id: taskId }, taskData).exec()); this.body = 'The Task was successfully updated'; return logger.info("User " + this.authenticated.email + " updated task with id " + taskId); } catch (_error) { err = _error; return utils.logAndSetResponse(this, 500, "Could not update Task by ID {taskId} via the API: " + err, 'error'); } }; exports.removeTask = function*(taskId) { var err; if (!authorisation.inGroup('admin', this.authenticated)) { utils.logAndSetResponse(this, 403, "User " + this.authenticated.email + " is not an admin, API access to removeTask denied.", 'info'); return; } taskId = unescape(taskId); try { (yield Task.remove({ _id: taskId }).exec()); this.body = 'The Task was successfully deleted'; return logger.info("User " + this.authenticated.email + " removed task with id " + taskId); } catch (_error) { err = _error; return utils.logAndSetResponse(this, 500, "Could not remove Task by ID {taskId} via the API: " + err, 'error'); } }; //# sourceMappingURL=tasks.js.map