From ba412f4a56853b2d3c418a317626bcd21d439059 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 24 May 2016 23:04:57 -0400 Subject: [PATCH] fully completed #4658 --- package.json | 3 ++- public/src/admin/advanced/errors.js | 17 +++++++++++++++++ src/controllers/admin/errors.js | 14 ++++++++++++-- src/meta/errors.js | 7 +++---- src/routes/admin.js | 1 + src/socket.io/admin.js | 8 +++++++- src/views/admin/advanced/errors.tpl | 2 +- 7 files changed, 43 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 96a5c0eaaa..ce3674ef2f 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "html-to-text": "2.0.0", "ip": "1.1.2", "jimp": "0.2.21", + "json-2-csv": "^2.0.22", "less": "^2.0.0", "logrotate-stream": "^0.2.3", "lru-cache": "4.0.0", @@ -49,8 +50,8 @@ "nconf": "~0.8.2", "nodebb-plugin-composer-default": "3.0.31", "nodebb-plugin-dbsearch": "1.0.1", - "nodebb-plugin-emoji-one": "1.1.3", "nodebb-plugin-emoji-extended": "1.1.0", + "nodebb-plugin-emoji-one": "1.1.3", "nodebb-plugin-markdown": "5.1.5", "nodebb-plugin-mentions": "1.1.1", "nodebb-plugin-soundpack-default": "0.1.6", diff --git a/public/src/admin/advanced/errors.js b/public/src/admin/advanced/errors.js index 1713311eb7..96b17fbe40 100644 --- a/public/src/admin/advanced/errors.js +++ b/public/src/admin/advanced/errors.js @@ -5,6 +5,23 @@ define('admin/advanced/errors', ['Chart'], function(Chart) { var Errors = {}; Errors.init = function() { + Errors.setupCharts(); + + $('[data-action="clear"]').on('click', Errors.clear404); + }; + + Errors.clear404 = function() { + bootbox.confirm('Are you sure you wish to clear the 404 error logs?', function(ok) { + if (ok) { + socket.emit('admin.errors.clear', {}, function(err) { + ajaxify.refresh(); + app.alertSuccess('"404 Not Found" errors cleared'); + }); + } + }); + }; + + Errors.setupCharts = function() { var notFoundCanvas = document.getElementById('not-found'), tooBusyCanvas = document.getElementById('toobusy'), dailyLabels = utils.getDaysArray(); diff --git a/src/controllers/admin/errors.js b/src/controllers/admin/errors.js index d5ce5a1b76..4b59932965 100644 --- a/src/controllers/admin/errors.js +++ b/src/controllers/admin/errors.js @@ -1,6 +1,7 @@ 'use strict'; -var async = require('async'); +var async = require('async'), + json2csv = require('json-2-csv').json2csv; var meta = require('../../meta'), analytics = require('../../analytics'); @@ -9,12 +10,21 @@ var errorsController = {}; errorsController.get = function(req, res) { async.parallel({ - 'not-found': async.apply(meta.errors.get), + 'not-found': async.apply(meta.errors.get, true), analytics: async.apply(analytics.getErrorAnalytics) }, function(err, data) { res.render('admin/advanced/errors', data); }); }; +errorsController.export = function(req, res) { + async.waterfall([ + async.apply(meta.errors.get, false), + async.apply(json2csv) + ], function(err, csv) { + res.set('Content-Type', 'text/csv').set('Content-Disposition', 'attachment; filename="404.csv"').send(csv); + }); +}; + module.exports = errorsController; \ No newline at end of file diff --git a/src/meta/errors.js b/src/meta/errors.js index 5582d537b8..4449a55f57 100644 --- a/src/meta/errors.js +++ b/src/meta/errors.js @@ -18,10 +18,10 @@ module.exports = function(Meta) { db.sortedSetIncrBy('errors:404', 1, route, callback); }; - Meta.errors.get = function(callback) { + Meta.errors.get = function(escape, callback) { db.getSortedSetRevRangeByScoreWithScores('errors:404', 0, -1, '+inf', '-inf', function(err, data) { data = data.map(function(nfObject) { - nfObject.value = validator.escape(nfObject.value); + nfObject.value = escape ? validator.escape(nfObject.value) : nfObject.value; return nfObject; }); @@ -30,7 +30,6 @@ module.exports = function(Meta) { }; Meta.errors.clear = function(callback) { - console.log('clear errors'); - callback(); + db.delete('errors:404', callback); }; }; diff --git a/src/routes/admin.js b/src/routes/admin.js index 9767c26e9d..521f0194bf 100644 --- a/src/routes/admin.js +++ b/src/routes/admin.js @@ -83,6 +83,7 @@ function addRoutes(router, middleware, controllers) { router.get('/advanced/events', middlewares, controllers.admin.events.get); router.get('/advanced/logs', middlewares, controllers.admin.logs.get); router.get('/advanced/errors', middlewares, controllers.admin.errors.get); + router.get('/advanced/errors/export', middlewares, controllers.admin.errors.export); router.get('/advanced/post-cache', middlewares, controllers.admin.postCache.get); router.get('/development/logger', middlewares, controllers.admin.logger.get); diff --git a/src/socket.io/admin.js b/src/socket.io/admin.js index 6dd22134ba..8a1df2931e 100644 --- a/src/socket.io/admin.js +++ b/src/socket.io/admin.js @@ -33,7 +33,8 @@ var async = require('async'), settings: {}, email: {}, analytics: {}, - logs: {} + logs: {}, + errors: {} }; SocketAdmin.before = function(socket, method, data, next) { @@ -255,6 +256,11 @@ SocketAdmin.logs.clear = function(socket, data, callback) { meta.logs.clear(callback); }; +SocketAdmin.errors.clear = function(socket, data, callback) { + console.log('clearing errors?'); + meta.errors.clear(callback); +}; + SocketAdmin.getMoreEvents = function(socket, next, callback) { var start = parseInt(next, 10); if (start < 0) { diff --git a/src/views/admin/advanced/errors.tpl b/src/views/admin/advanced/errors.tpl index 996f71f818..67eea3084e 100644 --- a/src/views/admin/advanced/errors.tpl +++ b/src/views/admin/advanced/errors.tpl @@ -52,7 +52,7 @@
Manage Error Log
- + Export Error Log (CSV)