@tiledesk/tiledesk-server 2.1.41 → 2.2.4
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/.circleci/config.yml +54 -0
- package/.env.sample +1 -1
- package/.github/workflows/docker-community-push-latest.yml +22 -0
- package/.github/workflows/{docker-image-push.yml → docker-image-en-tag-push.yml} +1 -1
- package/.github/workflows/docker-image-tag-community-tag-push.yml +21 -0
- package/.github/workflows/{docker-push-latest.yml → docker-push-en-push-latest.yml} +1 -1
- package/CHANGELOG.md +198 -1
- package/Dockerfile +1 -1
- package/Dockerfile-en +1 -1
- package/README.md +5 -7
- package/app.js +12 -1
- package/channels/chat21/chat21Contact.js +34 -8
- package/channels/chat21/chat21Handler.js +48 -5
- package/channels/chat21/chat21WebHook.js +34 -5
- package/channels/chat21/nativeauth.js +2 -2
- package/config/email.js +2 -1
- package/config/global.js +3 -0
- package/config/labels/widget.json +170 -16
- package/event/messageEvent.js +18 -1
- package/middleware/passport.js +10 -4
- package/models/actionsConstants.js +7 -0
- package/models/department.js +3 -0
- package/models/faq.js +8 -2
- package/models/faq_kb.js +6 -0
- package/models/message.js +10 -4
- package/models/messageConstants.js +3 -3
- package/models/request.js +33 -3
- package/package.json +31 -28
- package/pubmodules/emailNotification/requestNotification.js +380 -62
- package/pubmodules/messageActions/messageActionsInterceptor.js +20 -7
- package/pubmodules/messageTransformer/index.js +1 -1
- package/pubmodules/messageTransformer/microLanguageAttributesTransformerInterceptor.js +67 -0
- package/pubmodules/pubModulesManager.js +66 -14
- package/pubmodules/rules/conciergeBot.js +81 -49
- package/routes/auth.js +34 -10
- package/routes/campaigns.js +117 -25
- package/routes/faq.js +19 -0
- package/routes/faq_kb.js +13 -4
- package/routes/faqpub.js +1 -1
- package/routes/images.js +1 -1
- package/routes/jwt.js +0 -1
- package/routes/logs.js +26 -0
- package/routes/message.js +7 -2
- package/routes/messagesRoot.js +73 -16
- package/routes/project_user.js +36 -1
- package/routes/request.js +88 -12
- package/routes/requestUtilRoot.js +30 -0
- package/routes/urls.js +12 -0
- package/routes/users.js +5 -1
- package/services/BotSubscriptionNotifier.js +1 -0
- package/services/departmentService.js +29 -5
- package/services/emailService.js +1103 -298
- package/services/faqBotHandler.js +176 -61
- package/services/faqBotSupport.js +181 -117
- package/services/faqService.js +17 -14
- package/services/messageService.js +57 -9
- package/services/modulesManager.js +86 -23
- package/services/requestService.js +58 -17
- package/template/email/assignedEmailMessage.html +205 -0
- package/template/email/assignedRequest.html +44 -14
- package/template/email/beenInvitedExistingUser.html +2 -2
- package/template/email/beenInvitedNewUser.html +1 -1
- package/template/email/newMessage.html +31 -12
- package/template/email/passwordChanged.html +2 -3
- package/template/email/pooledEmailMessage.html +208 -0
- package/template/email/pooledRequest.html +41 -14
- package/template/email/resetPassword.html +2 -3
- package/template/email/sendTranscript.html +1 -1
- package/template/email/test.html +1 -1
- package/template/email/ticket.html +78 -52
- package/template/email/ticket.txt +5 -1
- package/template/email/verify.html +1 -1
- package/test/authentication.js +76 -4
- package/test/authenticationJwt.js +76 -2
- package/test/campaignsRoute.js +226 -0
- package/test/faqService.js +3 -3
- package/test/faqkbRoute.js +3 -2
- package/test/messageRootRoute.js +193 -0
- package/test/messageRoute.js +75 -0
- package/test/messageService.js +5 -5
- package/test/requestRoute.js +27 -9
- package/test/requestService.js +472 -11
- package/test-int/bot.js +673 -8
- package/websocket/webSocketServer.js +7 -4
- package/template/email/ticket-taking.txt +0 -7
@@ -20,9 +20,14 @@ var mongoose = require('mongoose');
|
|
20
20
|
var jwt = require('jsonwebtoken');
|
21
21
|
const uuidv4 = require('uuid/v4');
|
22
22
|
var config = require('../../config/database');
|
23
|
+
var configGlobal = require('../../config/global');
|
23
24
|
|
24
25
|
var widgetConfig = require('../../config/widget');
|
25
26
|
var widgetTestLocation = process.env.WIDGET_TEST_LOCATION || widgetConfig.testLocation;
|
27
|
+
let configSecret = process.env.GLOBAL_SECRET || config.secret;
|
28
|
+
|
29
|
+
let apiUrl = process.env.API_URL || configGlobal.apiUrl;
|
30
|
+
winston.debug('********* RequestNotification apiUrl: ' + apiUrl);
|
26
31
|
|
27
32
|
class RequestNotification {
|
28
33
|
|
@@ -31,7 +36,15 @@ listen() {
|
|
31
36
|
var that = this;
|
32
37
|
|
33
38
|
|
34
|
-
|
39
|
+
|
40
|
+
var messageCreateKey = 'message.create';
|
41
|
+
if (messageEvent.queueEnabled) {
|
42
|
+
messageCreateKey = 'message.create.queue';
|
43
|
+
}
|
44
|
+
winston.debug('RequestNotification messageCreateKey: ' + messageCreateKey);
|
45
|
+
|
46
|
+
|
47
|
+
messageEvent.on(messageCreateKey, function(message) {
|
35
48
|
|
36
49
|
setImmediate(() => {
|
37
50
|
winston.debug("sendUserEmail", message);
|
@@ -39,21 +52,38 @@ listen() {
|
|
39
52
|
if (message.attributes && message.attributes.subtype==='info') {
|
40
53
|
return winston.debug("not sending sendUserEmail for attributes.subtype info messages");
|
41
54
|
}
|
55
|
+
|
56
|
+
|
42
57
|
if (message.request && (message.request.channel.name===ChannelConstants.EMAIL || message.request.channel.name===ChannelConstants.FORM)) {
|
43
58
|
|
44
59
|
if (message.sender != message.request.lead.lead_id) {
|
45
|
-
winston.verbose("sending
|
46
|
-
return that.
|
60
|
+
winston.verbose("sending sendToUserEmailChannelEmail for EMAIL or FORM channel");
|
61
|
+
return that.sendToUserEmailChannelEmail(message.id_project, message);
|
47
62
|
} else {
|
48
|
-
|
63
|
+
|
64
|
+
if (message.text != message.request.first_text) {
|
65
|
+
winston.verbose("sending sendToAgentEmailChannelEmail for EMAIL or FORM channel");
|
66
|
+
return that.sendToAgentEmailChannelEmail(message.id_project, message);
|
67
|
+
} else {
|
68
|
+
winston.debug("sending sendToAgentEmailChannelEmail for EMAIL or FORM channel disabled for first text message")
|
69
|
+
}
|
70
|
+
|
49
71
|
}
|
50
72
|
|
51
73
|
} else {
|
52
|
-
|
74
|
+
winston.debug("sendUserEmail chat channel");
|
75
|
+
// controlla se sta funzionando
|
76
|
+
if (process.env.DISABLE_SEND_OFFLINE_EMAIL === "true" || process.env.DISABLE_SEND_OFFLINE_EMAIL === true ) {
|
53
77
|
return winston.debug("DISABLE_SEND_OFFLINE_EMAIL disabled");
|
54
78
|
}
|
55
79
|
// mandare email se ultimo messaggio > X MINUTI configurato in Notification . potresti usare request.updated_at ?
|
56
|
-
|
80
|
+
if (message.request && message.request.lead && message.sender != message.request.lead.lead_id) {
|
81
|
+
winston.debug("sendUserEmail", message);
|
82
|
+
|
83
|
+
// send an email only if offline and has an email
|
84
|
+
return that.sendUserEmail(message.id_project, message);
|
85
|
+
}
|
86
|
+
|
57
87
|
}
|
58
88
|
|
59
89
|
|
@@ -61,14 +91,22 @@ listen() {
|
|
61
91
|
});
|
62
92
|
});
|
63
93
|
|
64
|
-
|
94
|
+
var requestCreateKey = 'request.create';
|
95
|
+
if (requestEvent.queueEnabled) {
|
96
|
+
requestCreateKey = 'request.create.queue';
|
97
|
+
}
|
98
|
+
winston.debug('RequestNotification requestCreateKey: ' + requestCreateKey);
|
65
99
|
|
100
|
+
requestEvent.on(requestCreateKey, function(request) {
|
101
|
+
// winston.info('quiiiiiiiiiiiii');
|
66
102
|
setImmediate(() => {
|
67
103
|
|
104
|
+
/*
|
68
105
|
if (request && (request.channel.name===ChannelConstants.EMAIL || request.channel.name===ChannelConstants.FORM )) {
|
69
106
|
winston.verbose("sending sendEmailChannelTakingNotification for EMAIL or FORM channel");
|
70
107
|
that.sendEmailChannelTakingNotification(request.id_project, request)
|
71
108
|
}
|
109
|
+
*/
|
72
110
|
|
73
111
|
that.sendAgentEmail(request.id_project, request);
|
74
112
|
|
@@ -76,7 +114,14 @@ listen() {
|
|
76
114
|
});
|
77
115
|
|
78
116
|
|
79
|
-
|
117
|
+
var requestParticipantsUpdateKey = 'request.participants.update';
|
118
|
+
// this is not queued
|
119
|
+
// if (requestEvent.queueEnabled) {
|
120
|
+
// requestParticipantsUpdateKey = 'request.participants.update.queue';
|
121
|
+
// }
|
122
|
+
winston.debug('RequestNotification requestParticipantsUpdateKey: ' + requestParticipantsUpdateKey);
|
123
|
+
|
124
|
+
requestEvent.on(requestParticipantsUpdateKey, function(data) {
|
80
125
|
|
81
126
|
winston.debug("requestEvent request.participants.update");
|
82
127
|
|
@@ -103,7 +148,13 @@ listen() {
|
|
103
148
|
|
104
149
|
// TODO Send email also for addAgent and reassign. Alessio request for pooled only?
|
105
150
|
|
106
|
-
|
151
|
+
var requestCloseExtendedKey = 'request.close.extended';
|
152
|
+
// this is not queued
|
153
|
+
// if (requestEvent.queueEnabled) {
|
154
|
+
// requestCloseExtendedKey = 'request.close.extended.queue';
|
155
|
+
// }
|
156
|
+
winston.debug('RequestNotification requestCloseExtendedKey: ' + requestCloseExtendedKey);
|
157
|
+
requestEvent.on(requestCloseExtendedKey, function(data) {
|
107
158
|
setImmediate(() => {
|
108
159
|
var request = data.request;
|
109
160
|
var notify = data.notify;
|
@@ -136,7 +187,7 @@ listen() {
|
|
136
187
|
if (project_users && project_users.length>0) {
|
137
188
|
project_users.forEach(project_user => {
|
138
189
|
if (project_user.id_user && project_user.id_user.email) {
|
139
|
-
return that.sendTranscriptByEmail(project_user.id_user.email, request_id, id_project);
|
190
|
+
return that.sendTranscriptByEmail(project_user.id_user.email, request_id, id_project, project);
|
140
191
|
} else {
|
141
192
|
}
|
142
193
|
});
|
@@ -149,7 +200,7 @@ listen() {
|
|
149
200
|
return Lead.findById(request.requester_id, function(err, lead){
|
150
201
|
//if (lead && lead.email) {
|
151
202
|
if (lead && lead.email) {
|
152
|
-
return that.sendTranscriptByEmail(lead.email, request_id, id_project);
|
203
|
+
return that.sendTranscriptByEmail(lead.email, request_id, id_project, project);
|
153
204
|
}
|
154
205
|
|
155
206
|
});
|
@@ -168,7 +219,7 @@ listen() {
|
|
168
219
|
}
|
169
220
|
|
170
221
|
|
171
|
-
|
222
|
+
sendToUserEmailChannelEmail(projectid, message) {
|
172
223
|
try {
|
173
224
|
|
174
225
|
if (!message.request) {
|
@@ -179,14 +230,13 @@ sendEmailChannelEmail(projectid, message) {
|
|
179
230
|
return winston.debug("The lead object is undefined or has empty email");
|
180
231
|
}
|
181
232
|
|
182
|
-
Project.findOne({_id: projectid, status: 100}
|
233
|
+
Project.findOne({_id: projectid, status: 100}).select("+settings").exec(function(err, project){
|
183
234
|
if (err) {
|
184
235
|
return winston.error(err);
|
185
236
|
}
|
186
237
|
|
187
238
|
if (!project) {
|
188
|
-
|
189
|
-
return console.warn("Project not found", projectid);
|
239
|
+
return winston.warn("Project not found", projectid);
|
190
240
|
}
|
191
241
|
|
192
242
|
// 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 ) {
|
@@ -197,8 +247,61 @@ sendEmailChannelEmail(projectid, message) {
|
|
197
247
|
// 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 ) {
|
198
248
|
// return winston.info("RequestNotification offline email notification for the project with id : " + projectid + " for the offline conversation is disabled");
|
199
249
|
// }
|
200
|
-
emailService.sendEmailChannelNotification(message.request.lead.email, message, project);
|
201
250
|
|
251
|
+
let lead = message.request.lead;
|
252
|
+
winston.debug("sending channel emaol email to lead ", lead);
|
253
|
+
|
254
|
+
|
255
|
+
winston.debug("sending user email to "+ lead.email);
|
256
|
+
|
257
|
+
var signOptions = {
|
258
|
+
issuer: 'https://tiledesk.com',
|
259
|
+
subject: 'userexternal',
|
260
|
+
audience: 'https://tiledesk.com',
|
261
|
+
jwtid: uuidv4()
|
262
|
+
};
|
263
|
+
|
264
|
+
|
265
|
+
var recipient = lead.lead_id;
|
266
|
+
winston.debug("recipient:"+ recipient);
|
267
|
+
|
268
|
+
let userEmail = {_id: recipient, firstname: lead.fullname, lastname: lead.fullname, email: lead.email, attributes: lead.attributes};
|
269
|
+
winston.debug("userEmail ",userEmail);
|
270
|
+
|
271
|
+
|
272
|
+
var token = jwt.sign(userEmail, configSecret, signOptions);
|
273
|
+
winston.debug("token "+token);
|
274
|
+
|
275
|
+
var sourcePage = widgetTestLocation + "?tiledesk_projectid="
|
276
|
+
+ projectid + "&project_name="+encodeURIComponent(project.name)
|
277
|
+
|
278
|
+
if (message.request.sourcePage) {
|
279
|
+
sourcePage = message.request.sourcePage;
|
280
|
+
}
|
281
|
+
|
282
|
+
if (sourcePage.indexOf("?")===-1) {
|
283
|
+
sourcePage = sourcePage + "?";
|
284
|
+
}
|
285
|
+
|
286
|
+
sourcePage = sourcePage
|
287
|
+
+ "&tiledesk_recipientId="+message.request.request_id
|
288
|
+
+ "&tiledesk_isOpen=true";
|
289
|
+
|
290
|
+
|
291
|
+
sourcePage = apiUrl + "/urls/redirect?path=" + encodeURIComponent(sourcePage)
|
292
|
+
winston.debug("sourcePage "+sourcePage);
|
293
|
+
|
294
|
+
|
295
|
+
var tokenQueryString;
|
296
|
+
if(sourcePage && sourcePage.indexOf('?')>-1) { //controllo superfluo visto che lo metto prima? ma lascio comunque per indipendenza
|
297
|
+
tokenQueryString = encodeURIComponent("&tiledesk_jwt=JWT "+token)
|
298
|
+
}else {
|
299
|
+
tokenQueryString = encodeURIComponent("?tiledesk_jwt=JWT "+token);
|
300
|
+
}
|
301
|
+
winston.debug("tokenQueryString: "+tokenQueryString);
|
302
|
+
|
303
|
+
emailService.sendEmailChannelNotification(message.request.lead.email, message, project, tokenQueryString, sourcePage);
|
304
|
+
|
202
305
|
|
203
306
|
});
|
204
307
|
|
@@ -210,7 +313,166 @@ sendEmailChannelEmail(projectid, message) {
|
|
210
313
|
|
211
314
|
|
212
315
|
|
316
|
+
sendToAgentEmailChannelEmail(projectid, message) {
|
317
|
+
let savedRequest = message.request;
|
318
|
+
// send email
|
319
|
+
try {
|
320
|
+
|
321
|
+
|
322
|
+
Project.findOne({_id: projectid, status: 100}).select("+settings").exec(async function(err, project){
|
323
|
+
if (err) {
|
324
|
+
return winston.error(err);
|
325
|
+
}
|
326
|
+
|
327
|
+
if (!project) {
|
328
|
+
return winston.warn("Project not found", projectid);
|
329
|
+
} else {
|
330
|
+
|
331
|
+
winston.debug("project", project);
|
332
|
+
|
333
|
+
if (project.settings && project.settings.email && project.settings.email.notification && project.settings.email.notification.conversation && project.settings.email.notification.conversation.blocked == true ) {
|
334
|
+
return winston.verbose("RequestNotification email notification for the project with id : " + projectid + " for all the conversations is blocked");
|
335
|
+
}
|
336
|
+
|
337
|
+
winston.debug("savedRequest", savedRequest);
|
338
|
+
|
339
|
+
// TODO fare il controllo anche sul dipartimento con modalità assigned o pooled
|
340
|
+
if (savedRequest.status==RequestConstants.UNASSIGNED) { //POOLED
|
341
|
+
|
342
|
+
if (project.settings && project.settings.email && project.settings.email.notification && project.settings.email.notification.conversation && project.settings.email.notification.conversation.ticket && project.settings.email.notification.conversation.ticket.pooled == false ) {
|
343
|
+
return winston.info("RequestNotification email notification for the project with id : " + projectid + " for the pooled conversation ticket is disabled");
|
344
|
+
}
|
345
|
+
|
346
|
+
if (!savedRequest.snapshot) {
|
347
|
+
return winston.warn("RequestNotification savedRequest.snapshot is null :(. You are closing an old request?");
|
348
|
+
}
|
349
|
+
|
350
|
+
|
351
|
+
|
352
|
+
|
353
|
+
var snapshotAgents = await Request.findById(savedRequest.id).select({"snapshot":1}).exec();
|
354
|
+
|
355
|
+
winston.debug('snapshotAgents',snapshotAgents);
|
356
|
+
|
357
|
+
|
358
|
+
// winston.info("savedRequest.snapshot.agents", savedRequest.snapshot.agents);
|
359
|
+
// agents è selected false quindi nn va sicuro
|
360
|
+
if (!snapshotAgents.snapshot.agents) {
|
361
|
+
return winston.warn("RequestNotification snapshotAgents.snapshot.agents is null :(. You are closing an old request?", savedRequest);
|
362
|
+
}
|
363
|
+
|
364
|
+
// var allAgents = savedRequest.agents;
|
365
|
+
var allAgents = snapshotAgents.snapshot.agents;
|
366
|
+
// winston.debug("allAgents", allAgents);
|
367
|
+
|
368
|
+
allAgents.forEach(project_user => {
|
369
|
+
// winston.debug("project_user", project_user); //DON'T UNCOMMENT THIS. OTHERWISE this.agents.filter of models/request.js:availableAgentsCount has .filter not found.
|
370
|
+
|
371
|
+
|
372
|
+
var userid = project_user.id_user;
|
373
|
+
|
374
|
+
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.pooled == false ) {
|
375
|
+
return winston.verbose("RequestNotification email notification for the user with id " + userid+ " the pooled conversation ticket is disabled");
|
376
|
+
}
|
377
|
+
|
378
|
+
User.findOne({_id: userid , status: 100})
|
379
|
+
.cache(cacheUtil.defaultTTL, "users:id:"+userid)
|
380
|
+
.exec(function (err, user) {
|
381
|
+
if (err) {
|
382
|
+
// winston.debug(err);
|
383
|
+
}
|
384
|
+
if (!user) {
|
385
|
+
winston.warn("User not found", userid);
|
386
|
+
} else {
|
387
|
+
winston.verbose("Sending sendNewPooledMessageNotification to user with email: "+ user.email);
|
388
|
+
if (user.emailverified) {
|
389
|
+
emailService.sendNewPooledMessageEmailNotification(user.email, savedRequest, project, message);
|
390
|
+
}else {
|
391
|
+
winston.verbose("User email not verified", user.email);
|
392
|
+
}
|
393
|
+
}
|
394
|
+
});
|
395
|
+
|
396
|
+
|
397
|
+
});
|
398
|
+
|
399
|
+
}
|
400
|
+
|
401
|
+
// TODO fare il controllo anche sul dipartimento con modalità assigned o pooled
|
402
|
+
else if (savedRequest.status==RequestConstants.ASSIGNED) { //ASSIGNED
|
403
|
+
|
404
|
+
if (project.settings && project.settings.email && project.settings.email.notification && project.settings.email.notification.conversation && project.settings.email.notification.conversation.ticket && project.settings.email.notification.conversation.ticket.assigned == false ) {
|
405
|
+
return winston.verbose("RequestNotification email notification for the project with id : " + projectid + " for the assigned conversation ticket is disabled");
|
406
|
+
}
|
407
|
+
|
408
|
+
|
409
|
+
var assignedId = savedRequest.participants[0];
|
410
|
+
|
411
|
+
// winston.info("assignedId1:"+ assignedId);
|
412
|
+
|
413
|
+
// if (!assignedId) {
|
414
|
+
// console.log("attention90", savedRequest);
|
415
|
+
// }
|
416
|
+
|
417
|
+
|
418
|
+
|
419
|
+
Project_user.findOne( { id_user:assignedId, id_project: projectid, status: "active"}) //attento in 2.1.14.2
|
420
|
+
.exec(function (err, project_user) {
|
421
|
+
|
422
|
+
winston.debug("project_user notification", project_user);
|
423
|
+
if (project_user && 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.assigned && project_user.settings.email.notification.conversation.ticket.assigned.toyou == false ) {
|
424
|
+
return winston.info("RequestNotification email notification for the user with id : " + assignedId + " for the pooled conversation ticket is disabled");
|
425
|
+
}
|
426
|
+
|
427
|
+
// botprefix
|
428
|
+
if (assignedId.startsWith("bot_")) {
|
429
|
+
return ;
|
430
|
+
}
|
431
|
+
|
432
|
+
User.findOne({_id: assignedId, status: 100})
|
433
|
+
.cache(cacheUtil.defaultTTL, "users:id:"+assignedId)
|
434
|
+
.exec(function (err, user) {
|
435
|
+
if (err) {
|
436
|
+
winston.error("Error sending email to " + savedRequest.participants[0], err);
|
437
|
+
}
|
438
|
+
if (!user) {
|
439
|
+
winston.warn("User not found", savedRequest.participants[0]);
|
440
|
+
} else {
|
441
|
+
winston.verbose("Sending sendNewAssignedAgentMessageEmailNotification to user with email: "+ user.email);
|
442
|
+
// if (user.emailverified) { enable it? send anyway to improve engagment for new account
|
443
|
+
// attento cambia
|
444
|
+
emailService.sendNewAssignedAgentMessageEmailNotification(user.email, savedRequest, project, message);
|
445
|
+
// }
|
446
|
+
}
|
447
|
+
});
|
448
|
+
|
449
|
+
});
|
450
|
+
|
451
|
+
}
|
452
|
+
|
453
|
+
|
454
|
+
|
455
|
+
else {
|
456
|
+
return winston.debug("Other states");
|
457
|
+
}
|
458
|
+
|
459
|
+
|
460
|
+
|
461
|
+
}
|
462
|
+
|
463
|
+
});
|
464
|
+
|
465
|
+
} catch (e) {
|
466
|
+
winston.warn("Error sending email", {error:e, projectid:projectid, message: message, savedRequest:savedRequest}); //it's better to view error email at this stage
|
467
|
+
}
|
468
|
+
//end send email
|
469
|
+
|
470
|
+
}
|
471
|
+
|
472
|
+
|
473
|
+
|
213
474
|
|
475
|
+
//unused
|
214
476
|
sendEmailChannelTakingNotification(projectid, request) {
|
215
477
|
try {
|
216
478
|
|
@@ -219,14 +481,13 @@ sendEmailChannelTakingNotification(projectid, request) {
|
|
219
481
|
return winston.debug("The lead object is undefined or has empty email");
|
220
482
|
}
|
221
483
|
|
222
|
-
Project.findOne({_id: projectid, status: 100}
|
484
|
+
Project.findOne({_id: projectid, status: 100}).select("+settings").exec(function(err, project){
|
223
485
|
if (err) {
|
224
486
|
return winston.error(err);
|
225
487
|
}
|
226
488
|
|
227
489
|
if (!project) {
|
228
|
-
|
229
|
-
return console.warn("Project not found", projectid);
|
490
|
+
return winston.warn("Project not found", projectid);
|
230
491
|
}
|
231
492
|
|
232
493
|
// 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 ) {
|
@@ -237,8 +498,8 @@ sendEmailChannelTakingNotification(projectid, request) {
|
|
237
498
|
// 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 ) {
|
238
499
|
// return winston.info("RequestNotification offline email notification for the project with id : " + projectid + " for the offline conversation is disabled");
|
239
500
|
// }
|
240
|
-
|
241
|
-
|
501
|
+
emailService.sendEmailChannelTakingNotification(request.lead.email, request, project);
|
502
|
+
|
242
503
|
|
243
504
|
});
|
244
505
|
|
@@ -262,14 +523,13 @@ sendUserEmail(projectid, message) {
|
|
262
523
|
return winston.debug("The lead object is undefined or has empty email");
|
263
524
|
}
|
264
525
|
|
265
|
-
Project.findOne({_id: projectid, status: 100}
|
526
|
+
Project.findOne({_id: projectid, status: 100}).select("+settings").exec(function(err, project){
|
266
527
|
if (err) {
|
267
528
|
return winston.error(err);
|
268
529
|
}
|
269
530
|
|
270
531
|
if (!project) {
|
271
|
-
|
272
|
-
return console.warn("Project not found", projectid);
|
532
|
+
return winston.warn("Project not found", projectid);
|
273
533
|
}
|
274
534
|
|
275
535
|
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 ) {
|
@@ -313,9 +573,9 @@ sendUserEmail(projectid, message) {
|
|
313
573
|
|
314
574
|
//send email to lead
|
315
575
|
return Lead.findOne({lead_id: recipient}, function(err, lead){
|
316
|
-
winston.debug("lead", lead);
|
576
|
+
winston.debug("lead", lead); //TODO lead is already present in request.lead
|
317
577
|
if (lead && lead.email) {
|
318
|
-
winston.
|
578
|
+
winston.debug("sending user email to "+ lead.email);
|
319
579
|
|
320
580
|
var signOptions = {
|
321
581
|
issuer: 'https://tiledesk.com',
|
@@ -325,29 +585,40 @@ sendUserEmail(projectid, message) {
|
|
325
585
|
};
|
326
586
|
|
327
587
|
let userAnonym = {_id: recipient, firstname: lead.fullname, lastname: lead.fullname, email: lead.email, attributes: lead.attributes};
|
328
|
-
winston.
|
588
|
+
winston.debug("userAnonym ",userAnonym);
|
329
589
|
|
330
590
|
|
331
|
-
var token = jwt.sign(userAnonym,
|
332
|
-
winston.
|
333
|
-
|
334
|
-
var sourcePage = widgetTestLocation;
|
591
|
+
var token = jwt.sign(userAnonym, configSecret, signOptions);
|
592
|
+
winston.debug("token "+token);
|
335
593
|
|
594
|
+
var sourcePage = widgetTestLocation + "?tiledesk_projectid="
|
595
|
+
+ projectid + "&project_name="+encodeURIComponent(project.name)
|
336
596
|
|
337
597
|
if (message.request.sourcePage) {
|
338
|
-
sourcePage = message.request.sourcePage;
|
598
|
+
sourcePage = message.request.sourcePage;
|
339
599
|
}
|
340
600
|
|
341
|
-
|
601
|
+
if (sourcePage && sourcePage.indexOf("?")===-1) {
|
602
|
+
sourcePage = sourcePage + "?";
|
603
|
+
}
|
604
|
+
|
605
|
+
sourcePage = sourcePage
|
606
|
+
+ "&tiledesk_recipientId="+message.request.request_id
|
607
|
+
+ "&tiledesk_isOpen=true";
|
608
|
+
|
609
|
+
sourcePage = apiUrl + "/urls/redirect?path=" + encodeURIComponent(sourcePage)
|
610
|
+
|
611
|
+
winston.debug("sourcePage "+sourcePage);
|
342
612
|
|
343
613
|
var tokenQueryString;
|
344
|
-
if(sourcePage && sourcePage.indexOf('?')>-1) {
|
345
|
-
tokenQueryString = "&
|
614
|
+
if(sourcePage && sourcePage.indexOf('?')>-1) { //controllo superfluo visto che lo metto prima? ma lascio comunque per indipendenza
|
615
|
+
tokenQueryString = encodeURIComponent("&tiledesk_jwt=JWT "+token)
|
346
616
|
}else {
|
347
|
-
tokenQueryString = "?
|
617
|
+
tokenQueryString = encodeURIComponent("?tiledesk_jwt=JWT "+token);
|
348
618
|
}
|
349
|
-
|
350
|
-
|
619
|
+
winston.debug("tokenQueryString: "+tokenQueryString);
|
620
|
+
|
621
|
+
emailService.sendNewMessageNotification(lead.email, message, project, tokenQueryString, sourcePage);
|
351
622
|
}
|
352
623
|
|
353
624
|
});
|
@@ -365,19 +636,17 @@ sendUserEmail(projectid, message) {
|
|
365
636
|
}
|
366
637
|
|
367
638
|
sendAgentEmail(projectid, savedRequest) {
|
368
|
-
// console.log("savedRequest23", savedRequest);
|
369
639
|
// send email
|
370
640
|
try {
|
371
641
|
|
372
642
|
|
373
|
-
Project.findOne({_id: projectid, status: 100}
|
643
|
+
Project.findOne({_id: projectid, status: 100}).select("+settings").exec( async function(err, project){
|
374
644
|
if (err) {
|
375
645
|
return winston.error(err);
|
376
646
|
}
|
377
647
|
|
378
648
|
if (!project) {
|
379
|
-
|
380
|
-
return console.warn("Project not found", projectid);
|
649
|
+
return winston.warn("Project not found", projectid);
|
381
650
|
} else {
|
382
651
|
|
383
652
|
winston.debug("project", project);
|
@@ -386,7 +655,7 @@ sendAgentEmail(projectid, savedRequest) {
|
|
386
655
|
return winston.verbose("RequestNotification email notification for the project with id : " + projectid + " for all the conversations is blocked");
|
387
656
|
}
|
388
657
|
|
389
|
-
winston.debug("savedRequest"
|
658
|
+
winston.debug("savedRequest: " + JSON.stringify(savedRequest));
|
390
659
|
|
391
660
|
// TODO fare il controllo anche sul dipartimento con modalità assigned o pooled
|
392
661
|
if (savedRequest.status==RequestConstants.UNASSIGNED) { //POOLED
|
@@ -394,18 +663,40 @@ sendAgentEmail(projectid, savedRequest) {
|
|
394
663
|
if (project.settings && project.settings.email && project.settings.email.notification && project.settings.email.notification.conversation && project.settings.email.notification.conversation.pooled == false ) {
|
395
664
|
return winston.info("RequestNotification email notification for the project with id : " + projectid + " for the pooled conversation is disabled");
|
396
665
|
}
|
397
|
-
|
398
666
|
if (!savedRequest.snapshot) {
|
399
667
|
return winston.warn("RequestNotification savedRequest.snapshot is null :(. You are closing an old request?");
|
400
668
|
}
|
401
|
-
|
402
|
-
|
669
|
+
|
670
|
+
|
671
|
+
|
672
|
+
var snapshotAgents = savedRequest; //riassegno varibile cosi nn cambio righe successive
|
673
|
+
|
674
|
+
|
675
|
+
|
676
|
+
|
677
|
+
// winston.info("savedRequest.snapshot.agents", savedRequest.snapshot.agents);
|
678
|
+
// agents è selected false quindi nn va sicuro
|
679
|
+
if (!snapshotAgents.snapshot.agents) {
|
680
|
+
//return winston.warn("RequestNotification snapshotAgents.snapshot.agents is null :(. You are closing an old request?", savedRequest);
|
681
|
+
|
682
|
+
// agents già c'è in quanto viene creato con departmentService.getOperator nella request.create ma nn c'è per request.participants.update
|
683
|
+
snapshotAgents = await Request.findById(savedRequest.id).select({"snapshot":1}).exec();
|
684
|
+
winston.debug('load snapshotAgents with Request.findById ');
|
685
|
+
}
|
686
|
+
winston.debug('snapshotAgents', snapshotAgents);
|
687
|
+
|
688
|
+
if (!snapshotAgents.snapshot.agents) {
|
689
|
+
return winston.warn("RequestNotification snapshotAgents.snapshot.agents is null :(. You are closing an old request?", savedRequest);
|
403
690
|
}
|
691
|
+
|
404
692
|
// var allAgents = savedRequest.agents;
|
405
|
-
var allAgents =
|
406
|
-
|
693
|
+
var allAgents = snapshotAgents.snapshot.agents;
|
694
|
+
|
695
|
+
// // var allAgents = savedRequest.agents;
|
696
|
+
// var allAgents = savedRequest.snapshot.agents;
|
697
|
+
// // winston.debug("allAgents", allAgents);
|
407
698
|
|
408
|
-
|
699
|
+
allAgents.forEach(project_user => {
|
409
700
|
// winston.debug("project_user", project_user); //DON'T UNCOMMENT THIS. OTHERWISE this.agents.filter of models/request.js:availableAgentsCount has .filter not found.
|
410
701
|
|
411
702
|
|
@@ -424,7 +715,7 @@ sendAgentEmail(projectid, savedRequest) {
|
|
424
715
|
if (!user) {
|
425
716
|
winston.warn("User not found", userid);
|
426
717
|
} else {
|
427
|
-
winston.
|
718
|
+
winston.verbose("Sending sendNewPooledRequestNotification to user with email: "+ user.email);
|
428
719
|
if (user.emailverified) {
|
429
720
|
emailService.sendNewPooledRequestNotification(user.email, savedRequest, project);
|
430
721
|
}else {
|
@@ -456,19 +747,27 @@ sendAgentEmail(projectid, savedRequest) {
|
|
456
747
|
|
457
748
|
|
458
749
|
|
459
|
-
Project_user.findOne( { id_user:assignedId, id_project: projectid, status: "active"})
|
750
|
+
Project_user.findOne( { id_user:assignedId, id_project: projectid, status: "active"})
|
460
751
|
.exec(function (err, project_user) {
|
461
752
|
|
753
|
+
// botprefix
|
754
|
+
if (assignedId.startsWith("bot_")) {
|
755
|
+
return ;
|
756
|
+
}
|
757
|
+
|
758
|
+
if (err) {
|
759
|
+
return winston.error("RequestNotification email notification error getting project_user", err);
|
760
|
+
}
|
462
761
|
winston.debug("project_user notification", project_user);
|
463
762
|
if (project_user && project_user.settings && project_user.settings.email && project_user.settings.email.notification && project_user.settings.email.notification.conversation && project_user.settings.email.notification.conversation.assigned && project_user.settings.email.notification.conversation.assigned.toyou == false ) {
|
464
763
|
return winston.info("RequestNotification email notification for the user with id : " + assignedId + " for the pooled conversation is disabled");
|
465
764
|
}
|
466
765
|
|
467
|
-
|
468
|
-
if (assignedId.startsWith("bot_")) {
|
469
|
-
return ;
|
470
|
-
}
|
766
|
+
|
471
767
|
|
768
|
+
if (!project_user) {
|
769
|
+
return winston.warn("RequestNotification email notification for the user with id : " + assignedId + " not found project_user");
|
770
|
+
}
|
472
771
|
User.findOne({_id: assignedId, status: 100})
|
473
772
|
.cache(cacheUtil.defaultTTL, "users:id:"+assignedId)
|
474
773
|
.exec(function (err, user) {
|
@@ -476,11 +775,30 @@ sendAgentEmail(projectid, savedRequest) {
|
|
476
775
|
winston.error("Error sending email to " + savedRequest.participants[0], err);
|
477
776
|
}
|
478
777
|
if (!user) {
|
479
|
-
|
778
|
+
winston.warn("User not found", savedRequest.participants[0]);
|
480
779
|
} else {
|
481
|
-
winston.
|
482
|
-
// if (user.emailverified) { enable it? send anyway to improve engagment for new account
|
483
|
-
|
780
|
+
winston.verbose("Sending sendNewAssignedRequestNotification to user with email", user.email);
|
781
|
+
// if (user.emailverified) { enable it? send anyway to improve engagment for new account
|
782
|
+
|
783
|
+
|
784
|
+
// var signOptions = {
|
785
|
+
// issuer: 'https://tiledesk.com',
|
786
|
+
// subject: 'user',
|
787
|
+
// audience: 'https://tiledesk.com',
|
788
|
+
// jwtid: uuidv4()
|
789
|
+
// };
|
790
|
+
|
791
|
+
// let userObject = {_id: user._id, firstname: user.firstname, lastname: user.lastname, email: user.email, attributes: user.attributes};
|
792
|
+
// winston.debug("userObject ",userObject);
|
793
|
+
|
794
|
+
|
795
|
+
// var agentToken = jwt.sign(userObject, configSecret, signOptions);
|
796
|
+
// winston.debug("agentToken "+agentToken);
|
797
|
+
|
798
|
+
|
799
|
+
|
800
|
+
|
801
|
+
emailService.sendNewAssignedRequestNotification(user.email, savedRequest, project);
|
484
802
|
// }
|
485
803
|
}
|
486
804
|
});
|
@@ -513,7 +831,7 @@ sendAgentEmail(projectid, savedRequest) {
|
|
513
831
|
|
514
832
|
|
515
833
|
|
516
|
-
sendTranscriptByEmail(sendTo, request_id, id_project) {
|
834
|
+
sendTranscriptByEmail(sendTo, request_id, id_project, project) {
|
517
835
|
return new Promise(function (resolve, reject) {
|
518
836
|
return Request.findOne({request_id: request_id, id_project: id_project})
|
519
837
|
.populate('department')
|
@@ -543,8 +861,8 @@ sendAgentEmail(projectid, savedRequest) {
|
|
543
861
|
|
544
862
|
|
545
863
|
|
546
|
-
emailService.sendRequestTranscript(sendTo, messages, request);
|
547
|
-
winston.
|
864
|
+
emailService.sendRequestTranscript(sendTo, messages, request, project);
|
865
|
+
winston.verbose("sendTranscriptByEmail sent");
|
548
866
|
return resolve({sendTo: sendTo, messages: messages, request: request});
|
549
867
|
|
550
868
|
|