fix: #9177, handled multiple deleted users properly

v1.18.x
Barış Soner Uşaklı 4 years ago
parent 5cae95eb9f
commit eaf62d39fd

@ -37,12 +37,14 @@ module.exports = function (User) {
User.guestData = { User.guestData = {
uid: 0, uid: 0,
username: '[[global:guest]]', username: '[[global:guest]]',
displayname: '[[global:guest]]',
userslug: '', userslug: '',
fullname: '[[global:guest]]', fullname: '[[global:guest]]',
email: '', email: '',
'icon:text': '?', 'icon:text': '?',
'icon:bgColor': '#aaa', 'icon:bgColor': '#aaa',
groupTitle: '', groupTitle: '',
groupTitleArray: [],
status: 'offline', status: 'offline',
reputation: 0, reputation: 0,
'email:confirmed': 0, 'email:confirmed': 0,
@ -68,14 +70,19 @@ module.exports = function (User) {
fields = fields.filter(value => value !== 'password'); fields = fields.filter(value => value !== 'password');
} }
let users = await db.getObjectsFields(uniqueUids.map(uid => 'user:' + uid), fields); const users = await db.getObjectsFields(uniqueUids.map(uid => 'user:' + uid), fields);
const result = await plugins.hooks.fire('filter:user.getFields', { const result = await plugins.hooks.fire('filter:user.getFields', {
uids: uniqueUids, uids: uniqueUids,
users: users, users: users,
fields: fields, fields: fields,
}); });
users = uidsToUsers(uids, uniqueUids, result.users); result.users.forEach((user, index) => {
return await modifyUserData(users, fields, fieldsToRemove); if (uniqueUids[index] > 0 && !user.uid) {
user.oldUid = uniqueUids[index];
}
});
await modifyUserData(result.users, fields, fieldsToRemove);
return uidsToUsers(uids, uniqueUids, result.users);
}; };
function ensureRequiredFields(fields, fieldsToRemove) { function ensureRequiredFields(fields, fieldsToRemove) {
@ -110,12 +117,13 @@ module.exports = function (User) {
function uidsToUsers(uids, uniqueUids, usersData) { function uidsToUsers(uids, uniqueUids, usersData) {
const uidToUser = _.zipObject(uniqueUids, usersData); const uidToUser = _.zipObject(uniqueUids, usersData);
const users = uids.map(function (uid) { const users = uids.map(function (uid) {
const returnPayload = uidToUser[uid] || { ...User.guestData }; const user = uidToUser[uid] || { ...User.guestData };
if (uid > 0 && !returnPayload.uid) { if (!parseInt(user.uid, 10)) {
returnPayload.oldUid = parseInt(uid, 10); user.username = (user.hasOwnProperty('oldUid') && parseInt(user.oldUid, 10)) ? '[[global:former_user]]' : '[[global:guest]]';
user.displayname = user.username;
} }
return returnPayload; return user;
}); });
return users; return users;
} }
@ -142,19 +150,14 @@ module.exports = function (User) {
async function modifyUserData(users, requestedFields, fieldsToRemove) { async function modifyUserData(users, requestedFields, fieldsToRemove) {
let uidToSettings = {}; let uidToSettings = {};
if (meta.config.showFullnameAsDisplayName) { if (meta.config.showFullnameAsDisplayName) {
const uids = _.uniq(users.map(user => user.uid)); const uids = users.map(user => user.uid);
uidToSettings = _.zipObject(uids, await db.getObjectsFields( uidToSettings = _.zipObject(uids, await db.getObjectsFields(
uids.map(uid => 'user:' + uid + ':settings'), uids.map(uid => 'user:' + uid + ':settings'),
['showfullname'] ['showfullname']
)); ));
} }
const uidToUser = {};
users.forEach(function (user) {
uidToUser[user.uid] = user;
});
await Promise.all(Object.keys(uidToUser).map(async function (uid) { await Promise.all(users.map(async function (user) {
const user = uidToUser[uid];
if (!user) { if (!user) {
return; return;
} }
@ -171,14 +174,10 @@ module.exports = function (User) {
} }
if (!parseInt(user.uid, 10)) { if (!parseInt(user.uid, 10)) {
user.uid = 0; for (const [key, value] of Object.entries(User.guestData)) {
user.username = (user.hasOwnProperty('oldUid') && parseInt(user.oldUid, 10)) ? '[[global:former_user]]' : '[[global:guest]]'; user[key] = value;
user.displayname = user.username; }
user.userslug = '';
user.picture = User.getDefaultAvatar(); user.picture = User.getDefaultAvatar();
user['icon:text'] = '?';
user['icon:bgColor'] = '#aaa';
user.groupTitle = '';
} }
if (user.hasOwnProperty('groupTitle')) { if (user.hasOwnProperty('groupTitle')) {

Loading…
Cancel
Save