@tiledesk/tiledesk-server 2.2.13 → 2.2.17

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/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