createPrivateGroup method

pull/4139/head
Marcelo Schmidt 10 years ago
parent 34655a6d5f
commit 08820b3f42
No known key found for this signature in database
GPG Key ID: CA48C21A7B66097E
  1. 1
      packages/rocketchat-lib/package.js
  2. 65
      packages/rocketchat-lib/server/functions/createPrivateGroup.js
  3. 21
      packages/rocketchat-slackbridge/slackbridge.js
  4. 47
      server/methods/createPrivateGroup.coffee

@ -58,6 +58,7 @@ Package.onUse(function(api) {
// SERVER FUNCTIONS
api.addFiles('server/functions/checkUsernameAvailability.coffee', 'server');
api.addFiles('server/functions/checkEmailAvailability.js', 'server');
api.addFiles('server/functions/createPrivateGroup.js', 'server');
api.addFiles('server/functions/deleteUser.js', 'server');
api.addFiles('server/functions/sendMessage.coffee', 'server');
api.addFiles('server/functions/settings.coffee', 'server');

@ -0,0 +1,65 @@
/* globals RocketChat */
RocketChat.createPrivateGroup = function(name, owner, members) {
name = s.trim(name);
owner = s.trim(owner);
members = [].concat(members);
if (!name) {
throw new Meteor.Error('error-invalid-name', 'Invalid name', { function: 'RocketChat.createPrivateGroup' });
}
if (!owner) {
throw new Meteor.Error('error-invalid-user', 'Invalid user', { function: 'RocketChat.createPrivateGroup' });
}
let nameValidation;
try {
nameValidation = new RegExp('^' + RocketChat.settings.get('UTF8_Names_Validation') + '$');
} catch (error) {
nameValidation = new RegExp('^[0-9a-zA-Z-_.]+$');
}
if (!nameValidation.test(name)) {
throw new Meteor.Error('error-invalid-name', 'Invalid name', { function: 'RocketChat.createPrivateGroup' });
}
let now = new Date();
if (!_.contains(members, owner)) {
members.push(owner);
}
// avoid duplicate names
let room = RocketChat.models.Rooms.findOneByName(name);
if (room) {
if (room.archived) {
throw new Meteor.Error('error-archived-duplicate-name', 'There\'s an archived channel with name ' + name, { function: 'RocketChat.createPrivateGroup', room_name: name });
} else {
throw new Meteor.Error('error-duplicate-channel-name', 'A channel with name \'' + name + '\' exists', { function: 'RocketChat.createPrivateGroup', room_name: name });
}
}
room = RocketChat.models.Rooms.createWithTypeNameUserAndUsernames('p', name, owner, members, { ts: now });
for (let username of members) {
let member = RocketChat.models.Users.findOneByUsername(username, { fields: { username: 1 }});
if (!member) {
continue;
}
let extra = { open: true };
if (username === owner) {
extra.ls = now;
}
RocketChat.models.Subscriptions.createWithRoomAndUser(room, member, extra);
}
// set owner
owner = RocketChat.models.Users.findOneByUsername(owner, { fields: { username: 1 }});
RocketChat.authz.addUserRoles(owner._id, ['owner'], room._id);
return {
rid: room._id
};
};

@ -102,10 +102,9 @@ class SlackBridge {
if (data && data.data && data.data.ok === true) {
let channelData = isGroup ? data.data.group : data.data.channel;
let existingRoom = RocketChat.models.Rooms.findOneByName(channelData.name);
// If the room exists, make sure we have its id in importIds
if (existingRoom || channelData.is_general) {
if (channelData.is_general && channelData.name !== (existingRoom && existingRoom.name)) {
Meteor.call('saveRoomSettings', 'GENERAL', 'roomName', channelData.name);
}
channelData.rocketId = channelData.is_general ? 'GENERAL' : existingRoom._id;
RocketChat.models.Rooms.update({ _id: channelData.rocketId }, { $addToSet: { importIds: channelData.id } });
} else {
@ -125,15 +124,13 @@ class SlackBridge {
}
try {
Meteor.runAsUser(creator._id, () => {
if (isGroup) {
let channel = Meteor.call('createPrivateGroup', channelData.name, users);
channelData.rocketId = channel._id;
} else {
let channel = Meteor.call('createChannel', channelData.name, users);
channelData.rocketId = channel._id;
}
});
if (isGroup) {
let channel = RocketChat.createPrivateGroup(channelData, users);
channelData.rocketId = channel._id;
} else {
let channel = Meteor.call('createChannel', channelData.name, users);
channelData.rocketId = channel._id;
}
} catch (e) {
if (!hasRetried) {
// If first time trying to create channel fails, could be because of multiple messages received at the same time. Try again once after 1s.

@ -6,49 +6,4 @@ Meteor.methods
unless RocketChat.authz.hasPermission(Meteor.userId(), 'create-p')
throw new Meteor.Error 'error-not-allowed', "Not allowed", { method: 'createPrivateGroup' }
try
nameValidation = new RegExp '^' + RocketChat.settings.get('UTF8_Names_Validation') + '$'
catch
nameValidation = new RegExp '^[0-9a-zA-Z-_.]+$'
if not nameValidation.test name
throw new Meteor.Error 'error-invalid-name', "Invalid name", { method: 'createPrivateGroup' }
now = new Date()
me = Meteor.user()
members.push me.username
# name = s.slugify name
# avoid duplicate names
if RocketChat.models.Rooms.findOneByName name
if RocketChat.models.Rooms.findOneByName(name).archived
throw new Meteor.Error 'error-archived-duplicate-name', "There's an archived channel with name " + name, { method: 'createPrivateGroup', room_name: name }
else
throw new Meteor.Error 'error-duplicate-channel-name', "A channel with name '" + name + "' exists", { method: 'createPrivateGroup', room_name: name }
# create new room
room = RocketChat.models.Rooms.createWithTypeNameUserAndUsernames 'p', name, me, members,
ts: now
for username in members
member = RocketChat.models.Users.findOneByUsername(username, { fields: { username: 1 }})
if not member?
continue
extra =
open: true
if username is me.username
extra.ls = now
RocketChat.models.Subscriptions.createWithRoomAndUser room, member, extra
# set creator as group moderator. permission limited to group by scoping to rid
RocketChat.authz.addUserRoles(Meteor.userId(), ['owner'], room._id)
return {
rid: room._id
}
return RocketChat.createPrivateGroup(name, Meteor.user()?.username, members);

Loading…
Cancel
Save