Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FIX] Discussions created from inside DMs were not working and some errors accessing recently created rooms #17282

Merged
merged 6 commits into from
Apr 14, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion app/discussion/server/methods/createDiscussion.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { hasAtLeastOnePermission, canAccessRoom } from '../../../authorization/s
import { Messages, Rooms } from '../../../models/server';
import { createRoom, addUserToRoom, sendMessage, attachMessage } from '../../../lib/server';
import { settings } from '../../../settings/server';
import { roomTypes } from '../../../utils/server';

const getParentRoom = (rid) => {
const room = Rooms.findOne(rid);
Expand Down Expand Up @@ -86,7 +87,8 @@ const create = ({ prid, pmid, t_name, reply, users }) => {
// auto invite the replied message owner
const invitedUsers = message ? [message.u.username, ...users] : users;

const discussion = createRoom(p_room.t, name, user.username, [...new Set(invitedUsers)], false, {
const type = roomTypes.getConfig(p_room.t).getDiscussionType();
const discussion = createRoom(type, name, user.username, [...new Set(invitedUsers)], false, {
fname: t_name,
description: message.msg, // TODO discussions remove
topic: p_room.name, // TODO discussions remove
Expand Down
4 changes: 4 additions & 0 deletions app/lib/lib/roomTypes/public.js
Original file line number Diff line number Diff line change
Expand Up @@ -133,4 +133,8 @@ export class PublicRoomType extends RoomTypeConfig {

return getAvatarURL({ username: `@${ this.roomName(roomData) }` });
}

getDiscussionType() {
return 'c';
}
}
4 changes: 4 additions & 0 deletions app/utils/lib/RoomTypeConfig.js
Original file line number Diff line number Diff line change
Expand Up @@ -299,4 +299,8 @@ export class RoomTypeConfig {
openCustomProfileTab() {
return false;
}

getDiscussionType() {
return 'p';
}
}
1 change: 1 addition & 0 deletions server/startup/migrations/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -180,4 +180,5 @@ import './v179';
import './v180';
import './v181';
import './v182';
import './v183';
import './xrun';
94 changes: 94 additions & 0 deletions server/startup/migrations/v183.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
import { Random } from 'meteor/random';

import { Migrations } from '../../../app/migrations';
import { Rooms, Messages, Subscriptions, Uploads } from '../../../app/models/server';

const unifyRooms = (room) => {
// verify if other DM already exists
const other = Rooms.findOne({
_id: { $ne: room._id },
t: 'd',
uids: room.uids,
});

// we need to at least change the _id of the current room, so remove it
Rooms.remove({ _id: room._id });

const newId = (other && other._id) || Random.id();

if (!other) {
// create the same room with different _id
Rooms.insert({
...room,
_id: newId,
});

// update subscription to point to new room _id
Subscriptions.update({ rid: room._id }, {
$set: {
rid: newId,
},
}, { multi: true });

return newId;
}

// the other room exists already, so just remove the subscription of the wrong room
Subscriptions.remove({ rid: room._id });

return newId;
};

const fixSelfDMs = () => {
Rooms.find({
t: 'd',
uids: { $size: 1 },
}).forEach((room) => {
if (!Array.isArray(room.uids) || room._id !== room.uids[0]) {
return;
}

const correctId = unifyRooms(room);

// move things to correct room
Messages.update({ rid: room._id }, {
$set: {
rid: correctId,
},
}, { multi: true });
Uploads.update({ rid: room._id }, {
$set: {
rid: correctId,
},
}, { multi: true });
});
};

const fixDiscussions = () => {
Rooms.find({ t: 'd', prid: { $exists: true } }, { fields: { _id: 1 } }).forEach(({ _id }) => {
const { u } = Messages.findOne({ drid: _id }, { fields: { u: 1 } }) || {};

Rooms.update({ _id }, {
$set: {
t: 'p',
name: Random.id(),
u,
ro: false,
default: false,
sysMes: true,
},
$unset: {
usernames: 1,
uids: 1,
},
});
});
};

Migrations.add({
version: 183,
up() {
fixDiscussions();
fixSelfDMs();
},
});