@tiledesk/tiledesk-server 2.2.39 → 2.3.1-8.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. package/CHANGELOG.md +121 -0
  2. package/LICENSE +14 -657
  3. package/README.md +17 -3
  4. package/app.js +21 -60
  5. package/channels/chat21/chat21Handler.js +18 -3
  6. package/channels/chat21/chat21WebHook.js +31 -15
  7. package/channels/chat21/package-lock.json +663 -706
  8. package/channels/chat21/package.json +2 -2
  9. package/deploy.sh +2 -0
  10. package/event/botEvent.js +1 -1
  11. package/event/subscriptionEvent.js +11 -0
  12. package/fonts/Roboto-Italic.ttf +0 -0
  13. package/fonts/Roboto-Medium.ttf +0 -0
  14. package/fonts/Roboto-MediumItalic.ttf +0 -0
  15. package/fonts/Roboto-Regular.ttf +0 -0
  16. package/middleware/ipFilter.js +220 -0
  17. package/middleware/passport.js +11 -2
  18. package/models/lead.js +2 -0
  19. package/models/project.js +10 -0
  20. package/models/project_user.js +4 -0
  21. package/models/request.js +50 -12
  22. package/models/subscriptionLog.js +34 -0
  23. package/models/tagLibrary.js +42 -0
  24. package/package.json +6 -12
  25. package/pubmodules/activities/activityArchiver.js +314 -0
  26. package/pubmodules/activities/index.js +3 -0
  27. package/pubmodules/activities/models/activity.js +88 -0
  28. package/pubmodules/activities/routes/activity.js +710 -0
  29. package/pubmodules/activities/test/activityRoute.js +85 -0
  30. package/pubmodules/analytics/analytics.js +1719 -0
  31. package/pubmodules/analytics/index.js +3 -0
  32. package/pubmodules/canned/cannedResponse.js +55 -0
  33. package/pubmodules/canned/cannedResponseRoute.js +163 -0
  34. package/pubmodules/canned/index.js +3 -0
  35. package/pubmodules/emailNotification/requestNotification.js +215 -28
  36. package/pubmodules/events/eventRoute.js +37 -7
  37. package/pubmodules/messageActions/messageActionsInterceptor.js +4 -2
  38. package/pubmodules/pubModulesManager.js +129 -5
  39. package/pubmodules/rasa/listener.js +5 -5
  40. package/pubmodules/rules/conciergeBot.js +4 -4
  41. package/pubmodules/scheduler/tasks/closeAgentUnresponsiveRequestTask.js +3 -1
  42. package/pubmodules/scheduler/tasks/closeBotUnresponsiveRequestTask.js +3 -1
  43. package/pubmodules/tilebot/index.js +11 -0
  44. package/pubmodules/tilebot/listener.js +69 -0
  45. package/pubmodules/trigger/default.js +271 -0
  46. package/pubmodules/trigger/event/actionEventEmitter.js +10 -0
  47. package/pubmodules/trigger/event/flowEventEmitter.js +10 -0
  48. package/pubmodules/trigger/event/triggerEventEmitter.js +10 -0
  49. package/pubmodules/trigger/index.js +3 -0
  50. package/pubmodules/trigger/models/trigger.js +149 -0
  51. package/pubmodules/trigger/rulesTrigger.js +1181 -0
  52. package/pubmodules/trigger/start.js +118 -0
  53. package/pubmodules/trigger/triggerRoute.js +150 -0
  54. package/routes/auth.js +7 -2
  55. package/routes/department.js +51 -0
  56. package/routes/faq.js +7 -0
  57. package/routes/faq_kb.js +1 -1
  58. package/routes/group.js +140 -0
  59. package/routes/lead.js +24 -1
  60. package/routes/message.js +6 -3
  61. package/routes/project.js +118 -0
  62. package/routes/project_user.js +9 -0
  63. package/routes/public-request.js +280 -2
  64. package/routes/request.js +122 -16
  65. package/routes/subscription.js +140 -0
  66. package/routes/tag.js +138 -0
  67. package/routes/user-request.js +3 -2
  68. package/routes/users.js +1 -1
  69. package/routes/widget.js +80 -3
  70. package/routes/widgetLoader.js +31 -0
  71. package/services/banUserNotifier.js +86 -0
  72. package/services/emailService.js +189 -11
  73. package/services/faqService.js +2 -2
  74. package/services/geoService.js +30 -4
  75. package/services/leadService.js +2 -0
  76. package/services/modulesManager.js +7 -188
  77. package/services/requestService.js +364 -6
  78. package/services/subscriptionNotifier.js +485 -0
  79. package/template/email/assignedEmailMessage.html +1 -1
  80. package/template/email/assignedRequest.html +1 -1
  81. package/template/email/newMessage.html +1 -1
  82. package/template/email/newMessageFollower.html +236 -0
  83. package/template/email/passwordChanged.html +1 -1
  84. package/template/email/pooledEmailMessage.html +1 -1
  85. package/template/email/pooledRequest.html +1 -1
  86. package/template/email/resetPassword.html +2 -2
  87. package/template/email/ticket.html +1 -1
  88. package/test/cannedRoute.js +166 -0
  89. package/test/messageRoute.js +69 -0
  90. package/test/requestService.js +3 -1
  91. package/utils/orgUtil.js +3 -3
  92. package/views/messages.jade +2 -2
  93. package/websocket/webSocketServer.js +23 -5
