The communications platform that puts data protection first.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
Rocket.Chat/packages/rocketchat-lib/server/functions/getRoomByNameOrIdWithOption...

80 lines
2.5 KiB

/* globals RocketChat */
import _ from 'underscore';
RocketChat.getRoomByNameOrIdWithOptionToJoin = function _getRoomByNameOrIdWithOptionToJoin({ currentUserId, nameOrId, type='', tryDirectByUserIdOnly=false, joinChannel=true, errorOnEmpty=true }) {
let room;
//If the nameOrId starts with #, then let's try to find a channel or group
if (nameOrId.startsWith('#')) {
nameOrId = nameOrId.substring(1);
room = RocketChat.models.Rooms.findOneByIdOrName(nameOrId);
} else if (nameOrId.startsWith('@') || type === 'd') {
//If the nameOrId starts with @ OR type is 'd', then let's try just a direct message
nameOrId = nameOrId.replace('@', '');
let roomUser;
if (tryDirectByUserIdOnly) {
roomUser = RocketChat.models.Users.findOneById(nameOrId);
} else {
roomUser = RocketChat.models.Users.findOne({
$or: [{ _id: nameOrId }, { username: nameOrId }]
});
}
const rid = _.isObject(roomUser) ? [currentUserId, roomUser._id].sort().join('') : nameOrId;
room = RocketChat.models.Rooms.findOneById(rid);
//If the room hasn't been found yet, let's try some more
if (!_.isObject(room)) {
//If the roomUser wasn't found, then there's no destination to point towards
//so return out based upon errorOnEmpty
if (!_.isObject(roomUser)) {
if (errorOnEmpty) {
throw new Meteor.Error('invalid-channel');
} else {
return;
}
}
room = Meteor.runAsUser(currentUserId, function() {
const {rid} = Meteor.call('createDirectMessage', roomUser.username);
return RocketChat.models.Rooms.findOneById(rid);
});
}
} else {
//Otherwise, we'll treat this as a channel or group.
room = RocketChat.models.Rooms.findOneByIdOrName(nameOrId);
}
//If no room was found, handle the room return based upon errorOnEmpty
if (!room && errorOnEmpty) {
throw new Meteor.Error('invalid-channel');
} else if (!room) {
return;
}
//If a room was found and they provided a type to search, then check
//and if the type found isn't what we're looking for then handle
//the return based upon errorOnEmpty
if (type && room.t !== type) {
if (errorOnEmpty) {
throw new Meteor.Error('invalid-channel');
} else {
return;
}
}
//If the room type is channel and joinChannel has been passed, try to join them
//if they can't join the room, this will error out!
if (room.t === 'c' && joinChannel) {
const sub = RocketChat.models.Subscriptions.findOneByRoomIdAndUserId(room._id, currentUserId);
if (!sub) {
Meteor.runAsUser(currentUserId, function() {
return Meteor.call('joinRoom', room._id);
});
}
}
return room;
};