@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
@@ -0,0 +1,11 @@
1
+ const listener = require("./listener");
2
+
3
+ const tilebot = require("@tiledesk/tiledesk-tybot-connector");
4
+ const tilebotRoute = tilebot.router;
5
+
6
+
7
+
8
+
9
+
10
+ module.exports = { listener: listener, tilebotRoute: tilebotRoute };
11
+
@@ -0,0 +1,85 @@
1
+ const botEvent = require('../../event/botEvent');
2
+ var Faq_kb = require("../../models/faq_kb");
3
+ var winston = require('../../config/winston');
4
+ var configGlobal = require('../../config/global');
5
+
6
+ var port = process.env.PORT || '3000';
7
+
8
+ const TILEBOT_ENDPOINT = process.env.TILEBOT_ENDPOINT || "http://localhost:" + port+ "/modules/tilebot/ext/";
9
+ winston.debug("TILEBOT_ENDPOINT: " + TILEBOT_ENDPOINT);
10
+
11
+ winston.info("Tilebot endpoint: " + TILEBOT_ENDPOINT);
12
+
13
+
14
+ const apiUrl = process.env.API_URL || configGlobal.apiUrl;
15
+ winston.info('Rasa apiUrl: '+ apiUrl);
16
+
17
+ const tybot = require("@tiledesk/tiledesk-tybot-connector");
18
+
19
+
20
+ class Listener {
21
+
22
+ listen(config) {
23
+
24
+ winston.info('Tilebot Listener listen');
25
+ winston.debug("Tilebot config databaseUri: " + config.databaseUri);
26
+
27
+
28
+ var that = this;
29
+
30
+ var port = process.env.CACHE_REDIS_PORT || 6379;
31
+ winston.debug("Redis port: "+ port);
32
+
33
+ var host = process.env.CACHE_REDIS_HOST || "127.0.0.1"
34
+ winston.debug("Redis host: "+ host);
35
+
36
+ var password = process.env.CACHE_REDIS_PASSWORD;
37
+ winston.debug("Redis password: "+ password);
38
+
39
+ // console.log("Using: REDIS_HOST:", process.env.CACHE_REDIS_HOST);
40
+ // console.log("Using: REDIS_PORT", process.env.CACHE_REDIS_PORT);
41
+ // console.log("Using: REDIS_PASSWORD", process.env.CACHE_REDIS_PASSWORD);
42
+ tybot.startApp(
43
+ {
44
+ MONGODB_URI: config.databaseUri,
45
+ API_ENDPOINT: apiUrl,
46
+ REDIS_HOST: host,
47
+ REDIS_PORT: port,
48
+ REDIS_PASSWORD: password,
49
+ CACHE_ENABLED: process.env.CACHE_ENABLED,
50
+ log: process.env.TILEBOT_LOG
51
+ }, () => {
52
+ winston.info("TileBot proxy server successfully started.");
53
+ }
54
+ );
55
+
56
+
57
+ botEvent.on('faqbot.create', function(bot) {
58
+ if (TILEBOT_ENDPOINT) {
59
+
60
+ winston.debug('bot.type:'+bot.type);
61
+ if (bot.type==="tilebot") {
62
+
63
+ winston.debug('qui.type:'+bot.type);
64
+
65
+
66
+ Faq_kb.findByIdAndUpdate(bot.id, {"url":TILEBOT_ENDPOINT+bot.id}, { new: true, upsert: true }, function (err, savedFaq_kb) {
67
+
68
+ // bot.save(function (err, savedFaq_kb) {
69
+ if (err) {
70
+ return winston.error('error saving faqkb tilebot ', err)
71
+ }
72
+ winston.verbose('Saved faqkb tilebot', savedFaq_kb.toObject())
73
+ });
74
+ }
75
+ }
76
+ });
77
+
78
+ }
79
+
80
+ }
81
+
82
+ var listener = new Listener();
83
+
84
+
85
+ module.exports = listener;
@@ -18,11 +18,11 @@ var leadService = require('../../services/leadService');
18
18
  var LeadConstants = require('../../models/leadConstants');
19
19
  var operatingHoursService = require("../../services/operatingHoursService");
20
20
  var sendMessageUtil = require("../../utils/sendMessageUtil");
