mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-11-02 20:16:04 +01:00
103 lines
2.7 KiB
JavaScript
103 lines
2.7 KiB
JavaScript
'use strict';
|
|
|
|
var async = require('async');
|
|
var validator = require('validator');
|
|
|
|
var posts = require('../../posts');
|
|
var user = require('../../user');
|
|
var categories = require('../../categories');
|
|
var analytics = require('../../analytics');
|
|
var pagination = require('../../pagination');
|
|
|
|
var flagsController = {};
|
|
|
|
var itemsPerPage = 20;
|
|
|
|
flagsController.get = function (req, res, next) {
|
|
var byUsername = req.query.byUsername || '';
|
|
var cid = req.query.cid || 0;
|
|
var sortBy = req.query.sortBy || 'count';
|
|
var page = parseInt(req.query.page, 10) || 1;
|
|
|
|
async.parallel({
|
|
categories: function (next) {
|
|
categories.buildForSelect(req.uid, next);
|
|
},
|
|
flagData: function (next) {
|
|
getFlagData(req, res, next);
|
|
},
|
|
analytics: function (next) {
|
|
analytics.getDailyStatsForSet('analytics:flags', Date.now(), 30, next);
|
|
},
|
|
assignees: async.apply(user.getAdminsandGlobalModsandModerators),
|
|
}, function (err, results) {
|
|
if (err) {
|
|
return next(err);
|
|
}
|
|
|
|
// Minimise data set for assignees so tjs does less work
|
|
results.assignees = results.assignees.map(function (userObj) {
|
|
return {
|
|
uid: userObj.uid,
|
|
username: userObj.username,
|
|
};
|
|
});
|
|
|
|
// If res.locals.cids is populated, then slim down the categories list
|
|
if (res.locals.cids) {
|
|
results.categories = results.categories.filter(function (category) {
|
|
return res.locals.cids.indexOf(String(category.cid)) !== -1;
|
|
});
|
|
}
|
|
|
|
var pageCount = Math.max(1, Math.ceil(results.flagData.count / itemsPerPage));
|
|
|
|
results.categories.forEach(function (category) {
|
|
category.selected = parseInt(category.cid, 10) === parseInt(cid, 10);
|
|
});
|
|
|
|
var data = {
|
|
posts: results.flagData.posts,
|
|
assignees: results.assignees,
|
|
analytics: results.analytics,
|
|
categories: results.categories,
|
|
byUsername: validator.escape(String(byUsername)),
|
|
sortByCount: sortBy === 'count',
|
|
sortByTime: sortBy === 'time',
|
|
pagination: pagination.create(page, pageCount, req.query),
|
|
};
|
|
res.render('admin/manage/flags', data);
|
|
});
|
|
};
|
|
|
|
function getFlagData(req, res, callback) {
|
|
var sortBy = req.query.sortBy || 'count';
|
|
var byUsername = req.query.byUsername || '';
|
|
var cid = req.query.cid || res.locals.cids || 0;
|
|
var page = parseInt(req.query.page, 10) || 1;
|
|
var start = (page - 1) * itemsPerPage;
|
|
var stop = start + itemsPerPage - 1;
|
|
|
|
var sets = [sortBy === 'count' ? 'posts:flags:count' : 'posts:flagged'];
|
|
|
|
async.waterfall([
|
|
function (next) {
|
|
if (byUsername) {
|
|
user.getUidByUsername(byUsername, next);
|
|
} else {
|
|
process.nextTick(next, null, 0);
|
|
}
|
|
},
|
|
function (uid, next) {
|
|
if (uid) {
|
|
sets.push('uid:' + uid + ':flag:pids');
|
|
}
|
|
|
|
posts.getFlags(sets, cid, req.uid, start, stop, next);
|
|
},
|
|
], callback);
|
|
}
|
|
|
|
|
|
module.exports = flagsController;
|