From 36acdea459d07e4b244c5eddabca81a6e76749aa Mon Sep 17 00:00:00 2001 From: Marcelo Schmidt Date: Thu, 22 Nov 2018 14:42:01 -0300 Subject: [PATCH] [IMPROVE] Rocket.Chat.Apps (#12680) * Allow apps to create direct messages * Implement getMembers; * Adds ability to search direct rooms by usernames --- .../rocketchat-apps/server/bridges/rooms.js | 28 +++++++++++++++++-- .../rocketchat-lib/server/models/Rooms.js | 9 ++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/packages/rocketchat-apps/server/bridges/rooms.js b/packages/rocketchat-apps/server/bridges/rooms.js index 5cbbc783dd80..9ae44a587200 100644 --- a/packages/rocketchat-apps/server/bridges/rooms.js +++ b/packages/rocketchat-apps/server/bridges/rooms.js @@ -19,8 +19,11 @@ export class AppRoomBridge { case RoomType.PRIVATE_GROUP: method = 'createPrivateGroup'; break; + case RoomType.DIRECT_MESSAGE: + method = 'createDirectMessage'; + break; default: - throw new Error('Only channels and private groups can be created.'); + throw new Error('Only channels, private groups and direct messages can be created.'); } let rid; @@ -30,7 +33,13 @@ export class AppRoomBridge { delete extraData.t; delete extraData.ro; delete extraData.customFields; - const info = Meteor.call(method, rcRoom.name, members, rcRoom.ro, rcRoom.customFields, extraData); + let info; + if (room.type === RoomType.DIRECT_MESSAGE) { + members.splice(members.indexOf(room.creator.username), 1); + info = Meteor.call(method, members[0]); + } else { + info = Meteor.call(method, rcRoom.name, members, rcRoom.ro, rcRoom.customFields, extraData); + } rid = info.rid; }); @@ -73,6 +82,21 @@ export class AppRoomBridge { return this.orch.getConverters().get('users').convertById(room.u._id); } + async getMembers(roomId, appId) { + console.log(`The App ${ appId } is getting the room's members by room id: "${ roomId }"`); + const subscriptions = await RocketChat.models.Subscriptions.findByRoomId(roomId); + return subscriptions.map((sub) => this.orch.getConverters().get('users').convertById(sub.u && sub.u._id)); + } + + async getDirectByUsernames(usernames, appId) { + console.log(`The App ${ appId } is getting direct room by usernames: "${ usernames }"`); + const room = await RocketChat.models.Rooms.findDirectRoomContainingAllUsernames(usernames); + if (!room) { + return undefined; + } + return this.orch.getConverters().get('rooms').convertRoom(room); + } + async update(room, members = [], appId) { console.log(`The App ${ appId } is updating a room.`); diff --git a/packages/rocketchat-lib/server/models/Rooms.js b/packages/rocketchat-lib/server/models/Rooms.js index 64f0185fa408..2105c43a1112 100644 --- a/packages/rocketchat-lib/server/models/Rooms.js +++ b/packages/rocketchat-lib/server/models/Rooms.js @@ -251,6 +251,15 @@ class ModelRooms extends RocketChat.models._Base { return this.find(query, options); } + findDirectRoomContainingAllUsernames(usernames, options) { + const query = { + t: 'd', + usernames: { $size: usernames.length, $all: usernames }, + }; + + return this.findOne(query, options); + } + findByTypeAndName(type, name, options) { const query = { name,