@tiledesk/tiledesk-server 2.3.70 β†’ 2.3.72

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. package/CHANGELOG.md +15 -2
  2. package/channels/chat21/chat21WebHook.js +14 -5
  3. package/models/faq.js +4 -0
  4. package/models/message.js +9 -7
  5. package/package.json +3 -3
  6. package/pubmodules/apps/listener.js +1 -0
  7. package/pubmodules/kaleyra/index.js +6 -0
  8. package/pubmodules/kaleyra/listener.js +32 -0
  9. package/pubmodules/pubModulesManager.js +23 -1
  10. package/routes/email.js +13 -7
  11. package/routes/faq.js +6 -0
  12. package/routes/faq_kb.js +7 -4
  13. package/routes/message.js +29 -12
  14. package/routes/project_user.js +2 -1
  15. package/services/emailService.js +4 -3
  16. package/services/messageService.js +2 -1
  17. package/services/requestService.js +13 -7
  18. package/template/email/assignedEmailMessage.html +21 -12
  19. package/template/email/assignedRequest.html +21 -12
  20. package/template/email/beenInvitedExistingUser.html +15 -6
  21. package/template/email/beenInvitedNewUser.html +15 -6
  22. package/template/email/emailDirect.html +15 -6
  23. package/template/email/newMessage.html +18 -9
  24. package/template/email/newMessageFollower.html +22 -13
  25. package/template/email/passwordChanged.html +15 -6
  26. package/template/email/pooledEmailMessage.html +21 -12
  27. package/template/email/pooledRequest.html +20 -11
  28. package/template/email/resetPassword.html +15 -6
  29. package/template/email/sendTranscript.html +6 -4
  30. package/template/email/ticket.html +17 -8
  31. package/template/email/verify.html +15 -5
  32. package/test/requestService.js +55 -4
  33. package/utils/recipientEmailUtil.js +66 -0
  34. package/docker-compose.yml +0 -166
  35. package/version +0 -69
  36. package/versions +0 -69
package/CHANGELOG.md CHANGED
@@ -1,9 +1,22 @@
1
1
 
2
2
 
3
- πŸ’₯ TILEDESK SERVER v2.3.69 πŸ’₯
3
+ πŸ’₯ TILEDESK SERVER v2.3.71 πŸ’₯
4
4
  πŸš€ TAGGED AND PUBLISHED ON NPM πŸš€
5
5
  πŸš€ IN PRODUCTION πŸš€