21
+ var sendEmailUtil = require("../../utils/sendEmailUtil");
21
22
  var cacheUtil = require("../../utils/cacheUtil");
22
-
23
-
24
-
25
- const uuidv4 = require('uuid/v4');
23
+ var cacheEnabler = require("../../services/cacheEnabler");
24
+ var UIDGenerator = require("../../utils/UIDGenerator");
25
+ const RequestConstants = require('../../models/requestConstants');
26
26
 
27
27
 
28
28
  class RulesTrigger {
@@ -54,6 +54,10 @@ class RulesTrigger {
54
54
  setImmediate(() => {
55
55
 
56
56
  requestEvent.on('request.support_group.created', function(request) {
57
+
58
+ // performance console log
59
+ // console.log("************* request.support_group.created: "+new Date().toISOString());
60
+
57
61
  // requestEvent.on('request.create', function(request) {
58
62
  var requestJson = request.toJSON();
59
63
  operatingHoursService.projectIsOpenNow(request.id_project, function (isOpen, err) {
@@ -63,6 +67,9 @@ class RulesTrigger {
63
67
  });
64
68
  });
65
69
 
70
+
71
+
72
+ // da aggiungere in dashboard
66
73
  requestEvent.on('request.participants.join', function(data) {
67
74
  let request = data.request;
68
75
  let member = data.member;
@@ -80,10 +87,10 @@ class RulesTrigger {
80
87
  // operatingHoursService.projectIsOpenNow(request.id_project, function (isOpen, err) {
81
88
  that.exec(message, 'message.create.from.requester', success, error);
82
89
  });
83
- // not in use
84
- // messageEvent.on('message.received', function(request) {
85
- // that.exec(request, 'message.received', success, error);
86
- // });
90
+
91
+ messageEvent.on('message.received', function(message) {
92
+ that.exec(message, 'message.received', success, error);
93
+ });
87
94
 
88
95
  // event2Event.on('*', function(event){
89
96
  // winston.verbose('event2Event this.event: ' + this.event);
@@ -174,6 +181,9 @@ class RulesTrigger {
174
181
  // attributes
175
182
  // );
176
183
 
184
+ // performance console log
185
+ // console.log("************* send message trigger: "+new Date().toISOString(), text);
186
+
177
187
  // send(sender, senderFullname, recipient, text, id_project, createdBy, attributes, type, metadata, language) {
178
188
  sendMessageUtil.send(
179
189
  sender,
@@ -193,6 +203,93 @@ class RulesTrigger {
193
203
 
194
204
 
195
205
 
206
+ triggerEventEmitter.on('email.send', function(eventTrigger) {
207
+
208
+ try {
209
+
210
+ winston.debug('runAction eventTrigger.eventSuccess:', eventTrigger.eventSuccess);
211
+ var trigger = eventTrigger.trigger;
212
+ winston.debug('runAction trigger', trigger.toObject());
213
+
214
+
215
+ var action = eventTrigger.action;
216
+ winston.debug('runAction action', action.toObject());
217
+
218
+
219
+ var fullname = action.parameters.fullName || "BOT";
220
+ winston.debug('runAction action fullname: ' + fullname);
221
+
222
+ var subject = action.parameters.subject || "New Email";
223
+
224
+ winston.debug('runAction action subject: ' + subject);
225
+
226
+ var sender = "system";
227
+
228
+ if (action.parameters.sender) {
229
+ sender = action.parameters.sender;
230
+ }
231
+ winston.debug('runAction action sender: ' + sender);
232
+
233
+ var text = action.parameters.text;
234
+ winston.debug('runAction action text: ' + text);
235
+
236
+ var attributes = {};
237
+
238
+ // var attributes = action.parameters.attributes;
239
+ // winston.debug('runAction action attributes: ' + attributes);
240
+
241
+
242
+ var recipient;
243
+ if (eventTrigger.eventKey=="request.create" || eventTrigger.eventKey=="request.participants.join") {
244
+ recipient = eventTrigger.event.request_id;
245
+ }
246
+ if (eventTrigger.eventKey=="message.create.from.requester" || eventTrigger.eventKey=="message.received") {
247
+ recipient = eventTrigger.event.recipient;
248
+
249
+ //custom ocf here
250
+ if (eventTrigger.event.id_project =="636a63070d942d001950c023") {
251
+ subject = "Apertura richiesta di supporto #" + eventTrigger.event.request.ticket_id;
252
+ console.log("subject",subject);
253
+ }
254
+
255
+ }
256
+ if (eventTrigger.eventKey=="event.emit") {
257
+ winston.debug('runAction action event.emit: ', eventTrigger.event.toObject());
258
+
259
+ //TODO funziona?
260
+ recipient = eventTrigger.event.project_user.id_user;
261
+ }
262
+
263
+ // console.log("eventTrigger.event", eventTrigger.event);
264
+
265
+ winston.debug('runAction action recipient: ' + recipient);
266
+
267
+ var id_project = eventTrigger.event.id_project;
268
+ winston.debug('runAction action id_project: ' + id_project);
269
+
270
+
271
+ var message = eventTrigger.event;
272
+ winston.debug('runAction action message: ', message);
273
+
274
+ if (eventTrigger.event.request && eventTrigger.event.request.lead && eventTrigger.event.request.lead.email) {
275
+ var to = eventTrigger.event.request.lead.email;
276
+ winston.debug('to ' + to);
277
+
278
+ // sendEmailDirect(to, text, project, request_id, subject, tokenQueryString, sourcePage) {
279
+ sendEmailUtil.sendEmailDirect(to, text, id_project, recipient, subject, message);
280
+ } else {
281
+ winston.info('email.send trigger. Lead email is undefined ');
282
+ }
283
+
284
+
285
+ } catch(e) {
286
+ winston.error("Error runAction", e);
287
+ }
288
+
289
+ });
290
+
291
+
292
+
196
293
 
197
294
 
198
295
  triggerEventEmitter.on('request.department.route', function(eventTrigger) {
@@ -675,12 +772,14 @@ class RulesTrigger {
675
772
  var departmentid = action.parameters.departmentid;
676
773
  winston.debug('runAction action departmentid: ' + departmentid);
677
774
 
775
+ var participants = action.parameters.participants;
776
+ winston.debug('runAction action participants: ' + participants);
678
777
  // var attributes = action.parameters.attributes;
679
778
  // winston.debug('runAction action attributes: ' + attributes);
680
779
 
681
780
 
682
781
 
683
- var request_id = 'support-group-'+id_project+"-"+uuidv4();
782
+ var request_id = 'support-group-'+id_project+"-"+UIDGenerator.generate();
684
783
  var id_user;
685
784
  var fullname;
686
785
  var email;
@@ -760,10 +859,24 @@ class RulesTrigger {
760
859
  departmentid = eventAttributes.department;
761
860
  }
762
861
 
862
+
863
+
763
864
  if (eventAttributes.text) {
764
865
  text = eventAttributes.text;
765
866
  }
766
867
 
868
+ // console.log("eventAttributes.participants.length"+ eventAttributes.participants.length);
869
+ if (eventAttributes.participants && eventAttributes.participants.length>0) {
870
+ participants = eventAttributes.participants;
871
+ if (participants[0].indexOf("bot_")>-1) {
872
+ text = "\\start"; //if participants is passed than the bot reply to the first message "welcome" so I changed "welcome" with "\start"
873
+ }
874
+ // status = RequestConstants.ASSIGNED;
875
+ // console.log("eventAttributes.participants",eventAttributes.participants);
876
+ }
877
+
878
+ // console.log("text", text);
879
+
767
880
  if (eventAttributes.status) {
768
881
  status = eventAttributes.status;
769
882
  }
@@ -856,7 +969,7 @@ class RulesTrigger {
856
969
 
857
970
  var new_request = {
858
971
  request_id: request_id, project_user_id: project_user_id, lead_id: createdLead._id, id_project: id_project,
859
- first_text: text, departmentid: departmentid, sourcePage: sourcePage,
972
+ first_text: text, participants: participants, departmentid: departmentid, sourcePage: sourcePage,
860
973
  language: language, userAgent: userAgent, status: status, createdBy: id_user,
861
974
  attributes: attributes, subject: undefined, preflight: preflight, channel: undefined, location: undefined,
862
975
  lead: createdLead, requester: puser
@@ -864,12 +977,14 @@ class RulesTrigger {
864
977
 
865
978
  return requestService.create(new_request).then(function (savedRequest) {
866
979
 
980
+ // performance console log
981
+ // console.log("************* request created trigger: "+new Date().toISOString());
867
982
 
868
983
  if (attributes) {
869
984
  attributes.sendnotification = false; // sembra nn funzionae
870
985
  }
871
986
 
872
- var senderFullname = fullname || 'Guest';
987
+ var senderFullname = fullname || 'Guest'; // guest_here
873
988
 
874
989
  // create(sender, senderFullname, recipient, text, id_project, createdBy, status, attributes, type, metadata, language) {
875
990
  return messageService.create( id_user, senderFullname , savedRequest.request_id, text,
@@ -925,9 +1040,17 @@ class RulesTrigger {
925
1040
 
926
1041
  winston.debug('trigger query', query);
927
1042
 
928
- Trigger.find(query)
929
- .cache(cacheUtil.longTTL, event.id_project+":triggers:trigger.key:"+eventKey)
930
- .exec(function(err, triggers) {
1043
+ let q = Trigger.find(query);
1044
+
1045
+ if (cacheEnabler.trigger) {
1046
+ q.cache(cacheUtil.longTTL, event.id_project+":triggers:trigger.key:"+eventKey) //CACHE_TRIGGER
1047
+ winston.debug('trigger cache enabled');
1048
+
1049
+ }
1050
+
1051
+ q.exec(function(err, triggers) {
1052
+
1053
+
931
1054
  if (err) {
932
1055
  winston.error('Error gettting bots ', err);
933
1056
  return 0;
@@ -102,9 +102,13 @@ projectEvent.on('project.create', async (project) => {
102
102
  */
103
103
 
104
104
 
105
- winston.info("triggers created for new project");
105
+ winston.debug("triggers created for new project");
106
106
 
107
107
 
108
+
109
+
110
+ // cc
111
+
108
112
  });
109
113
  });
110
114
 
@@ -0,0 +1,7 @@
1
+ const listener = require("./listener");
2
+
3
+ const whatsapp = require("@tiledesk/tiledesk-whatsapp-connector");
4
+ const whatsappRoute = whatsapp.router;
5
+
6
+
7
+ module.exports = { listener: listener, whatsappRoute: whatsappRoute }
@@ -0,0 +1,32 @@
1
+ const whatsapp = require("@tiledesk/tiledesk-whatsapp-connector");
2
+ var winston = require('../../config/winston');
3
+ var configGlobal = require('../../config/global');
4
+
5
+ const apiUrl = process.env.API_URL || configGlobal.apiUrl;
6
+ winston.info('Whatsapp apiUrl: ' + apiUrl);
7
+
8
+ class Listener {
9
+
10
+ listen(config) {
11
+ winston.info("WhatsApp Listener listen");
12
+ if (config.databaseUri) {
13
+ winston.debug("whatsapp config databaseUri: " + config.databaseUri);
14
+ }
15
+
16
+ whatsapp.startApp({
17
+ MONGODB_URL: config.databaseUri,
18
+ API_URL: apiUrl,
19
+ GRAPH_URL: process.env.META_GRAPH_URL || config.graphUrl,
20
+ BASE_URL: apiUrl + "/modules/whatsapp",
21
+ APPS_API_URL: apiUrl + "/modules/apps",
22
+ log: process.env.WHATSAPP_LOG
23
+ }, () => {
24
+ winston.info("Tiledesk WhatsApp Connector proxy server succesfully started.");
25
+ })
26
+
27
+ }
28
+ }
29
+
30
+ var listener = new Listener();
31
+
32
+ module.exports = listener;
package/routes/auth.js CHANGED
@@ -112,13 +112,18 @@ function (req, res) {
112
112
  winston.error("SigninAnonymously validation error", {errors: errors, reqBody: req.body, reqUrl: req.url });
113
113
  return res.status(422).json({ errors: errors.array() });
114
114
  }
115
- var firstname = req.body.firstname || "Guest";
115
+
116
+ let uid = uuidv4();
117
+ let shortuid = uid.substring(0,4);
118
+ var firstname = req.body.firstname || "guest#"+shortuid; // guest_here
119
+ // var firstname = req.body.firstname || "Guest"; // guest_here
120
+
116
121
 
117
122
 
118
123
  //TODO togli trattini da uuidv4()
119
124
 
120
125
  // TODO remove email.sec?
121
- let userAnonym = {_id: uuidv4(), firstname:firstname, lastname: req.body.lastname, email: req.body.email, attributes: req.body.attributes};
126
+ let userAnonym = {_id: uid, firstname:firstname, lastname: req.body.lastname, email: req.body.email, attributes: req.body.attributes};
122
127
 
123
128
  req.user = UserUtil.decorateUser(userAnonym);
124
129
 
@@ -6,8 +6,7 @@ var winston = require('../config/winston');
6
6
  var requestService = require("../services/requestService");
7
7
  var messageService = require("../services/messageService");
8
8
  var MessageConstants = require("../models/messageConstants");
9
- const uuidv4 = require('uuid/v4');
10
-
9
+ var UIDGenerator = require("../utils/UIDGenerator");
11
10
 
12
11
 
13
12
 
@@ -19,7 +18,7 @@ router.post('/', function (req, res) {
19
18
 
20
19
  winston.debug(req.body);
21
20
  winston.debug("req.user", req.user);
22
- var request_id = req.body.request_id || 'support-group-' + req.projectid + "-" + uuidv4();
21
+ var request_id = req.body.request_id || 'support-group-' + req.projectid + "-" + UIDGenerator.generate();
23
22
 
24
23
  // TODO cicla su segment
25
24
 
@@ -73,6 +72,7 @@ router.post('/direct', async function (req, res) {
73
72
 
74
73
  }
75
74
 
75
+
76
76
  winston.info("recipients", recipients);
77
77
  winston.info("recipients.length: " + recipients.length);
78
78
 
@@ -175,7 +175,8 @@ router.get('/allstatus', [passport.authenticate(['basic', 'jwt'], { session: fal
175
175
 
176
176
  winston.debug("## GET ALL DEPTS req.project ", req.project)
177
177
 
178
- var query = { "id_project": req.projectid };
178
+ var query = { "id_project": req.projectid, status: { $gte: 0 } }; // nascondi quelli con status = hidden (-1) for dashboard
179
+ //secondo me qui manca un parentesi tonda per gli or
179
180
  if (req.project && req.project.profile && (req.project.profile.type === 'free' && req.project.trialExpired === true) || (req.project.profile.type === 'payment' && req.project.isActiveSubscription === false)) {
180
181
 
181
182
  query.default = true;
@@ -270,7 +271,7 @@ router.get('/', function (req, res) {
270
271
  winston.debug('GET DEPTS FILTERED FOR STATUS === 1 req.project.profile.type ', req.project.trialExpired);
271
272
  winston.debug('GET DEPTS FILTERED FOR STATUS === 1 req.project.isActiveSubscription ', req.project.isActiveSubscription);
272
273
 
273
-
274
+ //secondo me qui manca un parentesi tonda per gli or
274
275
  if (req.project && req.project.profile && (req.project.profile.type === 'free' && req.project.trialExpired === true) || (req.project.profile.type === 'payment' && req.project.isActiveSubscription === false)) {
275
276
 
276
277
  query.default = true;
package/routes/email.js CHANGED
@@ -4,6 +4,9 @@ var router = express.Router();
4
4
 
5
5
  var emailService = require("../services/emailService");
6
6
  var winston = require('../config/winston');
7
+ const recipientEmailUtil = require("../utils/recipientEmailUtil");
8
+
9
+
7
10
 
8
11
  router.get('/templates/:templateid',
9
12
  async (req, res) => {
@@ -17,10 +20,10 @@ router.get('/templates/:templateid',
17
20
  router.post('/test/send',
18
21
  async (req, res) => {
19
22
  let to = req.body.to;
20
- winston.info("to",to);
23
+ winston.debug("to",to);
21
24
 
22
25
  let configEmail = req.body.config;
23
- winston.info("configEmail", configEmail);
26
+ winston.debug("configEmail", configEmail);
24
27
 
25
28
  emailService.sendTest(to, configEmail, function(err,obj) {
26
29
  // winston.info("sendTest rest", err, obj);
@@ -29,4 +32,31 @@ router.post('/test/send',
29
32
 
30
33
  });
31
34
 
35
+ //TODO add cc
36
+ router.post('/send',
37
+ async (req, res) => {
38
+ let to = req.body.to;
39
+ winston.debug("to: " + to);
40
+
41
+ let text = req.body.text;
42
+ winston.debug("text: " + text);
43
+
44
+ let request_id = req.body.request_id;
45
+ winston.debug("request_id: " + request_id);
46
+
47
+ let subject = req.body.subject;
48
+ winston.debug("subject: " + subject);
49
+
50
+ winston.debug("req.project", req.project);
51
+
52
+ let newto = await recipientEmailUtil.process(to, req.projectid);
53
+ winston.debug("newto: " + newto);
54
+
55
+ //sendEmailDirect(to, text, project, request_id, subject, tokenQueryString, sourcePage)
56
+ emailService.sendEmailDirect(newto, text, req.project, request_id, subject, undefined, undefined);
57
+
58
+ res.json({"queued": true});
59
+
60
+ });
61
+
32
62
  module.exports = router;
package/routes/faq.js CHANGED
@@ -61,6 +61,7 @@ router.post('/uploadcsv', upload.single('uploadFile'), function (req, res, next)
61
61
  // var row = {question: element.question, answer: element.answer,
62
62
  // intent_id: element.intent_id, intent_display_name: element.intent_display_name,
63
63
  // webhook_enabled: element.webhook_enabled || false }
64
+
64
65
  var newFaq = new Faq({
65
66
  id_faq_kb: id_faq_kb,
66
67
  question: question,
@@ -114,6 +115,9 @@ router.post('/', function (req, res) {
114
115
  id_faq_kb: req.body.id_faq_kb,
115
116
  question: req.body.question,
116
117
  answer: req.body.answer,
118
+ reply: req.body.reply,
119
+ form: req.body.form,
120
+ enabled: true,
117
121
  id_project: req.projectid,
118
122
  topic: req.body.topic,
119
123
  language: faq_kb.language,
@@ -123,6 +127,13 @@ router.post('/', function (req, res) {
123
127
  updatedBy: req.user.id
124
128
  });
125
129
 
130
+ if (req.body.enabled != undefined) {
131
+ newFaq.enabled = req.body.enabled;
132
+ }
133
+ if (req.body.actions) {
134
+ newFaq.actions = req.body.actions
135
+ }
136
+
126
137
  newFaq.save(function (err, savedFaq) {
127
138
  if (err) {
128
139
  if (err.code == 11000) {
@@ -177,8 +188,18 @@ router.put('/:faqid', function (req, res) {
177
188
  if (req.body.webhook_enabled!=undefined) {
178
189
  update.webhook_enabled = req.body.webhook_enabled;
179
190
  }
180
-
181
-
191
+ if (req.body.enabled!=undefined) {
192
+ update.enabled = req.body.enabled;
193
+ }
194
+ if (req.body.reply!=undefined) {
195
+ update.reply = req.body.reply;
196
+ }
197
+ if (req.body.form!=undefined) {
198
+ update.form = req.body.form;
199
+ }
200
+ if (req.body.actions != undefined) {
201
+ update.actions = req.body.actions;
202
+ }
182
203
 
183
204
  Faq.findByIdAndUpdate(req.params.faqid, update, { new: true, upsert: true }, function (err, updatedFaq) {
184
205
  if (err) {
@@ -299,10 +320,24 @@ router.get('/', function (req, res, next) {
299
320
  query.id_project = req.projectid
300
321
  }
301
322
 
323
+ if (req.query.intent_display_name) {
324
+ query.intent_display_name=req.query.intent_display_name
325
+ }
326
+
327
+
302
328
  winston.debug("GET FAQ query", query);
303
329
 
304
330
  // query.$text = {"$search": "question"};
305
331
 
332
+ // TODO ORDER BY SCORE
333
+ // return Faq.find(query, {score: { $meta: "textScore" } })
334
+ // .sort( { score: { $meta: "textScore" } } ) //https://docs.mongodb.com/manual/reference/operator/query/text/#sort-by-text-search-score
335
+
336
+ // in testing...
337
+ // return Faq.search('a closer', (err, result) => {
338
+ // console.log("result: ", result);
339
+ // })
340
+
306
341
  return Faq.find(query).
307
342
  skip(skip).limit(limit).
308
343
  populate({path:'faq_kb'})//, match: { trashed: { $in: [null, false] } }}).