refactor user search

use pagination on results
removed infinite scroll
changed the term and section to use the query param as well
pagination urls respect search
This commit is contained in:
barisusakli
2016-08-24 14:47:01 +03:00
parent 768c1b37d4
commit 84f88a6f15
12 changed files with 181 additions and 236 deletions

View File

@@ -1,43 +1,13 @@
'use strict'; 'use strict';
/* globals define, socket, utils */ /* globals define */
define('forum/account/followers', ['forum/account/header', 'forum/infinitescroll'], function(header, infinitescroll) { define('forum/account/followers', ['forum/account/header'], function(header) {
var Followers = {}; var Followers = {};
Followers.init = function() { Followers.init = function() {
header.init(); header.init();
infinitescroll.init(function(direction) {
Followers.loadMore(direction, 'account/followers', 'followers:' + ajaxify.data.uid);
});
}; };
Followers.loadMore = function(direction, tpl, set) {
if (direction < 0) {
return;
}
infinitescroll.loadMore('user.loadMore', {
set: set,
after: $('#users-container').attr('data-nextstart')
}, function(data, done) {
if (data.users && data.users.length) {
onUsersLoaded(tpl, data.users, done);
$('#users-container').attr('data-nextstart', data.nextStart);
} else {
done();
}
});
};
function onUsersLoaded(tpl, users, callback) {
app.parseAndTranslate(tpl, 'users', {users: users}, function(html) {
$('#users-container').append(html);
utils.addCommasToNumbers(html.find('.formatted-number'));
callback();
});
}
return Followers; return Followers;
}); });

View File

