diff --git a/app.js b/app.js index 7ad5732fd..7e0b00754 100644 --- a/app.js +++ b/app.js @@ -228,6 +228,10 @@ function launchServer (db) { }) return next() + }, + function (next) { + var taskRunner = require('./src/taskrunner') + return taskRunner.init(next) } ], function (err) { diff --git a/package.json b/package.json index c51122dbd..564917501 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "trudesk", - "version": "1.0.11", + "version": "1.0.12-beta", "private": true, "engines": { "node": ">=9.10.0" diff --git a/src/middleware/middleware.js b/src/middleware/middleware.js index 09d0e0808..3e09762d6 100644 --- a/src/middleware/middleware.js +++ b/src/middleware/middleware.js @@ -58,19 +58,19 @@ middleware.redirectToLogin = function (req, res, next) { req.session.redirectUrl = req.url } - return res.redirect(401, '/') + return res.redirect('/') } if (req.user.deleted) { req.logout() req.session.l2auth = null req.session.destroy() - return res.redirect(401, '/') + return res.redirect('/') } if (req.user.hasL2Auth) { if (req.session.l2auth !== 'totp') { - return res.redirect(401, '/') + return res.redirect('/') } } diff --git a/src/models/task.js b/src/models/task.js deleted file mode 100644 index 13aea2228..000000000 --- a/src/models/task.js +++ /dev/null @@ -1,48 +0,0 @@ -/* - * . .o8 oooo - * .o8 "888 `888 - * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - * ======================================================================== - * Author: Chris Brame - * Updated: 1/20/19 4:43 PM - * Copyright (c) 2014-2019. All rights reserved. - */ - -var mongoose = require('mongoose') - -var COLLECTION = 'tasks' - -/** - * @since 1.0 - * @author Chris Brame - * @copyright 2015 Chris Brame - **/ - -/** - * Task Object Schema for MongoDB - * @module models/task - * @class Task - * @property {Number} type ```Required``` Type of Task {@link TaskType} - * @property {String} title ```Required``` Title for Task - * @property {String} query ```Required``` MongoDB Query to run for this task - * @property {Date} nextRun ```Required``` Next run date for the task - * @property {Date} lastRun Last run date for the task - */ - -var taskSchema = mongoose.Schema({ - type: { type: Number, required: true }, - title: { type: String, required: true }, - query: { type: String, required: true }, - nextRun: { type: Date, required: true }, - lastRun: Date -}) - -taskSchema.statics.getTasks = function (callback) { - return this.model(COLLECTION).find({}, callback) -} - -module.exports = mongoose.model(COLLECTION, taskSchema) diff --git a/src/taskrunner/index.js b/src/taskrunner/index.js index 3405539ef..1aca234ed 100644 --- a/src/taskrunner/index.js +++ b/src/taskrunner/index.js @@ -10,21 +10,109 @@ */ var _ = require('lodash') +var async = require('async') var winston = require('winston') -var taskSchema = require('../models/task') - -/** - * @namespace - */ -;(function () { - // Start up Task Runners - winston.debug('Starting Runners...') - - taskSchema.getTasks(function (err, items) { - if (err) { - return winston.warn('Task Runner Error: ' + err.message) +var request = require('request') +var ticketSchema = require('../models/ticket') +var userSchema = require('../models/user') +var groupSchema = require('../models/group') +var conversationSchema = require('../models/chat/conversation') +var settingSchema = require('../models/setting') + +var taskRunner = {} + +taskRunner.init = function (callback) { + taskRunner.sendStats(function (err) { + if (!err) setInterval(taskRunner.sendStats, 86400000) // 24 hours + }) + + return callback() +} + +taskRunner.sendStats = function (callback) { + settingSchema.getSettingsByName(['gen:installid', 'gen:version'], function (err, settings) { + if (err) return callback(err) + if (!settings || settings.length < 1) return callback() + + var versionSetting = _.find(settings, function (x) { + return x.name === 'gen:version' + }) + var installIdSetting = _.find(settings, function (x) { + return x.name === 'gen:installid' + }) + + if (!installIdSetting) return callback() + + versionSetting = _.isUndefined(versionSetting) ? { value: '--' } : versionSetting + + var result = { + ticketCount: 0, + agentCount: 0, + customerGroupCount: 0, + conversationCount: 0 } - winston.debug('Number of Tasks: ' + _.size(items)) + async.parallel( + [ + function (done) { + ticketSchema.countDocuments({ deleted: false }, function (err, count) { + if (err) return done(err) + + result.ticketCount = count + return done() + }) + }, + function (done) { + userSchema.getAgents({}, function (err, agents) { + if (err) return done(err) + + if (!agents) return done() + result.agentCount = agents.length + + return done() + }) + }, + function (done) { + groupSchema.countDocuments({}, function (err, count) { + if (err) return done(err) + + result.customerGroupCount = count + + return done() + }) + }, + function (done) { + conversationSchema.countDocuments({}, function (err, count) { + if (err) return done(err) + + result.conversationCount = count + + return done() + }) + } + ], + function (err) { + if (err) return callback() + request( + 'https://stats.trudesk.app/api/v1/installation', + { + method: 'POST', + json: true, + body: { + statsKey: 'trudesk', + id: installIdSetting.value, + version: versionSetting.value, + ticketCount: result.ticketCount, + agentCount: result.agentCount, + customerGroupCount: result.customerGroupCount, + conversationCount: result.conversationCount + } + }, + callback + ) + } + ) }) -})() +} + +module.exports = taskRunner