[FIX] Group DMs title when user changes his/her name (#19834)

Co-authored-by: Diego Sampaio <chinello@gmail.com>
pull/19925/head
Gabriel Thomé 4 years ago committed by GitHub
parent b336e3ae5a
commit 91880428a3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      app/lib/server/functions/saveUserIdentity.js
  2. 35
      app/lib/server/functions/updateGroupDMsName.js
  3. 67
      tests/end-to-end/api/09-rooms.js

@ -38,7 +38,7 @@ export function saveUserIdentity(userId, { _id, name: rawName, username: rawUser
}
// if coming from old username, update all references
if (previousUsername && usernameChanged) {
if ((previousUsername && usernameChanged) || (previousName && previousUsername)) {
if (typeof rawUsername !== 'undefined') {
Messages.updateAllUsernamesByUserId(user._id, username);
Messages.updateUsernameOfEditByUserId(user._id, username);

@ -3,37 +3,52 @@ import { Rooms, Subscriptions, Users } from '../../../models/server';
const getFname = (members) => members.map(({ name, username }) => name || username).join(', ');
const getName = (members) => members.map(({ username }) => username).join(',');
export const updateGroupDMsName = (user) => {
if (!user.username) {
function getUsersWhoAreInTheSameGroupDMsAs(user) {
// add all users to single array so we can fetch details from them all at once
const rooms = Rooms.findGroupDMsByUids(user._id, { fields: { uids: 1 } });
if (rooms.count() === 0) {
return;
}
const userIds = new Set();
const users = new Map();
const rooms = Rooms.findGroupDMsByUids(user._id, { fields: { uids: 1 } });
rooms.forEach((room) => room.uids.forEach((uid) => uid !== user._id && userIds.add(uid)));
if (rooms.count() === 0) {
Users.findByIds([...userIds], { fields: { username: 1, name: 1 } })
.forEach((user) => users.set(user._id, user));
return users;
}
function sortUsersAlphabetically(u1, u2) {
return (u1.name || u1.username).localeCompare(u2.name || u2.username);
}
export const updateGroupDMsName = (userThatChangedName) => {
if (!userThatChangedName.username) {
return;
}
// add all users to single array so we can fetch details from them all at once
rooms.forEach((room) => room.uids.forEach((uid) => uid !== user._id && userIds.add(uid)));
const users = getUsersWhoAreInTheSameGroupDMsAs(userThatChangedName);
if (!users) {
return;
}
Users.findByIds([...userIds], { fields: { username: 1, name: 1 } })
.forEach((user) => users.set(user._id, user));
users.set(userThatChangedName._id, userThatChangedName);
const rooms = Rooms.findGroupDMsByUids(userThatChangedName._id, { fields: { uids: 1 } });
const getMembers = (uids) => uids.map((uid) => users.get(uid)).filter(Boolean);
// loop rooms to update the subcriptions from them all
rooms.forEach((room) => {
const members = getMembers(room.uids);
const sortedMembers = members.sort((u1, u2) => (u1.name || u1.username).localeCompare(u2.name || u2.username));
const sortedMembers = members.sort(sortUsersAlphabetically);
const subs = Subscriptions.findByRoomId(room._id, { fields: { _id: 1, 'u._id': 1 } });
subs.forEach((sub) => {
const otherMembers = sortedMembers.filter(({ _id }) => _id !== sub.u._id);
Subscriptions.updateNameAndFnameById(sub._id, getName(otherMembers), getFname(otherMembers));
});
});

@ -6,6 +6,7 @@ import { closeRoom, createRoom } from '../../data/rooms.helper';
import { imgURL } from '../../data/interactions.js';
import { updatePermission, updateSetting } from '../../data/permissions.helper';
import { sendSimpleMessage } from '../../data/chat.helper';
import { createUser } from '../../data/users.helper';
describe('[Rooms]', function() {
this.retries(0);
@ -933,4 +934,70 @@ describe('[Rooms]', function() {
.end(done);
});
});
describe('update group dms name', () => {
let testUser;
let roomId;
before(async () => {
testUser = await createUser();
const rocketcat = 'rocket.cat';
const usernames = [testUser.username, rocketcat].join(',');
const result = await request.post(api('dm.create'))
.set(credentials)
.send({
usernames,
});
roomId = result.body.room.rid;
});
it('should update group name if user changes username', (done) => {
updateSetting('UI_Use_Real_Name', false).then(() => {
request.post(api('users.update'))
.set(credentials)
.send({
userId: testUser._id,
data: {
username: `changed.username.${ testUser.username }`,
},
})
.end(() => {
request.get(api('subscriptions.getOne'))
.set(credentials)
.query({ roomId })
.end((err, res) => {
const { subscription } = res.body;
expect(subscription.name).to.equal(`rocket.cat,changed.username.${ testUser.username }`);
done();
});
});
});
});
it('should update group name if user changes name', (done) => {
updateSetting('UI_Use_Real_Name', true).then(() => {
request.post(api('users.update'))
.set(credentials)
.send({
userId: testUser._id,
data: {
name: `changed.name.${ testUser.username }`,
},
})
.end(() => {
request.get(api('subscriptions.getOne'))
.set(credentials)
.query({ roomId })
.end((err, res) => {
const { subscription } = res.body;
expect(subscription.fname).to.equal(`changed.name.${ testUser.username }, Rocket.Cat`);
done();
});
});
});
});
});
});

Loading…
Cancel
Save