@tiledesk/tiledesk-server 2.2.11 → 2.2.16

Sign up to get free protection for your applications and to get access to all the features.
package/routes/project.js CHANGED
@@ -50,6 +50,69 @@ router.put('/:projectid', [passport.authenticate(['basic', 'jwt'], { session: fa
50
50
  update["settings.email.notification.conversation.pooled"] = req.body["settings.email.notification.conversation.pooled"];
51
51
  }
52
52
 
53
+
54
+
55
+
56
+ if (req.body["settings.email.templates.assignedRequest"]!=undefined) {
57
+ update["settings.email.templates.assignedRequest"] = req.body["settings.email.templates.assignedRequest"];
58
+ }
59
+ if (req.body["settings.email.templates.assignedEmailMessage"]!=undefined) {
60
+ update["settings.email.templates.assignedEmailMessage"] = req.body["settings.email.templates.assignedEmailMessage"];
61
+ }
62
+ if (req.body["settings.email.templates.pooledRequest"]!=undefined) {
63
+ update["settings.email.templates.pooledRequest"] = req.body["settings.email.templates.pooledRequest"];
64
+ }
65
+ if (req.body["settings.email.templates.pooledEmailMessage"]!=undefined) {
66
+ update["settings.email.templates.pooledEmailMessage"] = req.body["settings.email.templates.pooledEmailMessage"];
67
+ }
68
+ if (req.body["settings.email.templates.newMessage"]!=undefined) {
69
+ update["settings.email.templates.newMessage"] = req.body["settings.email.templates.newMessage"];
70
+ }
71
+ if (req.body["settings.email.templates.ticket"]!=undefined) {
72
+ update["settings.email.templates.ticket"] = req.body["settings.email.templates.ticket"];
73
+ }
74
+ if (req.body["settings.email.templates.sendTranscript"]!=undefined) {
75
+ update["settings.email.templates.sendTranscript"] = req.body["settings.email.templates.sendTranscript"];
76
+ }
77
+
78
+
79
+ if (req.body["settings.email.from"]!=undefined) {
80
+ update["settings.email.from"] = req.body["settings.email.from"];
81
+ }
82
+ if (req.body["settings.email.config.host"]!=undefined) {
83
+ update["settings.email.config.host"] = req.body["settings.email.config.host"];
84
+ }
85
+ if (req.body["settings.email.config.port"]!=undefined) {
86
+ update["settings.email.config.port"] = req.body["settings.email.config.port"];
87
+ }
88
+ if (req.body["settings.email.config.secure"]!=undefined) {
89
+ update["settings.email.config.secure"] = req.body["settings.email.config.secure"];
90
+ }
91
+ if (req.body["settings.email.config.user"]!=undefined) {
92
+ update["settings.email.config.user"] = req.body["settings.email.config.user"];
93
+ }
94
+ if (req.body["settings.email.config.pass"]!=undefined) {
95
+ update["settings.email.config.pass"] = req.body["settings.email.config.pass"];
96
+ }
97
+
98
+
99
+
100
+ /*
101
+
102
+ if (req.body.settings.email.templates.assignedRequest!=undefined) {
103
+ // if (req.body["settings.email.templates.assignedRequest.html"]!=undefined) {
104
+ console.log("assignedRequest");
105
+ update["settings.email.templates.assignedRequest"] = req.body.settings.email.templates.assignedRequest;
106
+ }
107
+ if (req.body["settings.email.templates.assignedEmailMessage.html"]!=undefined) {
108
+ update["settings.email.templates.assignedEmailMessage.html"] = req.body["settings.email.templates.assignedEmailMessage.html"];
109
+ }
110
+ if (req.body.settings.email.templates.pooledRequest!=undefined) {
111
+ console.log("pooledRequest");
112
+ update["settings.email.templates.pooledRequest"] = req.body.settings.email.templates.pooledRequest;
113
+ }
114
+ */
115
+
53
116
  if (req.body["settings.chat_limit_on"]!=undefined) {
54
117
  update["settings.chat_limit_on"] = req.body["settings.chat_limit_on"];
55
118
  }
@@ -96,7 +159,7 @@ router.put('/:projectid', [passport.authenticate(['basic', 'jwt'], { session: fa
96
159
 
97
160
  winston.debug('UPDATE PROJECT REQ BODY ', update);
98
161
 
99
-
162
+ // console.log("update",JSON.stringify(update));
100
163
 
101
164
  Project.findByIdAndUpdate(req.params.projectid, update, { new: true, upsert: true }, function (err, updatedProject) {
102
165
  if (err) {
@@ -143,6 +206,50 @@ router.patch('/:projectid', [passport.authenticate(['basic', 'jwt'], { session:
143
206
  }
144
207
 
145
208
 
209
+
210
+ if (req.body["settings.email.templates.assignedRequest"]!=undefined) {
211
+ update["settings.email.templates.assignedRequest"] = req.body["settings.email.templates.assignedRequest"];
212
+ }
213
+ if (req.body["settings.email.templates.assignedEmailMessage"]!=undefined) {
214
+ update["settings.email.templates.assignedEmailMessage"] = req.body["settings.email.templates.assignedEmailMessage"];
215
+ }
216
+ if (req.body["settings.email.templates.pooledRequest"]!=undefined) {
217
+ update["settings.email.templates.pooledRequest"] = req.body["settings.email.templates.pooledRequest"];
218
+ }
219
+ if (req.body["settings.email.templates.pooledEmailMessage"]!=undefined) {
220
+ update["settings.email.templates.pooledEmailMessage"] = req.body["settings.email.templates.pooledEmailMessage"];
221
+ }
222
+ if (req.body["settings.email.templates.newMessage"]!=undefined) {
223
+ update["settings.email.templates.newMessage"] = req.body["settings.email.templates.newMessage"];
224
+ }
225
+ if (req.body["settings.email.templates.ticket"]!=undefined) {
226
+ update["settings.email.templates.ticket"] = req.body["settings.email.templates.ticket"];
227
+ }
228
+ if (req.body["settings.email.templates.sendTranscript"]!=undefined) {
229
+ update["settings.email.templates.sendTranscript"] = req.body["settings.email.templates.sendTranscript"];
230
+ }
231
+
232
+
233
+ if (req.body["settings.email.from"]!=undefined) {
234
+ update["settings.email.from"] = req.body["settings.email.from"];
235
+ }
236
+ if (req.body["settings.email.config.host"]!=undefined) {
237
+ update["settings.email.config.host"] = req.body["settings.email.config.host"];
238
+ }
239
+ if (req.body["settings.email.config.port"]!=undefined) {
240
+ update["settings.email.config.port"] = req.body["settings.email.config.port"];
241
+ }
242
+ if (req.body["settings.email.config.secure"]!=undefined) {
243
+ update["settings.email.config.secure"] = req.body["settings.email.config.secure"];
244
+ }
245
+ if (req.body["settings.email.config.user"]!=undefined) {
246
+ update["settings.email.config.user"] = req.body["settings.email.config.user"];
247
+ }
248
+ if (req.body["settings.email.config.pass"]!=undefined) {
249
+ update["settings.email.config.pass"] = req.body["settings.email.config.pass"];
250
+ }
251
+
252
+
146
253
  if (req.body["settings.chat_limit_on"]!=undefined) {
147
254
  update["settings.chat_limit_on"] = req.body["settings.chat_limit_on"];
148
255
  }
package/routes/request.js CHANGED
@@ -184,7 +184,8 @@ router.patch('/:requestid', function (req, res) {
184
184
  }
185
185
 
186
186
  requestEvent.emit("request.update", request);
187
- requestEvent.emit("request.update.comment", {comment:"PATCH",request:request});
187
+ requestEvent.emit("request.update.comment", {comment:"PATCH",request:request}); //Deprecated
188
+ requestEvent.emit("request.updated", {comment:"PATCH",request:request, patch: update});
188
189
  return res.json(request);
189
190
  });
190
191
 
@@ -455,7 +456,8 @@ router.patch('/:requestid/attributes', function (req, res) {
455
456
  }
456
457
  winston.verbose(" saved request attributes",savedRequest.toObject())
457
458
  requestEvent.emit("request.update", savedRequest);
458
- requestEvent.emit("request.update.comment", {comment:"ATTRIBUTES_PATCH",request:savedRequest});
459
+ requestEvent.emit("request.update.comment", {comment:"ATTRIBUTES_PATCH",request:savedRequest});//Deprecated
460
+ requestEvent.emit("request.updated", {comment:"ATTRIBUTES_PATCH",request:savedRequest, patch: {attributes:data}});
459
461
  requestEvent.emit("request.attributes.update", savedRequest);
460
462
  res.json(savedRequest);
461
463
  });
@@ -483,7 +485,9 @@ router.post('/:requestid/notes', function (req, res) {
483
485
  return res.status(500).send({ success: false, msg: 'Error adding request object.' });
484
486
  }
485
487
  requestEvent.emit("request.update", updatedRequest);
486
- requestEvent.emit("request.update.comment", {comment:"NOTE_ADD",request:updatedRequest});
488
+ requestEvent.emit("request.update.comment", {comment:"NOTE_ADD",request:updatedRequest});//Deprecated
489
+ requestEvent.emit("request.updated", {comment:"NOTE_ADD",request:updatedRequest, patch: {notes:note}});
490
+
487
491
  return res.json(updatedRequest);
488
492
  });
489
493
 
@@ -506,7 +510,9 @@ router.delete('/:requestid/notes/:noteid', function (req, res) {
506
510
  return res.status(500).send({ success: false, msg: 'Error adding request object.' });
507
511
  }
508
512
  requestEvent.emit("request.update", updatedRequest);
509
- requestEvent.emit("request.update.comment", {comment:"NOTE_DELETE",request:updatedRequest});
513
+ requestEvent.emit("request.update.comment", {comment:"NOTE_DELETE",request:updatedRequest});//Deprecated
514
+ // requestEvent.emit("request.updated", {comment:"NOTE_DELETE",request:updatedRequest, patch: {notes:req.params.noteid}});
515
+
510
516
  return res.json(updatedRequest);
511
517
  });
512
518
 
@@ -45,7 +45,9 @@ router.patch('/:requestid/rating', function (req, res) {
45
45
  }
46
46
 
47
47
  requestEvent.emit("request.update", request);
48
- requestEvent.emit("request.update.comment", {comment:"PATCH",request:request});
48
+ requestEvent.emit("request.update.comment", {comment:"PATCH",request:request});//Deprecated
49
+ requestEvent.emit("request.updated", {comment:"PATCH",request:request, patch: update});
50
+
49
51
  return res.json(request);
50
52
  });
51
53
 
@@ -119,6 +119,7 @@ class EmailService {
119
119
  }
120
120
 
121
121
  readTemplate(templateName, settings) {
122
+ // aggiunsta questo
122
123
  var that = this;
123
124
  winston.debug('EmailService readTemplate: '+ templateName + ' ' + JSON.stringify(settings));
124
125
 
@@ -246,11 +247,19 @@ class EmailService {
246
247
 
247
248
  // send mail with defined transport object
248
249
  this.getTransport(mail.config).sendMail(mailOptions, (error, info) => {
249
- if (error) {
250
+ if (error) {
251
+ if (mail.callback){
252
+ mail.callback(error, {info:info});
253
+ }
250
254
  return winston.error("Error sending email ", {error:error, mailOptions:mailOptions});
251
255
  }
252
256
  winston.verbose('Email sent:', {info: info});
253
257
  winston.debug('Email sent:', {info: info, mailOptions: mailOptions});
258
+
259
+ if (mail.callback){
260
+ mail.callback(error, {info:info});
261
+ }
262
+
254
263
  // Preview only available when sending through an Ethereal account
255
264
  // winston.debug('Preview URL: %s', nodemailer.getTestMessageUrl(info));
256
265
 
@@ -260,7 +269,7 @@ class EmailService {
260
269
  }
261
270
 
262
271
 
263
- async sendTest(to) {
272
+ async sendTest(to, configEmail, callback) {
264
273
 
265
274
  var that = this;
266
275
 
@@ -268,19 +277,12 @@ class EmailService {
268
277
 
269
278
  var template = handlebars.compile(html);
270
279
 
271
- var replacements = {
272
- user: {name: "andrea"},
273
- enabled: true
280
+ var replacements = {
274
281
  };
275
282
 
276
283
  var html = template(replacements);
277
-
278
- that.send({to:to, subject:`TileDesk test email`,html: html});
279
-
280
- //that.send(that.bcc, `TileDesk test email - notification`, html);
281
-
282
-
283
-
284
+
285
+ return that.send({to:to, subject:`TileDesk test email`, config: configEmail, html: html, callback: callback});
284
286
 
285
287
  }
286
288
 
@@ -12,6 +12,10 @@ var eventService = require('../pubmodules/events/eventService');
12
12
  var mongoose = require('mongoose');
13
13
  const { TiledeskChatbotUtil } = require('@tiledesk/tiledesk-chatbot-util');
14
14
  const ActionsConstants = require('../models/actionsConstants');
15
+ var httpUtil = require('../utils/httpUtil');
16
+
17
+ var webhook_origin = process.env.WEBHOOK_ORIGIN || "http://localhost:3000";
18
+ winston.debug("webhook_origin: "+webhook_origin);
15
19
 
16
20
  class FaqBotHandler {
17
21
 
@@ -137,7 +141,7 @@ class FaqBotHandler {
137
141
 
138
142
  Faq.find(query)
139
143
  .lean().
140
- exec(function (err, faqs) {
144
+ exec(async (err, faqs) => {
141
145
  if (err) {
142
146
  return winston.error("Error getting faq object.",err);
143
147
  }
@@ -209,7 +213,13 @@ class FaqBotHandler {
209
213
  messageService.send(sender, botName, message.recipient, command_parsed.command,
210
214
  message.id_project, sender, {subtype: "info"}, 'text', undefined).then(function(savedMessage){
211
215
  winston.debug("agent_handoff faqs agent sent ", savedMessage.toObject());
212
- });
216
+ }).catch(function(err){
217
+ winston.log({
218
+ level: 'error',
219
+ message: 'Error sending message bot: '+ JSON.stringify(err) ,
220
+ label: message.id_project
221
+ });
222
+ });
213
223
  // PATCH: Chat clients (i.e. web widget) remove messages with text = null
214
224
  // command_parsed.text contains the eventual text before the \agent command
215
225
  // or 'all the message text' if \agent was not found
@@ -224,7 +234,13 @@ class FaqBotHandler {
224
234
  messageService.send(sender, botName, message.recipient, bot_answer.text,
225
235
  message.id_project, sender, attr, bot_answer.type, bot_answer.metadata, bot_answer.language).then(function(savedMessage){
226
236
  winston.debug("faqbot message botAns ", savedMessage.toObject());
227
- });
237
+ }).catch(function(err){
238
+ winston.log({
239
+ level: 'error',
240
+ message: 'Error sending message bot: '+ JSON.stringify(err) ,
241
+ label: message.id_project
242
+ });
243
+ });
228
244
  // }
229
245
 
230
246
 
@@ -238,20 +254,57 @@ class FaqBotHandler {
238
254
 
239
255
  } else {
240
256
 
257
+
241
258
  query = { "id_project": message.id_project, "id_faq_kb": faq_kb._id};
242
-
243
- var search_obj = {"$search": message.text};
259
+ var mongoproject = undefined;
260
+ var sort = undefined;
244
261
 
245
- if (faq_kb.language) {
246
- search_obj["$language"] = faq_kb.language;
247
- }
248
- query.$text = search_obj;
249
- winston.debug("fulltext search query", query);
262
+ //make http request external
263
+ if (faq_kb.url) {
264
+
265
+
266
+ var url = faq_kb.url+"/parse";
267
+ winston.debug("fulltext search external url " + url);
250
268
 
251
- Faq.find(query, {score: { $meta: "textScore" } })
252
- .sort( { score: { $meta: "textScore" } } ) //https://docs.mongodb.com/manual/reference/operator/query/text/#sort-by-text-search-score
269
+ var json = {text: message.text, language: faq_kb.language, id_project: message.id_project, id_faq_kb: faq_kb._id};
270
+ winston.debug("fulltext search external json", json);
271
+
272
+ var headers = {
273
+ 'Content-Type' : 'application/json',
274
+ 'User-Agent': 'tiledesk-bot',
275
+ 'Origin': webhook_origin
276
+ };
277
+
278
+ var res = await httpUtil.call(url, headers, json, "POST")
279
+ winston.debug("res", res);
280
+
281
+ if (res && res.intent && res.intent.name) {
282
+ var intent_name = res.intent.name;
283
+ winston.debug("intent_name", intent_name);
284
+ //filtra su intent name
285
+ query.intent_display_name = intent_name;
286
+ winston.debug("query",query);
287
+
288
+ }
289
+ } else {
290
+
291
+ var search_obj = {"$search": message.text};
292
+
293
+ if (faq_kb.language) {
294
+ search_obj["$language"] = faq_kb.language;
295
+ }
296
+ query.$text = search_obj;
297
+ winston.debug("fulltext search query", query);
298
+
299
+ mongoproject = {score: { $meta: "textScore" } };
300
+ sort = { score: { $meta: "textScore" } } //https://docs.mongodb.com/manual/reference/operator/query/text/#sort-by-text-search-score
301
+ }
302
+
303
+
304
+ Faq.find(query, mongoproject)
305
+ .sort(sort)
253
306
  .lean().
254
- exec(function (err, faqs) {
307
+ exec(async (err, faqs) => {
255
308
  if (err) {
256
309
  return winston.error('Error getting fulltext objects.', err);
257
310
  }
@@ -266,6 +319,53 @@ class FaqBotHandler {
266
319
  if (faqs && faqs.length>0 && faqs[0].answer) {
267
320
  answerObj = faqs[0];
268
321
 
322
+
323
+ // non fare la ricerca fulltext
324
+ //make http request external
325
+ /*
326
+ if (faq_kb.url) {
327
+
328
+
329
+ var url = faq_kb.url+"/parse";
330
+ winston.verbose("fulltext search external url " + url);
331
+
332
+ var json = {text: message.text, language: faq_kb.language, id_project: message.id_project, id_faq_kb: faq_kb._id};
333
+ winston.verbose("fulltext search external json", json);
334
+
335
+ var headers = {
336
+ 'Content-Type' : 'application/json',
337
+ 'User-Agent': 'tiledesk-bot',
338
+ 'Origin': webhook_origin
339
+ };
340
+
341
+ var res = await httpUtil.call(url, headers, json, "POST")
342
+ console.log("res", res);
343
+
344
+ if (res && res.intent && res.intent.name) {
345
+ var intent_name = res.intent.name;
346
+ console.log("intent_name", intent_name);
347
+ //filtra su intent name
348
+ var queryExternal = { id_project: message.id_project, id_faq_kb: faq_kb._id, intent_display_name: intent_name};
349
+ winston.verbose("queryExternal",queryExternal);
350
+
351
+ var faqExternal = await Faq.findOne(queryExternal)
352
+ .lean().
353
+ exec();
354
+
355
+ winston.verbose("faqExternal",faqExternal);
356
+
357
+ if (faqExternal) {
358
+ answerObj = faqExternal;
359
+ }
360
+
361
+ }
362
+ }
363
+ */
364
+
365
+
366
+
367
+
368
+
269
369
  // qui
270
370
  faqBotSupport.getParsedMessage(answerObj.answer, message, faq_kb, answerObj).then(function(bot_answer) {
271
371
 
@@ -315,7 +415,14 @@ class FaqBotHandler {
315
415
  messageService.send(sender, botName, message.recipient, command_parsed.command,
316
416
  message.id_project, sender, {subtype: "info"}, 'text', undefined).then(function(savedMessage){
317
417
  winston.debug("agent_handoff faqs agent sent ", savedMessage.toObject());
318
- });
418
+ }).catch(function(err){
419
+ winston.log({
420
+ level: 'error',
421
+ message: 'Error sending message bot: '+ JSON.stringify(err) ,
422
+ label: message.id_project
423
+ });
424
+ });
425
+
319
426
  // PATCH: Chat clients (i.e. web widget) remove messages with text = null
320
427
  // command_parsed.text contains the eventual text before the \agent command
321
428
  // or 'all the message text' if \agent was not found
@@ -330,7 +437,13 @@ class FaqBotHandler {
330
437
  message.id_project, sender, attr, bot_answer.type, bot_answer.metadata, bot_answer.language).then(function(savedMessage){
331
438
 
332
439
  winston.debug("faqbot message sending ", savedMessage.toObject());
333
- });
440
+ }).catch(function(err){
441
+ winston.log({
442
+ level: 'error',
443
+ message: 'Error sending message bot: '+ JSON.stringify(err) ,
444
+ label: message.id_project
445
+ });
446
+ });
334
447
  });
335
448
 
336
449
 
@@ -408,7 +521,13 @@ class FaqBotHandler {
408
521
  messageService.send(sender, botName, message.recipient, command_parsed.command,
409
522
  message.id_project, sender, {subtype: "info"}, 'text', undefined).then(function(savedMessage){
410
523
  winston.debug("agent_handoff faqs agent sent ", savedMessage.toObject());
411
- });
524
+ }).catch(function(err){
525
+ winston.log({
526
+ level: 'error',
527
+ message: 'Error sending message bot: '+ JSON.stringify(err) ,
528
+ label: message.id_project
529
+ });
530
+ });
412
531
  // PATCH: Chat clients (i.e. web widget) remove messages with text = null
413
532
  // command_parsed.text contains the eventual text before the \agent command
414
533
  // or 'all the message text' if \agent was not found
@@ -423,6 +542,13 @@ class FaqBotHandler {
423
542
  messageService.send(sender, botName, message.recipient, botAns.text,
424
543
  message.id_project, sender, attr, botAns.type, botAns.metadata, botAns.language).then(function(savedMessage){
425
544
  winston.debug("faqbot message botAns " ,savedMessage.toObject());
545
+ })
546
+ .catch(function(err){
547
+ winston.log({
548
+ level: 'error',
549
+ message: 'Error sending message bot: '+ JSON.stringify(err) + " " + JSON.stringify(botAns.text) ,
550
+ label: message.id_project
551
+ });
426
552
  });
427
553
  }
428
554