@tiledesk/tiledesk-server 2.15.7 → 2.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,7 +5,16 @@
5
5
  🚀 IN PRODUCTION 🚀
6
6
  (https://www.npmjs.com/package/@tiledesk/tiledesk-server/v/2.3.77)
7
7
 
8
- # 2.16.7
8
+ # 2.16.0
9
+ - Added possibility to update Knowledge Base content
10
+ - Added rated only filter in Conversations History
11
+ - Improved pending requests management
12
+
13
+ # 2.15.8
14
+ - Updated tybot-connector to 2.0.45
15
+ - Added support for tags management in knowledge base routes
16
+
17
+ # 2.15.7
9
18
  - Updated whatsapp-connector to 1.0.26
10
19
 
11
20
  # 2.15.6
@@ -5,6 +5,7 @@ var Message = require("../models/message");
5
5
  var Faq_kb = require("../models/faq_kb");
6
6
  var MessageConstants = require("../models/messageConstants");
7
7
  var message2Event = require("../event/message2Event");
8
+ var requestEvent = require("../event/requestEvent");
8
9
 
9
10
  var cacheUtil = require('../utils/cacheUtil');
10
11
  var cacheEnabler = require("../services/cacheEnabler");
@@ -178,6 +179,29 @@ function populateMessageWithRequest(message, eventPrefix) {
178
179
  messageEvent.on('message.create.simple', populateMessageCreate);
179
180
  messageEvent.on('message.update.simple', populateMessageUpdate);
180
181
 
182
+ // When the user (lead/requester) sends a message, reopen the conversation if it was pending
183
+ messageEvent.on('message.create.from.requester', function (messageJson) {
184
+ if (!messageJson.request || messageJson.request.workingStatus !== 'pending') return;
185
+ var request_id = messageJson.request.request_id;
186
+ var id_project = messageJson.request.id_project;
187
+ Request.findOneAndUpdate(
188
+ { request_id: request_id, id_project: id_project },
189
+ { $set: { workingStatus: 'open' } },
190
+ { new: true },
191
+ function (err, updatedRequest) {
192
+ if (err) {
193
+ winston.error("Error updating request workingStatus from pending to open", err);
194
+ return;
195
+ }
196
+ if (updatedRequest) {
197
+ winston.debug("Request workingStatus set to open (was pending)", { request_id, id_project });
198
+ requestEvent.emit('request.workingStatus.update', { request: updatedRequest });
199
+ requestEvent.emit('request.update', updatedRequest);
200
+ }
201
+ }
202
+ );
203
+ });
204
+
181
205
 
182
206
 
183
207
  // // riattiva commentato per performance
@@ -175,6 +175,11 @@ var KBSchema = new Schema({
175
175
  last_error: {
176
176
  type: Object,
177
177
  required: false
178
+ },
179
+ tags: {
180
+ type: Array,
181
+ default: undefined,
182
+ required: false
178
183
  }
179
184
  }, {
180
185
  timestamps: true
package/models/request.js CHANGED
@@ -507,6 +507,7 @@ RequestSchema.index({ id_project: 1, createdAt: -1, status: 1 })
507
507
  RequestSchema.index({ id_project: 1, preflight: 1, smartAssignment: 1, "snapshot.department.routing": 1, createdAt: 1, status: 1 })
508
508
 
509
509
  RequestSchema.index({ status: 1, hasBot: 1, updatedAt: 1 }) // For closing unresponsive requests
510
+ RequestSchema.index({ status: 1, hasBot: 1, workingStatus: 1, updatedAt: 1 }) // For closing unresponsive requests
510
511
 
511
512
  // Contact search by phone / email
512
513
  RequestSchema.index({ id_project: 1, 'contact.phone': 1 });
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tiledesk/tiledesk-server",
3
3
  "description": "The Tiledesk server module",
4
- "version": "2.15.7",
4
+ "version": "2.16.0",
5
5
  "scripts": {
6
6
  "start": "node ./bin/www",
7
7
  "pretest": "mongodb-runner start",
@@ -49,7 +49,7 @@
49
49
  "@tiledesk/tiledesk-rasa-connector": "^1.0.10",
50
50
  "@tiledesk/tiledesk-sms-connector": "^0.1.13",
51
51
  "@tiledesk/tiledesk-telegram-connector": "^0.1.14",
52
- "@tiledesk/tiledesk-tybot-connector": "^2.0.44",
52
+ "@tiledesk/tiledesk-tybot-connector": "^2.0.45",
53
53
  "@tiledesk/tiledesk-voice-twilio-connector": "^0.3.2",
54
54
  "@tiledesk/tiledesk-vxml-connector": "^0.1.91",
55
55
  "@tiledesk/tiledesk-whatsapp-connector": "1.0.26",
@@ -175,6 +175,11 @@ function startWorker() {
175
175
  winston.info("Data queue", oka)
176
176
  });
177
177
 
178
+ ch.bindQueue(_ok.queue, exchange, "request_workingStatus_update", {}, function(err3, oka) {
179
+ winston.info("Queue bind: "+_ok.queue+ " err: "+err3+ " key: request_workingStatus_update");
180
+ winston.info("Data queue", oka)
181
+ });
182
+
178
183
  ch.bindQueue(_ok.queue, exchange, "message_create", {}, function(err3, oka) {
179
184
  winston.info("Queue bind: "+_ok.queue+ " err: "+err3+ " key: message_create");
180
185
  winston.info("Data queue", oka)
@@ -286,6 +291,11 @@ function work(msg, cb) {
286
291
  requestEvent.emit('request.close.extended.queue', JSON.parse(message_string));
287
292
  }
288
293
 
294
+ if (topic === 'request_workingStatus_update') {
295
+ winston.debug("reconnect here topic:" + topic);
296
+ requestEvent.emit('request.workingStatus.update.queue', JSON.parse(message_string));
297
+ }
298
+
289
299
  if (topic === 'message_create') {
290
300
  winston.debug("reconnect here topic:" + topic);
291
301
  // requestEvent.emit('request.create.queue', msg.content);
@@ -410,6 +420,12 @@ function listen() {
410
420
  });
411
421
  });
412
422
 
423
+ requestEvent.on('request.workingStatus.update', function(request) {
424
+ setImmediate(() => {
425
+ publish(exchange, "request_workingStatus_update", Buffer.from(JSON.stringify(request)));
426
+ });
427
+ });
428
+
413
429
  requestEvent.on('request.snapshot.update', function(data) {
414
430
  setImmediate(() => {
415
431
  winston.debug("reconnect request.snapshot.update")
@@ -50,7 +50,7 @@ class Listener {
50
50
  return winston.warn("Chatbot is not a project_user. Skip update.")
51
51
  }
52
52
 
53
- return Request.countDocuments({ id_project: id_project, participantsAgents: id_user, status: { $lt: 1000 }, draft: { $in: [null, false] } }, (err, requestsCount) => {
53
+ return Request.countDocuments({ id_project: id_project, participantsAgents: id_user, status: { $lt: 1000 }, draft: { $in: [null, false] }, workingStatus: { $ne: 'pending' } }, (err, requestsCount) => {
54
54
  winston.verbose("requestsCount for id_user: ", id_user, "and project: ", id_project, "-->", requestsCount);
55
55
  if (err) {
56
56
  return winston.error(err);
@@ -236,8 +236,27 @@ class Listener {
236
236
  });
237
237
  });
238
238
 
239
-
240
-
239
+ var requestWorkingStatusUpdateKey = 'request.workingStatus.update';
240
+ if (requestEvent.queueEnabled) {
241
+ requestWorkingStatusUpdateKey = 'request.workingStatus.update.queue';
242
+ }
243
+ winston.debug('Route queue requestWorkingStatusUpdateKey: ' + requestWorkingStatusUpdateKey);
244
+
245
+ requestEvent.on(requestWorkingStatusUpdateKey, async (data) => {
246
+ winston.debug('Route queue WorkingStatus Update');
247
+
248
+ var request = data.request;
249
+ var participantIds = (request.participantsAgents && request.participantsAgents.length)
250
+ ? request.participantsAgents
251
+ : (request.participatingAgents || []).map(u => u._id || u.id);
252
+ setImmediate(() => {
253
+ participantIds.forEach(id_user => {
254
+ if (id_user && !String(id_user).startsWith('bot_')) {
255
+ this.updateProjectUser(id_user, request.id_project, 0);
256
+ }
257
+ });
258
+ });
259
+ });
241
260
  }
242
261
 
243
262
  }
@@ -65,7 +65,8 @@ class CloseAgentUnresponsiveRequestTask {
65
65
  const query = {
66
66
  hasBot: false,
67
67
  status: { $lt: 1000 },
68
- updatedAt: { $lte: cutoffDate }
68
+ updatedAt: { $lte: cutoffDate },
69
+ workingStatus: { $ne: 'pending' }
69
70
  };
70
71
 
71
72
  if (this.queryProject) {
@@ -73,7 +73,8 @@ class CloseBotUnresponsiveRequestTask {
73
73
  const query = {
74
74
  hasBot: true,
75
75
  status: { $lt: 1000 },
76
- updatedAt: { $lte: cutoffDate }
76
+ updatedAt: { $lte: cutoffDate },
77
+ workingStatus: { $ne: 'pending' }
77
78
  };
78
79
 
79
80
  if (this.queryProject) {