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/methods/channelsList.js

98 lines
2.6 KiB

import { Meteor } from 'meteor/meteor';
import { Match, check } from 'meteor/check';
import _ from 'underscore';
import s from 'underscore.string';
import { hasPermission } from '../../app/authorization';
import { Rooms, Subscriptions, Users } from '../../app/models';
import { getUserPreference } from '../../app/utils';
import { settings } from '../../app/settings';
Meteor.methods({
channelsList(filter, channelType, limit, sort) {
check(filter, String);
check(channelType, String);
check(limit, Match.Optional(Number));
check(sort, Match.Optional(String));
if (!Meteor.userId()) {
throw new Meteor.Error('error-invalid-user', 'Invalid user', {
method: 'channelsList',
});
}
const options = {
fields: {
name: 1,
t: 1,
},
sort: {
msgs: -1,
},
};
if (_.isNumber(limit)) {
options.limit = limit;
}
if (s.trim(sort)) {
switch (sort) {
case 'name':
options.sort = {
name: 1,
};
break;
case 'msgs':
options.sort = {
msgs: -1,
};
}
}
let channels = [];
const userId = Meteor.userId();
if (channelType !== 'private') {
if (hasPermission(userId, 'view-c-room')) {
if (filter) {
channels = channels.concat(Rooms.findByTypeAndNameContaining('c', filter, options).fetch());
} else {
channels = channels.concat(Rooms.findByType('c', options).fetch());
}
} else if (hasPermission(userId, 'view-joined-room')) {
const roomIds = Subscriptions.findByTypeAndUserId('c', userId, { fields: { rid: 1 } }).fetch().map((s) => s.rid);
if (filter) {
channels = channels.concat(Rooms.findByTypeInIdsAndNameContaining('c', roomIds, filter, options).fetch());
} else {
channels = channels.concat(Rooms.findByTypeInIds('c', roomIds, options).fetch());
}
}
}
if (channelType !== 'public' && hasPermission(userId, 'view-p-room')) {
const user = Users.findOne(userId, {
fields: {
username: 1,
'settings.preferences.sidebarGroupByType': 1,
},
});
const userPref = getUserPreference(user, 'sidebarGroupByType');
// needs to negate globalPref because userPref represents its opposite
const groupByType = userPref !== undefined ? userPref : settings.get('UI_Group_Channels_By_Type');
if (!groupByType) {
const roomIds = Subscriptions.findByTypeAndUserId('p', userId, { fields: { rid: 1 } }).fetch().map((s) => s.rid);
if (filter) {
channels = channels.concat(Rooms.findByTypeInIdsAndNameContaining('p', roomIds, filter, options).fetch());
} else {
channels = channels.concat(Rooms.findByTypeInIds('p', roomIds, options).fetch());
}
}
}
return {
channels,
};
},
});