diff --git a/packages/rocketchat-livechat/imports/server/rest/messages.js b/packages/rocketchat-livechat/imports/server/rest/messages.js new file mode 100644 index 000000000000..54d70af09e9e --- /dev/null +++ b/packages/rocketchat-livechat/imports/server/rest/messages.js @@ -0,0 +1,64 @@ +import LivechatVisitors from '../../../server/models/LivechatVisitors'; + +RocketChat.API.v1.addRoute('livechat/messages', { authRequired: true }, { + post() { + if (!RocketChat.authz.hasPermission(this.userId, 'view-livechat-manager')) { + return RocketChat.API.v1.unauthorized(); + } + + if (!this.bodyParams.visitor) { + return RocketChat.API.v1.failure('Body param "visitor" is required'); + } + if (!this.bodyParams.visitor.token) { + return RocketChat.API.v1.failure('Body param "visitor.token" is required'); + } + if (!this.bodyParams.messages) { + return RocketChat.API.v1.failure('Body param "messages" is required'); + } + if (!(this.bodyParams.messages instanceof Array)) { + return RocketChat.API.v1.failure('Body param "messages" is not an array'); + } + if (this.bodyParams.messages.length === 0) { + return RocketChat.API.v1.failure('Body param "messages" is empty'); + } + + const visitorToken = this.bodyParams.visitor.token; + + let visitor = LivechatVisitors.getVisitorByToken(visitorToken); + let rid; + if (visitor) { + const rooms = RocketChat.models.Rooms.findOpenByVisitorToken(visitorToken).fetch(); + if (rooms && rooms.length > 0) { + rid = rooms[0]._id; + } else { + rid = Random.id(); + } + } else { + rid = Random.id(); + const visitorId = RocketChat.Livechat.registerGuest(this.bodyParams.visitor); + visitor = LivechatVisitors.findOneById(visitorId); + } + + const sentMessages = this.bodyParams.messages.map((message) => { + const sendMessage = { + guest: visitor, + message: { + _id: Random.id(), + rid, + token: visitorToken, + msg: message.msg + } + }; + const sentMessage = RocketChat.Livechat.sendMessage(sendMessage); + return { + username: sentMessage.u.username, + msg: sentMessage.msg, + ts: sentMessage.ts + }; + }); + + return RocketChat.API.v1.success({ + messages: sentMessages + }); + } +}); diff --git a/packages/rocketchat-livechat/imports/server/rest/users.js b/packages/rocketchat-livechat/imports/server/rest/users.js index 8d874a36ec32..c40b6dc45b44 100644 --- a/packages/rocketchat-livechat/imports/server/rest/users.js +++ b/packages/rocketchat-livechat/imports/server/rest/users.js @@ -23,7 +23,7 @@ RocketChat.API.v1.addRoute('livechat/users/:type', { authRequired: true }, { const users = RocketChat.authz.getUsersInRole(role); return RocketChat.API.v1.success({ - users: users.fetch().map(user => ({ _id: user._id, username: user.username })) + users: users.fetch().map(user => _.pick(user, '_id', 'username', 'name', 'status', 'statusLivechat')) }); } catch (e) { return RocketChat.API.v1.failure(e.error); diff --git a/packages/rocketchat-livechat/imports/server/rest/visitors.js b/packages/rocketchat-livechat/imports/server/rest/visitors.js new file mode 100644 index 000000000000..1fe3d0297d7b --- /dev/null +++ b/packages/rocketchat-livechat/imports/server/rest/visitors.js @@ -0,0 +1,32 @@ +import LivechatVisitors from '../../../server/models/LivechatVisitors'; + +RocketChat.API.v1.addRoute('livechat/visitor/:visitorToken', { authRequired: true }, { + get() { + if (!RocketChat.authz.hasPermission(this.userId, 'view-livechat-manager')) { + return RocketChat.API.v1.unauthorized(); + } + + const visitor = LivechatVisitors.getVisitorByToken(this.urlParams.visitorToken); + return RocketChat.API.v1.success(visitor); + } +}); + +RocketChat.API.v1.addRoute('livechat/visitor/:visitorToken/room', { authRequired: true }, { + get() { + if (!RocketChat.authz.hasPermission(this.userId, 'view-livechat-manager')) { + return RocketChat.API.v1.unauthorized(); + } + + const rooms = RocketChat.models.Rooms.findOpenByVisitorToken(this.urlParams.visitorToken, { + fields: { + name: 1, + t: 1, + cl: 1, + u: 1, + usernames: 1, + servedBy: 1 + } + }).fetch(); + return RocketChat.API.v1.success({ rooms }); + } +}); diff --git a/packages/rocketchat-livechat/server/api.js b/packages/rocketchat-livechat/server/api.js index 2c2b9307a64c..1fdd545230e7 100644 --- a/packages/rocketchat-livechat/server/api.js +++ b/packages/rocketchat-livechat/server/api.js @@ -2,3 +2,5 @@ import '../imports/server/rest/departments.js'; import '../imports/server/rest/facebook.js'; import '../imports/server/rest/sms.js'; import '../imports/server/rest/users.js'; +import '../imports/server/rest/messages.js'; +import '../imports/server/rest/visitors.js';