feat: ACP analytics API route (#7725)

* feat: added API route for retrieving analytics via REST API

* feat: sets is now optional, can pass in multiple sets

* fix: moved expand and added json button to panel header

* fix: matching api params to socket method

* fix: update json api button url on graph change

* fix: updated default counts based on passed in units
This commit is contained in:
Julian Lam
2019-06-28 14:59:55 -04:00
committed by GitHub
parent fb0870297b
commit a0c0ef1ba4
6 changed files with 81 additions and 19 deletions

View File

@@ -4,10 +4,12 @@ var async = require('async');
var nconf = require('nconf');
var semver = require('semver');
var winston = require('winston');
const _ = require('lodash');
var versions = require('../../admin/versions');
var db = require('../../database');
var meta = require('../../meta');
const analytics = require('../../analytics').async;
var plugins = require('../../plugins');
var user = require('../../user');
var utils = require('../../utils');
@@ -76,6 +78,40 @@ dashboardController.get = function (req, res, next) {
], next);
};
dashboardController.getAnalytics = async (req, res, next) => {
// Basic validation
const validUnits = ['days', 'hours'];
const validSets = ['uniquevisitors', 'pageviews', 'pageviews:registered', 'pageviews:bot', 'pageviews:guest'];
const until = req.query.until ? new Date(parseInt(req.query.until, 10)) : Date.now();
const count = req.query.count || (req.query.units === 'hours' ? 24 : 30);
if (isNaN(until) || !validUnits.includes(req.query.units)) {
return next(new Error('[[error:invalid-data]]'));
}
// Filter out invalid sets, if no sets, assume all sets
let sets;
if (req.query.sets) {
sets = Array.isArray(req.query.sets) ? req.query.sets : [req.query.sets];
sets = sets.filter(set => validSets.includes(set));
} else {
sets = validSets;
}
const method = req.query.units === 'days' ? analytics.getDailyStatsForSet : analytics.getHourlyStatsForSet;
let payload = await Promise.all(sets.map(async set => method('analytics:' + set, until, count)));
payload = _.zipObject(sets, payload);
res.json({
query: {
set: req.query.set,
units: req.query.units,
until: until,
count: count,
},
result: payload,
});
};
function getStats(callback) {
async.waterfall([
function (next) {