From 33780e6fdb18c7ae8bde483bb93c1074593118e1 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 3 Oct 2014 14:14:41 -0400 Subject: [PATCH] closes #2133 --- src/controllers/admin/users.js | 4 +++ src/database/mongo/sorted.js | 3 +++ src/routes/admin.js | 1 + src/upgrade.js | 45 +++++++++++++++++++++++++++++++- src/user/admin.js | 14 ++++++++-- src/views/admin/manage/users.tpl | 5 ++-- 6 files changed, 67 insertions(+), 5 deletions(-) diff --git a/src/controllers/admin/users.js b/src/controllers/admin/users.js index 14f02b7fd0..4af06fed33 100644 --- a/src/controllers/admin/users.js +++ b/src/controllers/admin/users.js @@ -25,6 +25,10 @@ usersController.sortByJoinDate = function(req, res, next) { getUsers('users:joindate', req, res, next); }; +usersController.banned = function(req, res, next) { + getUsers('users:banned', req, res, next); +}; + function getUsers(set, req, res, next) { user.getUsersFromSet(set, 0, 49, function(err, users) { if (err) { diff --git a/src/database/mongo/sorted.js b/src/database/mongo/sorted.js index 41e0cf0663..5af9d8bd7f 100644 --- a/src/database/mongo/sorted.js +++ b/src/database/mongo/sorted.js @@ -26,6 +26,9 @@ module.exports = function(db, module) { }; function sortedSetAddBulk(key, scores, values, callback) { + if (!scores.length || !values.length) { + return callback(); + } if (scores.length !== values.length) { return callback(new Error('[[error:invalid-data]]')); } diff --git a/src/routes/admin.js b/src/routes/admin.js index 5093683824..104f6c40f3 100644 --- a/src/routes/admin.js +++ b/src/routes/admin.js @@ -51,6 +51,7 @@ function addRoutes(router, middleware, controllers) { router.get('/manage/users/latest', controllers.admin.users.sortByJoinDate); router.get('/manage/users/sort-posts', controllers.admin.users.sortByPosts); router.get('/manage/users/sort-reputation', controllers.admin.users.sortByReputation); + router.get('/manage/users/banned', controllers.admin.users.banned); router.get('/manage/groups', controllers.admin.groups.get); diff --git a/src/upgrade.js b/src/upgrade.js index 65bbdd7a2d..7621c572b2 100644 --- a/src/upgrade.js +++ b/src/upgrade.js @@ -19,7 +19,7 @@ var db = require('./database'), schemaDate, thisSchemaDate, // IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema - latestSchema = Date.UTC(2014, 8, 27); + latestSchema = Date.UTC(2014, 9, 3); Upgrade.check = function(callback) { db.get('schemaDate', function(err, value) { @@ -1042,6 +1042,49 @@ Upgrade.upgrade = function(callback) { winston.info('[2014/9/27] Deleting tid::read_by_uid skipped'); next(); } + }, + function(next) { + thisSchemaDate = Date.UTC(2014, 9, 3); + if (schemaDate < thisSchemaDate) { + winston.info('[2014/10/3] Banned users sorted set'); + + db.getSortedSetRange('users:joindate', 0, -1, function(err, uids) { + if (err) { + return next(err); + } + + async.eachLimit(uids, 50, function(uid, next) { + User.getMultipleUserFields(uids, ['uid', 'banned'], function(err, userData) { + if (err) { + return next(err); + } + + var bannedUids = userData.filter(function(user) { + return user && parseInt(user.banned, 10) === 1; + }).map(function(user) { + return user.uid; + }); + var timestamps = []; + var now = Date.now(); + bannedUids.forEach(function() { + timestamps.push(now); + }); + db.sortedSetAdd('users:banned', timestamps, bannedUids, next); + }); + }, function(err) { + if (err) { + winston.error('[2014/10/3] Error encountered while updating banned users sorted set'); + return next(err); + } + + winston.info('[2014/10/3] Banned users added to sorted set'); + Upgrade.update(thisSchemaDate, next); + }); + }); + } else { + winston.info('[2014/10/3] Banned users sorted set skipped'); + next(); + } } // Add new schema updates here // IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema IN LINE 22!!! diff --git a/src/user/admin.js b/src/user/admin.js index d489f16446..ab94a35193 100644 --- a/src/user/admin.js +++ b/src/user/admin.js @@ -46,11 +46,21 @@ module.exports = function(User) { }; User.ban = function(uid, callback) { - User.setUserField(uid, 'banned', 1, callback); + User.setUserField(uid, 'banned', 1, function(err) { + if (err) { + return callback(); + } + db.sortedSetAdd('users:banned', Date.now(), uid, callback); + }); }; User.unban = function(uid, callback) { db.delete('uid:' + uid + ':flagged_by'); - User.setUserField(uid, 'banned', 0, callback); + User.setUserField(uid, 'banned', 0, function(err) { + if (err) { + return callback(err); + } + db.sortedSetRemove('users:banned', uid, callback); + }); }; }; diff --git a/src/views/admin/manage/users.tpl b/src/views/admin/manage/users.tpl index 6b080edeb4..543cf8e26b 100644 --- a/src/views/admin/manage/users.tpl +++ b/src/views/admin/manage/users.tpl @@ -2,12 +2,13 @@
Users
-
+