perf: get rid of async call in user load for expiring bans

unban all expires in one call
This commit is contained in:
Barış Soner Uşaklı
2024-06-11 17:42:06 -04:00
parent 1dadd16f4b
commit 023d52a31c
2 changed files with 13 additions and 14 deletions

View File

@@ -42,7 +42,7 @@ module.exports = function (User) {
await db.sortedSetAdd('users:banned', now, uid); await db.sortedSetAdd('users:banned', now, uid);
await db.sortedSetAdd(`uid:${uid}:bans:timestamp`, now, banKey); await db.sortedSetAdd(`uid:${uid}:bans:timestamp`, now, banKey);
await db.setObject(banKey, banData); await db.setObject(banKey, banData);
await User.setUserField(uid, 'banned:expire', banData.expire); await User.setUserFields(uid, { banned: 1, 'banned:expire': banData.expire });
if (until > now) { if (until > now) {
await db.sortedSetAdd('users:banned:expire', until, uid); await db.sortedSetAdd('users:banned:expire', until, uid);
} else { } else {
@@ -69,7 +69,7 @@ module.exports = function (User) {
uids = isArray ? uids : [uids]; uids = isArray ? uids : [uids];
const userData = await User.getUsersFields(uids, ['email:confirmed']); const userData = await User.getUsersFields(uids, ['email:confirmed']);
await db.setObject(uids.map(uid => `user:${uid}`), { 'banned:expire': 0 }); await db.setObject(uids.map(uid => `user:${uid}`), { banned: 0, 'banned:expire': 0 });
const now = Date.now(); const now = Date.now();
const unbanDataArray = []; const unbanDataArray = [];
/* eslint-disable no-await-in-loop */ /* eslint-disable no-await-in-loop */
@@ -124,16 +124,15 @@ module.exports = function (User) {
User.bans.unbanIfExpired = async function (uids) { User.bans.unbanIfExpired = async function (uids) {
// loading user data will unban if it has expired -barisu // loading user data will unban if it has expired -barisu
const userData = await User.getUsersFields(uids, ['banned:expire']); const userData = await User.getUsersFields(uids, ['banned', 'banned:expire']);
return User.bans.calcExpiredFromUserData(userData); return User.bans.calcExpiredFromUserData(userData);
}; };
User.bans.calcExpiredFromUserData = async function (userData) { User.bans.calcExpiredFromUserData = function (userData) {
const isArray = Array.isArray(userData); const isArray = Array.isArray(userData);
userData = isArray ? userData : [userData]; userData = isArray ? userData : [userData];
const banned = await groups.isMembers(userData.map(u => u.uid), groups.BANNED_USERS); userData = userData.map(userData => ({
userData = userData.map((userData, index) => ({ banned: !!(userData && userData.banned),
banned: banned[index],
'banned:expire': userData && userData['banned:expire'], 'banned:expire': userData && userData['banned:expire'],
banExpired: userData && userData['banned:expire'] <= Date.now() && userData['banned:expire'] !== 0, banExpired: userData && userData['banned:expire'] <= Date.now() && userData['banned:expire'] !== 0,
})); }));

View File

@@ -193,6 +193,7 @@ module.exports = function (User) {
iconBackgrounds = await User.getIconBackgrounds(); iconBackgrounds = await User.getIconBackgrounds();
} }
const unbanUids = [];
users.forEach((user) => { users.forEach((user) => {
if (!user) { if (!user) {
return; return;
@@ -258,23 +259,22 @@ module.exports = function (User) {
if (user.hasOwnProperty('mutedUntil')) { if (user.hasOwnProperty('mutedUntil')) {
user.muted = user.mutedUntil > Date.now(); user.muted = user.mutedUntil > Date.now();
} }
});
// TODO get rid of single calls
// dont do anything if user is not banned?
await Promise.all(users.map(async (user) => {
if (user.hasOwnProperty('banned') || user.hasOwnProperty('banned:expire')) { if (user.hasOwnProperty('banned') || user.hasOwnProperty('banned:expire')) {
const result = await User.bans.calcExpiredFromUserData(user); const result = User.bans.calcExpiredFromUserData(user);
user.banned = result.banned; user.banned = result.banned;
const unban = result.banned && result.banExpired; const unban = result.banned && result.banExpired;
user.banned_until = unban ? 0 : user['banned:expire']; user.banned_until = unban ? 0 : user['banned:expire'];
user.banned_until_readable = user.banned_until && !unban ? utils.toISOString(user.banned_until) : 'Not Banned'; user.banned_until_readable = user.banned_until && !unban ? utils.toISOString(user.banned_until) : 'Not Banned';
if (unban) { if (unban) {
await User.bans.unban(user.uid, '[[user:info.ban-expired]]'); unbanUids.push(user.uid);
user.banned = false; user.banned = false;
} }
} }
})); });
if (unbanUids.length) {
await User.bans.unban(unbanUids, '[[user:info.ban-expired]]');
}
return await plugins.hooks.fire('filter:users.get', users); return await plugins.hooks.fire('filter:users.get', users);
} }