controllers/users refactor

v1.18.x
barisusakli 8 years ago
parent 566ff95d3c
commit 2188036148

@ -8,9 +8,7 @@ var pagination = require('../pagination');
var db = require('../database'); var db = require('../database');
var helpers = require('./helpers'); var helpers = require('./helpers');
var usersController = module.exports;
var usersController = {};
usersController.index = function (req, res, next) { usersController.index = function (req, res, next) {
var section = req.query.section || 'joindate'; var section = req.query.section || 'joindate';
@ -33,62 +31,65 @@ usersController.index = function (req, res, next) {
}; };
usersController.search = function (req, res, next) { usersController.search = function (req, res, next) {
async.parallel({ async.waterfall([
search: function (next) { function (next) {
user.search({ async.parallel({
query: req.query.term, search: function (next) {
searchBy: req.query.searchBy || 'username', user.search({
page: req.query.page || 1, query: req.query.term,
sortBy: req.query.sortBy, searchBy: req.query.searchBy || 'username',
onlineOnly: req.query.onlineOnly === 'true', page: req.query.page || 1,
bannedOnly: req.query.bannedOnly === 'true', sortBy: req.query.sortBy,
flaggedOnly: req.query.flaggedOnly === 'true', onlineOnly: req.query.onlineOnly === 'true',
bannedOnly: req.query.bannedOnly === 'true',
flaggedOnly: req.query.flaggedOnly === 'true',
}, next);
},
isAdminOrGlobalMod: function (next) {
user.isAdminOrGlobalMod(req.uid, next);
},
}, next); }, next);
}, },
isAdminOrGlobalMod: function (next) { function (results, next) {
user.isAdminOrGlobalMod(req.uid, next); var section = req.query.section || 'joindate';
results.search.isAdminOrGlobalMod = results.isAdminOrGlobalMod;
results.search.pagination = pagination.create(req.query.page, results.search.pageCount, req.query);
results.search['section_' + section] = true;
render(req, res, results.search, next);
}, },
}, function (err, results) { ], next);
if (err) {
return next(err);
}
var section = req.query.section || 'joindate';
results.search.isAdminOrGlobalMod = results.isAdminOrGlobalMod;
results.search.pagination = pagination.create(req.query.page, results.search.pageCount, req.query);
results.search['section_' + section] = true;
render(req, res, results.search, next);
});
}; };
usersController.getOnlineUsers = function (req, res, next) { usersController.getOnlineUsers = function (req, res, next) {
async.parallel({ async.waterfall([
users: function (next) { function (next) {
usersController.getUsers('users:online', req.uid, req.query, next); async.parallel({
}, users: function (next) {
guests: function (next) { usersController.getUsers('users:online', req.uid, req.query, next);
require('../socket.io/admin/rooms').getTotalGuestCount(next); },
guests: function (next) {
require('../socket.io/admin/rooms').getTotalGuestCount(next);
},
}, next);
}, },
}, function (err, results) { function (results, next) {
if (err) { var userData = results.users;
return next(err); var hiddenCount = 0;
} if (!userData.isAdminOrGlobalMod) {
var userData = results.users; userData.users = userData.users.filter(function (user) {
var hiddenCount = 0; if (user && user.status === 'offline') {
if (!userData.isAdminOrGlobalMod) { hiddenCount += 1;
userData.users = userData.users.filter(function (user) { }
if (user && user.status === 'offline') { return user && user.status !== 'offline';
hiddenCount += 1; });
} }
return user && user.status !== 'offline';
});
}
userData.anonymousUserCount = results.guests + hiddenCount; userData.anonymousUserCount = results.guests + hiddenCount;
render(req, res, userData, next); render(req, res, userData, next);
}); },
], next);
}; };
usersController.getUsersSortedByPosts = function (req, res, next) { usersController.getUsersSortedByPosts = function (req, res, next) {
@ -107,41 +108,36 @@ usersController.getUsersSortedByJoinDate = function (req, res, next) {
}; };
usersController.getBannedUsers = function (req, res, next) { usersController.getBannedUsers = function (req, res, next) {
usersController.getUsers('users:banned', req.uid, req.query, function (err, userData) { renderIfAdminOrGlobalMod('users:banned', req, res, next);
if (err) {
return next(err);
}
if (!userData.isAdminOrGlobalMod) {
return next();
}
render(req, res, userData, next);
});
}; };
usersController.getFlaggedUsers = function (req, res, next) { usersController.getFlaggedUsers = function (req, res, next) {
usersController.getUsers('users:flags', req.uid, req.query, function (err, userData) { renderIfAdminOrGlobalMod('users:flags', req, res, next);
if (err) {
return next(err);
}
if (!userData.isAdminOrGlobalMod) {
return next();
}
render(req, res, userData, next);
});
}; };
usersController.renderUsersPage = function (set, req, res, next) { function renderIfAdminOrGlobalMod(set, req, res, next) {
usersController.getUsers(set, req.uid, req.query, function (err, userData) { async.waterfall([
if (err) { function (next) {
return next(err); user.isAdminOrGlobalMod(req.uid, next);
} },
function (isAdminOrGlobalMod, next) {
if (!isAdminOrGlobalMod) {
return helpers.notAllowed(req, res);
}
usersController.renderUsersPage(set, req, res, next);
},
], next);
}
render(req, res, userData, next); usersController.renderUsersPage = function (set, req, res, next) {
}); async.waterfall([
function (next) {
usersController.getUsers(set, req.uid, req.query, next);
},
function (userData, next) {
render(req, res, userData, next);
},
], next);
}; };
usersController.getUsers = function (set, uid, query, callback) { usersController.getUsers = function (set, uid, query, callback) {
@ -169,59 +165,62 @@ usersController.getUsers = function (set, uid, query, callback) {
var start = Math.max(0, page - 1) * resultsPerPage; var start = Math.max(0, page - 1) * resultsPerPage;
var stop = start + resultsPerPage - 1; var stop = start + resultsPerPage - 1;
async.parallel({ async.waterfall([
isAdminOrGlobalMod: function (next) { function (next) {
user.isAdminOrGlobalMod(uid, next); async.parallel({
isAdminOrGlobalMod: function (next) {
user.isAdminOrGlobalMod(uid, next);
},
usersData: function (next) {
usersController.getUsersAndCount(set, uid, start, stop, next);
},
}, next);
}, },
usersData: function (next) { function (results, next) {
usersController.getUsersAndCount(set, uid, start, stop, next); var pageCount = Math.ceil(results.usersData.count / resultsPerPage);
var userData = {
users: results.usersData.users,
pagination: pagination.create(page, pageCount, query),
userCount: results.usersData.count,
title: setToData[set].title || '[[pages:users/latest]]',
breadcrumbs: helpers.buildBreadcrumbs(breadcrumbs),
isAdminOrGlobalMod: results.isAdminOrGlobalMod,
};
userData['section_' + (query.section || 'joindate')] = true;
next(null, userData);
}, },
}, function (err, results) { ], callback);
if (err) {
return callback(err);
}
var pageCount = Math.ceil(results.usersData.count / resultsPerPage);
var userData = {
users: results.usersData.users,
pagination: pagination.create(page, pageCount, query),
userCount: results.usersData.count,
title: setToData[set].title || '[[pages:users/latest]]',
breadcrumbs: helpers.buildBreadcrumbs(breadcrumbs),
isAdminOrGlobalMod: results.isAdminOrGlobalMod,
};
userData['section_' + (query.section || 'joindate')] = true;
callback(null, userData);
});
}; };
usersController.getUsersAndCount = function (set, uid, start, stop, callback) { usersController.getUsersAndCount = function (set, uid, start, stop, callback) {
async.parallel({ async.waterfall([
users: function (next) { function (next) {
user.getUsersFromSet(set, uid, start, stop, next); async.parallel({
users: function (next) {
user.getUsersFromSet(set, uid, start, stop, next);
},
count: function (next) {
if (set === 'users:online') {
var now = Date.now();
db.sortedSetCount('users:online', now - 300000, '+inf', next);
} else if (set === 'users:banned') {
db.sortedSetCard('users:banned', next);
} else if (set === 'users:flags') {
db.sortedSetCard('users:flags', next);
} else {
db.getObjectField('global', 'userCount', next);
}
},
}, next);
}, },
count: function (next) { function (results, next) {
if (set === 'users:online') { results.users = results.users.filter(function (user) {
var now = Date.now(); return user && parseInt(user.uid, 10);
db.sortedSetCount('users:online', now - 300000, '+inf', next); });
} else if (set === 'users:banned') {
db.sortedSetCard('users:banned', next); next(null, results);
} else if (set === 'users:flags') {
db.sortedSetCard('users:flags', next);
} else {
db.getObjectField('global', 'userCount', next);
}
}, },
}, function (err, results) { ], callback);
if (err) {
return callback(err);
}
results.users = results.users.filter(function (user) {
return user && parseInt(user.uid, 10);
});
callback(null, results);
});
}; };
function render(req, res, data, next) { function render(req, res, data, next) {
@ -232,16 +231,15 @@ function render(req, res, data, next) {
data.adminInviteOnly = registrationType === 'admin-invite-only'; data.adminInviteOnly = registrationType === 'admin-invite-only';
data['reputation:disabled'] = parseInt(meta.config['reputation:disabled'], 10) === 1; data['reputation:disabled'] = parseInt(meta.config['reputation:disabled'], 10) === 1;
user.getInvitesNumber(req.uid, function (err, numInvites) { async.waterfall([
if (err) { function (next) {
return next(err); user.getInvitesNumber(req.uid, next);
} },
function (numInvites) {
res.append('X-Total-Count', data.userCount); res.append('X-Total-Count', data.userCount);
data.invites = numInvites; data.invites = numInvites;
res.render('users', data); res.render('users', data);
}); },
], next);
} }
module.exports = usersController;

@ -53,22 +53,24 @@ middleware.ensureSelfOrGlobalPrivilege = function (req, res, next) {
The "self" part of this middleware hinges on you having used The "self" part of this middleware hinges on you having used
middleware.exposeUid prior to invoking this middleware. middleware.exposeUid prior to invoking this middleware.
*/ */
if (req.user) { async.waterfall([
if (req.user.uid === res.locals.uid) { function (next) {
return next(); if (!req.uid) {
} return setImmediate(next, null, false);
}
user.isAdminOrGlobalMod(req.uid, function (err, ok) { if (req.uid === parseInt(res.locals.uid, 10)) {
if (err) { return setImmediate(next, null, true);
return next(err);
} else if (ok) {
return next();
} }
controllers.helpers.notAllowed(req, res); user.isAdminOrGlobalMod(req.uid, next);
}); },
} else { function (isAdminOrGlobalMod, next) {
controllers.helpers.notAllowed(req, res); if (!isAdminOrGlobalMod) {
} return controllers.helpers.notAllowed(req, res);
}
next();
},
], next);
}; };
middleware.pageView = function (req, res, next) { middleware.pageView = function (req, res, next) {

Loading…
Cancel
Save