diff --git a/src/user/search.js b/src/user/search.js index 4583e0e28f..967c32c32b 100644 --- a/src/user/search.js +++ b/src/user/search.js @@ -68,16 +68,17 @@ module.exports = function (User) { var resultsPerPage = parseInt(meta.config.userSearchResultsPerPage, 10) || 20; var hardCap = resultsPerPage * 10; - db.getSortedSetRangeByLex(searchBy + ':sorted', min, max, 0, hardCap, function (err, data) { - if (err) { - return callback(err); - } - - var uids = data.map(function (data) { - return data.split(':')[1]; - }); - callback(null, uids); - }); + async.waterfall([ + function (next) { + db.getSortedSetRangeByLex(searchBy + ':sorted', min, max, 0, hardCap, next); + }, + function (data, next) { + var uids = data.map(function (data) { + return data.split(':')[1]; + }); + next(null, uids); + }, + ], callback); } function filterAndSortUids(uids, data, callback) { @@ -94,37 +95,38 @@ module.exports = function (User) { fields.push('flags'); } - User.getUsersFields(uids, fields, function (err, userData) { - if (err) { - return callback(err); - } - - if (data.onlineOnly) { - userData = userData.filter(function (user) { - return user && user.status !== 'offline' && (Date.now() - parseInt(user.lastonline, 10) < 300000); - }); - } + async.waterfall([ + function (next) { + User.getUsersFields(uids, fields, next); + }, + function (userData, next) { + if (data.onlineOnly) { + userData = userData.filter(function (user) { + return user && user.status !== 'offline' && (Date.now() - parseInt(user.lastonline, 10) < 300000); + }); + } - if (data.bannedOnly) { - userData = userData.filter(function (user) { - return user && user.banned; - }); - } + if (data.bannedOnly) { + userData = userData.filter(function (user) { + return user && parseInt(user.banned, 10) === 1; + }); + } - if (data.flaggedOnly) { - userData = userData.filter(function (user) { - return user && parseInt(user.flags, 10) > 0; - }); - } + if (data.flaggedOnly) { + userData = userData.filter(function (user) { + return user && parseInt(user.flags, 10) > 0; + }); + } - sortUsers(userData, sortBy); + sortUsers(userData, sortBy); - uids = userData.map(function (user) { - return user && user.uid; - }); + uids = userData.map(function (user) { + return user && user.uid; + }); - callback(null, uids); - }); + next(null, uids); + }, + ], callback); } function sortUsers(userData, sortBy) { diff --git a/test/user.js b/test/user.js index f7d9986336..fd40b990dd 100644 --- a/test/user.js +++ b/test/user.js @@ -237,6 +237,70 @@ describe('User', function () { done(); }); }); + + it('should search users by ip', function (done) { + User.create({ username: 'ipsearch' }, function (err, uid) { + assert.ifError(err); + db.sortedSetAdd('ip:1.1.1.1:uid', [1, 1], [testUid, uid], function (err) { + assert.ifError(err); + socketUser.search({ uid: testUid }, { query: '1.1.1.1', searchBy: 'ip' }, function (err, data) { + assert.ifError(err); + assert(Array.isArray(data.users)); + assert.equal(data.users.length, 2); + done(); + }); + }); + }); + }); + + it('should return empty array if query is empty', function (done) { + socketUser.search({ uid: testUid }, { query: '' }, function (err, data) { + assert.ifError(err); + assert.equal(data.users.length, 0); + done(); + }); + }); + + it('should filter users', function (done) { + User.create({ username: 'ipsearch_filter' }, function (err, uid) { + assert.ifError(err); + User.setUserFields(uid, { banned: 1, flags: 10 }, function (err) { + assert.ifError(err); + socketUser.search({ uid: testUid }, { + query: 'ipsearch', + onlineOnly: true, + bannedOnly: true, + flaggedOnly: true, + }, function (err, data) { + assert.ifError(err); + assert.equal(data.users[0].username, 'ipsearch_filter'); + done(); + }); + }); + }); + }); + + it('should sort results by username', function (done) { + async.waterfall([ + function (next) { + User.create({ username: 'brian' }, next); + }, + function (uid, next) { + User.create({ username: 'baris' }, next); + }, + function (uid, next) { + socketUser.search({ uid: testUid }, { + query: 'b', + sortBy: 'username', + }, next); + }, + ], function (err, data) { + assert.ifError(err); + assert.equal(data.users[0].username, 'baris'); + assert.equal(data.users[1].username, 'brian'); + done(); + }); + }); }); describe('.delete()', function () {