[NEW] Apps-Engine event for when a livechat room is closed (#15837)

pull/15898/head
Shiqi Mei 6 years ago committed by Diego Sampaio
parent 0137e56e13
commit aff2cb2747
  1. 10
      app/apps/server/bridges/listeners.js
  2. 60
      app/apps/server/bridges/livechat.js
  3. 1
      app/apps/server/converters/messages.js
  4. 3
      app/apps/server/converters/visitors.js
  5. 3
      app/livechat/server/lib/Livechat.js
  6. 30
      package-lock.json
  7. 2
      package.json
  8. 1
      server/startup/migrations/index.js
  9. 13
      server/startup/migrations/v169.js

@ -36,4 +36,14 @@ export class AppListenerBridge {
// this.orch.debugLog(e.stack);
// }
}
async livechatEvent(inte, room) {
const rm = this.orch.getConverters().get('rooms').convertRoom(room);
const result = await this.orch.getManager().getListenerManager().executeListener(inte, rm);
if (typeof result === 'boolean') {
return result;
}
return this.orch.getConverters().get('rooms').convertAppRoom(result);
}
}

@ -2,8 +2,9 @@ import { Random } from 'meteor/random';
import { getRoom } from '../../../livechat/server/api/lib/livechat';
import { Livechat } from '../../../livechat/server/lib/Livechat';
import Rooms from '../../../models/server/models/Rooms';
import LivechatRooms from '../../../models/server/models/LivechatRooms';
import LivechatVisitors from '../../../models/server/models/LivechatVisitors';
import LivechatDepartment from '../../../models/server/models/LivechatDepartment';
import Users from '../../../models/server/models/Users';
export class AppLivechatBridge {
@ -11,6 +12,10 @@ export class AppLivechatBridge {
this.orch = orch;
}
isOnline() {
return Livechat.online();
}
async createMessage(message, appId) {
this.orch.debugLog(`The App ${ appId } is creating a new message.`);
@ -48,14 +53,19 @@ export class AppLivechatBridge {
async createRoom(visitor, agent, appId) {
this.orch.debugLog(`The App ${ appId } is creating a livechat room.`);
const agentUser = Users.findOneById(agent.id);
agentUser.agentId = agentUser._id;
let agentRoom;
if (agent && agent.id) {
const user = Users.getAgentInfo(agent.id);
agentRoom = Object.assign({}, { agentId: user._id });
}
return this.orch.getConverters().get('rooms').convertRoom(getRoom({
const result = await getRoom({
guest: this.orch.getConverters().get('visitors').convertAppVisitor(visitor),
agent: agentUser,
agent: agentRoom,
rid: Random.id(),
}).room);
});
return this.orch.getConverters().get('rooms').convertRoom(result.room);
}
async closeRoom(room, comment, appId) {
@ -78,9 +88,9 @@ export class AppLivechatBridge {
let result;
if (departmentId) {
result = Rooms.findOpenByVisitorTokenAndDepartmentId(visitor.token, departmentId).fetch();
result = LivechatRooms.findOpenByVisitorTokenAndDepartmentId(visitor.token, departmentId).fetch();
} else {
result = Rooms.findOpenByVisitorToken(visitor.token).fetch();
result = LivechatRooms.findOpenByVisitorToken(visitor.token).fetch();
}
return result.map((room) => this.orch.getConverters().get('rooms').convertRoom(room));
@ -130,6 +140,40 @@ export class AppLivechatBridge {
async findVisitors(query, appId) {
this.orch.debugLog(`The App ${ appId } is looking for livechat visitors.`);
if (this.orch.isDebugging()) {
console.warn('The method AppLivechatBridge.findVisitors is deprecated. Please consider using its alternatives');
}
return LivechatVisitors.find(query).fetch().map((visitor) => this.orch.getConverters().get('visitors').convertVisitor(visitor));
}
async findVisitorById(id, appId) {
this.orch.debugLog(`The App ${ appId } is looking for livechat visitors.`);
return this.orch.getConverters().get('visitors').convertById(id);
}
async findVisitorByEmail(email, appId) {
this.orch.debugLog(`The App ${ appId } is looking for livechat visitors.`);
return this.orch.getConverters().get('visitors').convertVisitor(LivechatVisitors.findOneGuestByEmailAddress(email));
}
async findVisitorByToken(token, appId) {
this.orch.debugLog(`The App ${ appId } is looking for livechat visitors.`);
return this.orch.getConverters().get('visitors').convertVisitor(LivechatVisitors.getVisitorByToken(token));
}
async findVisitorByPhoneNumber(phoneNumber, appId) {
this.orch.debugLog(`The App ${ appId } is looking for livechat visitors.`);
return this.orch.getConverters().get('visitors').convertVisitor(LivechatVisitors.findOneVisitorByPhone(phoneNumber));
}
async findDepartmentByIdOrName(value, appId) {
this.orch.debugLog(`The App ${ appId } is looking for livechat departments.`);
return this.orch.getConverters().get('departments').convertDepartment(LivechatDepartment.findOneByIdOrName(value));
}
}

@ -135,6 +135,7 @@ export class AppMessagesConverter {
attachments,
reactions: message.reactions,
parseUrls: message.parseUrls,
token: message.token,
};
return Object.assign(newMessage, message._unmappedProperties_);

@ -48,7 +48,8 @@ export class AppVisitorsConverter {
name: visitor.name,
token: visitor.token,
phone: visitor.phone,
visitorEmails: visitor.visitorEmails,
...visitor.visitorEmails && { visitorEmails: visitor.visitorEmails },
...visitor.department && { department: visitor.department },
};
return Object.assign(newVisitor, visitor._unmappedProperties_);

@ -1,5 +1,6 @@
import dns from 'dns';
import { AppInterface } from '@rocket.chat/apps-engine/server/compiler';
import { Meteor } from 'meteor/meteor';
import { Match, check } from 'meteor/check';
import { Random } from 'meteor/random';
@ -37,6 +38,7 @@ import { updateMessage } from '../../../lib/server/functions/updateMessage';
import { deleteMessage } from '../../../lib/server/functions/deleteMessage';
import { FileUpload } from '../../../file-upload/server';
import { normalizeTransferredByData } from './Helper';
import { Apps } from '../../../apps/server';
export const Livechat = {
Analytics,
@ -344,6 +346,7 @@ export const Livechat = {
Messages.createCommandWithRoomIdAndUser('promptTranscript', rid, closeData.closedBy);
Meteor.defer(() => {
Apps.getBridges().getListenerBridge().livechatEvent(AppInterface.ILivechatRoomClosedHandler, room);
callbacks.run('livechat.closeRoom', room);
});

30
package-lock.json generated

@ -2348,16 +2348,40 @@
}
},
"@rocket.chat/apps-engine": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/@rocket.chat/apps-engine/-/apps-engine-1.7.0.tgz",
"integrity": "sha512-1uTOVBmyj8PwIkVNSFaoaFTb83JKoj4ZE/oZQV3yXakXNYAGUqJUddnDnkgJ4PLiJtIfIwY/eciTNYqMWo665Q==",
"version": "1.11.0",
"resolved": "https://registry.npmjs.org/@rocket.chat/apps-engine/-/apps-engine-1.11.0.tgz",
"integrity": "sha512-tptq+Cw2VZudUzerfe6iUqRRnu1b1IIQAtAM64kT9oDXY5xydhhPR00YzF1KgFAKhhT1zQhtocfLiajGFacVEQ==",
"requires": {
"adm-zip": "^0.4.9",
"cryptiles": "^4.1.3",
"lodash.clonedeep": "^4.5.0",
"semver": "^5.5.0",
"stack-trace": "0.0.10",
"typescript": "^2.9.2",
"uuid": "^3.2.1"
},
"dependencies": {
"boom": {
"version": "7.3.0",
"resolved": "https://registry.npmjs.org/boom/-/boom-7.3.0.tgz",
"integrity": "sha512-Swpoyi2t5+GhOEGw8rEsKvTxFLIDiiKoUc2gsoV6Lyr43LHBIzch3k2MvYUs8RTROrIkVJ3Al0TkaOGjnb+B6A==",
"requires": {
"hoek": "6.x.x"
}
},
"cryptiles": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-4.1.3.tgz",
"integrity": "sha512-gT9nyTMSUC1JnziQpPbxKGBbUg8VL7Zn2NB4E1cJYvuXdElHrwxrV9bmltZGDzet45zSDGyYceueke1TjynGzw==",
"requires": {
"boom": "7.x.x"
}
},
"hoek": {
"version": "6.1.3",
"resolved": "https://registry.npmjs.org/hoek/-/hoek-6.1.3.tgz",
"integrity": "sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ=="
}
}
},
"@rocket.chat/eslint-config": {

@ -150,7 +150,7 @@
"@google-cloud/language": "^2.0.0",
"@google-cloud/storage": "^2.3.1",
"@google-cloud/vision": "^0.23.0",
"@rocket.chat/apps-engine": "^1.7.0",
"@rocket.chat/apps-engine": "^1.11.0",
"@rocket.chat/fuselage": "^0.2.0-dev.53",
"@rocket.chat/fuselage-hooks": "^0.2.0-dev.50",
"@rocket.chat/icons": "^0.2.0-dev.49",

@ -166,4 +166,5 @@ import './v165';
import './v166';
import './v167';
import './v168';
import './v169';
import './xrun';

@ -0,0 +1,13 @@
import { Migrations } from '../../../app/migrations';
import { LivechatRooms } from '../../../app/models/server';
Migrations.add({
version: 169,
up() {
LivechatRooms.update(
{ t: 'l', whatsAppGateway: { $exists: 1 } },
{ $rename: { whatsAppGateway: 'customFields.whatsAppGateway' } },
{ multi: true },
);
},
});
Loading…
Cancel
Save