6
- (https://www.npmjs.com/package/@tiledesk/tiledesk-server/v/2.3.69)
6
+ (https://www.npmjs.com/package/@tiledesk/tiledesk-server/v/2.3.71)
7
+
8
+ # 2.3.71
9
+ - Email service send email direct fit without request_id
10
+ - Removed strong from transcript email template
11
+ - Added for updateWaitingTimeByRequestId the field enable_populate
12
+ - Added cache for message send endpoint
13
+ - Added support to mention and group to mail endpoint
14
+ - Now user role can use /users/search (for smtp)
15
+ - Disable text validation for send message
16
+ - Logo email fix
17
+
18
+ # 2.3.70
19
+ - Update tiledesk-tybot-connector to 0.1.42
7
20
 
8
21
  # 2.3.69
9
22
  - Update tiledesk-dialogflow-connector to 1.8.3
@@ -210,7 +210,12 @@ router.post('/', function (req, res) {
210
210
  }
211
211
 
212
212
 
213
-
213
+ // var auto_close;
214
+
215
+ // // qui projecy nn c'Γ¨ devi leggerlo
216
+ // // if (req.project.attributes.auto_close === false) {
217
+ // // auto_close = 10;
218
+ // // }
214
219
 
215
220
 
216
221
  var new_request = {
@@ -218,7 +223,7 @@ router.post('/', function (req, res) {
218
223
  departmentid:departmentid, sourcePage:sourcePage, language:language, userAgent:client, status:requestStatus, createdBy: undefined,
219
224
  attributes:rAttributes, subject:undefined, preflight:false, channel:undefined, location:undefined,
220
225
  lead:createdLead, requester:project_user
221
-
226
+ // , auto_close: auto_close
222
227
  };
223
228
 
224
229
  winston.debug("new_request", new_request);
@@ -303,8 +308,8 @@ router.post('/', function (req, res) {
303
308
 
304
309
  // TODO it doesn't work for internal requests bacause participanets == message.sender⁄
305
310
  if (request.participants && request.participants.indexOf(message.sender) > -1) { //update waiitng time if write an agent (member of participants)
306
- winston.debug("updateWaitingTimeByRequestId");
307
- return requestService.updateWaitingTimeByRequestId(request.request_id, request.id_project).then(function(upRequest) {
311
+ winston.debug("updateWaitingTimeByRequestId*******");
312
+ return requestService.updateWaitingTimeByRequestId(request.request_id, request.id_project, false).then(function(upRequest) {
308
313
  return res.json(upRequest);
309
314
  });
310
315
  }else {
@@ -486,6 +491,10 @@ router.post('/', function (req, res) {
486
491
 
487
492
  winston.debug("request",request.toObject());
488
493
  // lead_id used. Change it?
494
+
495
+ // winston.info("request.snapshot.lead",request.snapshot.lead);
496
+ // if (request.snapshot.lead && request.snapshot.lead.lead_id==new_member) {
497
+
489
498
  if (request.lead && request.lead.lead_id==new_member) {
490
499
  winston.debug("don't joining request.lead or a lead");
491
500
  return res.status(400).send({success: false, msg: "don't joining request.lead or a lead" });
@@ -612,7 +621,7 @@ router.post('/', function (req, res) {
612
621
  }
613
622
  else if (req.body.event_type == "typing-start") {
614
623
 
615
- winston.debug("event_type","typing-start");
624
+ winston.debug("event_type typing-start");
616
625
 
617
626
  winston.debug("typing-start req.body",req.body);
618
627
 
package/models/faq.js CHANGED
@@ -87,6 +87,10 @@ var FaqSchema = new Schema({
87
87
  form: {
88
88
  type: Object,
89
89
  required: false
90
+ },
91
+ actions: {
92
+ type: Array,
93
+ required: false
90
94
  }
91
95
  }, {
92
96
  timestamps: true,
package/models/message.js CHANGED
@@ -45,13 +45,13 @@ var MessageSchema = new Schema({
45
45
  },
46
46
  text: {
47
47
  type: String,
48
- required: function() {
49
- if (this.type === "text") {
50
- return true;
51
- }else {
52
- return false;
53
- }
54
- }
48
+ // required: function() {
49
+ // if (this.type === "text") {
50
+ // return true;
51
+ // }else {
52
+ // return false;
53
+ // }
54
+ // }
55
55
  },
56
56
  language: { //ISO 639-1 (Two letter codes) https://docs.mongodb.com/manual/reference/text-search-languages/#text-search-languages
57
57
  type: String,
@@ -97,6 +97,8 @@ MessageSchema.index({ recipient: 1, updatedAt:1 });
97
97
  MessageSchema.index({ id_project: 1, recipient:1, updatedAt: 1 });
98
98
  MessageSchema.index({ id_project: 1, "attributes._answerid": 1 });
99
99
 
100
+
101
+
100
102
  // https://docs.mongodb.com/manual/core/index-text/
101
103
  // https://docs.mongodb.com/manual/tutorial/specify-language-for-text-index/
102
104
  // https://docs.mongodb.com/manual/reference/text-search-languages/#text-search-languages
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tiledesk/tiledesk-server",
3
3
  "description": "The Tiledesk server module",
4
- "version": "2.3.70",
4
+ "version": "2.3.72",
5
5
  "scripts": {
6
6
  "start": "node ./bin/www",
7
7
  "pretest": "mongodb-runner start",
@@ -36,8 +36,9 @@
36
36
  "@tiledesk-ent/tiledesk-server-enterprise": "^1.0.0"
37
37
  },
38
38
  "dependencies": {
39
- "@tiledesk/tiledesk-apps": "^1.0.9",
39
+ "@tiledesk/tiledesk-apps": "^1.0.12",
40
40
  "@tiledesk/tiledesk-whatsapp-connector": "^0.1.19",
41
+ "@tiledesk/tiledesk-kaleyra-proxy": "^0.1.6",
41
42
  "@tiledesk/tiledesk-chat21-app": "^1.1.7",
42
43
  "@tiledesk/tiledesk-chatbot-util": "^0.8.33",
43
44
  "@tiledesk/tiledesk-json-rules-engine": "^4.0.3",
@@ -76,7 +77,6 @@
76
77
  "moment": "^2.29.3",
77
78
  "moment-timezone": "^0.5.33",
78
79
  "mongoose": "^5.13.14",
79
- "mongoose-auto-increment": "^5.0.1",
80
80
  "mongoose-sequence": "^5.3.1",
81
81
  "morgan": "^1.10.0",
82
82
  "multer": "^1.4.4",
@@ -14,6 +14,7 @@ class Listener {
14
14
  apps.startApp({
15
15
  ACCESS_TOKEN_SECRET: process.env.APPS_ACCESS_TOKEN_SECRET || 'nodeauthsecret',
16
16
  MONGODB_URI: process.env.APPS_MONGODB_URI || config.databaseUri,
17
+ KALEYRA_ENABLED: process.env.KALEYRA_ENABLED || config.kaleyra_enabled
17
18
  }, () => {
18
19
  winston.info("Tiledesk Apps proxy server succesfully started.")
19
20
  })
@@ -0,0 +1,6 @@
1
+ const listener = require('./listener');
2
+
3
+ const kaleyra = require('@tiledesk/tiledesk-kaleyra-proxy');
4
+ const kaleyraRoute = kaleyra.router;
5
+
6
+ module.exports = { listener: listener, kaleyraRoute: kaleyraRoute }
@@ -0,0 +1,32 @@
1
+ const kaleyra = require("@tiledesk/tiledesk-kaleyra-proxy");
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("Kaleyra apiUrl: " + apiUrl);
7
+
8
+ class Listener {
9
+
10
+ listen(config) {
11
+ winston.info("Kaleyra Listener listen");
12
+ if (config.databaseUri) {
13
+ winston.debug("kaleyra config databaseUri: " + config.databaseUri);
14
+ }
15
+
16
+ kaleyra.startApp({
17
+ MONGODB_URL: config.databaseUri,
18
+ API_URL: apiUrl,
19
+ BASE_URL: apiUrl + "/modules/kaleyra",
20
+ APPS_API_URL: apiUrl + "/modules/apps",
21
+ KALEYRA_API_URL: process.env.KALEYRA_API_URL,
22
+ API_KEY: process.env.API_KEY,
23
+ log: process.env.KALEYRA_LOG
24
+ }, () => {
25
+ winston.info("Tiledesk Kaleyra proxy server succesfully started.");
26
+ })
27
+ }
28
+ }
29
+
30
+ var listener = new Listener();
31
+
32
+ module.exports = listener;
@@ -27,6 +27,9 @@ class PubModulesManager {
27
27
  this.whatsapp = undefined;
28
28
  this.whatsappRoute = undefined;
29
29
 
30
+ this.kaleyra = undefined;
31
+ this.kaleyraRoute = undefined;
32
+
30
33
  this.activityArchiver = undefined;
31
34
  this.activityRoute = undefined;
32
35
 
@@ -67,11 +70,15 @@ class PubModulesManager {
67
70
  app.use('/modules/whatsapp', this.whatsappRoute);
68
71
  winston.info("ModulesManager whatsappRoute controller loaded");
69
72
  }
73
+ if (this.kaleyraRoute) {
74
+ app.use('/modules/kaleyra', this.kaleyraRoute);
75
+ winston.info("ModulesManager kaleyraRoute controller loaded");
76
+ }
70
77
  if (this.tilebotRoute) {
71
78
  app.use('/modules/tilebot', this.tilebotRoute);
72
79
  winston.info("ModulesManager tilebot controller loaded");
73
80
  }
74
-
81
+
75
82
  if (this.dialogFlow) {
76
83
  app.use("/modules/dialogFlow", this.dialogFlow.dialogflowRoute);
77
84
  winston.info("ModulesManager dialogFlow controller loaded");
@@ -263,6 +270,21 @@ class PubModulesManager {
263
270
  }
264
271
  }
265
272
 
273
+ try {
274
+ this.kaleyra = require('./kaleyra');
275
+ winston.debug("this.kaleyra: " + this.kaleyra);
276
+ this.kaleyra.listener.listen(config);
277
+
278
+ this.kaleyraRoute = this.kaleyra.kaleyraRoute;
279
+
280
+ winston.info("PubModulesManager initialized apps.");
281
+ } catch(err) {
282
+ if (err.code == 'MODULE_NOT_FOUND') {
283
+ winston.info("PubModulesManager init apps module not found");
284
+ }else {
285
+ winston.info("PubModulesManager error initializing init apps module", err);
286
+ }
287
+ }
266
288
 
267
289
  try {
268
290
  this.activityArchiver = require('./activities').activityArchiver;
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) => {
@@ -29,25 +32,28 @@ router.post('/test/send',
29
32
 
30
33
  });
31
34
 
32
-
35
+ //TODO add cc
33
36
  router.post('/send',
34
37
  async (req, res) => {
35
38
  let to = req.body.to;
36
- winston.info("to: " + to);
39
+ winston.debug("to: " + to);
37
40
 
38
41
  let text = req.body.text;
39
- winston.info("text: " + text);
42
+ winston.debug("text: " + text);
40
43
 
41
44
  let request_id = req.body.request_id;
42
- winston.info("request_id: " + request_id);
45
+ winston.debug("request_id: " + request_id);
43
46
 
44
47
  let subject = req.body.subject;
45
- winston.info("subject: " + subject);
48
+ winston.debug("subject: " + subject);
49
+
50
+ winston.debug("req.project", req.project);
46
51
 
47
- winston.info("req.project", req.project);
52
+ let newto = await recipientEmailUtil.process(to, req.projectid);
53
+ winston.debug("newto: " + newto);
48
54
 
49
55
  //sendEmailDirect(to, text, project, request_id, subject, tokenQueryString, sourcePage)
50
- emailService.sendEmailDirect(to, text, req.project, request_id, subject, undefined, undefined);
56
+ emailService.sendEmailDirect(newto, text, req.project, request_id, subject, undefined, undefined);
51
57
 
52
58
  res.json({"queued": true});
53
59
 
package/routes/faq.js CHANGED
@@ -130,6 +130,9 @@ router.post('/', function (req, res) {
130
130
  if (req.body.enabled != undefined) {
131
131
  newFaq.enabled = req.body.enabled;
132
132
  }
133
+ if (req.body.actions) {
134
+ newFaq.actions = req.body.actions
135
+ }
133
136
 
134
137
  newFaq.save(function (err, savedFaq) {
135
138
  if (err) {
@@ -194,6 +197,9 @@ router.put('/:faqid', function (req, res) {
194
197
  if (req.body.form!=undefined) {
195
198
  update.form = req.body.form;
196
199
  }
200
+ if (req.body.actions != undefined) {
201
+ update.actions = req.body.actions;
202
+ }
197
203
 
198
204
  Faq.findByIdAndUpdate(req.params.faqid, update, { new: true, upsert: true }, function (err, updatedFaq) {
199
205
  if (err) {
package/routes/faq_kb.js CHANGED
@@ -432,7 +432,8 @@ router.post('/importjson/:id_faq_kb', upload.single('uploadFile'), (req, res) =>
432
432
  form: intent.form,
433
433
  enabled: intent.enabled,
434
434
  webhook_enabled: intent.webhook_enabled,
435
- language: intent.language
435
+ language: intent.language,
436
+ actions: intent.actions
436
437
  }
437
438
 
438
439
  // overwrite duplicated intents
@@ -491,7 +492,8 @@ router.post('/importjson/:id_faq_kb', upload.single('uploadFile'), (req, res) =>
491
492
  form: intent.form,
492
493
  enabled: intent.enabled,
493
494
  webhook_enabled: intent.webhook_enabled,
494
- language: intent.language
495
+ language: intent.language,
496
+ actions: intent.actions
495
497
  }
496
498
 
497
499
  // TO DELETE: no used when req.query.create = 'true'
@@ -533,7 +535,7 @@ router.post('/importjson/:id_faq_kb', upload.single('uploadFile'), (req, res) =>
533
535
  return res.status(200).send(savedFaq_kb);
534
536
 
535
537
  }).catch((err) => {
536
- console.error("error saving faq_kb: ", err);
538
+ winston.error("error saving faq_kb: ", err);
537
539
  return res.status(500).send(err);
538
540
  })
539
541
 
@@ -587,7 +589,8 @@ router.post('/importjson/:id_faq_kb', upload.single('uploadFile'), (req, res) =>
587
589
  form: intent.form,
588
590
  enabled: intent.enabled,
589
591
  webhook_enabled: intent.webhook_enabled,
590
- language: intent.language
592
+ language: intent.language,
593
+ actions: intent.actions
591
594
  }
592
595
 
593
596
  // overwrite duplicated intents
package/routes/message.js CHANGED
@@ -49,13 +49,17 @@ async (req, res) => {
49
49
  winston.debug('req.params: ', req.params);
50
50
  winston.debug('req.params.request_id: ' + req.params.request_id);
51
51
 
52
- if (!req.body.text && (!req.body.type || req.body.type=="text") ) {
53
- return res.status(422).json({ errors: ["text field is required"] });
54
- }
55
- const errors = validationResult(req);
56
- if (!errors.isEmpty()) {
57
- return res.status(422).json({ errors: errors.array() });
58
- }
52
+ // sponz: 4/01/23 disable it
53
+ // if (!req.body.text && (!req.body.type || req.body.type=="text") ) {
54
+ // return res.status(422).json({ errors: ["text field is required"] });
55
+ // }
56
+ // const errors = validationResult(req);
57
+ // if (!errors.isEmpty()) {
58
+ // return res.status(422).json({ errors: errors.array() });
59
+ // }
60
+
61
+
62
+
59
63
 
60
64
  // TODO se sei agent non puoi cambiare sender
61
65
  // verificare validazione invio immagine senza caption
@@ -247,7 +251,7 @@ async (req, res) => {
247
251
 
248
252
  if (request.participants && request.participants.indexOf(sender) > -1) { //update waiitng time if write an agent (member of participants)
249
253
  winston.debug("updateWaitingTimeByRequestId");
250
- return requestService.updateWaitingTimeByRequestId(request.request_id, request.id_project).then(function(upRequest) {
254
+ return requestService.updateWaitingTimeByRequestId(request.request_id, request.id_project, true).then(function(upRequest) {
251
255
  let message = savedMessage.toJSON();
252
256
  message.request = upRequest;
253
257
 
@@ -257,13 +261,26 @@ async (req, res) => {
257
261
  }else {
258
262
  let message = savedMessage.toJSON();
259
263
 
260
- request.populate('lead')
264
+ winston.debug("getting request for response");
265
+
266
+ let q =
267
+ Request.findOne({request_id: request.request_id, id_project: request.id_project})
268
+ // request
269
+ .populate('lead')
261
270
  .populate('department')
262
271
  .populate('participatingBots')
263
272
  .populate('participatingAgents')
264
273
  // .populate('followers')
265
- .populate({path:'requester',populate:{path:'id_user'}})
266
- .execPopulate(function (err, requestPopulated){
274
+ .populate({path:'requester',populate:{path:'id_user'}});
275
+
276
+
277
+ if (cacheEnabler.request) {
278
+ q.cache(cacheUtil.defaultTTL, request.id_project+":requests:request_id:"+request.request_id)
279
+ winston.debug('request cache enabled for messages');
280
+ }
281
+
282
+ q.exec(function (err, requestPopulated){
283
+ // q.execPopulate(function (err, requestPopulated){
267
284
 
268
285
  if (err) {
269
286
  return winston.error("Error gettting savedRequestPopulated for send Message", err);
@@ -282,7 +299,7 @@ async (req, res) => {
282
299
  message: 'Error creating message endpoint: '+ JSON.stringify(err) + " " + JSON.stringify(req.body) ,
283
300
  label: req.projectid
284
301
  });
285
- // winston.error("Error creating message", err);
302
+ winston.error("Error creating message", err);
286
303
  return res.status(500).send({success: false, msg: 'Error creating message', err:err });
287
304
  });
288
305
 
@@ -375,7 +375,8 @@ router.get('/:project_userid', [passport.authenticate(['basic', 'jwt'], { sessio
375
375
  });
376
376
 
377
377
 
378
- router.get('/users/search', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('agent', ['subscription'])], async (req, res, next) => {
378
+ router.get('/users/search', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('user', ['subscription'])], async (req, res, next) => { //changed for smtp
379
+ // router.get('/users/search', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('agent', ['subscription'])], async (req, res, next) => {
379
380
  winston.debug("--> users search ");
380
381
 
381
382
  if (!req.project) {
@@ -124,7 +124,7 @@ class EmailService {
124
124
  }
125
125
  winston.info('EmailService headers: ' + JSON.stringify(this.headers));
126
126
 
127
- this.ccEnabled = false
127
+ 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
128
128
 
129
129
  if (process.env.EMAIL_CC_ENABLED ==="true" || process.env.EMAIL_CC_ENABLED === true ) {
130
130
  this.ccEnabled = true;
@@ -1463,6 +1463,7 @@ async sendEmailDirect(to, text, project, request_id, subject, tokenQueryString,
1463
1463
 
1464
1464
  var replacements = {
1465
1465
  project: project,
1466
+ request_id: request_id,
1466
1467
  seamlessPage: sourcePage,
1467
1468
  msgText: msgText,
1468
1469
  tokenQueryString: tokenQueryString,
@@ -1474,7 +1475,7 @@ async sendEmailDirect(to, text, project, request_id, subject, tokenQueryString,
1474
1475
 
1475
1476
 
1476
1477
  let replyTo;
1477
- if (this.replyEnabled) {
1478
+ if (this.replyEnabled && request_id) {
1478
1479
  replyTo = request_id + this.inboundDomainDomainWithAt;
1479
1480
  }
1480
1481
 
@@ -1730,7 +1731,7 @@ async sendEmailDirect(to, text, project, request_id, subject, tokenQueryString,
1730
1731
  // ok
1731
1732
 
1732
1733
  async sendRequestTranscript(to, messages, request, project) {
1733
-
1734
+ winston.debug("sendRequestTranscript: "+to);
1734
1735
 
1735
1736
  //if the request came from rabbit mq?
1736
1737
  if (request.toJSON) {
@@ -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
  }
@@ -176,6 +176,7 @@ class MessageService {
176
176
  // attento giΓ  scatta su chat21handler
177
177
 
178
178
  changeStatus(message_id, newstatus) {
179
+ winston.debug("changeStatus. "+message_id + " "+ newstatus);
179
180
  var that = this;
180
181
  return new Promise(function (resolve, reject) {
181
182
  // winston.debug("request_id", request_id);
@@ -970,19 +970,25 @@ class RequestService {
970
970
 
971
971
  }
972
972
 
973
- updateWaitingTimeByRequestId(request_id, id_project) {
973
+ updateWaitingTimeByRequestId(request_id, id_project, enable_populate) {
974
974
 
975
975
  return new Promise(function (resolve, reject) {
976
976
  // winston.debug("request_id", request_id);
977
977
  // winston.debug("newstatus", newstatus);
978
978
 
979
979
  let q = Request
980
- .findOne({request_id: request_id, id_project: id_project})
981
- .populate('lead')
982
- .populate('department')
983
- .populate('participatingBots')
984
- .populate('participatingAgents')
985
- .populate({path:'requester',populate:{path:'id_user'}});
980
+ .findOne({request_id: request_id, id_project: id_project});
981
+
982
+ if (enable_populate==true) {
983
+ winston.debug("updateWaitingTimeByRequestId enable_populate");
984
+
985
+ q.populate('lead')
986
+ .populate('department')
987
+ .populate('participatingBots')
988
+ .populate('participatingAgents')
989
+ .populate({path:'requester',populate:{path:'id_user'}});
990
+ }
991
+
986
992
 
987
993
  // if (cacheEnabler.request) { //attention this cache is not usable bacause cacheoose don't support populate without .lean.. so if cached populated field is not returned with cacheoose, updateWaitingTime is only used in chat21webhook but i thik it is important for messages route
988
994
  // q.cache(cacheUtil.defaultTTL, id_project+":requests:request_id:"+request_id) //request_cache
@@ -11,9 +11,19 @@
11
11
  img {
12
12
  max-width: 100%;
13
13
  margin-left:16px;
14
- margin-bottom:16px;
15
14
  text-align:center !important;
16
15
  }
16
+ img.CToWUd {
17
+ margin-bottom: 16px;
18
+ max-width: 200px !important;
19
+ width: 200px !important;
20
+ min-width: 200px !important;
21
+ outline: none;
22
+ text-decoration: none;
23
+ border: none;
24
+ height: auto;
25
+ margin-left: 0px;
26
+ }
17
27
  body {
18
28
  -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none; width: 100% !important; height: 100%; line-height: 1.6em;
19
29
  }
@@ -82,8 +92,7 @@
82
92
 
83
93
  <div style="text-align:center">
84
94
  <a href="http://www.tiledesk.com" style="color:#2daae1;font-weight:bold;text-decoration:none;word-break:break-word" target="_blank">
85
- <!--<img src="https://tiledesk.com/wp-content/uploads/2022/07/tiledesk_v2.png" style="width:10%;outline:none;text-decoration:none;border:none;min-height:36px" class="CToWUd">-->
86
- <img src="https://tiledesk.com/wp-content/uploads/2022/09/tiledeesk_log_email.png" style="max-width:200px;outline:none;text-decoration:none;border:none;height:auto;margin-left:0px;" class="CToWUd">
95
+ <img src="https://tiledesk.com/wp-content/uploads/2023/01/tiledesk_log_email_200.png" class="CToWUd">
87
96
  </a>
88
97
  </div>
89
98
  </tr>
@@ -103,7 +112,7 @@
103
112
  <table width="100%" cellpadding="0" cellspacing="0" style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
104
113
 
105
114
  <tr style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
106
- <td class="content-block" style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;" valign="top">
115
+ <td class="content-block" style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0;" valign="top">
107
116
  {{#ifEquals message.type "text"}}
108
117
  <div style="white-space: pre-wrap;">{{{msgText}}}</div>
109
118
  {{/ifEquals}}
@@ -121,26 +130,26 @@
121
130
 
122
131
 
123
132
  <tr style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
124
- <td class="content-block" style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;" valign="top">
133
+ <td class="content-block" style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0;" valign="top">
125
134
  Project name : <strong style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">{{project.name}}</strong>
126
135
  </td>
127
136
  </tr>
128
137
 
129
138
 
130
139
  <tr style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
131
- <td class="content-block" style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;" valign="top">
140
+ <td class="content-block" style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0;" valign="top">
132
141
  Department name : <strong style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">{{request.department.name}}</strong>
133
142
  </td>
134
143
  </tr>
135
144
 
136
145
  <tr style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
137
- <td class="content-block" style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;" valign="top">
146
+ <td class="content-block" style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0;" valign="top">
138
147
  From email : <strong style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">{{request.lead.email}}</strong>
139
148
  </td>
140
149
  </tr>
141
150
 
142
151
  <tr style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
143
- <td class="content-block" style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;" valign="top">
152
+ <td class="content-block" style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0;" valign="top">
144
153
  Contact name : <strong style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">{{request.lead.fullname}}</strong>
145
154
  </td>
146
155
  </tr>
@@ -152,7 +161,7 @@
152
161
  </tr> -->
153
162
 
154
163
  <tr style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
155
- <td class="content-block" style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;" valign="top">
164
+ <td class="content-block" style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0;" valign="top">
156
165
  Channel : <strong style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
157
166
  {{#ifEquals request.channel.name "chat21"}}
158
167
  Chat
@@ -164,7 +173,7 @@
164
173
  </tr>
165
174
 
166
175
  <tr style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
167
- <td class="content-block" style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;" valign="top">
176
+ <td class="content-block" style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0;" valign="top">
168
177
  <a href="{{baseScope.baseUrl}}/#/project/{{request.id_project}}/wsrequest/{{request.request_id}}/messages">Open the dashboard</a>.
169
178
 
170
179
  </td>
@@ -175,7 +184,7 @@
175
184
 
176
185
 
177
186
  <tr style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
178
- <td class="content-block" style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;" valign="top">
187
+ <td class="content-block" style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0;" valign="top">
179
188
  </td>
180
189
  </tr>
181
190
  </table>
@@ -185,7 +194,7 @@
185
194
  <div class="footer" style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; width: 100%; clear: both; color: #999; margin: 0; padding: 20px;">
186
195
  <table width="100%" style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
187
196
  <tr style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
188
- <td class="aligncenter content-block" style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 12px; vertical-align: top; color: #999; text-align: center; margin: 0; padding: 0 0 20px;" align="center" valign="top">
197
+ <td class="aligncenter content-block" style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 12px; vertical-align: top; color: #999; text-align: center; margin: 0;" align="center" valign="top">
189
198
  <span><a href="http://www.tiledesk.com" style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 12px; color: #999; text-decoration: underline; margin: 0;" > Tiledesk.com </a></span>
190
199
  <br><span><a href="%unsubscribe_url%" style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 12px; color: #999; text-decoration: underline; margin: 0;">Unsubscribe</a></span>
191
200
  </td>