@@ -0,0 +1,3 @@
1
+ const analyticsRoute = require("./analytics");
2
+
3
+ module.exports = {analyticsRoute:analyticsRoute};
@@ -0,0 +1,55 @@
1
+ var mongoose = require('mongoose');
2
+ var Schema = mongoose.Schema;
3
+ var winston = require('../../config/winston');
4
+
5
+
6
+ var CannedResponseSchema = new Schema({
7
+
8
+ title: {
9
+ type: String,
10
+ required: false,
11
+ index: true
12
+ },
13
+ text: {
14
+ type: String,
15
+ required: true,
16
+ },
17
+ shared: {
18
+ type: Boolean,
19
+ required: true
20
+ },
21
+ attributes: {
22
+ type: Object,
23
+ },
24
+ id_project: {
25
+ type: String,
26
+ required: true,
27
+ index: true
28
+ },
29
+ createdBy: {
30
+ type: String,
31
+ required: true
32
+ },
33
+ status: {
34
+ type: Number,
35
+ required: false,
36
+ default: 100,
37
+ index: true
38
+ },
39
+ },{
40
+ timestamps: true
41
+ }
42
+ );
43
+
44
+
45
+ // CannedResponseSchema.index({text: 'text'},
46
+ // {"name":"cannedresponse_fulltext","default_language": "italian","language_override": "dummy"}); // schema level
47
+
48
+ var CannedResponse = mongoose.model('cannedResponse', CannedResponseSchema);
49
+
50
+ if (process.env.MONGOOSE_SYNCINDEX) {
51
+ CannedResponse.syncIndexes();
52
+ winston.info("CannedResponse syncIndexes")
53
+ }
54
+
55
+ module.exports = CannedResponse;
@@ -0,0 +1,163 @@
1
+ var express = require('express');
2
+ var router = express.Router();
3
+ var CannedResponse = require("./cannedResponse");
4
+ var winston = require('../../config/winston');
5
+ // const CannedResponseEvent = require('../event/CannedResponseEvent');
6
+
7
+
8
+ router.post('/', function (req, res) {
9
+
10
+ winston.debug(req.body);
11
+ winston.debug("req.user", req.user);
12
+
13
+ var newCannedResponse = new CannedResponse({
14
+ title: req.body.title,
15
+ text: req.body.text,
16
+ id_project: req.projectid,
17
+ createdBy: req.user.id,
18
+ updatedBy: req.user.id
19
+ });
20
+
21
+ if (req.projectuser.role == 'owner' || req.projectuser.role == 'admin') {
22
+ newCannedResponse.shared = true;
23
+ } else {
24
+ newCannedResponse.shared = false;
25
+ }
26
+
27
+ newCannedResponse.save(function (err, savedCannedResponse) {
28
+ if (err) {
29
+ winston.error('--- > ERROR ', err)
30
+
31
+ return res.status(500).send({ success: false, msg: 'Error saving object.' });
32
+ }
33
+
34
+ res.json(savedCannedResponse);
35
+ });
36
+ });
37
+
38
+ router.put('/:cannedResponseid', function (req, res) {
39
+ winston.debug(req.body);
40
+ var update = {};
41
+
42
+ if (req.body.title!=undefined) {
43
+ update.title = req.body.title;
44
+ }
45
+ if (req.body.text!=undefined) {
46
+ update.text = req.body.text;
47
+ }
48
+ if (req.body.attributes!=undefined) {
49
+ update.attributes = req.body.attributes;
50
+ }
51
+
52
+
53
+ CannedResponse.findByIdAndUpdate(req.params.cannedResponseid, update, { new: true, upsert: true }, function (err, updatedCannedResponse) {
54
+ if (err) {
55
+ winston.error('--- > ERROR ', err);
56
+ return res.status(500).send({ success: false, msg: 'Error updating object.' });
57
+ }
58
+
59
+
60
+
61
+ // CannedResponseEvent.emit('CannedResponse.update', updatedCannedResponse);
62
+ res.json(updatedCannedResponse);
63
+ });
64
+ });
65
+
66
+ router.delete('/:cannedResponseid', function (req, res) {
67
+ winston.debug(req.body);
68
+
69
+ CannedResponse.findByIdAndUpdate(req.params.cannedResponseid, {status: 1000}, { new: true, upsert: true }, function (err, updatedCannedResponse) {
70
+ if (err) {
71
+ winston.error('--- > ERROR ', err);
72
+ return res.status(500).send({ success: false, msg: 'Error updating object.' });
73
+ }
74
+
75
+
76
+
77
+ // CannedResponseEvent.emit('CannedResponse.delete', updatedCannedResponse);
78
+ res.json(updatedCannedResponse);
79
+ });
80
+ });
81
+
82
+ router.delete('/:cannedResponseid/physical', function (req, res) {
83
+ winston.debug(req.body);
84
+
85
+ CannedResponse.remove({ _id: req.params.cannedResponseid }, function (err, cannedResponse) {
86
+ if (err) {
87
+ winston.error('--- > ERROR ', err);
88
+ return res.status(500).send({ success: false, msg: 'Error deleting object.' });
89
+ }
90
+
91
+
92
+ // CannedResponseEvent.emit('CannedResponse.delete', CannedResponse);
93
+
94
+ res.json(cannedResponse);
95
+ });
96
+ });
97
+
98
+ router.get('/:cannedResponseid', function (req, res) {
99
+ winston.debug(req.body);
100
+
101
+ CannedResponse.findById(req.params.cannedResponseid, function (err, cannedResponse) {
102
+ if (err) {
103
+ return res.status(500).send({ success: false, msg: 'Error getting object.' });
104
+ }
105
+ if (!cannedResponse) {
106
+ return res.status(404).send({ success: false, msg: 'Object not found.' });
107
+ }
108
+ res.json(cannedResponse);
109
+ });
110
+ });
111
+
112
+ router.get('/', function (req, res) {
113
+ var limit = 1000; // Number of CannedResponses per page
114
+ var page = 0;
115
+
116
+ if (req.query.page) {
117
+ page = req.query.page;
118
+ }
119
+
120
+ var skip = page * limit;
121
+ winston.debug('CannedResponse ROUTE - SKIP PAGE ', skip);
122
+
123
+ // var query = { "id_project": req.projectid, "status": {$lt:1000}};
124
+ console.log("canned_req.user: ", req.user);
125
+ var query = {"id_project": req.projectid, "status": { $lt:1000 }, $or:[ { shared: true }, { createdBy: req.user._id } ] }
126
+
127
+ if (req.query.full_text) {
128
+ winston.debug('CannedResponse ROUTE req.query.fulltext', req.query.full_text);
129
+ query.$text = { "$search": req.query.full_text };
130
+ }
131
+
132
+ var direction = -1; //-1 descending , 1 ascending
133
+ if (req.query.direction) {
134
+ direction = req.query.direction;
135
+ }
136
+
137
+ var sortField = "createdAt";
138
+ if (req.query.sort) {
139
+ sortField = req.query.sort;
140
+ }
141
+
142
+ var sortQuery = {};
143
+ sortQuery[sortField] = direction;
144
+
145
+ winston.debug("sort query", sortQuery);
146
+
147
+ return CannedResponse.find(query).
148
+ skip(skip).limit(limit).
149
+ sort(sortQuery).
150
+ exec(function (err, cannedResponses) {
151
+ if (err) {
152
+ winston.error('CannedResponse ROUTE - REQUEST FIND ERR ', err)
153
+ return (err);
154
+ }
155
+
156
+ return res.json(cannedResponses);
157
+ });
158
+ });
159
+
160
+
161
+
162
+
163
+ module.exports = router;
@@ -0,0 +1,3 @@
1
+ const cannedResponseRoute = require("./cannedResponseRoute");
2
+
3
+ module.exports = {cannedResponseRoute: cannedResponseRoute};
@@ -31,11 +31,25 @@ winston.debug('********* RequestNotification apiUrl: ' + apiUrl);
31
31
 
