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/server/publications/room.js

120 lines
3.0 KiB

const fields = {
_id: 1,
name: 1,
fname: 1,
t: 1,
cl: 1,
u: 1,
// usernames: 1,
topic: 1,
announcement: 1,
muted: 1,
_updatedAt: 1,
archived: 1,
jitsiTimeout: 1,
description: 1,
default: 1,
customFields: 1,
// @TODO create an API to register this fields based on room type
livechatData: 1,
tags: 1,
sms: 1,
code: 1,
joinCodeRequired: 1,
open: 1,
v: 1,
label: 1,
ro: 1,
sentiment: 1
};
const roomMap = (record, fields) => {
if (record._room) {
return _.pick(record._room, ...Object.keys(fields));
}
console.log('Empty Room for Subscription', record);
return {};
};
function getFieldsForUserId(userId) {
if (RocketChat.authz.hasPermission(userId, 'view-join-code')) {
return {
...fields,
joinCode: 1
};
}
return fields;
}
Meteor.methods({
'rooms/get'(updatedAt) {
let options = {fields};
if (!Meteor.userId()) {
if (RocketChat.settings.get('Accounts_AllowAnonymousRead') === true) {
return RocketChat.models.Rooms.findByDefaultAndTypes(true, ['c'], options).fetch();
}
return [];
}
this.unblock();
options = {
fields: getFieldsForUserId(this.userId)
};
if (updatedAt instanceof Date) {
return {
update: RocketChat.models.Rooms.findBySubscriptionUserIdUpdatedAfter(Meteor.userId(), updatedAt, options).fetch(),
remove: RocketChat.models.Rooms.trashFindDeletedAfter(updatedAt, {}, {fields: {_id: 1, _deletedAt: 1}}).fetch()
};
}
return RocketChat.models.Rooms.findBySubscriptionUserId(Meteor.userId(), options).fetch();
},
getRoomByTypeAndName(type, name) {
if (!Meteor.userId() && RocketChat.settings.get('Accounts_AllowAnonymousRead') === false) {
throw new Meteor.Error('error-invalid-user', 'Invalid user', { method: 'getRoomByTypeAndName' });
}
const roomFind = RocketChat.roomTypes.getRoomFind(type);
let room;
if (roomFind) {
room = roomFind.call(this, name);
} else {
room = RocketChat.models.Rooms.findByTypeAndName(type, name).fetch();
}
if (!room) {
throw new Meteor.Error('error-invalid-room', 'Invalid room', { method: 'getRoomByTypeAndName' });
}
if (!Meteor.call('canAccessRoom', room._id, Meteor.userId())) {
throw new Meteor.Error('error-no-permission', 'No permission', { method: 'getRoomByTypeAndName' });
}
return roomMap({_room: room}, getFieldsForUserId(this.userId));
}
});
RocketChat.models.Rooms.cache.on('sync', (type, room/*, diff*/) => {
const records = RocketChat.models.Subscriptions.findByRoomId(room._id).fetch();
for (const record of records) {
RocketChat.Notifications.notifyUserInThisInstance(record.u._id, 'rooms-changed', type, roomMap({_room: room}, getFieldsForUserId(record.u._id)));
}
});
RocketChat.models.Subscriptions.on('changed', (type, subscription/*, diff*/) => {
if (type === 'inserted' || type === 'removed') {
const room = RocketChat.models.Rooms.findOneById(subscription.rid);
if (room) {
RocketChat.Notifications.notifyUserInThisInstance(subscription.u._id, 'rooms-changed', type, roomMap({_room: room}, getFieldsForUserId(subscription.u._id)));
}
}
});