diff --git a/public/src/forum/admin/groups.js b/public/src/forum/admin/groups.js index 93de7bdbdc..ad530c12a9 100644 --- a/public/src/forum/admin/groups.js +++ b/public/src/forum/admin/groups.js @@ -127,16 +127,16 @@ define(function() { foundUserLabel = foundUser.getElementsByTagName('span')[0]; socket.emit('admin.user.search', searchText, function(err, results) { - if (!err && results && results.length > 0) { - var numResults = results.length, + if (!err && results && results.users.length > 0) { + var numResults = results.users.length, resultsSlug = document.createDocumentFragment(), x; if (numResults > 4) numResults = 4; for (x = 0; x < numResults; x++) { - foundUserImg.src = results[x].picture; - foundUserLabel.innerHTML = results[x].username; - foundUser.setAttribute('title', results[x].username); - foundUser.setAttribute('data-uid', results[x].uid); + foundUserImg.src = results.users[x].picture; + foundUserLabel.innerHTML = results.users[x].username; + foundUser.setAttribute('title', results.users[x].username); + foundUser.setAttribute('data-uid', results.users[x].uid); resultsSlug.appendChild(foundUser.cloneNode(true)); } @@ -172,7 +172,7 @@ define(function() { groupMembersEl.on('click', 'li[data-uid]', function() { var uid = this.getAttribute('data-uid'), gid = detailsModal.attr('data-gid'); - + socket.emit('admin.groups.get', gid, function(err, groupObj){ if (!err){ if (groupObj.name == 'Administrators' && uid == yourid){ diff --git a/public/src/forum/admin/users.js b/public/src/forum/admin/users.js index e890329118..98dd235957 100644 --- a/public/src/forum/admin/users.js +++ b/public/src/forum/admin/users.js @@ -196,23 +196,23 @@ define(function() { socket.emit('admin.user.search', username, function(err, data) { if(err) { return app.alertError(err.message); - }console.log(data) + } var html = templates.prepare(templates['admin/users'].blocks['users']).parse({ - users: data + users: data.users }), userListEl = document.querySelector('.users'); userListEl.innerHTML = html; jQuery('.fa-spinner').addClass('none'); - if (data && data.length === 0) { + if (data && data.users.length === 0) { $('#user-notfound-notify').html('User not found!') .show() .addClass('label-danger') .removeClass('label-success'); } else { - $('#user-notfound-notify').html(data.length + ' user' + (data.length > 1 ? 's' : '') + ' found!') + $('#user-notfound-notify').html(data.users.length + ' user' + (data.users.length > 1 ? 's' : '') + ' found! Search took ' + data.timing + ' ms.') .show() .addClass('label-success') .removeClass('label-danger'); diff --git a/public/src/forum/users.js b/public/src/forum/users.js index 77e086259b..fcf52e897a 100644 --- a/public/src/forum/users.js +++ b/public/src/forum/users.js @@ -52,6 +52,8 @@ define(function() { return app.alert(err.message); } + console.log(data); + if (!data) { $('#user-notfound-notify').html('You need to be logged in to search!'); $('#user-notfound-notify').parent().addClass('btn-warning label-warning'); @@ -59,18 +61,18 @@ define(function() { } var html = templates.prepare(templates['users'].blocks['users']).parse({ - users: data + users: data.users }), userListEl = $('#users-container'); userListEl.html(html); - if (data && data.length === 0) { + if (data && data.users.length === 0) { $('#user-notfound-notify').html('User not found!'); $('#user-notfound-notify').parent().addClass('btn-warning label-warning'); } else { - $('#user-notfound-notify').html(data.length + ' user' + (data.length > 1 ? 's' : '') + ' found!'); + $('#user-notfound-notify').html(data.users.length + ' user' + (data.users.length > 1 ? 's' : '') + ' found! Search took ' + data.timing + ' ms.'); $('#user-notfound-notify').parent().addClass('btn-success label-success'); } diff --git a/src/socket.io/admin.js b/src/socket.io/admin.js index 9ad8abe14d..fbaac2b2b8 100644 --- a/src/socket.io/admin.js +++ b/src/socket.io/admin.js @@ -91,7 +91,7 @@ SocketAdmin.user.search = function(socket, username, callback) { }); } - async.each(data, isAdmin, function(err) { + async.each(data.users, isAdmin, function(err) { callback(err, data); }); }); @@ -126,7 +126,7 @@ SocketAdmin.categories.search = function(socket, data, callback) { cid = data.cid; user.search(username, function(err, data) { - async.map(data, function(userObj, next) { + async.map(data.users, function(userObj, next) { CategoryTools.privileges(cid, userObj.uid, function(err, privileges) { if(err) { return next(err); diff --git a/src/user.js b/src/user.js index 12ed7b38b7..2a8cabaaf7 100644 --- a/src/user.js +++ b/src/user.js @@ -490,34 +490,36 @@ var bcrypt = require('bcrypt'), User.search = function(query, callback) { if (!query || query.length === 0) { - return callback(null, []); + return callback(null, {timing:0, users:[]}); } + var start = process.hrtime(); - // TODO: Have this use db.getObjectKeys (doesn't exist yet) db.getObject('username:uid', function(err, usernamesHash) { if (err) { - return callback(null, []); + return callback(null, {timing: 0, users:[]}); } + query = query.toLowerCase(); + var usernames = Object.keys(usernamesHash), results = []; - results = usernames.filter(function(username) { // Remove non-matches - return username.indexOf(query) === 0; - }).sort(function(a, b) { // Sort alphabetically + results = usernames.filter(function(username) { + return username.toLowerCase().indexOf(query) === 0; + }) + .slice(0, 10) + .sort(function(a, b) { return a > b; - }).slice(0, 5) // Limit 5 - .map(function(username) { // Translate to uids + }) + .map(function(username) { return usernamesHash[username]; }); - if (results && results.length) { - User.getDataForUsers(results, function(userdata) { - callback(null, userdata); - }); - } else { - callback(null, []); - } + User.getDataForUsers(results, function(userdata) { + var diff = process.hrtime(start); + var timing = (diff[0] * 1e3 + diff[1] / 1e6).toFixed(1); + callback(null, {timing: timing, users: userdata}); + }); }); };