fix: #7762, allow array for isBanned

dont filter banned users one by one in digest
v1.18.x
Barış Soner Uşaklı 6 years ago
parent 239195d8a9
commit 9eb1fcd4e5

@ -1,6 +1,5 @@
'use strict'; 'use strict';
const util = require('util');
const db = require('../database'); const db = require('../database');
module.exports = function (User) { module.exports = function (User) {
@ -42,42 +41,45 @@ module.exports = function (User) {
return banData; return banData;
}; };
User.bans.unban = async function (uid) { User.bans.unban = async function (uids) {
await User.setUserFields(uid, { banned: 0, 'banned:expire': 0 }); if (Array.isArray(uids)) {
await db.sortedSetsRemove(['users:banned', 'users:banned:expire'], uid); await db.setObject(uids.map(uid => 'user:' + uid), { banned: 0, 'banned:expire': 0 });
} else {
await User.setUserFields(uids, { banned: 0, 'banned:expire': 0 });
}
await db.sortedSetRemove(['users:banned', 'users:banned:expire'], uids);
}; };
User.bans.getBannedAndExpired = async function (uid) { User.bans.isBanned = async function (uids) {
if (parseInt(uid, 10) <= 0) { const isArray = Array.isArray(uids);
return false; uids = isArray ? uids : [uids];
} const result = await User.bans.unbanIfExpired(uids);
const userData = await User.getUserFields(uid, ['banned', 'banned:expire']); return isArray ? result.map(r => r.banned) : result[0].banned;
return User.bans.calcExpiredFromUserData(userData);
}; };
User.bans.calcExpiredFromUserData = function (userData) { User.bans.unbanIfExpired = async function (uids) {
return { // loading user data will unban if it has expired -barisu
banned: !!userData.banned, const userData = await User.getUsersFields(uids, ['banned', 'banned:expire']);
'banned:expire': userData['banned:expire'], return User.bans.calcExpiredFromUserData(userData);
banExpired: userData['banned:expire'] <= Date.now() && userData['banned:expire'] !== 0,
};
}; };
User.bans.unbanIfExpired = async function (uid) { User.bans.calcExpiredFromUserData = function (userData) {
const result = await User.bans.getBannedAndExpired(uid); const isArray = Array.isArray(userData);
if (result.banned && result.banExpired) { userData = isArray ? userData : [userData];
await User.bans.unban(uid); userData = userData.map(function (userData) {
return { banned: false, banExpired: true, 'banned:expire': 0 }; return {
} banned: userData && !!userData.banned,
return result; 'banned:expire': userData && userData['banned:expire'],
banExpired: userData && userData['banned:expire'] <= Date.now() && userData['banned:expire'] !== 0,
};
});
return isArray ? userData : userData[0];
}; };
User.bans.isBanned = async function (uid) { User.bans.filterBanned = async function (uids) {
if (parseInt(uid, 10) <= 0) { const isBanned = User.bans.isBanned(uids);
return false; return uids.filter((uid, index) => !isBanned[index]);
}
const result = await User.bans.unbanIfExpired(uid);
return result.banned;
}; };
User.bans.getReason = async function (uid) { User.bans.getReason = async function (uid) {
@ -91,14 +93,4 @@ module.exports = function (User) {
const banObj = await db.getObject(keys[0]); const banObj = await db.getObject(keys[0]);
return banObj && banObj.reason ? banObj.reason : ''; return banObj && banObj.reason ? banObj.reason : '';
}; };
// TODO Remove in v1.13.0
const deprecatedMessage = (oldPath, newPath) => `function ${oldPath} is deprecated, please use ${newPath} instead`;
User.ban = util.deprecate(User.bans.ban, deprecatedMessage('User.ban', 'User.bans.ban'));
User.unban = util.deprecate(User.bans.unban, deprecatedMessage('User.unban', 'User.bans.unban'));
User.getBannedAndExpired = util.deprecate(User.bans.getBannedAndExpired, deprecatedMessage('User.getBannedAndExpired', 'User.bans.getBannedAndExpired'));
User.calcBanExpiredFromUserData = util.deprecate(User.bans.calcExpiredFromUserData, deprecatedMessage('User.calcBanExpiredFromUserData', 'User.bans.calcExpiredFromUserData'));
User.unbanIfBanExpired = util.deprecate(User.bans.unbanIfExpired, deprecatedMessage('User.unbanIfBanExpired', 'User.bans.unbanIfExpired'));
User.isBanned = util.deprecate(User.bans.isBanned, deprecatedMessage('User.isBanned', 'User.bans.isBanned'));
User.getBannedReason = util.deprecate(User.bans.getReason, deprecatedMessage('User.getBannedReason', 'User.bans.getReason'));
}; };

@ -65,11 +65,16 @@ Digest.getSubscribers = function (interval, callback) {
user.getMultipleUserSettings(uids, next); user.getMultipleUserSettings(uids, next);
}, },
function (settings, next) { function (settings, next) {
const subUids = [];
settings.forEach(function (hash) { settings.forEach(function (hash) {
if (hash.dailyDigestFreq === interval) { if (hash.dailyDigestFreq === interval) {
subs.push(hash.uid); subUids.push(hash.uid);
} }
}); });
user.bans.filterBanned(subUids, next);
},
function (uids, next) {
subs = subs.concat(uids);
next(); next();
}, },
], next); ], next);
@ -77,13 +82,6 @@ Digest.getSubscribers = function (interval, callback) {
next(err, subs); next(err, subs);
}); });
}, },
function (subscribers, next) {
async.filter(subscribers, function (uid, next) {
user.bans.isBanned(uid, function (err, banned) {
next(err, !banned);
});
}, next);
},
function (subscribers, next) { function (subscribers, next) {
plugins.fireHook('filter:digest.subscribers', { plugins.fireHook('filter:digest.subscribers', {
interval: interval, interval: interval,

Loading…
Cancel
Save