Commit afcf012b authored by Bradley Hilton's avatar Bradley Hilton

Several changes to allow for easier Integrations from others.

* getFullUserData now accepts a limit of -1 which will retrieve all of the users, but you only see what you have permission to.
* processWebhookMessage now accepts a roomId for rooms or user, that way integrations don't have to know the name of the channel.
* Fixed the chat.postMessage being broke for messages that contain more than channel and text...whoops!
parent 39b20d13
......@@ -2,11 +2,11 @@
RocketChat.API.v1.addRoute('chat.delete', { authRequired: true }, {
post: function() {
try {
check(this.bodyParams, {
check(this.bodyParams, Match.ObjectIncluding({
msgId: String,
roomId: String,
asUser: Match.Maybe(Boolean)
});
}));
const msg = RocketChat.models.Messages.findOneById(this.bodyParams.msgId, { fields: { u: 1, rid: 1 }});
......@@ -35,14 +35,6 @@ RocketChat.API.v1.addRoute('chat.delete', { authRequired: true }, {
RocketChat.API.v1.addRoute('chat.postMessage', { authRequired: true }, {
post: function() {
try {
if (!this.bodyParams.attachments) {
check(this.bodyParams, {
channel: String,
text: String
});
}
//TODO: Completely rewrite this? Seems too "magical"
const messageReturn = processWebhookMessage(this.bodyParams, this.user)[0];
if (!messageReturn) {
......
......@@ -116,10 +116,16 @@ RocketChat.API.v1.addRoute('users.info', { authRequired: true }, {
RocketChat.API.v1.addRoute('users.list', { authRequired: true }, {
get: function() {
let limit = -1;
if (typeof this.queryParams.limit !== 'undefined') {
limit = parseInt(limit);
}
let result = undefined;
try {
Meteor.runAsUser(this.userId, () => {
result = Meteor.call('getFullUserData', {});
result = Meteor.call('getFullUserData', { filter: '', limit });
});
} catch (e) {
return RocketChat.API.v1.failure(e.name + ': ' + e.message);
......
function retrieveRoomInfo({ userId, channel, ignoreEmpty=false }) {
const room = RocketChat.models.Rooms.findOneByIdOrName(channel);
if (!_.isObject(room) && !ignoreEmpty) {
throw new Meteor.Error('invalid-channel');
}
if (room && room.t === 'c') {
Meteor.runAsUser(userId, function() {
return Meteor.call('joinRoom', room._id);
});
}
return room;
}
function retrieveDirectMessageInfo({ userId, channel }) {
const roomUser = RocketChat.models.Users.findOne({
$or: [
{
_id: channel
}, {
username: channel
}
]
}) || {};
const rid = [userId, roomUser._id].sort().join('');
let room = RocketChat.models.Rooms.findOneById({$in: [rid, channel]});
if (!_.isObject(roomUser) && !_.isObject(room)) {
throw new Meteor.Error('invalid-channel');
}
if (!room) {
Meteor.runAsUser(userId, function() {
Meteor.call('createDirectMessage', roomUser.username);
room = RocketChat.models.Rooms.findOneById(rid);
});
}
return room;
}
this.processWebhookMessage = function(messageObj, user, defaultValues) {
var attachment, channel, channels, channelType, i, len, message, ref, rid, room, roomUser, ret;
var attachment, channel, channels, channelType, i, len, message, ref, room, ret;
ret = [];
if (!defaultValues) {
......@@ -11,7 +53,7 @@ this.processWebhookMessage = function(messageObj, user, defaultValues) {
};
}
channel = messageObj.channel || defaultValues.channel;
channel = messageObj.channel || messageObj.roomId || defaultValues.channel;
channels = [].concat(channel);
......@@ -22,41 +64,26 @@ this.processWebhookMessage = function(messageObj, user, defaultValues) {
switch (channelType) {
case '#':
room = RocketChat.models.Rooms.findOneByIdOrName(channel);
if (!_.isObject(room)) {
throw new Meteor.Error('invalid-channel');
}
rid = room._id;
if (room.t === 'c') {
Meteor.runAsUser(user._id, function() {
return Meteor.call('joinRoom', room._id);
});
}
room = retrieveRoomInfo({ userId: user._id, channel });
break;
case '@':
roomUser = RocketChat.models.Users.findOne({
$or: [
{
_id: channel
}, {
username: channel
}
]
}) || {};
rid = [user._id, roomUser._id].sort().join('');
room = RocketChat.models.Rooms.findOneById({$in: [rid, channel]});
if (!_.isObject(roomUser) && !_.isObject(room)) {
throw new Meteor.Error('invalid-channel');
}
if (!room) {
Meteor.runAsUser(user._id, function() {
Meteor.call('createDirectMessage', roomUser.username);
room = RocketChat.models.Rooms.findOneById(rid);
});
}
room = retrieveDirectMessageInfo({ userId: user._id, channel });
break;
default:
throw new Meteor.Error('invalid-channel-type');
//Try to find the room by id or name if they didn't include the prefix.
room = retrieveRoomInfo({ userId: user._id, channel: channelType + channel, ignoreEmpty: true });
if (room) {
break;
}
//We didn't get a room, let's try finding direct messages
room = retrieveDirectMessageInfo({ userId: user._id, channel: channelType + channel });
if (room) {
break;
}
//No room, so throw an error
throw new Meteor.Error('invalid-channel');
}
if (messageObj.attachments && !_.isArray(messageObj.attachments)) {
......
......@@ -21,7 +21,7 @@ RocketChat.getFullUserData = function({userId, filter, limit}) {
requirePasswordChangeReason: 1,
roles: 1
});
} else {
} else if (limit !== -1) {
limit = 1;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment