From 483ad87c1d1f33b9b1ec80291d10cd7d3c9090fa Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Sun, 19 Jan 2014 21:46:39 -0500 Subject: [PATCH 1/4] first pass --- src/user.js | 51 ++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 38 insertions(+), 13 deletions(-) diff --git a/src/user.js b/src/user.js index 12ff17ed3e..769fc1f27c 100644 --- a/src/user.js +++ b/src/user.js @@ -482,24 +482,49 @@ var bcrypt = require('bcrypt'), }); } - User.search = function(username, callback) { - if (!username) { - return callback([]); + // User.search = function(username, callback) { + // if (!username) { + // return callback([]); + // } + + // db.search('user', username, 50, function(err, uids) { + // if (err) { + // console.log(err); + // return; + // } + + // if (uids && uids.length) { + // User.getDataForUsers(uids, function(userdata) { + // callback(userdata); + // }); + // } else { + // callback([]); + // } + // }); + // }; + + User.search = function(query, callback) { + if (!query || query.length === 0) { + return callback(null, []); } - db.search('user', username, 50, function(err, uids) { + // TODO: Have this use db.getObjectKeys (doesn't exist yet) + db.getObject('username:uid', function(err, usernamesHash) { if (err) { - console.log(err); - return; + return callback(null, []); } - if (uids && uids.length) { - User.getDataForUsers(uids, function(userdata) { - callback(userdata); - }); - } else { - callback([]); - } + var usernames = Object.keys(usernamesHash), + filterRegex = new RegExp('^' + query + '.*?$'), + results = []; + + results = usernames.filter(function(username) { // Remove non-matches + return filterRegex.text(username); + }).sort(function(a, b) { // Sort alphabetically + return a > b; + }).slice(0, 5); // Limit 5 + + callback(null, results); }); }; From e542da1f528aeb1782737abff620c6f2cf008015 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Sun, 19 Jan 2014 22:07:29 -0500 Subject: [PATCH 2/4] added alphanumeric user search (instead of using reds), and exposed a proper socket call for user searching for non-admins --- public/src/forum/users.js | 2 +- src/socket.io/admin.js | 4 ++-- src/socket.io/user.js | 4 ++++ src/user.js | 36 ++++++++++++------------------------ 4 files changed, 19 insertions(+), 27 deletions(-) diff --git a/public/src/forum/users.js b/public/src/forum/users.js index de00f3bc38..77e086259b 100644 --- a/public/src/forum/users.js +++ b/public/src/forum/users.js @@ -47,7 +47,7 @@ define(function() { jQuery('#user-notfound-notify').html(''); setTimeout(function() { - socket.emit('admin.user.search', username, function(err, data) { + socket.emit('user.search', username, function(err, data) { if(err) { return app.alert(err.message); } diff --git a/src/socket.io/admin.js b/src/socket.io/admin.js index 320f0d4a64..9ad8abe14d 100644 --- a/src/socket.io/admin.js +++ b/src/socket.io/admin.js @@ -79,7 +79,7 @@ SocketAdmin.user.unbanUser = function(socket, theirid) { }; SocketAdmin.user.search = function(socket, username, callback) { - user.search(username, function(data) { + user.search(username, function(err, data) { function isAdmin(userData, next) { user.isAdministrator(userData.uid, function(err, isAdmin) { if(err) { @@ -125,7 +125,7 @@ SocketAdmin.categories.search = function(socket, data, callback) { var username = data.username, cid = data.cid; - user.search(username, function(data) { + user.search(username, function(err, data) { async.map(data, function(userObj, next) { CategoryTools.privileges(cid, userObj.uid, function(err, privileges) { if(err) { diff --git a/src/socket.io/user.js b/src/socket.io/user.js index 81df38e33a..ea608750e4 100644 --- a/src/socket.io/user.js +++ b/src/socket.io/user.js @@ -19,6 +19,10 @@ SocketUser.emailExists = function(socket, data, callback) { } }; +SocketUser.search = function(socket, username, callback) { + user.search(username, callback); +}; + // Password Reset SocketUser.reset = {}; diff --git a/src/user.js b/src/user.js index 769fc1f27c..00ccee7cf1 100644 --- a/src/user.js +++ b/src/user.js @@ -482,27 +482,6 @@ var bcrypt = require('bcrypt'), }); } - // User.search = function(username, callback) { - // if (!username) { - // return callback([]); - // } - - // db.search('user', username, 50, function(err, uids) { - // if (err) { - // console.log(err); - // return; - // } - - // if (uids && uids.length) { - // User.getDataForUsers(uids, function(userdata) { - // callback(userdata); - // }); - // } else { - // callback([]); - // } - // }); - // }; - User.search = function(query, callback) { if (!query || query.length === 0) { return callback(null, []); @@ -519,12 +498,21 @@ var bcrypt = require('bcrypt'), results = []; results = usernames.filter(function(username) { // Remove non-matches - return filterRegex.text(username); + return filterRegex.test(username); }).sort(function(a, b) { // Sort alphabetically return a > b; - }).slice(0, 5); // Limit 5 + }).slice(0, 5) // Limit 5 + .map(function(username) { // Translate to uids + return usernamesHash[username]; + }); - callback(null, results); + if (results && results.length) { + User.getDataForUsers(results, function(userdata) { + callback(null, userdata); + }); + } else { + callback(null, []); + } }); }; From b6aa31b245ed97e10293e7708ca495ef565b84c6 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Sun, 19 Jan 2014 22:11:34 -0500 Subject: [PATCH 3/4] removed references to Reds user search --- src/routes/debug.js | 10 ++-------- src/user.js | 23 ----------------------- 2 files changed, 2 insertions(+), 31 deletions(-) diff --git a/src/routes/debug.js b/src/routes/debug.js index c31684a6dd..db55f82258 100644 --- a/src/routes/debug.js +++ b/src/routes/debug.js @@ -67,15 +67,9 @@ var DebugRoute = function(app) { topics.reIndexAll(function (err) { if (err) { return res.json(err); + } else { + res.send('Topics and users reindexed'); } - - user.reIndexAll(function (err) { - if (err) { - return res.json(err); - } else { - res.send('Topics and users reindexed'); - } - }); }); }); diff --git a/src/user.js b/src/user.js index 00ccee7cf1..c035369a18 100644 --- a/src/user.js +++ b/src/user.js @@ -115,8 +115,6 @@ var bcrypt = require('bcrypt'), db.sortedSetAdd('users:postcount', 0, uid); db.sortedSetAdd('users:reputation', 0, uid); - db.searchIndex('user', username, uid); - // Join the "registered-users" meta group groups.joinByGroupName('registered-users', uid); @@ -309,7 +307,6 @@ var bcrypt = require('bcrypt'), db.deleteObjectField('username:uid', userData.username); db.setObjectField('username:uid', data.username, uid); events.logUsernameChange(uid, userData.username, data.username); - User.reIndexUser(uid, data.username); } if(userslug !== userData.userslug) { @@ -438,26 +435,6 @@ var bcrypt = require('bcrypt'), }); }; - User.reIndexAll = function(callback) { - User.getUsers('users:joindate', 0, -1, function(err, usersData) { - if (err) { - return callback(err, null); - } - - for (var i = 0; i < usersData.length; ++i) { - User.reIndexUser(usersData[i].uid, usersData[i].username); - } - - callback(null, 1); - }); - }; - - User.reIndexUser = function(uid, username) { - db.searchRemove('user', uid, function() { - db.searchIndex('user', username, uid); - }); - }; - // thanks to @akhoury User.getUsersCSV = function(callback) { var csvContent = ""; From ee6ac77f8b740fea75cb96fd987c6b780411f214 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Sun, 19 Jan 2014 22:29:28 -0500 Subject: [PATCH 4/4] new upgrade directive --- src/upgrade.js | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/upgrade.js b/src/upgrade.js index 89f3843192..15d8613272 100644 --- a/src/upgrade.js +++ b/src/upgrade.js @@ -17,7 +17,7 @@ var db = require('./database'), Upgrade.check = function(callback) { // IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema - var latestSchema = new Date(2014, 0, 13, 12, 0).getTime(); + var latestSchema = new Date(2014, 0, 19, 22, 19).getTime(); db.get('schemaDate', function(err, value) { if (parseInt(value, 10) >= latestSchema) { @@ -281,6 +281,24 @@ Upgrade.upgrade = function(callback) { winston.info('[2014/1/13] Set up "Registered Users" user group - skipped'); next(); } + }, + function(next) { + thisSchemaDate = new Date(2014, 0, 19, 22, 19).getTime(); + if (schemaDate < thisSchemaDate) { + updatesMade = true; + + db.getObjectValues('username:uid', function(err, uids) { + async.each(uids, function(uid, next) { + db.searchRemove('user', uid, next); + }, function(err) { + winston.info('[2014/1/19] Remove user search from Reds'); + next(); + }); + }); + } else { + winston.info('[2014/1/19] Remove user search from Reds -- skipped'); + next(); + } } // Add new schema updates here // IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema IN LINE 17!!!