@@ -2,15 +2,11 @@
/* globals define */ /* globals define */
define('forum/account/following', ['forum/account/header', 'forum/infinitescroll', 'forum/account/followers'], function(header, infinitescroll, followers) { define('forum/account/following', ['forum/account/header'], function(header) {
var Following = {}; var Following = {};
Following.init = function() { Following.init = function() {
header.init(); header.init();
infinitescroll.init(function(direction) {
followers.loadMore(direction, 'account/following', 'following:' + ajaxify.data.uid);
});
}; };
return Following; return Following;

View File

@@ -22,15 +22,10 @@ define('forum/search', ['search', 'autocomplete'], function(searchModule, autoco
$('#advanced-search').off('submit').on('submit', function(e) { $('#advanced-search').off('submit').on('submit', function(e) {
e.preventDefault(); e.preventDefault();
searchModule.query(getSearchData(), function() {
var input = $('#search-input'); $('#search-input').val('');
var searchData = getSearchData();
searchData.term = input.val();
searchModule.query(searchData, function() {
input.val('');
}); });
return false;
}); });
handleSavePreferences(); handleSavePreferences();
@@ -43,7 +38,7 @@ define('forum/search', ['search', 'autocomplete'], function(searchModule, autoco
var searchData = { var searchData = {
in: $('#search-in').val() in: $('#search-in').val()
}; };
searchData.term = $('#search-input').val();
if (searchData.in === 'posts' || searchData.in === 'titlesposts' || searchData.in === 'titles') { if (searchData.in === 'posts' || searchData.in === 'titlesposts' || searchData.in === 'titles') {
searchData.by = form.find('#posted-by-user').val(); searchData.by = form.find('#posted-by-user').val();
searchData.categories = form.find('#posted-in-categories').val(); searchData.categories = form.find('#posted-in-categories').val();
@@ -71,6 +66,10 @@ define('forum/search', ['search', 'autocomplete'], function(searchModule, autoco
params = utils.merge(searchData, params); params = utils.merge(searchData, params);
if (params) { if (params) {
if (params.term) {
$('#search-input').val(params.term);
}
if (params.in) { if (params.in) {
$('#search-in').val(params.in); $('#search-in').val(params.in);
updateFormItemVisiblity(params.in); updateFormItemVisiblity(params.in);

View File

@@ -1,16 +1,24 @@
'use strict'; 'use strict';
/* globals define, socket, app, templates, bootbox, ajaxify */ /* globals define, socket, app, templates, bootbox, utils */
define('forum/users', ['translator'], function(translator) { define('forum/users', ['translator'], function(translator) {
var Users = {}; var Users = {};
var loadingMoreUsers = false; var searchTimeoutID = 0;
$(window).on('action:ajaxify.start', function() {
if (searchTimeoutID) {
clearTimeout(searchTimeoutID);
searchTimeoutID = 0;
}
});
Users.init = function() { Users.init = function() {
app.enterRoom('user_list'); app.enterRoom('user_list');
$('.nav-pills li').removeClass('active').find('a[href="' + window.location.pathname + '"]').parent().addClass('active'); var section = utils.params().section ? ('?section=' + utils.params().section) : '';
$('.nav-pills li').removeClass('active').find('a[href="' + window.location.pathname + section + '"]').parent().addClass('active');
handleSearch(); handleSearch();
@@ -18,110 +26,55 @@ define('forum/users', ['translator'], function(translator) {
socket.removeListener('event:user_status_change', onUserStatusChange); socket.removeListener('event:user_status_change', onUserStatusChange);
socket.on('event:user_status_change', onUserStatusChange); socket.on('event:user_status_change', onUserStatusChange);
$('#load-more-users-btn').on('click', loadMoreUsers);
$(window).off('scroll').on('scroll', function() {
var bottom = ($(document).height() - $(window).height()) * 0.9;
if ($(window).scrollTop() > bottom && !loadingMoreUsers) {
loadMoreUsers();
}
});
}; };
function loadMoreUsers() {
if ($('#search-user').val()) {
return;
}
if (ajaxify.data.setName) {
startLoading(ajaxify.data.setName, $('#users-container').children('.registered-user').length);
}
}
function startLoading(set, after) {
loadingMoreUsers = true;
socket.emit('user.loadMore', {
set: set,
after: after
}, function(err, data) {
if (err) {
return app.alertError(err.message);
}
if (data && data.users.length) {
onUsersLoaded(data);
$('#load-more-users-btn').removeClass('disabled');
} else {
$('#load-more-users-btn').addClass('disabled');
}
loadingMoreUsers = false;
});
}
function onUsersLoaded(data) {
data.users = data.users.filter(function(user) {
return !$('.users-box[data-uid="' + user.uid + '"]').length;
});
templates.parse('users', 'users', data, function(html) {
translator.translate(html, function(translated) {
translated = $(translated);
$('#users-container').append(translated);
translated.find('span.timeago').timeago();
utils.addCommasToNumbers(translated.find('.formatted-number'));
$('#users-container .anon-user').appendTo($('#users-container'));
});
});
}
function handleSearch() { function handleSearch() {
var timeoutId = 0; searchTimeoutID = 0;
$('#search-user').on('keyup', function() { $('#search-user').on('keyup', function() {
if (timeoutId) { if (searchTimeoutID) {
clearTimeout(timeoutId); clearTimeout(searchTimeoutID);
timeoutId = 0; searchTimeoutID = 0;
} }
timeoutId = setTimeout(doSearch, 250); searchTimeoutID = setTimeout(doSearch, 150);
}); });
$('.search select, .search input[type="checkbox"]').on('change', function() { $('.search select, .search input[type="checkbox"]').on('change', function() {
doSearch(); doSearch();
}); });
$('.users').on('click', '.pagination a', function() {
doSearch($(this).attr('data-page'));
return false;
});
} }
function doSearch(page) { function doSearch(page) {
$('[component="user/search/icon"]').removeClass('fa-search').addClass('fa-spinner fa-spin');
var username = $('#search-user').val(); var username = $('#search-user').val();
page = page || 1; page = page || 1;
if (!username) {
return loadPage(page);
}
var activeSection = getActiveSection(); var activeSection = getActiveSection();
socket.emit('user.search', {
query: username,
page: page,
searchBy: 'username',
sortBy: $('.search select').val() || getSortBy(),
onlineOnly: $('.search .online-only').is(':checked') || (activeSection === 'online'),
bannedOnly: activeSection === 'banned',
flaggedOnly: activeSection === 'flagged'
}, function(err, data) {
if (err) {
return app.alertError(err.message);
}
renderSearchResults(data); var query = {
}); section: activeSection,
page: page
};
if (!username) {
return loadPage(query);
}
query.term = username;
query.sortBy = getSortBy();
if ($('.search .online-only').is(':checked') || (activeSection === 'online')) {
query.onlineOnly = true;
}
if (activeSection === 'banned') {
query.bannedOnly = true;
}
if (activeSection === 'flagged') {
query.flaggedOnly = true;
}
loadPage(query);
} }
function getSortBy() { function getSortBy() {
@@ -137,16 +90,17 @@ define('forum/users', ['translator'], function(translator) {
return sortBy; return sortBy;
} }
function loadPage(page) {
var section = getActiveSection(); function loadPage(query) {
section = section !== 'users' ? section : ''; var qs = decodeURIComponent($.param(query));
$.get('/api/users/' + section + '?page=' + page, function(data) { $.get('/api/users?' + qs, renderSearchResults).fail(function(xhrErr) {
renderSearchResults(data); if (xhrErr && xhrErr.responseJSON && xhrErr.responseJSON.error) {
app.alertError(xhrErr.responseJSON.error);
}
}); });
} }
function renderSearchResults(data) { function renderSearchResults(data) {
$('#load-more-users-btn').addClass('hide');
templates.parse('partials/paginator', {pagination: data.pagination}, function(html) { templates.parse('partials/paginator', {pagination: data.pagination}, function(html) {
$('.pagination-container').replaceWith(html); $('.pagination-container').replaceWith(html);
}); });
@@ -156,6 +110,7 @@ define('forum/users', ['translator'], function(translator) {
translated = $(translated); translated = $(translated);
$('#users-container').html(translated); $('#users-container').html(translated);
translated.find('span.timeago').timeago(); translated.find('span.timeago').timeago();
$('[component="user/search/icon"]').addClass('fa-search').removeClass('fa-spinner fa-spin');
}); });
}); });
} }
@@ -173,9 +128,7 @@ define('forum/users', ['translator'], function(translator) {
} }
function getActiveSection() { function getActiveSection() {
var url = window.location.href; return utils.params().section || '';
var parts = url.split('/');
return parts[parts.length - 1];
} }
function handleInvite() { function handleInvite() {

View File

@@ -4,8 +4,8 @@
define('search', ['navigator', 'translator'], function(nav, translator) { define('search', ['navigator', 'translator'], function(nav, translator) {
var Search = { var Search = {
current: {} current: {}
}; };
Search.query = function(data, callback) { Search.query = function(data, callback) {
var term = data.term; var term = data.term;
@@ -22,11 +22,11 @@ define('search', ['navigator', 'translator'], function(nav, translator) {
return app.alertError('[[error:invalid-search-term]]'); return app.alertError('[[error:invalid-search-term]]');
} }
ajaxify.go('search/' + term + '?' + createQueryString(data)); ajaxify.go('search?' + createQueryString(data));
callback(); callback();
} else { } else {
var cleanedTerm = term.replace(topicSearch[0], ''), var cleanedTerm = term.replace(topicSearch[0], '');
tid = topicSearch[1]; var tid = topicSearch[1];
if (cleanedTerm.length > 0) { if (cleanedTerm.length > 0) {
Search.queryTopic(tid, cleanedTerm, callback); Search.queryTopic(tid, cleanedTerm, callback);
@@ -38,8 +38,9 @@ define('search', ['navigator', 'translator'], function(nav, translator) {
var searchIn = data['in'] || 'titlesposts'; var searchIn = data['in'] || 'titlesposts';
var postedBy = data.by || ''; var postedBy = data.by || '';
var query = { var query = {
'in': searchIn term: data.term,
}; 'in': searchIn
};
if (postedBy && (searchIn === 'posts' || searchIn === 'titles' || searchIn === 'titlesposts')) { if (postedBy && (searchIn === 'posts' || searchIn === 'titles' || searchIn === 'titlesposts')) {
query.by = postedBy; query.by = postedBy;

View File

@@ -1,10 +1,11 @@
'use strict'; 'use strict';
var async = require('async'), var async = require('async');
user = require('../../user'), var user = require('../../user');
helpers = require('../helpers'), var helpers = require('../helpers');
accountHelpers = require('./helpers'); var accountHelpers = require('./helpers');
var pagination = require('../../pagination');
var followController = {}; var followController = {};
@@ -19,6 +20,11 @@ followController.getFollowers = function(req, res, next) {
function getFollow(tpl, name, req, res, callback) { function getFollow(tpl, name, req, res, callback) {
var userData; var userData;
var page = parseInt(req.query.page, 10) || 1;
var resultsPerPage = 50;
var start = Math.max(0, page - 1) * resultsPerPage;
var stop = start + resultsPerPage - 1;
async.waterfall([ async.waterfall([
function(next) { function(next) {
accountHelpers.getBaseUser(req.params.userslug, req.uid, next); accountHelpers.getBaseUser(req.params.userslug, req.uid, next);
@@ -29,7 +35,7 @@ function getFollow(tpl, name, req, res, callback) {
return callback(); return callback();
} }
var method = name === 'following' ? 'getFollowing' : 'getFollowers'; var method = name === 'following' ? 'getFollowing' : 'getFollowers';
user[method](userData.uid, 0, 49, next); user[method](userData.uid, start, stop, next);
} }
], function(err, users) { ], function(err, users) {
if (err) { if (err) {
@@ -37,8 +43,10 @@ function getFollow(tpl, name, req, res, callback) {
} }
userData.users = users; userData.users = users;
userData.nextStart = 50;
userData.title = '[[pages:' + tpl + ', ' + userData.username + ']]'; userData.title = '[[pages:' + tpl + ', ' + userData.username + ']]';
var count = name === 'following' ? userData.followingCount : userData.followerCount;
var pageCount = Math.ceil(count / resultsPerPage);
userData.pagination = pagination.create(page, pageCount);
userData.breadcrumbs = helpers.buildBreadcrumbs([{text: userData.username, url: '/user/' + userData.userslug}, {text: '[[user:' + name + ']]'}]); userData.breadcrumbs = helpers.buildBreadcrumbs([{text: userData.username, url: '/user/' + userData.userslug}, {text: '[[user:' + name + ']]'}]);
res.render(tpl, userData); res.render(tpl, userData);

View File

@@ -133,7 +133,19 @@ helpers.getBaseUser = function(userslug, callerUID, callback) {
async.parallel({ async.parallel({
user: function(next) { user: function(next) {
user.getUserFields(uid, ['uid', 'username', 'userslug', 'picture', 'cover:url', 'cover:position', 'status', 'lastonline', 'groupTitle'], next); user.getUserFields(uid, [
'uid',
'username',
'userslug',
'picture',
'cover:url',
'cover:position',
'status',
'lastonline',
'groupTitle',
'followingCount',
'followerCount'
], next);
}, },
isAdmin: function(next) { isAdmin: function(next) {
user.isAdministrator(callerUID, next); user.isAdministrator(callerUID, next);

View File

@@ -28,7 +28,7 @@ searchController.search = function(req, res, next) {
} }
var data = { var data = {
query: req.params.term, query: req.query.term,
searchIn: req.query.in || 'posts', searchIn: req.query.in || 'posts',
postedBy: req.query.by, postedBy: req.query.by,
categories: req.query.categories, categories: req.query.categories,
@@ -59,7 +59,7 @@ searchController.search = function(req, res, next) {
searchData.showAsTopics = req.query.showAs === 'topics'; searchData.showAsTopics = req.query.showAs === 'topics';
searchData.title = '[[global:header.search]]'; searchData.title = '[[global:header.search]]';
searchData.breadcrumbs = helpers.buildBreadcrumbs([{text: '[[global:search]]'}]); searchData.breadcrumbs = helpers.buildBreadcrumbs([{text: '[[global:search]]'}]);
searchData.expandSearch = !req.params.term; searchData.expandSearch = !req.query.term;
res.render('search', searchData); res.render('search', searchData);
}); });

View File

@@ -11,10 +11,61 @@ var helpers = require('./helpers');
var usersController = {}; var usersController = {};
usersController.index = function(req, res, next) {
var section = req.query.section || 'joindate';
var sectionToController = {
joindate: usersController.getUsersSortedByJoinDate,
online: usersController.getOnlineUsers,
'sort-posts': usersController.getUsersSortedByPosts,
'sort-reputation': usersController.getUsersSortedByReputation,
banned: usersController.getBannedUsers,
flagged: usersController.getFlaggedUsers
};
if (req.query.term) {
usersController.search(req, res, next);
} else if (sectionToController[section]) {
sectionToController[section](req, res, next);
} else {
usersController.getUsersSortedByJoinDate(req, res, next);
}
};
usersController.search = function(req, res, next) {
async.parallel({
search: function(next) {
user.search({
query: req.query.term,
searchBy: req.query.searchBy || 'username',
page: req.query.page || 1,
sortBy: req.query.sortBy,
onlineOnly: req.query.onlineOnly === 'true',
bannedOnly: req.query.bannedOnly === 'true',
flaggedOnly: req.query.flaggedOnly === 'true'
}, next);
},
isAdminOrGlobalMod: function(next) {
user.isAdminOrGlobalMod(req.uid, next);
}
}, function(err, results) {
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.parallel({
users: function(next) { users: function(next) {
usersController.getUsers('users:online', req.uid, req.query.page, next); usersController.getUsers('users:online', req.uid, req.query, next);
}, },
guests: function(next) { guests: function(next) {
require('../socket.io/admin/rooms').getTotalGuestCount(next); require('../socket.io/admin/rooms').getTotalGuestCount(next);
@@ -56,7 +107,7 @@ 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.page, function(err, userData) { usersController.getUsers('users:banned', req.uid, req.query, function(err, userData) {
if (err) { if (err) {
return next(err); return next(err);
} }
@@ -70,7 +121,7 @@ usersController.getBannedUsers = function(req, res, next) {
}; };
usersController.getFlaggedUsers = function(req, res, next) { usersController.getFlaggedUsers = function(req, res, next) {
usersController.getUsers('users:flags', req.uid, req.query.page, function(err, userData) { usersController.getUsers('users:flags', req.uid, req.query, function(err, userData) {
if (err) { if (err) {
return next(err); return next(err);
} }
@@ -84,15 +135,16 @@ usersController.getFlaggedUsers = function(req, res, next) {
}; };
usersController.renderUsersPage = function(set, req, res, next) { usersController.renderUsersPage = function(set, req, res, next) {
usersController.getUsers(set, req.uid, req.query.page, function(err, userData) { usersController.getUsers(set, req.uid, req.query, function(err, userData) {
if (err) { if (err) {
return next(err); return next(err);
} }
render(req, res, userData, next); render(req, res, userData, next);
}); });
}; };
usersController.getUsers = function(set, uid, page, callback) { usersController.getUsers = function(set, uid, query, callback) {
var setToData = { var setToData = {
'users:postcount': {title: '[[pages:users/sort-posts]]', crumb: '[[users:top_posters]]'}, 'users:postcount': {title: '[[pages:users/sort-posts]]', crumb: '[[users:top_posters]]'},
'users:reputation': {title: '[[pages:users/sort-reputation]]', crumb: '[[users:most_reputation]]'}, 'users:reputation': {title: '[[pages:users/sort-reputation]]', crumb: '[[users:most_reputation]]'},
@@ -112,17 +164,14 @@ usersController.getUsers = function(set, uid, page, callback) {
breadcrumbs.unshift({text: '[[global:users]]', url: '/users'}); breadcrumbs.unshift({text: '[[global:users]]', url: '/users'});
} }
page = parseInt(page, 10) || 1; var page = parseInt(query.page, 10) || 1;
var resultsPerPage = parseInt(meta.config.userSearchResultsPerPage, 10) || 50; var resultsPerPage = parseInt(meta.config.userSearchResultsPerPage, 10) || 50;
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.parallel({
isAdministrator: function(next) { isAdminOrGlobalMod: function(next) {
user.isAdministrator(uid, next); user.isAdminOrGlobalMod(uid, next);
},
isGlobalMod: function(next) {
user.isGlobalModerator(uid, next);
}, },
usersData: function(next) { usersData: function(next) {
usersController.getUsersAndCount(set, uid, start, stop, next); usersController.getUsersAndCount(set, uid, start, stop, next);
@@ -134,16 +183,14 @@ usersController.getUsers = function(set, uid, page, callback) {
var pageCount = Math.ceil(results.usersData.count / resultsPerPage); var pageCount = Math.ceil(results.usersData.count / resultsPerPage);
var userData = { var userData = {
loadmore_display: results.usersData.count > (stop - start + 1) ? 'block' : 'hide',
users: results.usersData.users, users: results.usersData.users,
pagination: pagination.create(page, pageCount), pagination: pagination.create(page, pageCount, query),
userCount: results.usersData.count, userCount: results.usersData.count,
title: setToData[set].title || '[[pages:users/latest]]', title: setToData[set].title || '[[pages:users/latest]]',
breadcrumbs: helpers.buildBreadcrumbs(breadcrumbs), breadcrumbs: helpers.buildBreadcrumbs(breadcrumbs),
setName: set, isAdminOrGlobalMod: results.isAdminOrGlobalMod
isAdminOrGlobalMod: results.isAdministrator || results.isGlobalMod
}; };
userData['route_' + set] = true; userData['section_' + (query.section || 'joindate')] = true;
callback(null, userData); callback(null, userData);
}); });
}; };

View File

@@ -33,7 +33,7 @@ function mainRoutes(app, middleware, controllers) {
setupPageRoute(app, '/compose', middleware, [], controllers.compose); setupPageRoute(app, '/compose', middleware, [], controllers.compose);
setupPageRoute(app, '/confirm/:code', middleware, [], controllers.confirmEmail); setupPageRoute(app, '/confirm/:code', middleware, [], controllers.confirmEmail);
setupPageRoute(app, '/outgoing', middleware, [], controllers.outgoing); setupPageRoute(app, '/outgoing', middleware, [], controllers.outgoing);
setupPageRoute(app, '/search/:term?', middleware, [], controllers.search.search); setupPageRoute(app, '/search', middleware, [], controllers.search.search);
setupPageRoute(app, '/reset/:code?', middleware, [], controllers.reset); setupPageRoute(app, '/reset/:code?', middleware, [], controllers.reset);
setupPageRoute(app, '/tos', middleware, [], controllers.termsOfUse); setupPageRoute(app, '/tos', middleware, [], controllers.termsOfUse);
@@ -73,12 +73,7 @@ function categoryRoutes(app, middleware, controllers) {
function userRoutes(app, middleware, controllers) { function userRoutes(app, middleware, controllers) {
var middlewares = [middleware.checkGlobalPrivacySettings]; var middlewares = [middleware.checkGlobalPrivacySettings];
setupPageRoute(app, '/users', middleware, middlewares, controllers.users.getUsersSortedByJoinDate); setupPageRoute(app, '/users', middleware, middlewares, controllers.users.index);
setupPageRoute(app, '/users/online', middleware, middlewares, controllers.users.getOnlineUsers);
setupPageRoute(app, '/users/sort-posts', middleware, middlewares, controllers.users.getUsersSortedByPosts);
setupPageRoute(app, '/users/sort-reputation', middleware, middlewares, controllers.users.getUsersSortedByReputation);
setupPageRoute(app, '/users/banned', middleware, middlewares, controllers.users.getBannedUsers);
setupPageRoute(app, '/users/flagged', middleware, middlewares, controllers.users.getFlaggedUsers);
} }
function groupRoutes(app, middleware, controllers) { function groupRoutes(app, middleware, controllers) {
@@ -91,15 +86,15 @@ function groupRoutes(app, middleware, controllers) {
module.exports = function(app, middleware, hotswapIds) { module.exports = function(app, middleware, hotswapIds) {
var routers = [ var routers = [
express.Router(), // plugin router express.Router(), // plugin router
express.Router(), // main app router express.Router(), // main app router
express.Router() // auth router express.Router() // auth router
], ];
router = routers[1], var router = routers[1];
pluginRouter = routers[0], var pluginRouter = routers[0];
authRouter = routers[2], var authRouter = routers[2];
relativePath = nconf.get('relative_path'), var relativePath = nconf.get('relative_path');
ensureLoggedIn = require('connect-ensure-login'); var ensureLoggedIn = require('connect-ensure-login');
if (Array.isArray(hotswapIds) && hotswapIds.length) { if (Array.isArray(hotswapIds) && hotswapIds.length) {
for(var idx,x=0;x<hotswapIds.length;x++) { for(var idx,x=0;x<hotswapIds.length;x++) {

View File

@@ -265,51 +265,6 @@ SocketUser.getUnreadCounts = function(socket, data, callback) {
}, callback); }, callback);
}; };
SocketUser.loadMore = function(socket, data, callback) {
if (!data || !data.set || parseInt(data.after, 10) < 0) {
return callback(new Error('[[error:invalid-data]]'));
}
if (!socket.uid && !!parseInt(meta.config.privateUserInfo, 10)) {
return callback(new Error('[[error:no-privileges]]'));
}
var start = parseInt(data.after, 10);
var stop = start + 19;
async.parallel({
isAdmin: function(next) {
user.isAdministrator(socket.uid, next);
},
isGlobalMod: function(next) {
user.isGlobalModerator(socket.uid, next);
},
users: function(next) {
user.getUsersFromSet(data.set, socket.uid, start, stop, next);
}
}, function(err, results) {
if (err) {
return callback(err);
}
if (data.set === 'users:banned' && !results.isAdmin && !results.isGlobalMod) {
return callback(new Error('[[error:no-privileges]]'));
}
if (!results.isAdmin && data.set === 'users:online') {
results.users = results.users.filter(function(user) {
return user.status !== 'offline';
});
}
var result = {
users: results.users,
nextStart: stop + 1,
};
result['route_' + data.set] = true;
callback(null, result);
});
};
SocketUser.invite = function(socket, email, callback) { SocketUser.invite = function(socket, email, callback) {
if (!email || !socket.uid) { if (!email || !socket.uid) {
return callback(new Error('[[error:invalid-data]]')); return callback(new Error('[[error:invalid-data]]'));

View File

@@ -84,7 +84,16 @@ module.exports = function(User) {
function filterAndSortUids(uids, data, callback) { function filterAndSortUids(uids, data, callback) {
var sortBy = data.sortBy || 'joindate'; var sortBy = data.sortBy || 'joindate';
var fields = ['uid', 'status', 'lastonline', 'banned', 'flags', sortBy]; var fields = ['uid', sortBy];
if (data.onlineOnly) {
fields = fields.concat(['status', 'lastonline']);
}
if (data.bannedOnly) {
fields.push('banned');
}
if (data.flaggedOnly) {
fields.push('flags');
}
User.getUsersFields(uids, fields, function(err, userData) { User.getUsersFields(uids, fields, function(err, userData) {
if (err) { if (err) {