@tiledesk/tiledesk-server 2.3.6 → 2.3.7-1.2

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.
Files changed (126) hide show
  1. package/.github/workflows/docker-community-worker-push-latest.yml +23 -0
  2. package/.github/workflows/docker-image-tag-worker-community-tag-push.yml +22 -0
  3. package/CHANGELOG.md +361 -3
  4. package/Dockerfile-jobs +31 -0
  5. package/app.js +62 -69
  6. package/channels/chat21/chat21Handler.js +37 -6
  7. package/channels/chat21/chat21WebHook.js +62 -34
  8. package/channels/chat21/package-lock.json +663 -706
  9. package/channels/chat21/package.json +2 -2
  10. package/config/labels/widget.json +337 -136
  11. package/deploy.sh +2 -0
  12. package/event/messageEvent.js +110 -9
  13. package/jobs.js +80 -0
  14. package/jobsManager.js +47 -0
  15. package/middleware/has-role.js +10 -3
  16. package/middleware/ipFilter.js +220 -0
  17. package/middleware/passport.js +8 -2
  18. package/models/department.js +1 -1
  19. package/models/faq.js +77 -25
  20. package/models/faq_kb.js +19 -0
  21. package/models/message.js +10 -8
  22. package/models/project.js +10 -0
  23. package/models/project_user.js +10 -0
  24. package/models/request.js +12 -1
  25. package/package.json +12 -11
  26. package/pubmodules/activities/activityArchiver.js +216 -90
  27. package/pubmodules/activities/routes/activity.js +1 -1
  28. package/pubmodules/apps/index.js +8 -0
  29. package/pubmodules/apps/listener.js +27 -0
  30. package/pubmodules/cache/index.js +2 -0
  31. package/pubmodules/cache/mongoose-cachegoose-fn.js +630 -0
  32. package/pubmodules/canned/cannedResponse.js +4 -0
  33. package/pubmodules/canned/cannedResponseRoute.js +10 -5
  34. package/pubmodules/dialogflow/index.js +10 -0
  35. package/pubmodules/dialogflow/listener.js +66 -0
  36. package/pubmodules/emailNotification/requestNotification.js +58 -28
  37. package/pubmodules/events/eventRoute.js +49 -24
  38. package/pubmodules/messageTransformer/messageHandlebarsTransformerInterceptor.js +6 -1
  39. package/pubmodules/messageTransformer/messageTransformerInterceptor.js +10 -4
  40. package/pubmodules/pubModulesManager.js +173 -7
  41. package/pubmodules/queue/index.js +4 -0
  42. package/pubmodules/queue/reconnect.js +331 -0
  43. package/pubmodules/queue/reconnectFanout.js +256 -0
  44. package/pubmodules/rasa/listener.js +5 -5
  45. package/pubmodules/routing-queue/index.js +3 -0
  46. package/pubmodules/routing-queue/listener.js +328 -0
  47. package/pubmodules/rules/conciergeBot.js +2 -2
  48. package/pubmodules/scheduler/tasks/closeAgentUnresponsiveRequestTask.js +6 -1
  49. package/pubmodules/scheduler/tasks/closeBotUnresponsiveRequestTask.js +7 -1
  50. package/pubmodules/tilebot/index.js +11 -0
  51. package/pubmodules/tilebot/listener.js +85 -0
  52. package/pubmodules/trigger/rulesTrigger.js +137 -14
  53. package/pubmodules/trigger/start.js +5 -1
  54. package/pubmodules/whatsapp/index.js +7 -0
  55. package/pubmodules/whatsapp/listener.js +32 -0
  56. package/routes/auth.js +7 -2
  57. package/routes/campaigns.js +3 -3
  58. package/routes/department.js +3 -2
  59. package/routes/email.js +32 -2
  60. package/routes/faq.js +37 -2
  61. package/routes/faq_kb.js +496 -133
  62. package/routes/faqpub.js +5 -0
  63. package/routes/lead.js +56 -0
  64. package/routes/message.js +196 -14
  65. package/routes/messagesRoot.js +39 -0
  66. package/routes/project.js +76 -4
  67. package/routes/project_user.js +11 -1
  68. package/routes/project_user_test.js +19 -0
  69. package/routes/request.js +134 -30
  70. package/routes/troubleshooting.js +12 -0
  71. package/routes/users-util.js +39 -0
  72. package/routes/users.js +1 -1
  73. package/routes/widget.js +64 -2
  74. package/services/BotSubscriptionNotifier.js +5 -0
  75. package/services/banUserNotifier.js +86 -0
  76. package/services/cacheEnabler.js +56 -0
  77. package/services/chatbotService.js +101 -0
  78. package/services/departmentService.js +25 -3
  79. package/services/emailService.js +170 -28
  80. package/services/faqBotHandler.js +2 -3
  81. package/services/faqService.js +28 -3
  82. package/services/geoService.js +36 -6
  83. package/services/labelService.js +1 -1
  84. package/services/leadService.js +3 -2
  85. package/services/messageService.js +4 -2
  86. package/services/modulesManager.js +23 -76
  87. package/services/operatingHoursService.js +9 -4
  88. package/services/requestService.js +75 -39
  89. package/services/subscriptionNotifier.js +9 -4
  90. package/services/trainingService.js +106 -0
  91. package/template/email/assignedEmailMessage.html +21 -11
  92. package/template/email/assignedRequest.html +21 -11
  93. package/template/email/beenInvitedExistingUser.html +16 -6
  94. package/template/email/beenInvitedNewUser.html +16 -6
  95. package/template/email/emailDirect.html +130 -0
  96. package/template/email/newMessage.html +18 -8
  97. package/template/email/newMessageFollower.html +22 -12
  98. package/template/email/passwordChanged.html +15 -5
  99. package/template/email/pooledEmailMessage.html +21 -11
  100. package/template/email/pooledRequest.html +20 -10
  101. package/template/email/resetPassword.html +15 -5
  102. package/template/email/sendTranscript.html +7 -4
  103. package/template/email/ticket.html +17 -7
  104. package/template/email/verify.html +15 -5
  105. package/test/cannedRoute.js +157 -0
  106. package/test/chatbot-mock.js +127 -0
  107. package/test/example-json-intents.txt +1 -0
  108. package/test/example-json.txt +1 -0
  109. package/test/example.json +1 -0
  110. package/test/faqRoute.js +353 -208
  111. package/test/faqkbRoute.js +669 -64
  112. package/test/imageRoute.js +1 -1
  113. package/test/messageRoute.js +387 -5
  114. package/test/requestRoute.js +6 -6
  115. package/test/requestService.js +55 -4
  116. package/test-int/cache-project.js +90 -0
  117. package/test-int/cache-project_user.js +88 -0
  118. package/utils/UIDGenerator.js +20 -0
  119. package/utils/cacheUtil.js +2 -2
  120. package/utils/orgUtil.js +3 -3
  121. package/utils/promiseUtil.js +31 -0
  122. package/utils/recipientEmailUtil.js +66 -0
  123. package/utils/sendEmailUtil.js +34 -0
  124. package/utils/sendMessageUtil.js +1 -1
  125. package/utils/stringUtil.js +12 -0
  126. package/websocket/webSocketServer.js +33 -10