32
32
  class RequestNotification {
33
33
 
34
+ constructor() {
35
+ this.enabled = true;
36
+ if (process.env.EMAIL_NOTIFICATION_ENABLED=="false" || process.env.EMAIL_NOTIFICATION_ENABLED==false) {
37
+ this.enabled = false;
38
+ }
39
+ winston.debug("RequestNotification this.enabled: "+ this.enabled);
40
+ }
34
41
 
35
42
  listen() {
36
- var that = this;
43
+ var that = this;
37
44
 
38
45
 
46
+
47
+ if (this.enabled==true) {
48
+ winston.info("RequestNotification listener started");
49
+ } else {
50
+ return winston.info("RequestNotification listener disabled");
51
+ }
52
+
39
53
 
40
54
  var messageCreateKey = 'message.create';
41
55
  if (messageEvent.queueEnabled) {
@@ -47,7 +61,7 @@ listen() {
47
61
  messageEvent.on(messageCreateKey, function(message) {
48
62
 
49
63
  setImmediate(() => {
50
- winston.debug("sendUserEmail", message);
64
+ winston.debug("messageEvent.on(messageCreateKey", message);
51
65
 
52
66
  if (message.attributes && message.attributes.subtype==='info') {
53
67
  return winston.debug("not sending sendUserEmail for attributes.subtype info messages");
@@ -56,17 +70,18 @@ listen() {
56
70
 
57
71
  if (message.request && (message.request.channel.name===ChannelConstants.EMAIL || message.request.channel.name===ChannelConstants.FORM)) {
58
72
 
73
+ //messages sent from admins or agents to requester
59
74
  if (message.sender != message.request.lead.lead_id) {
60
75
  winston.verbose("sending sendToUserEmailChannelEmail for EMAIL or FORM channel");
61
-
62
- if (message.attributes && message.attributes.subtype==='private') {
63
- return winston.debug("not sending sendToUserEmailChannelEmail for attributes.subtype private messages");
64
- }
65
- return that.sendToUserEmailChannelEmail(message.id_project, message);
66
- } else {
76
+
77
+ //send email notification to requester (send also to followers)
78
+ return that.sendToUserEmailChannelEmail(message.id_project, message);
79
+ } else { //messages sent from requester to agents or admins
67
80
 
68
81
  if (message.text != message.request.first_text) {
69
82
  winston.verbose("sending sendToAgentEmailChannelEmail for EMAIL or FORM channel");
83
+
84
+ //send email notification to admins and agents(send also to followers)
70
85
  return that.sendToAgentEmailChannelEmail(message.id_project, message);
71
86
  } else {
72
87
  winston.debug("sending sendToAgentEmailChannelEmail for EMAIL or FORM channel disabled for first text message")
@@ -76,16 +91,22 @@ listen() {
76
91
 
77
92
  } else {
78
93
  winston.debug("sendUserEmail chat channel");
79
- // controlla se sta funzionando
80
- if (process.env.DISABLE_SEND_OFFLINE_EMAIL === "true" || process.env.DISABLE_SEND_OFFLINE_EMAIL === true ) {
81
- return winston.debug("DISABLE_SEND_OFFLINE_EMAIL disabled");
82
- }
83
- // mandare email se ultimo messaggio > X MINUTI configurato in Notification . potresti usare request.updated_at ?
94
+
95
+
96
+
97
+
98
+ //messages sent from admins or agents
99
+ //send email notification to requester
84
100
  if (message.request && message.request.lead && message.sender != message.request.lead.lead_id) {
101
+ winston.debug("sendUserEmail");
85
102
  winston.debug("sendUserEmail", message);
86
103
 
87
- // send an email only if offline and has an email
104
+ // send an email only if offline and has an email (send also to followers)
88
105
  return that.sendUserEmail(message.id_project, message);
106
+ } else { //send email to followers
107
+
108
+ that.sendToFollower(message.id_project, message);
109
+
89
110
  }
90
111
 
91
112
  }
@@ -139,7 +160,6 @@ listen() {
139
160
 
140
161
 
141
162
 
142
-
143
163
  // requestEvent.on("request.update.preflight", function(request) {
144
164
 
145
165
  // winston.info("requestEvent request.update.preflight");
@@ -227,15 +247,19 @@ listen() {
227
247
 
228
248
 
229
249
  sendToUserEmailChannelEmail(projectid, message) {
250
+ winston.debug("sendToUserEmailChannelEmail");
251
+ var that = this;
230
252
  try {
231
253
 
232
254
  if (!message.request) {
233
255
  return winston.debug("This is a direct message");
234
256
  }
235
257
 
236
- if (!message.request.lead || !message.request.lead.email) {
237
- return winston.debug("The lead object is undefined or has empty email");
238
- }
258
+
259
+
260
+
261
+
262
+
239
263
 
240
264
  Project.findOne({_id: projectid, status: 100}).select("+settings").exec(function(err, project){
241
265
  if (err) {
@@ -245,6 +269,7 @@ sendToUserEmailChannelEmail(projectid, message) {
245
269
  if (!project) {
246
270
  return winston.warn("Project not found", projectid);
247
271
  }
272
+
248
273
 
249
274
  // if (project.settings && project.settings.email && project.settings.email.notification && project.settings.email.notification.conversation && project.settings.email.notification.conversation.offline && project.settings.email.notification.conversation.offline.blocked == true ) {
250
275
  // return winston.info("RequestNotification offline email notification for the project with id : " + projectid + " for the conversations is blocked");
@@ -256,7 +281,7 @@ sendToUserEmailChannelEmail(projectid, message) {
256
281
  // }
257
282
 
258
283
  let lead = message.request.lead;
259
- winston.debug("sending channel emaol email to lead ", lead);
284
+ winston.debug("sending channel email to lead ", lead);
260
285
 
261
286
 
262
287
  winston.debug("sending user email to "+ lead.email);
@@ -307,8 +332,24 @@ sendToUserEmailChannelEmail(projectid, message) {
307
332
  }
308
333
  winston.debug("tokenQueryString: "+tokenQueryString);
309
334
 
335
+
336
+
337
+ // winston.info("savedRequest.followers", savedRequest.followers);
338
+ // winston.info("savedRequest.followers.length:"+ savedRequest.followers.length);
339
+ that.notifyFollowers(message.request, project, message);
340
+
341
+
342
+ if (message.attributes && message.attributes.subtype==='private') {
343
+ return winston.debug("not sending sendToUserEmailChannelEmail for attributes.subtype private messages");
344
+ }
345
+
346
+ // nn va bene qui
347
+ if (!message.request.lead || !message.request.lead.email) {
348
+ return winston.debug("The lead object is undefined or has empty email");
349
+ }
350
+
310
351
  emailService.sendEmailChannelNotification(message.request.lead.email, message, project, tokenQueryString, sourcePage);
311
-
352
+
312
353
 
313
354
  });
314
355
 
@@ -318,9 +359,112 @@ sendToUserEmailChannelEmail(projectid, message) {
318
359
  }
319
360
 
320
361
 
362
+ async notifyFollowers(savedRequest, project, message) {
363
+
364
+ if (message.attributes && message.attributes.subtype==='info/support') {
365
+ return winston.debug("not sending notifyFollowers for attributes.subtype info/support messages");
366
+ }
367
+
368
+ if (message.attributes && message.attributes.subtype==='info') {
369
+ return winston.debug("not sending notifyFollowers for attributes.subtype info messages");
370
+ }
371
+
372
+ if (!savedRequest) {
373
+ return winston.debug("not sending notifyFollowers for direct messages");
374
+ }
375
+
376
+ // Cannot read property '_id' of undefined at RequestNotification.notifyFollowers (/usr/src/app/pubmodules/emailNotification/requestNotification.js:358:62) at /usr/src/app
377
+ // forse meglio .id
378
+
379
+ var reqWithFollowers = await Request.findById(savedRequest._id).populate('followers').exec();
380
+ winston.debug("reqWithFollowers");
381
+ winston.debug("reqWithFollowers",reqWithFollowers);
382
+ // console.log("reqWithFollowers",reqWithFollowers);
383
+
384
+ if (reqWithFollowers.followers && reqWithFollowers.followers.length>0) {
385
+
386
+ winston.debug("reqWithFollowers.followers.length: "+reqWithFollowers.followers.length);
387
+
388
+ reqWithFollowers.followers.forEach(project_user => {
389
+ winston.debug("project_user", project_user);
390
+ //TODO skip participants from followers
391
+
392
+ var userid = project_user.id_user;
393
+
394
+ if (project_user.settings && project_user.settings.email && project_user.settings.email.notification && project_user.settings.email.notification.conversation && project_user.settings.email.notification.conversation.ticket && project_user.settings.email.notification.conversation.ticket.follower == false ) {
395
+ return winston.verbose("RequestNotification email notification for the user with id " + userid+ " the follower conversation ticket is disabled");
396
+ }
397
+
398
+ User.findOne({_id: userid , status: 100})
399
+ //@DISABLED_CACHE .cache(cacheUtil.defaultTTL, "users:id:"+userid)
400
+ .exec(function (err, user) {
401
+ if (err) {
402
+ // winston.debug(err);
403
+ }
404
+ if (!user) {
405
+ winston.warn("User not found", userid);
406
+ } else {
407
+ winston.info("Sending notifyFollowers to user with email: "+ user.email);
408
+ if (user.emailverified) {
409
+ emailService.sendFollowerNotification(user.email, message, project);
410
+ // emailService.sendEmailChannelNotification(user.email, message, project);
411
+
412
+ // emailService.sendNewAssignedAgentMessageEmailNotification(user.email, savedRequest, project, message);
413
+
414
+ }else {
415
+ winston.info("User email not verified", user.email);
416
+ }
417
+ }
418
+ });
419
+
420
+
421
+ });
422
+
423
+
424
+ }
425
+ }
426
+
427
+ sendToFollower(projectid, message) {
428
+ winston.debug("sendToFollower");
429
+ var that = this;
430
+ let savedRequest = message.request;
431
+ // send email
432
+ try {
433
+
434
+
435
+ Project.findOne({_id: projectid, status: 100}).select("+settings").exec(async function(err, project){
436
+ if (err) {
437
+ return winston.error(err);
438
+ }
439
+
440
+ if (!project) {
441
+ return winston.warn("Project not found", projectid);
442
+ } else {
443
+
444
+ winston.debug("project", project);
445
+
446
+ // if (project.settings && project.settings.email && project.settings.email.notification && project.settings.email.notification.conversation && project.settings.email.notification.conversation.blocked == true ) {
447
+ // return winston.verbose("RequestNotification email notification for the project with id : " + projectid + " for all the conversations is blocked");
448
+ // }
449
+
450
+ winston.debug("savedRequest", savedRequest);
451
+
452
+
321
453
 
454
+ // winston.info("savedRequest.followers", savedRequest.followers);
455
+ // winston.info("savedRequest.followers.length:"+ savedRequest.followers.length);
456
+ that.notifyFollowers(message.request, project, message);
457
+
458
+
459
+ }
460
+ })
461
+ } catch (e) {
462
+ winston.warn("Error sending email", {error:e, projectid:projectid, message: message, savedRequest:savedRequest}); //it's better to view error email at this stage
463
+ }
464
+ }
322
465
 
323
466
  sendToAgentEmailChannelEmail(projectid, message) {
467
+ var that = this;
324
468
  let savedRequest = message.request;
325
469
  // send email
326
470
  try {
@@ -343,9 +487,17 @@ sendToAgentEmailChannelEmail(projectid, message) {
343
487
 
344
488
  winston.debug("savedRequest", savedRequest);
345
489
 
346
-
347
490
 
348
491
 
492
+ // winston.info("savedRequest.followers", savedRequest.followers);
493
+ // winston.info("savedRequest.followers.length:"+ savedRequest.followers.length);
494
+ that.notifyFollowers(message.request, project, message);
495
+
496
+
497
+
498
+ // UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'status' of undefined
499
+ // at /Users/andrealeo/dev/chat21/ti
500
+
349
501
  // TODO fare il controllo anche sul dipartimento con modalità assigned o pooled
350
502
  if (savedRequest.status==RequestConstants.UNASSIGNED) { //POOLED
351
503
 
@@ -523,15 +675,19 @@ sendEmailChannelTakingNotification(projectid, request) {
523
675
 
524
676
 
525
677
  sendUserEmail(projectid, message) {
678
+ winston.debug("sendUserEmail");
679
+ var that = this;
680
+
681
+
526
682
  try {
527
683
 
528
684
  if (!message.request) {
529
685
  return winston.debug("This is a direct message");
530
686
  }
687
+
531
688
 
532
- if (!message.request.lead || !message.request.lead.email) {
533
- return winston.debug("The lead object is undefined or has empty email");
534
- }
689
+
690
+
535
691
 
536
692
  Project.findOne({_id: projectid, status: 100}).select("+settings").exec(function(err, project){
537
693
  if (err) {
@@ -542,6 +698,28 @@ sendUserEmail(projectid, message) {
542
698
  return winston.warn("Project not found", projectid);
543
699
  }
544
700
 
701
+ winston.debug("notifyFollowers");
702
+ that.notifyFollowers(message.request, project, message);
703
+
704
+
705
+
706
+ if (process.env.DISABLE_SEND_OFFLINE_EMAIL === "true" || process.env.DISABLE_SEND_OFFLINE_EMAIL === true ) {
707
+ return winston.debug("DISABLE_SEND_OFFLINE_EMAIL disabled");
708
+ }
709
+ if (message.attributes && message.attributes.subtype==='info/support') {
710
+ return winston.debug("not sending sendUserEmail for attributes.subtype info/support messages");
711
+ }
712
+
713
+ if (message.attributes && message.attributes.subtype==='info') {
714
+ return winston.debug("not sending sendUserEmail for attributes.subtype info messages");
715
+ }
716
+
717
+
718
+
719
+ if (!message.request.lead || !message.request.lead.email) {
720
+ return winston.debug("The lead object is undefined or has empty email");
721
+ }
722
+
545
723
  if (project.settings && project.settings.email && project.settings.email.notification && project.settings.email.notification.conversation && project.settings.email.notification.conversation.offline && project.settings.email.notification.conversation.offline.blocked == true ) {
546
724
  return winston.info("RequestNotification offline email notification for the project with id : " + projectid + " for the conversations is blocked");
547
725
  }
@@ -550,8 +728,8 @@ sendUserEmail(projectid, message) {
550
728
  if (project.settings && project.settings.email && project.settings.email.notification && project.settings.email.notification.conversation && project.settings.email.notification.conversation.offline && project.settings.email.notification.conversation.offline.enabled == false ) {
551
729
  return winston.info("RequestNotification offline email notification for the project with id : " + projectid + " for the offline conversation is disabled");
552
730
  }
553
-
554
-
731
+
732
+
555
733
 
556
734
  var recipient = message.request.lead.lead_id;
557
735
  winston.debug("recipient:"+ recipient);
@@ -649,7 +827,12 @@ sendAgentEmail(projectid, savedRequest) {
649
827
  // send email
650
828
  try {
651
829
 
652
-
830
+ // console.log("sendAgentEmail")
831
+ if (savedRequest.preflight === true) { //only for channel email and form preflight is false otherwise request.participants.update is used i think?
832
+ winston.debug("preflight request sendAgentEmail disabled")
833
+ return 0;
834
+ }
835
+
653
836
  Project.findOne({_id: projectid, status: 100}).select("+settings").exec( async function(err, project){
654
837
  if (err) {
655
838
  return winston.error(err);
@@ -670,6 +853,8 @@ sendAgentEmail(projectid, savedRequest) {
670
853
  // TODO fare il controllo anche sul dipartimento con modalità assigned o pooled
671
854
  if (savedRequest.status==RequestConstants.UNASSIGNED) { //POOLED
672
855
 
856
+ winston.debug("savedRequest.status==RequestConstants.UNASSIGNED");
857
+
673
858
  if (project.settings && project.settings.email && project.settings.email.notification && project.settings.email.notification.conversation && project.settings.email.notification.conversation.pooled == false ) {
674
859
  return winston.info("RequestNotification email notification for the project with id : " + projectid + " for the pooled conversation is disabled");
675
860
  }
@@ -678,7 +863,7 @@ sendAgentEmail(projectid, savedRequest) {
678
863
  }
679
864
 
680
865
 
681
-
866
+
682
867
  var snapshotAgents = savedRequest; //riassegno varibile cosi nn cambio righe successive
683
868
 
684
869
 
@@ -742,6 +927,8 @@ sendAgentEmail(projectid, savedRequest) {
742
927
  // TODO fare il controllo anche sul dipartimento con modalità assigned o pooled
743
928
  else if (savedRequest.status==RequestConstants.ASSIGNED) { //ASSIGNED
744
929
 
930
+ winston.debug("savedRequest.status==RequestConstants.ASSIGNED");
931
+
745
932
  if (project.settings && project.settings.email && project.settings.email.notification && project.settings.email.notification.conversation && project.settings.email.notification.conversation.assigned == false ) {
746
933
  return winston.verbose("RequestNotification email notification for the project with id : " + projectid + " for the assigned conversation is disabled");
747
934
  }