diff --git a/app/apps/server/bridges/listeners.js b/app/apps/server/bridges/listeners.js index 9ae81d2c23fdd..8e0bed83f0110 100644 --- a/app/apps/server/bridges/listeners.js +++ b/app/apps/server/bridges/listeners.js @@ -28,6 +28,8 @@ export class AppListenerBridge { case AppInterface.IPostRoomDeleted: case AppInterface.IPreRoomUserJoined: case AppInterface.IPostRoomUserJoined: + case AppInterface.IPreRoomUserLeave: + case AppInterface.IPostRoomUserLeave: return 'roomEvent'; /** * @deprecated please prefer the AppInterface.IPostLivechatRoomClosed event @@ -76,6 +78,13 @@ export class AppListenerBridge { joiningUser: this.orch.getConverters().get('users').convertToApp(joiningUser), invitingUser: this.orch.getConverters().get('users').convertToApp(invitingUser), }; + case AppInterface.IPreRoomUserLeave: + case AppInterface.IPostRoomUserLeave: + const [leavingUser] = payload; + return { + room: rm, + leavingUser: this.orch.getConverters().get('users').convertToApp(leavingUser), + }; default: return rm; } diff --git a/app/lib/server/functions/removeUserFromRoom.js b/app/lib/server/functions/removeUserFromRoom.js index 8a81100bb13d2..23ca26355af40 100644 --- a/app/lib/server/functions/removeUserFromRoom.js +++ b/app/lib/server/functions/removeUserFromRoom.js @@ -1,12 +1,24 @@ +import { AppsEngineException } from '@rocket.chat/apps-engine/definition/exceptions'; import { Meteor } from 'meteor/meteor'; import { Rooms, Messages, Subscriptions } from '../../../models'; +import { AppEvents, Apps } from '../../../apps/server'; import { callbacks } from '../../../callbacks'; export const removeUserFromRoom = function(rid, user, options = {}) { const room = Rooms.findOneById(rid); if (room) { + try { + Promise.await(Apps.triggerEvent(AppEvents.IPreRoomUserLeave, room, user)); + } catch (error) { + if (error instanceof AppsEngineException) { + throw new Meteor.Error('error-app-prevented', error.message); + } + + throw error; + } + callbacks.run('beforeLeaveRoom', user, room); const subscription = Subscriptions.findOneByRoomIdAndUserId(rid, user._id, { fields: { _id: 1 } }); @@ -31,6 +43,8 @@ export const removeUserFromRoom = function(rid, user, options = {}) { Meteor.defer(function() { // TODO: CACHE: maybe a queue? callbacks.run('afterLeaveRoom', user, room); + + Promise.await(Apps.triggerEvent(AppEvents.IPostRoomUserLeave, room, user)); }); } };