@@ -8,6 +8,8 @@ var winston = require('../config/winston');
8
8
  const departmentEvent = require('../event/departmentEvent');
9
9
  const Request = require('../models/request');
10
10
  const RoleConstants = require ('../models/roleConstants')
11
+ var cacheEnabler = require("../services/cacheEnabler");
12
+ var cacheUtil = require("../utils/cacheUtil");
11
13
 
12
14
  class DepartmentService {
13
15
 
@@ -86,7 +88,7 @@ roundRobin(operatorSelectedEvent) {
86
88
 
87
89
  // let lastRequests = await
88
90
  // requestcachefarequi nocachepopulatereqired
89
- Request.find(query).sort({_id:-1}).limit(1).exec(function (err, lastRequests) {
91
+ Request.find(query).sort({_id:-1}).limit(1).exec(function (err, lastRequests) { // cache_attention use_lean use_select
90
92
  if (err) {
91
93
  winston.error('Error getting request for RoundRobinOperator', err);
92
94
  return reject(err);
@@ -190,7 +192,12 @@ getOperators(departmentid, projectid, nobot, disableWebHookCall, context) {
190
192
  // console.log("»»» »»» --> DEPT ID ", departmentid);
191
193
 
192
194
 
193
- return Project.findOne({_id: projectid, status: 100}, function(err, project) {
195
+ let q = Project.findOne({_id: projectid, status: 100})
196
+ if (cacheEnabler.project) {
197
+ q.cache(cacheUtil.longTTL, "projects:id:"+projectid) //project_cache
198
+ winston.debug('project cache enabled');
199
+ }
200
+ return q.exec(function(err, project){
194
201
  if (err) {
195
202
  winston.error('Project findById ', err);
196
203
  return reject(err);
@@ -205,6 +212,7 @@ getOperators(departmentid, projectid, nobot, disableWebHookCall, context) {
205
212
  // TODO questo lo abiliterei solo esplicitamete se si flagga opzione su progetto per performance
206
213
  if (disableWebHookCall==undefined) {
207
214
  //if pro enabled disableWebHookCall = false
215
+ //secondo me qui manca un parentesi tonda per gli or
208
216
  if (project.profile && (project.profile.type === 'free' && project.trialExpired === false) || (project.profile.type === 'payment' && project.isActiveSubscription === true)) {
209
217
  // winston.info('disableWebHookCall pro');
210
218
  disableWebHookCall = false;
@@ -389,6 +397,7 @@ getOperators(departmentid, projectid, nobot, disableWebHookCall, context) {
389
397
 
390
398
  let objectToReturn = { available_agents: _available_agents, agents: project_users, operators: selectedoperator, department: department, group: group, id_project: projectid, project: project, context: context };
391
399
 
400
+ // var objectToReturnRoundRobin = objectToReturn;
392
401
  that.roundRobin(objectToReturn).then(function(objectToReturnRoundRobin){
393
402
 
394
403
  winston.debug("context2",context);
@@ -450,6 +459,8 @@ getOperators(departmentid, projectid, nobot, disableWebHookCall, context) {
450
459
 
451
460
  let objectToReturn = { available_agents: _available_agents, agents: project_users, operators: selectedoperator, department: department, id_project: projectid, project: project, context: context };
452
461
 
462
+ // var objectToReturnRoundRobin = objectToReturn;
463
+
453
464
  that.roundRobin(objectToReturn).then(function(objectToReturnRoundRobin) {
454
465
  winston.debug("context2",context);
455
466
  departmentEvent.emit('operator.select.base1', {result:objectToReturnRoundRobin, disableWebHookCall: disableWebHookCall, resolve: resolve, reject: reject, context: context});
@@ -543,8 +554,19 @@ getOperators(departmentid, projectid, nobot, disableWebHookCall, context) {
543
554
 
544
555
  // console.log('-- > OPERATORS [ getRandomAvailableOperator ] - PROJECT USER AVAILABLE LENGHT ', project_users_available.length);
545
556
  if (project_users_available.length > 0) {
557
+
558
+
559
+ // new
560
+ // num between 0 and 1 * es 3 ->
561
+ // let randomIndex = Math.round(Math.random() * project_users_available.length);
562
+ // // let randomIndex = Math.floor(Math.random() * project_users_available.length);
563
+
564
+ // console.log("randomIndex",randomIndex);
565
+ // var operator = project_users_available[randomIndex];
566
+ // // console.log('OPERATORS - SELECTED MEMBER ID', operator.id_user);
567
+
546
568
  var operator = project_users_available[Math.floor(Math.random() * project_users_available.length)];
547
- // console.log('OPERATORS - SELECTED MEMBER ID', operator.id_user);
569
+
548
570
 
549
571
  return [{ id_user: operator.id_user }];
550
572
  // return [operator];
@@ -12,6 +12,9 @@ handlebars.registerHelper('ifEquals', function(arg1, arg2, options) {
12
12
  return (arg1 == arg2) ? options.fn(this) : options.inverse(this);
13
13
  });
14
14
 
15
+ handlebars.registerHelper('dateFormat', require('handlebars-dateformat'));
16
+
17
+
15
18
  // var options = {};
16
19
  // handlebars.registerHelper('markdown', markdown(options));
17
20
 
@@ -45,6 +48,8 @@ const maskOptions = {
45
48
 
46
49
  const MESSAGE_ID_DOMAIN = "tiledesk.com";
47
50
 
51
+ // const hcustomization = require('../utils/hcustomization');
52
+
48
53
  class EmailService {
49
54
 
50
55
  constructor() {
@@ -98,7 +103,11 @@ class EmailService {
98
103
  this.host = process.env.EMAIL_HOST || config.host;
99
104
  winston.info('EmailService host: ' + this.host);
100
105
 
101
- this.secure = process.env.EMAIL_SECURE || false;
106
+ this.secure = false;
107
+ if (process.env.EMAIL_SECURE == "true" || process.env.EMAIL_SECURE ==true) {
108
+ this.secure = true;
109
+ }
110
+ // this.secure = process.env.EMAIL_SECURE || false;
102
111
  winston.info('EmailService secure: ' + this.secure);
103
112
 
104
113
  this.user = process.env.EMAIL_USERNAME || config.username;
@@ -108,7 +117,11 @@ class EmailService {
108
117
  winston.info('EmailService port: ' + this.port);
109
118
 
110
119
 
111
- this.markdown = process.env.EMAIL_MARKDOWN || true;
120
+ this.markdown = true;
121
+ if (process.env.EMAIL_MARKDOWN =="false" || process.env.EMAIL_MARKDOWN ==false) {
122
+ this.markdown = false;
123
+ }
124
+ // this.markdown = process.env.EMAIL_MARKDOWN || true;
112
125
  winston.info('EmailService markdown: '+ this.markdown);
113
126
 
114
127
  this.headers = {
@@ -116,6 +129,13 @@ class EmailService {
116
129
  }
117
130
  winston.info('EmailService headers: ' + JSON.stringify(this.headers));
118
131
 
132
+ this.ccEnabled = false //cc creates loop when you send an email with cc: support@tiledesk.com -> Tiledesk generates an email with ticket id with in cc support@tiledesk.com that loop
133
+
134
+ if (process.env.EMAIL_CC_ENABLED ==="true" || process.env.EMAIL_CC_ENABLED === true ) {
135
+ this.ccEnabled = true;
136
+ }
137
+ winston.info('EmailService ccEnabled: ' + this.ccEnabled);
138
+
119
139
  }
120
140
 
121
141
  readTemplate(templateName, settings) {
@@ -252,6 +272,8 @@ class EmailService {
252
272
  };
253
273
 
254
274
  winston.debug('mailOptions', mailOptions);
275
+ winston.debug(' mail.config', mail.config);
276
+
255
277
  if (!mail.to) {
256
278
  return winston.warn("EmailService send method. to field is not defined", mailOptions);
257
279
  }
@@ -262,7 +284,7 @@ class EmailService {
262
284
  if (mail.callback){
263
285
  mail.callback(error, {info:info});
264
286
  }
265
- return winston.error("Error sending email ", {error:error, mailOptions:mailOptions});
287
+ return winston.error("Error sending email ", {error:error, mailConfig: mail.config, mailOptions:mailOptions});
266
288
  }
267
289
  winston.verbose('Email sent:', {info: info});
268
290
  winston.debug('Email sent:', {info: info, mailOptions: mailOptions});
@@ -1020,7 +1042,7 @@ class EmailService {
1020
1042
 
1021
1043
  }
1022
1044
 
1023
-
1045
+
1024
1046
 
1025
1047
  async sendEmailChannelNotification(to, message, project, tokenQueryString, sourcePage) {
1026
1048
 
@@ -1114,14 +1136,17 @@ class EmailService {
1114
1136
  references = message.request.attributes.email_references;
1115
1137
  }
1116
1138
 
1117
- if (message.request.attributes.email_cc) {
1118
- cc = message.request.attributes.email_cc;
1119
- }
1120
- winston.debug("email message.request.attributes.email_ccStr: "+ message.request.attributes.email_ccStr);
1121
- if (message.request.attributes.email_ccStr!=undefined) {
1122
- ccString = message.request.attributes.email_ccStr;
1123
- winston.debug("email set ccString");
1139
+ if (that.ccEnabled==true) {
1140
+ if (message.request.attributes.email_cc) {
1141
+ cc = message.request.attributes.email_cc;
1142
+ }
1143
+ winston.debug("email message.request.attributes.email_ccStr: "+ message.request.attributes.email_ccStr);
1144
+ if (message.request.attributes.email_ccStr!=undefined) {
1145
+ ccString = message.request.attributes.email_ccStr;
1146
+ winston.debug("email set ccString");
1147
+ }
1124
1148
  }
1149
+
1125
1150
  }
1126
1151
  winston.verbose("email inReplyTo: "+ inReplyTo);
1127
1152
  winston.verbose("email references: "+ references);
@@ -1283,13 +1308,15 @@ class EmailService {
1283
1308
  references = message.request.attributes.email_references;
1284
1309
  }
1285
1310
 
1286
- if (message.request.attributes.email_cc) {
1287
- cc = message.request.attributes.email_cc;
1288
- }
1289
- winston.debug("email message.request.attributes.email_ccStr: "+ message.request.attributes.email_ccStr);
1290
- if (message.request.attributes.email_ccStr!=undefined) {
1291
- ccString = message.request.attributes.email_ccStr;
1292
- winston.debug("email set ccString");
1311
+ if (that.ccEnabled==true) {
1312
+ if (message.request.attributes.email_cc) {
1313
+ cc = message.request.attributes.email_cc;
1314
+ }
1315
+ winston.debug("email message.request.attributes.email_ccStr: "+ message.request.attributes.email_ccStr);
1316
+ if (message.request.attributes.email_ccStr!=undefined) {
1317
+ ccString = message.request.attributes.email_ccStr;
1318
+ winston.debug("email set ccString");
1319
+ }
1293
1320
  }
1294
1321
  }
1295
1322
  winston.verbose("email inReplyTo: "+ inReplyTo);
@@ -1350,10 +1377,6 @@ class EmailService {
1350
1377
  }
1351
1378
 
1352
1379
 
1353
-
1354
-
1355
-
1356
-
1357
1380
  /*
1358
1381
  sendEmailChannelTakingNotification(to, request, project, tokenQueryString) {
1359
1382
 
@@ -1401,6 +1424,103 @@ class EmailService {
1401
1424
  }
1402
1425
  */
1403
1426
 
1427
+
1428
+
1429
+
1430
+
1431
+
1432
+
1433
+ async sendEmailDirect(to, text, project, request_id, subject, tokenQueryString, sourcePage) {
1434
+
1435
+ var that = this;
1436
+
1437
+
1438
+ if (project.toJSON) {
1439
+ project = project.toJSON();
1440
+ }
1441
+
1442
+ var html = await this.readTemplate('emailDirect.html', project.settings);
1443
+
1444
+ var envTemplate = process.env.EMAIL_DIRECT_HTML_TEMPLATE;
1445
+ winston.debug("envTemplate: " + envTemplate);
1446
+
1447
+ if (envTemplate) {
1448
+ html = envTemplate;
1449
+ }
1450
+
1451
+ winston.debug("html: " + html);
1452
+
1453
+ var template = handlebars.compile(html);
1454
+
1455
+ var baseScope = JSON.parse(JSON.stringify(that));
1456
+ delete baseScope.pass;
1457
+
1458
+
1459
+ let msgText = text;
1460
+ msgText = encode(msgText);
1461
+ if (this.markdown) {
1462
+ msgText = marked(msgText);
1463
+ }
1464
+
1465
+ winston.debug("msgText: " + msgText);
1466
+ winston.debug("baseScope: " + JSON.stringify(baseScope));
1467
+
1468
+
1469
+ var replacements = {
1470
+ project: project,
1471
+ request_id: request_id,
1472
+ seamlessPage: sourcePage,
1473
+ msgText: msgText,
1474
+ tokenQueryString: tokenQueryString,
1475
+ baseScope: baseScope
1476
+ };
1477
+
1478
+ var html = template(replacements);
1479
+ winston.debug("html: " + html);
1480
+
1481
+
1482
+ let replyTo;
1483
+ if (this.replyEnabled && request_id) {
1484
+ replyTo = request_id + this.inboundDomainDomainWithAt;
1485
+ }
1486
+
1487
+ let from;
1488
+ let configEmail;
1489
+ if (project && project.settings && project.settings.email) {
1490
+ if (project.settings.email.config) {
1491
+ configEmail = project.settings.email.config;
1492
+ winston.verbose("custom email configEmail setting found: ", configEmail);
1493
+ }
1494
+ if (project.settings.email.from) {
1495
+ from = project.settings.email.from;
1496
+ winston.verbose("custom from email setting found: "+ from);
1497
+ }
1498
+ }
1499
+
1500
+
1501
+ // if (message.request && message.request.lead && message.request.lead.email) {
1502
+ // winston.info("message.request.lead.email: " + message.request.lead.email);
1503
+ // replyTo = replyTo + ", "+ message.request.lead.email;
1504
+ // }
1505
+
1506
+ // if (!subject) {
1507
+ // subject = "Tiledesk"
1508
+ // }
1509
+
1510
+ that.send({
1511
+ from:from,
1512
+ to:to,
1513
+ replyTo: replyTo,
1514
+ subject:subject,
1515
+ text:html,
1516
+ html:html,
1517
+ config:configEmail,
1518
+ });
1519
+
1520
+ }
1521
+
1522
+
1523
+
1404
1524
  // ok
1405
1525
  async sendPasswordResetRequestEmail(to, resetPswRequestId, userFirstname, userLastname) {
1406
1526
 
@@ -1616,7 +1736,7 @@ class EmailService {
1616
1736
  // ok
1617
1737
 
1618
1738
  async sendRequestTranscript(to, messages, request, project) {
1619
-
1739
+ winston.debug("sendRequestTranscript: "+to);
1620
1740
 
1621
1741
  //if the request came from rabbit mq?
1622
1742
  if (request.toJSON) {
@@ -1664,13 +1784,33 @@ async sendRequestTranscript(to, messages, request, project) {
1664
1784
 
1665
1785
  var html = template(replacements);
1666
1786
 
1787
+
1788
+
1789
+ let from;
1667
1790
  let configEmail;
1668
- if (project && project.settings && project.settings.email && project.settings.email.config) {
1669
- configEmail = project.settings.email.config;
1670
- winston.verbose("custom email setting found: ", configEmail);
1791
+ if (project && project.settings && project.settings.email) {
1792
+ if (project.settings.email.config) {
1793
+ configEmail = project.settings.email.config;
1794
+ winston.verbose("custom email configEmail setting found: ", configEmail);
1795
+ }
1796
+ if (project.settings.email.from) {
1797
+ from = project.settings.email.from;
1798
+ winston.verbose("custom from email setting found: "+ from);
1799
+ }
1800
+ }
1801
+
1802
+
1803
+
1804
+ //custom ocf here
1805
+ // console.log("ocf",project._id);
1806
+ let subject = '[Tiledesk] Transcript';
1807
+ if (project._id =="636a63070d942d001950c023") {
1808
+ subject = "Chiusura richiesta di supporto #" + request.ticket_id;
1809
+ console.log("subject",subject);
1671
1810
  }
1811
+ // hcustomization.emailTranscript(to, subject, html, configEmail)
1672
1812
 
1673
- that.send({to:to, subject: '[Tiledesk] Transcript', html:html, config: configEmail});
1813
+ that.send({from:from, to:to, subject: subject, html:html, config: configEmail});
1674
1814
  that.send({to: that.bcc, subject: '[Tiledesk] Transcript - notification', html:html });
1675
1815
 
1676
1816
  }
@@ -1683,6 +1823,8 @@ async sendRequestTranscript(to, messages, request, project) {
1683
1823
 
1684
1824
  var emailService = new EmailService();
1685
1825
 
1686
- // emailService.sendTest("asd.");
1826
+ // var subject = "abc";
1827
+ // hcustomization.emailTranscript({subject: subject});
1828
+ // console.log("subject", subject);
1687
1829
 
1688
1830
  module.exports = emailService;
@@ -185,7 +185,7 @@ class FaqBotHandler {
185
185
  if (clonedfaqs && clonedfaqs.length>0) {
186
186
  clonedfaqs = clonedfaqs.shift()
187
187
  }
188
- winston.verbose("clonedfaqs", clonedfaqs);
188
+ winston.debug("clonedfaqs", clonedfaqs);
189
189
 
190
190
  const intent_info = {
191
191
  intent_name: answerObj.intent_display_name,
@@ -389,7 +389,7 @@ class FaqBotHandler {
389
389
  if (clonedfaqs && clonedfaqs.length>0) {
390
390
  clonedfaqs = clonedfaqs.shift()
391
391
  }
392
- winston.verbose("clonedfaqs", clonedfaqs);
392
+ winston.debug("clonedfaqs", clonedfaqs);
393
393
 
394
394
  const intent_info = {
395
395
  intent_name: answerObj.intent_display_name,
@@ -468,7 +468,6 @@ class FaqBotHandler {
468
468
  message.id_project, project_user, "system", undefined);
469
469
  }
470
470
 
471
- // not sending with ws event with project_user undefined {"_id":"601be8bf5e24bf0012d653be","name":"faqbot.answer_not_found","attributes":{"bot":{"type":"internal","_id":"601baf4d9974d20019469ea8","name":"Bot2","description":"HI,IM","id_project":"60113c4f9974d200191d90d3","trashed":false,"createdBy":"60113ba19974d200191d868a","createdAt":"2021-02-04T08:24:45.137Z","updatedAt":"2021-02-04T08:24:45.137Z","__v":0},"message":{"senderFullname":"IndelishFinal ","type":"text","channel_type":"group","status":0,"_id":"601be8be5e24bf0012d653b7","sender":"acbc3f18-fc6b-41fc-a257-ce68f51f2551","recipient":"support-group-acbc3f18-fc6b-41fc-a257-ce68f51f2551","text":"Chineese","id_project":"60113c4f9974d200191d90d3","createdBy":"acbc3f18-fc6b-41fc-a257-ce68f51f2551","channel":{"name":"chat21"},"createdAt":"2021-02-04T12:29:50.753Z","updatedAt":"2021-02-04T12:29:50.753Z","__v":0,"request":{"_id":"601be8be5e24bf0012d653b4","status":200,"preflight":false,"hasBot":true,"participants":["bot_601baf4d9974d20019469ea8"],"participantsAgents":[],"participantsBots":["601baf4d9974d20019469ea8"],"request_id":"support-group-acbc3f18-fc6b-41fc-a257-ce68f51f2551","requester":{"_id":"601be8945e24bf0012d65311","user_available":true,"number_assigned_requests":0,"last_login_at":"2021-02-04T11:47:39.753Z","status":"active","id_project":"60113c4f9974d200191d90d3","uuid_user":"acbc3f18-fc6b-41fc-a257-ce68f51f2551","role":"guest","createdBy":"acbc3f18-fc6b-41fc-a257-ce68f51f2551","createdAt":"2021-02-04T12:29:08.397Z","updatedAt":"2021-02-04T12:29:08.397Z","__v":0},"lead":{"_id":"601be8be5e24bf0012d653b3","status":100,"lead_id":"acbc3f18-fc6b-41fc-a257-ce68f51f2551","fullname":"IndelishFinal ","id_project":"60113c4f9974d200191d90d3","createdBy":"system","tags":[],"createdAt":"2021-02-04T12:29:50.696Z","updatedAt":"2021-02-04T12:29:50.696Z","__v":0},"first_text":"Chineese","department":{"_id":"60113c4f9974d200191d90d5","routing":"assigned","default":true,"status":1,"name":"Default Department","id_project":"60113c4f9974d200191d90d3","createdBy":"60113ba19974d200191d868a","createdAt":"2021-01-27T10:11:27.117Z","updatedAt":"2021-02-04T08:27:04.354Z","__v":0,"id_bot":"601baf4d9974d20019469ea8","id_group":null,"bot":{"type":"internal","_id":"601baf4d9974d20019469ea8","name":"Bot2","description":"HI,IM","id_project":"60113c4f9974d200191d90d3","trashed":false,"createdBy":"60113ba19974d200191d868a","createdAt":"2021-02-04T08:24:45.137Z","updatedAt":"2021-02-04T08:24:45.137Z","__v":0}},"agents":[{"user_available":false,"number_assigned_requests":4,"last_login_at":"2021-01-21T20:57:22.057Z","status":"active","_id":"601308d89974d2001925e57e","id_project":"60113c4f9974d200191d90d3","id_user":"6012f23e9974d200192594cc","role":"agent","createdBy":"60113ba19974d200191d868a","createdAt":"2021-01-28T18:56:24.213Z","updatedAt":"2021-01-28T18:56:24.213Z","__v":0,"max_assigned_chat":-1},{"user_available":false,"number_assigned_requests":12,"last_login_at":"2021-01-21T20:57:22.057Z","status":"active","_id":"60113c4f9974d200191d90d4","id_project":"60113c4f9974d200191d90d3","id_user":"60113ba19974d200191d868a","role":"owner","createdBy":"60113ba19974d200191d868a","createdAt":"2021-01-27T10:11:27.110Z","updatedAt":"2021-01-27T10:11:27.110Z","__v":0,"presence":{"status":"online","changedAt":"2021-02-04T12:21:50.878Z"},"max_assigned_chat":-1}],"assigned_at":"2021-02-04T12:29:50.732Z","id_project":"60113c4f9974d200191d90d3","createdBy":"acbc3f18-fc6b-41fc-a257-ce68f51f2551","channel":{"name":"chat21"},"tags":[],"notes":[],"channelOutbound":{"name":"chat21"},"createdAt":"2021-02-04T12:29:50.739Z","updatedAt":"2021-02-04T12:29:50.739Z","__v":0,"participatingAgents":[],"participatingBots":[{"_id":"601baf4d9974d20019469ea8","type":"internal","name":"Bot2","description":"HI,IM","id_project":"60113c4f9974d200191d90d3","trashed":false,"createdBy":"60113ba19974d200191d868a","createdAt":"2021-02-04T08:24:45.137Z","updatedAt":"2021-02-04T08:24:45.137Z","__v":0}]}}},"id_project":"60113c4f9974d200191d90d3","createdBy":"system","createdAt":"2021-02-04T12:29:51.074Z","updatedAt":"2021-02-04T12:29:51.074Z","__v":0,"id":"601be8bf5e24bf0012d653be"}
472
471
 
473
472
  var attr = botAns.attributes;
474
473
  if (!attr) {
@@ -8,7 +8,7 @@ const ActionsConstants = require('../models/actionsConstants');
8
8
  class FaqService {
9
9
 
10
10
 
11
- create(name, url, projectid, user_id, type, description, webhook_url, webhook_enabled, language, template) {
11
+ create(name, url, projectid, user_id, type, description, webhook_url, webhook_enabled, language, template, mainCategory, intentsEngine) {
12
12
  var that = this;
13
13
  return new Promise(function (resolve, reject) {
14
14
 
@@ -22,6 +22,10 @@ class FaqService {
22
22
  webhook_enabled: webhook_enabled,
23
23
  type: type,
24
24
  language: language,
25
+ public: false,
26
+ certified: false,
27
+ mainCategory: mainCategory,
28
+ intentsEngine: intentsEngine,
25
29
  trashed: false,
26
30
  createdBy: user_id,
27
31
  updatedBy: user_id
@@ -39,10 +43,10 @@ class FaqService {
39
43
 
40
44
  winston.debug('type '+ type)
41
45
 
42
- if (type==="internal") {
46
+ if (type==="internal" || type==="tilebot") {
43
47
 
44
48
  if (!template) {
45
- template = "example";
49
+ template = "empty";
46
50
  }
47
51
  winston.debug('template '+ template);
48
52
  that.createGreetingsAndOperationalsFaqs(savedFaq_kb._id, savedFaq_kb.createdBy, savedFaq_kb.id_project, template);
@@ -63,6 +67,7 @@ class FaqService {
63
67
 
64
68
  // aggiungi esempio tdAction con intent_id
65
69
 
70
+ // TODO non scatta i trigger sui rest hook. fare?
66
71
  winston.debug('template: '+ template);
67
72
 
68
73
  var faqsArray;
@@ -113,6 +118,10 @@ class FaqService {
113
118
  ]
114
119
 
115
120
  }
121
+
122
+ if (template === "empty") {
123
+ faqsArray = [];
124
+ }
116
125
 
117
126
 
118
127
  faqsArray.forEach(faq => {
@@ -121,6 +130,7 @@ class FaqService {
121
130
  id_faq_kb: faq_kb_id,
122
131
  question: faq.question,
123
132
  answer: faq.answer,
133
+ reply: faq.reply,
124
134
  intent_display_name: faq.intent_display_name,
125
135
  language: "en",
126
136
  id_project: projectid,
@@ -144,6 +154,21 @@ class FaqService {
144
154
  });
145
155
  }
146
156
 
157
+ getAll(faq_kb_id) {
158
+
159
+ winston.debug("(Service) GET ALL FAQ OF THE BOT ID (req.query): ", faq_kb_id);
160
+
161
+ return new Promise((resolve, reject) => {
162
+
163
+ Faq.find({ id_faq_kb: faq_kb_id}, (err, faqs) => {
164
+ if (err) {
165
+ reject(err);
166
+ }
167
+ resolve(faqs);
168
+ }).lean().exec()
169
+ })
170
+ }
171
+
147
172
 
148
173
  }
149
174
 
@@ -8,6 +8,13 @@ var geoip = require('geoip-lite');
8
8
 
9
9
  class GeoService {
10
10
 
11
+ constructor() {
12
+ this.enabled = true;
13
+ if (process.env.GEO_SERVICE_ENABLED=="false" || process.env.GEO_SERVICE_ENABLED==false) {
14
+ this.enabled = false;
15
+ }
16
+ winston.debug("GeoService this.enabled: "+ this.enabled);
17
+ }
11
18
 
12
19
 
13
20
  // https://medium.com/@rossbulat/node-js-client-ip-location-with-geoip-lite-fallback-c25833c94a76
@@ -16,7 +23,12 @@ class GeoService {
16
23
 
17
24
  listen() {
18
25
 
19
- winston.info("GeoService listener started");
26
+ if (this.enabled==true) {
27
+ winston.info("GeoService listener started");
28
+ } else {
29
+ return winston.info("GeoService listener disabled");
30
+ }
31
+
20
32
 
21
33
 
22
34
 
@@ -36,15 +48,25 @@ class GeoService {
36
48
  // area: 200 }
37
49
 
38
50
 
39
- requestEvent.on('request.create', function(request) {
40
51
 
41
- winston.debug("request", request.toObject());
52
+ var requestCreateKey = 'request.create';
53
+ if (requestEvent.queueEnabled) {
54
+ requestCreateKey = 'request.create.queue';
55
+ }
56
+ winston.debug('GeoService requestCreateKey: ' + requestCreateKey);
57
+
58
+
59
+ requestEvent.on(requestCreateKey, function(request) {
60
+
61
+ setImmediate(() => {
62
+
63
+ winston.debug("request", request);
42
64
 
43
65
  var ip = (request.location && request.location.ipAddress) || (request.attributes && request.attributes.ipAddress);
44
66
  winston.debug("ip" + ip);
45
67
  if (ip) {
46
68
  var geo = geoip.lookup(ip);
47
- winston.verbose("Geo result", geo);
69
+ winston.debug("Geo result", geo);
48
70
 
49
71
  // var update = {};
50
72
  if (geo) {
@@ -106,7 +128,11 @@ class GeoService {
106
128
 
107
129
  winston.debug("geo request saving", request);
108
130
 
109
- request.markModified('location');
131
+
132
+ if (request.markModified) {
133
+ request.markModified('location');
134
+ }
135
+
110
136
  request.save(function(err, reqL) {
111
137
  // return Request.findByIdAndUpdate("5fb297bd1d838b14607b3b62", update, { new: true, upsert: false }).exec( function(err, reqL) {
112
138
  if (err) {
@@ -114,11 +140,15 @@ class GeoService {
114
140
  }
115
141
  return winston.verbose("Saved location metadata for request with id " + request._id);
116
142
  });
143
+
144
+ //TODO AGGIORNA ANCHE LEAD e req.snapshot.lead?
145
+ // leggi ip da request e nn da attributes
117
146
 
118
147
  }
119
148
  }
120
149
  });
121
- }
150
+ });
151
+ }
122
152
 
123
153
 
124
154
  }
@@ -74,7 +74,7 @@ getAll(id_project) {
74
74
 
75
75
 
76
76
  return Label.findOne(query).lean()
77
- //@DISABLED_CACHE .cache(cacheUtil.longTTL, id_project+":labels:query:all")
77
+ //@DISABLED_CACHE .cache(cacheUtil.longTTL, id_project+":labels:query:all") //label_cache
78
78
  .exec(function (err, labels) {
79
79
  if (err) {
80
80
  winston.error('Label ROUTE - REQUEST FIND ERR ', err)
@@ -14,7 +14,7 @@ class LeadService {
14
14
  var that = this;
15
15
  return new Promise(function (resolve, reject) {
16
16
  return Lead.findOne({email: email, id_project: id_project})
17
- //@DISABLED_CACHE .cache(cacheUtil.defaultTTL, id_project+":leads:email:"+email)
17
+ //@DISABLED_CACHE .cache(cacheUtil.defaultTTL, id_project+":leads:email:"+email) //lead_cache
18
18
  .exec(function(err, lead) {
19
19
  if (err) {
20
20
  return reject(err);
@@ -58,7 +58,7 @@ class LeadService {
58
58
  var that = this;
59
59
  return new Promise(function (resolve, reject) {
60
60
  return Lead.findOne({lead_id: lead_id, id_project: id_project})
61
- //@DISABLED_CACHE .cache(cacheUtil.defaultTTL, id_project+":leads:lead_id:"+lead_id)
61
+ //@DISABLED_CACHE .cache(cacheUtil.defaultTTL, id_project+":leads:lead_id:"+lead_id) //lead_cache
62
62
  .exec(function(err, lead) {
63
63
  if (err) {
64
64
  winston.error("Error createIfNotExistsWithLeadId", err);
@@ -130,6 +130,7 @@ class LeadService {
130
130
  leadEvent.emit('lead.update', updatedLead);
131
131
  leadEvent.emit('lead.email.update', updatedLead);
132
132
  leadEvent.emit('lead.fullname.update', updatedLead);
133
+ leadEvent.emit('lead.fullname.email.update', updatedLead);
133
134
  return resolve(updatedLead);
134
135
  });
135
136
  });
@@ -17,7 +17,7 @@ class MessageService {
17
17
  if (!id) {
18
18
  return this.create(sender, senderFullname, recipient, text, id_project, createdBy, status, attributes, type, metadata, language);
19
19
  } else {
20
- winston.debug("Message changeStatus", status);
20
+ winston.debug("Message upsert changeStatus:"+ status);
21
21
  return this.changeStatus(id, status);
22
22
  }
23
23
  }
@@ -173,7 +173,10 @@ class MessageService {
173
173
  }
174
174
 
175
175
  // TODO must update also message.attributes from chat21
176
+ // attento già scatta su chat21handler
177
+
176
178
  changeStatus(message_id, newstatus) {
179
+ winston.debug("changeStatus. "+message_id + " "+ newstatus);
177
180
  var that = this;
178
181
  return new Promise(function (resolve, reject) {
179
182
  // winston.debug("request_id", request_id);
@@ -188,7 +191,6 @@ class MessageService {
188
191
  // winston.debug("updatedMessage", updatedMessage);
189
192
 
190
193
  that.emitMessage(updatedMessage);
191
-
192
194
  return resolve(updatedMessage);
193
195
  });
194
196
  });