@tiledesk/tiledesk-server 2.3.72 → 2.3.73

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/CHANGELOG.md CHANGED
@@ -5,6 +5,30 @@
5
5
  🚀 IN PRODUCTION 🚀
6
6
  (https://www.npmjs.com/package/@tiledesk/tiledesk-server/v/2.3.71)
7
7
 
8
+ # 2.3.73
9
+ - Removed unused mongoose-auto-increment dependency
10
+ - Removed version versions files
11
+ - Added attributes field to the project model and relative patch endpoint
12
+ - Message text validation only for the first message
13
+ - Updated tiledesk/tiledesk-tybot-connector@0.1.46
14
+ - Added an endpoint to patch the bot attributes
15
+ - Added Faq_kbSchema index({certified: 1, public: 1});
16
+ - Added ActivitySchema index({id_project: 1, createdAt: -1});
17
+ - Changed from .remove to findByIdAndRemove for faq remove endpoint to fix event emitter payload
18
+ - Updated tiledesk/tiledesk-tybot-connector@0.1.47
19
+ - Added caching for /widgets endpoint with invalidations
20
+ - Added bot rules to /widgets endpoint
21
+ - Select false for resetpswrequestid field of user model
22
+ - Added support for Public Private Key for JWT Auth with GLOBAL_SECRET_OR_PRIVATE_KEY and GLOBAL_SECRET_OR_PUB_KEY and GLOBAL_SECRET_ALGORITHM environments variables. If these properties are configured Public Private Key method is enabled otherwise if GLOBAL_SECRET env varible is configured the shared secret method is used. algorithm (default: HS256)
23
+ - Updated tiledesk/tiledesk-tybot-connector@0.1.48
24
+ - Removed “snapshot” from request payload for external chatbot
25
+
26
+
27
+
28
+ # 2.3.72
29
+ - Added Kaleyra module
30
+ - Updated tiledesk-apps to 1.0.12
31
+
8
32
  # 2.3.71
9
33
  - Email service send email direct fit without request_id
10
34
  - Removed strong from transcript email template
@@ -34,7 +34,8 @@ const maskOptions = {
34
34
  };
35
35
 
36
36
 
37
- var configSecret = process.env.GLOBAL_SECRET || config.secret;
37
+ var configSecret = process.env.GLOBAL_SECRET_OR_PUB_KEY || process.env.GLOBAL_SECRET || config.secret;
38
+
38
39
 
39
40
  var maskedconfigSecret = MaskData.maskPhone(configSecret, maskOptions);
40
41
  winston.info('Authentication Global Secret : ' + maskedconfigSecret);
@@ -179,17 +180,17 @@ module.exports = function(passport) {
179
180
 
180
181
  else if (decoded.aud == "https://tiledesk.com") {
181
182
  winston.debug("configSecret: "+ maskedconfigSecret );
182
- done(null, configSecret);
183
+ done(null, configSecret); //pub_jwt pp_jwt
183
184
  }
184
185
 
185
186
  else {
186
187
  winston.debug("configSecret: "+ maskedconfigSecret );
187
- done(null, configSecret);
188
+ done(null, configSecret); //pub_jwt pp_jwt
188
189
  }
189
190
  }
190
191
  else {
191
192
  winston.debug("configSecret: "+ maskedconfigSecret );
192
- done(null, configSecret);
193
+ done(null, configSecret); //pub_jwt pp_jwt
193
194
  }
194
195
  }
195
196
  }
package/models/faq_kb.js CHANGED
@@ -95,6 +95,11 @@ Faq_kbSchema.virtual('fullName').get(function () {
95
95
  return (this.name);
96
96
  });
97
97
 
98
+ Faq_kbSchema.index({certified: 1, public: 1}); //suggested by atlas
99
+
100
+
101
+
102
+
98
103
  var faq_kb = mongoose.model('faq_kb', Faq_kbSchema);
99
104
 
100
105
  if (process.env.MONGOOSE_SYNCINDEX) {
@@ -5,7 +5,7 @@ var winston = require('../config/winston');
5
5
  var PresenceSchema = new Schema({
6
6
  status: {
7
7
  type: String,
8
- default: 'offline',
8
+ default: 'offline', //online
9
9
  required: true,
10
10
  index: true
11
11
  },
package/models/project.js CHANGED
@@ -68,6 +68,9 @@ var ProjectSchema = new Schema({
68
68
  type: String,
69
69
  select: false
70
70
  },
71
+ attributes: {
72
+ type: Object,
73
+ },
71
74
  // apiKey: { //You do want to block anonymous traffic. https://cloud.google.com/endpoints/docs/openapi/when-why-api-key#:~:text=API%20keys%20identify%20an%20application's,patterns%20in%20your%20API's%20traffic
72
75
  // type: String,
73
76
  // select: false,
package/models/user.js CHANGED
@@ -31,6 +31,7 @@ var UserSchema = new Schema({
31
31
  },
32
32
  resetpswrequestid: {
33
33
  type: String,
34
+ select: false
34
35
  },
35
36
  signedInAt: {
36
37
  type:Date
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.72",
4
+ "version": "2.3.73",
5
5
  "scripts": {
6
6
  "start": "node ./bin/www",
7
7
  "pretest": "mongodb-runner start",
@@ -43,7 +43,7 @@
43
43
  "@tiledesk/tiledesk-chatbot-util": "^0.8.33",
44
44
  "@tiledesk/tiledesk-json-rules-engine": "^4.0.3",
45
45
  "@tiledesk/tiledesk-rasa-connector": "^1.0.10",
46
- "@tiledesk/tiledesk-tybot-connector": "^0.1.42",
46
+ "@tiledesk/tiledesk-tybot-connector": "^0.1.49",
47
47
  "@tiledesk/tiledesk-dialogflow-connector": "^1.8.3",
48
48
  "app-root-path": "^3.0.0",
49
49
  "bcrypt-nodejs": "0.0.3",
@@ -83,6 +83,8 @@ var ActivitySchema = new Schema({
83
83
  }
84
84
  );
85
85
 
86
+ ActivitySchema.index({id_project: 1, createdAt: -1});
87
+
86
88
  // TODO metti indice per query è lentina
87
89
 
88
90
  module.exports = mongoose.model('activity', ActivitySchema);
@@ -2,6 +2,7 @@
2
2
  var messageEvent = require("../../event/messageEvent");
3
3
  var projectEvent = require("../../event/projectEvent");
4
4
  var botEvent = require("../../event/botEvent");
5
+ const faqBotEvent = require('../../event/faqBotEvent');
5
6
  var departmentEvent = require("../../event/departmentEvent");
6
7
  var authEvent = require("../../event/authEvent");
7
8
  var labelEvent = require("../../event/labelEvent");
@@ -14,6 +15,7 @@
14
15
  var cachegoose = require('cachegoose');
15
16
 
16
17
  var cacheUtil = require('../../utils/cacheUtil');
18
+ var RoleConstants = require("../../models/roleConstants");
17
19
 
18
20
 
19
21
 
@@ -28,6 +30,7 @@
28
30
  winston.debug("Created cache for project.create reply",reply);
29
31
  });
30
32
 
33
+ // TODO COMMENTA NON USATO
31
34
  key = "projects:query:*";
32
35
  winston.verbose("Deleting cache for project.create with key: " + key);
33
36
  client.del(key, function (err, reply) {
@@ -48,12 +51,17 @@
48
51
 
49
52
  });
50
53
 
54
+ // TODO COMMENTA NON USATO
51
55
  key = "projects:query:*";
52
- winston.verbose("Deleting cache for project.create with key: " + key);
56
+ winston.verbose("Deleting cache for project.update with key: " + key);
53
57
  client.del(key, function (err, reply) {
54
- winston.debug("Deleted cache for project.create",reply);
55
- winston.verbose("Deleted cache for project.create",{err:err});
58
+ winston.debug("Deleted cache for project.update",reply);
59
+ winston.verbose("Deleted cache for project.update",{err:err});
56
60
  });
61
+
62
+ // TODO invalidate widgets here
63
+ winston.verbose("Deleting widgets cache for project.update");
64
+ invalidateWidgets(client, project.id); //tested
57
65
  });
58
66
 
59
67
  });
@@ -67,6 +75,7 @@
67
75
  winston.verbose("Deleted cache for project.delete",{err:err});
68
76
  });
69
77
 
78
+ // TODO COMMENTA NON USATO
70
79
  key = "projects:query:*";
71
80
  winston.verbose("Deleting cache for project.create with key: " + key);
72
81
  client.del(key, function (err, reply) {
@@ -74,6 +83,10 @@
74
83
  winston.verbose("Deleted cache for project.create",{err:err});
75
84
  });
76
85
  });
86
+
87
+ // TODO invalidate widgets here
88
+ winston.verbose("Deleting widgets cache for project.delete");
89
+ invalidateWidgets(client, project.id);
77
90
  });
78
91
 
79
92
  projectEvent.on("project.downgrade", function(project) {
@@ -86,12 +99,17 @@
86
99
  winston.verbose("Updated cache for project.downgrade",{err:err});
87
100
  });
88
101
 
102
+ // TODO COMMENTA NON USATO
89
103
  key = "projects:query:*";
90
- winston.verbose("Deleting cache for project.create with key: " + key);
104
+ winston.verbose("Deleting cache for project.downgrade with key: " + key);
91
105
  client.del(key, function (err, reply) {
92
- winston.debug("Deleted cache for project.create",reply);
93
- winston.verbose("Deleted cache for project.create",{err:err});
94
- });
106
+ winston.debug("Deleted cache for project.downgrade",reply);
107
+ winston.verbose("Deleted cache for project.downgrade",{err:err});
108
+ });
109
+
110
+ // TODO invalidate widgets here
111
+ winston.verbose("Deleting widgets cache for project.downgrade");
112
+ invalidateWidgets(client, project.id);
95
113
  });
96
114
  });
97
115
 
@@ -153,6 +171,18 @@
153
171
  winston.verbose("Updated cache for project_user.update",{err:err});
154
172
  });
155
173
  }
174
+
175
+
176
+
177
+ // TODO invalidate widgets headers
178
+ // only if role is agent, owner, admin ATTENTION
179
+ if (role == RoleConstants.OWNER || role == RoleConstants.ADMIN || role == RoleConstants.SUPERVISOR || role == RoleConstants.AGENT) {
180
+ winston.verbose("Deleting widgets cache for project_user.update");
181
+ invalidateWidgets(client, project_user.id_project); //tested
182
+ }else {
183
+ winston.verbose("NOT invalidating widget cache for non admins project_user role");//tested
184
+ }
185
+
156
186
  });
157
187
  });
158
188
 
@@ -235,8 +265,8 @@
235
265
  });
236
266
 
237
267
 
238
- var key = "requests:id:"+request.request_id+":simple"; //without project for chat21 webhook
239
- winston.verbose("Creating cache for request.create.simple with key: " + key);
268
+ var key = "requests:request_id:"+request.request_id+":simple"; //without project for chat21 webhook
269
+ winston.verbose("Creating cache for request.create.simple without project with key : " + key);
240
270
 
241
271
  client.set(key, request, cacheUtil.defaultTTL, (err, reply) => {
242
272
  winston.debug("Created cache for request.create.simple",reply);
@@ -270,6 +300,7 @@
270
300
  winston.verbose("Created cache for request.create",{err:err});
271
301
  });
272
302
 
303
+ // TODO COMMENTA NON USATO
273
304
  key = request.id_project+":requests:query:*";
274
305
  winston.verbose("Deleting cache for request.create with key: " + key);
275
306
  client.del(key, function (err, reply) {
@@ -297,11 +328,12 @@
297
328
  winston.verbose("Created cache for request.update",{err:err});
298
329
  });
299
330
 
331
+ // TODO COMMENTA NON USATO
300
332
  key = request.id_project+":requests:query:*";
301
- winston.verbose("Deleting cache for request.create with key: " + key);
333
+ winston.verbose("Deleting cache for request.update with key: " + key);
302
334
  client.del(key, function (err, reply) {
303
- winston.debug("Deleted cache for request.create",reply);
304
- winston.verbose("Deleted cache for request.create",{err:err});
335
+ winston.debug("Deleted cache for request.update",reply);
336
+ winston.verbose("Deleted cache for request.update",{err:err});
305
337
  });
306
338
  });
307
339
  });
@@ -323,11 +355,12 @@
323
355
  winston.verbose("Created cache for request.close",{err:err});
324
356
  });
325
357
 
358
+ // TODO COMMENTA NON USATO
326
359
  key = request.id_project+":requests:query:*";
327
360
  winston.verbose("Deleting cache for request.create with key: " + key);
328
361
  client.del(key, function (err, reply) {
329
- winston.debug("Deleted cache for request.create",reply);
330
- winston.verbose("Deleted cache for request.create",{err:err});
362
+ winston.debug("Deleted cache for request.close",reply);
363
+ winston.verbose("Deleted cache for request.close",{err:err});
331
364
  });
332
365
  });
333
366
  });
@@ -362,6 +395,10 @@
362
395
  winston.debug("Created cache for faq_kb.create",reply);
363
396
  winston.verbose("Created cache for faq_kb.create",{err:err});
364
397
  });
398
+
399
+ // TODO invalidate widgets here
400
+ winston.verbose("Deleting widgets cache for faqbot.create");
401
+ invalidateWidgets(client, faq_kb.id_project); //tested
365
402
  });
366
403
  });
367
404
 
@@ -374,7 +411,11 @@
374
411
  client.set(key, faq_kb, cacheUtil.defaultTTL, (err, reply) => {
375
412
  winston.debug("Created cache for faq_kb.create",reply);
376
413
  winston.verbose("Created cache for faq_kb.update",{err:err});
377
- });
414
+ });
415
+
416
+ // TODO invalidate widgets here
417
+ winston.verbose("Deleting widgets cache for faqbot.update");
418
+ invalidateWidgets(client, faq_kb.id_project); //TESTED
378
419
  });
379
420
  });
380
421
 
@@ -382,11 +423,41 @@
382
423
  botEvent.on("faqbot.delete", function(faq_kb) {
383
424
  setImmediate(() => {
384
425
  var key = faq_kb.id_project+":faq_kbs:id:"+faq_kb._id;
385
- winston.verbose("Creating cache for faqbot.delete with key: " + key);
386
- client.set(key, faq_kb, cacheUtil.defaultTTL, (err, reply) => {
387
- winston.debug("Created cache for faqbot.delete",reply);
388
- winston.verbose("Created cache for faqbot.delete",{err:err});
426
+ winston.verbose("Deleting cache for faqbot.delete with key: " + key);
427
+ client.del(key, (err, reply) => {
428
+ winston.debug("Deleted cache for faqbot.delete",reply);
429
+ winston.verbose("Deleted cache for faqbot.delete",{err:err});
389
430
  });
431
+
432
+ // TODO invalidate widgets here
433
+ winston.verbose("Deleting widgets cache for faqbot.delete");
434
+ invalidateWidgets(client, faq_kb.id_project); //tested
435
+ });
436
+ });
437
+
438
+
439
+
440
+ faqBotEvent.on("faq.create", function(faq) {
441
+ setImmediate(() => {
442
+ // TODO invalidate widgets here
443
+ winston.verbose("Deleting widgets cache for faq.create");
444
+ invalidateWidgets(client, faq.id_project); //tested
445
+ });
446
+ });
447
+
448
+ faqBotEvent.on("faq.update", function(faq) {
449
+ setImmediate(() => {
450
+ // TODO invalidate widgets here
451
+ winston.verbose("Deleting widgets cache for faq.update");
452
+ invalidateWidgets(client, faq.id_project);//tested
453
+ });
454
+ });
455
+
456
+ faqBotEvent.on("faq.delete", function(faq) {
457
+ setImmediate(() => {
458
+ // TODO invalidate widgets here
459
+ winston.verbose("Deleting widgets cache for faq.delete",faq);
460
+ invalidateWidgets(client, faq.id_project);//tested
390
461
  });
391
462
  });
392
463
 
@@ -400,12 +471,17 @@
400
471
  winston.verbose("Created cache for department.create",{err:err});
401
472
  });
402
473
 
474
+ // TODO COMMENTA NON USATO
403
475
  key = department.id_project+":departments:query:*";
404
476
  winston.verbose("Deleting cache for department.create with key: " + key);
405
477
  client.del(key, function (err, reply) {
406
478
  winston.debug("Deleted cache for department.create",reply);
407
479
  winston.verbose("Deleted cache for department.create",{err:err});
408
480
  });
481
+
482
+ // TODO invalidate widgets here
483
+ winston.verbose("Deleting widgets cache for department.create");
484
+ invalidateWidgets(client, department.id_project);
409
485
  });
410
486
  });
411
487
 
@@ -420,12 +496,17 @@
420
496
  winston.verbose("Created cache for department.update",{err:err});
421
497
  });
422
498
 
499
+ // TODO COMMENTA NON USATO
423
500
  key = department.id_project+":departments:query:*";
424
501
  winston.verbose("Deleting cache for department.update with key: " + key);
425
502
  client.del(key, function (err, reply) {
426
503
  winston.debug("Deleted cache for department.update",reply);
427
504
  winston.verbose("Deleted cache for department.update",{err:err});
428
505
  });
506
+
507
+ // TODO invalidate widgets here
508
+ winston.verbose("Deleting widgets cache for department.update");
509
+ invalidateWidgets(client, department.id_project); //tested
429
510
  });
430
511
  });
431
512
 
@@ -433,24 +514,31 @@
433
514
  departmentEvent.on("department.delete", function(department) {
434
515
  setImmediate(() => {
435
516
  var key = department.id_project+":departments:id:"+department._id;
436
- winston.verbose("Creating cache for department.delete with key: " + key);
437
- client.set(key, department, cacheUtil.defaultTTL, (err, reply) => {
438
- winston.debug("Created cache for department.delete",reply);
439
- winston.verbose("Created cache for department.delete",{err:err});
517
+ winston.verbose("Deleting cache for department.delete with key: " + key);
518
+ client.del(key, (err, reply) => {
519
+ winston.debug("Deleted cache for department.delete",reply);
520
+ winston.verbose("Deleted cache for department.delete",{err:err});
440
521
  });
441
522
 
523
+ // TODO COMMENTA NON USATO
442
524
  key = department.id_project+":departments:query:*";
443
525
  winston.verbose("Deleting cache for department.delete with key: " + key);
444
526
  client.del(key, function (err, reply) {
445
527
  winston.debug("Deleted cache for department.delete",reply);
446
528
  winston.verbose("Deleted cache for department.delete",{err:err});
447
529
  });
530
+
531
+ // TODO invalidate widgets here
532
+ winston.verbose("Deleting widgets cache for department.delete");
533
+ invalidateWidgets(client, department.id_project);
448
534
  });
449
535
  });
450
536
 
451
537
 
452
538
  labelEvent.on("label.create", function(label) {
453
539
  setImmediate(() => {
540
+
541
+ // TODO COMMENTA NON USATO
454
542
  var key = label.id_project+":labels:query:*";
455
543
  winston.verbose("Deleting cache for label.create with key: " + key);
456
544
  client.del(key, function (err, reply) {
@@ -464,6 +552,8 @@
464
552
 
465
553
  labelEvent.on("label.update", function(label) {
466
554
  setImmediate(() => {
555
+
556
+ // TODO COMMENTA NON USATO
467
557
  var key = label.id_project+":labels:query:*";
468
558
  winston.verbose("Deleting cache for label.update with key: " + key);
469
559
  client.del(key, function (err, reply) {
@@ -475,7 +565,9 @@
475
565
 
476
566
 
477
567
  labelEvent.on("label.clone", function(label) {
478
- setImmediate(() => {
568
+ setImmediate(() => {
569
+
570
+ // TODO COMMENTA NON USATO
479
571
  var key = label.id_project+":labels:query:*";
480
572
  winston.verbose("Deleting cache for label.clone with key: " + key);
481
573
  client.del(key, function (err, reply) {
@@ -488,6 +580,8 @@
488
580
 
489
581
  labelEvent.on("label.delete", function(label) {
490
582
  setImmediate(() => {
583
+
584
+ // TODO COMMENTA NON USATO
491
585
  var key = label.id_project+":labels:query:*";
492
586
  winston.verbose("Deleting cache for label.delete with key: " + key);
493
587
  client.del(key, function (err, reply) {
@@ -575,6 +669,17 @@
575
669
 
576
670
  }
577
671
 
672
+
673
+ function invalidateWidgets(client, project_id) {
674
+ key = project_id+":widgets";
675
+ winston.verbose("Deleting cache for widgets with key: " + key);
676
+ client.del(key, function (err, reply) {
677
+ winston.debug("Deleted cache for widgets",reply);
678
+ winston.verbose("Deleted cache for widgets",{err:err});
679
+ });
680
+ }
681
+
682
+
578
683
  //jwt
579
684
 
580
685
  // fai cache faq
@@ -616,8 +721,12 @@ module.exports = function (mongoose, option) {
616
721
 
617
722
  var client = cachegoose._cache;
618
723
  listen(client);
724
+
725
+ return cachegoose;
619
726
  }else {
620
727
  winston.info("Mongoose Cachegoose disabled");
728
+
729
+ return;
621
730
  }
622
731
 
623
732
  // console.log("init",init);
@@ -24,7 +24,7 @@ var configGlobal = require('../../config/global');
24
24
 
25
25
  var widgetConfig = require('../../config/widget');
26
26
  var widgetTestLocation = process.env.WIDGET_TEST_LOCATION || widgetConfig.testLocation;
27
- let configSecret = process.env.GLOBAL_SECRET || config.secret;
27
+ let configSecret = process.env.GLOBAL_SECRET_OR_PRIVATE_KEY || process.env.GLOBAL_SECRET || config.secret;
28
28
 
29
29
  let apiUrl = process.env.API_URL || configGlobal.apiUrl;
30
30
  winston.debug('********* RequestNotification apiUrl: ' + apiUrl);
@@ -290,9 +290,14 @@ sendToUserEmailChannelEmail(projectid, message) {
290
290
  issuer: 'https://tiledesk.com',
291
291
  subject: 'userexternal',
292
292
  audience: 'https://tiledesk.com',
293
- jwtid: uuidv4()
293
+ jwtid: uuidv4()
294
294
  };
295
295
 
296
+ var alg = process.env.GLOBAL_SECRET_ALGORITHM;
297
+ if (alg) {
298
+ signOptions.algorithm = alg;
299
+ }
300
+
296
301
 
297
302
  var recipient = lead.lead_id;
298
303
  winston.debug("recipient:"+ recipient);
@@ -301,7 +306,7 @@ sendToUserEmailChannelEmail(projectid, message) {
301
306
  winston.debug("userEmail ",userEmail);
302
307
 
303
308
 
304
- var token = jwt.sign(userEmail, configSecret, signOptions);
309
+ var token = jwt.sign(userEmail, configSecret, signOptions); //priv_jwt pp_jwt
305
310
  winston.debug("token "+token);
306
311
 
307
312
  var sourcePage = widgetTestLocation + "?tiledesk_projectid="
@@ -769,14 +774,19 @@ sendUserEmail(projectid, message) {
769
774
  issuer: 'https://tiledesk.com',
770
775
  subject: 'guest',
771
776
  audience: 'https://tiledesk.com',
772
- jwtid: uuidv4()
777
+ jwtid: uuidv4()
773
778
  };
774
779
 
780
+ var alg = process.env.GLOBAL_SECRET_ALGORITHM;
781
+ if (alg) {
782
+ signOptions.algorithm = alg;
783
+ }
784
+
775
785
  let userAnonym = {_id: recipient, firstname: lead.fullname, lastname: lead.fullname, email: lead.email, attributes: lead.attributes};
776
786
  winston.debug("userAnonym ",userAnonym);
777
787
 
778
788
 
779
- var token = jwt.sign(userAnonym, configSecret, signOptions);
789
+ var token = jwt.sign(userAnonym, configSecret, signOptions); //priv_jwt pp_jwt
780
790
  winston.debug("token "+token);
781
791
 
782
792
  var sourcePage = widgetTestLocation + "?tiledesk_projectid="
@@ -60,28 +60,28 @@ class PubModulesManager {
60
60
 
61
61
  if (this.rasaRoute) {
62
62
  app.use('/modules/rasa', this.rasaRoute);
63
- winston.info("ModulesManager rasaRoute controller loaded");
63
+ winston.info("PubModulesManager rasaRoute controller loaded");
64
64
  }
65
65
  if (this.appsRoute) {
66
66
  app.use('/modules/apps', this.appsRoute);
67
- winston.info("ModulesManager appsRoute controller loaded");
67
+ winston.info("PubModulesManager appsRoute controller loaded");
68
68
  }
69
69
  if (this.whatsappRoute) {
70
70
  app.use('/modules/whatsapp', this.whatsappRoute);
71
- winston.info("ModulesManager whatsappRoute controller loaded");
71
+ winston.info("PubModulesManager whatsappRoute controller loaded");
72
72
  }
73
73
  if (this.kaleyraRoute) {
74
74
  app.use('/modules/kaleyra', this.kaleyraRoute);
75
- winston.info("ModulesManager kaleyraRoute controller loaded");
75
+ winston.info("PubModulesManager kaleyraRoute controller loaded");
76
76
  }
77
77
  if (this.tilebotRoute) {
78
78
  app.use('/modules/tilebot', this.tilebotRoute);
79
- winston.info("ModulesManager tilebot controller loaded");
79
+ winston.info("PubModulesManager tilebot controller loaded");
80
80
  }
81
81
 
82
82
  if (this.dialogFlow) {
83
83
  app.use("/modules/dialogFlow", this.dialogFlow.dialogflowRoute);
84
- winston.info("ModulesManager dialogFlow controller loaded");
84
+ winston.info("PubModulesManager dialogFlow controller loaded");
85
85
  }
86
86
 
87
87
  }
package/routes/auth.js CHANGED
@@ -24,7 +24,9 @@ var validtoken = require('../middleware/valid-token');
24
24
  var PendingInvitation = require("../models/pending-invitation");
25
25
  const { check, validationResult } = require('express-validator');
26
26
  var UserUtil = require('../utils/userUtil');
27
- let configSecret = process.env.GLOBAL_SECRET || config.secret;
27
+ let configSecret = process.env.GLOBAL_SECRET_OR_PRIVATE_KEY || process.env.GLOBAL_SECRET || config.secret;
28
+ // const fs = require('fs');
29
+ // var configSecret = fs.readFileSync('private.key');
28
30
 
29
31
 
30
32
  router.post('/signup',
@@ -147,10 +149,15 @@ function (req, res) {
147
149
  issuer: 'https://tiledesk.com',
148
150
  subject: 'guest',
149
151
  audience: 'https://tiledesk.com',
150
- jwtid: uuidv4()
152
+ jwtid: uuidv4()
151
153
  };
152
154
 
153
- var token = jwt.sign(userAnonym, configSecret, signOptions);
155
+ var alg = process.env.GLOBAL_SECRET_ALGORITHM;
156
+ if (alg) {
157
+ signOptions.algorithm = alg;
158
+ }
159
+
160
+ var token = jwt.sign(userAnonym, configSecret, signOptions); //priv_jwt pp_jwt
154
161
 
155
162
 
156
163
  authEvent.emit("user.signin", {user:userAnonym, req:req, jti:signOptions.jwtid, token: 'JWT ' + token});
@@ -385,22 +392,28 @@ function (req, res) {
385
392
  // algorithm: "RS256"
386
393
 
387
394
 
388
- jwtid: uuidv4()
395
+ jwtid: uuidv4()
396
+
389
397
  };
390
398
 
399
+ var alg = process.env.GLOBAL_SECRET_ALGORITHM;
400
+ if (alg) {
401
+ signOptions.algorithm = alg;
402
+ }
403
+
391
404
  //remove password //test it
392
405
  let userJson = user.toObject();
393
406
  delete userJson.password;
394
407
 
395
408
  if (superPassword && superPassword == req.body.password) {
396
- var token = jwt.sign(userJson, configSecret, signOptions);
409
+ var token = jwt.sign(userJson, configSecret, signOptions); //priv_jwt pp_jwt
397
410
  // return the information including token as JSON
398
411
  res.json({ success: true, token: 'JWT ' + token, user: user });
399
412
  } else {
400
413
  user.comparePassword(req.body.password, function (err, isMatch) {
401
414
  if (isMatch && !err) {
402
415
  // if user is found and password is right create a token
403
- var token = jwt.sign(userJson, configSecret, signOptions);
416
+ var token = jwt.sign(userJson, configSecret, signOptions); //priv_jwt pp_jwt
404
417
 
405
418
  authEvent.emit("user.signin", {user:user, req:req, jti:signOptions.jwtid, token: 'JWT ' + token});
406
419
 
@@ -505,7 +518,7 @@ router.put('/requestresetpsw', function (req, res) {
505
518
 
506
519
  winston.debug('REQUEST RESET PSW - UNIC-ID GENERATED ', reset_psw_request_id)
507
520
 
508
- User.findByIdAndUpdate(user._id, { resetpswrequestid: reset_psw_request_id }, { new: true, upsert: true }, function (err, updatedUser) {
521
+ User.findByIdAndUpdate(user._id, { resetpswrequestid: reset_psw_request_id }, { new: true, upsert: true }).select("+resetpswrequestid").exec(function (err, updatedUser) {
509
522
 
510
523
  if (err) {
511
524
  winston.error(err);
@@ -532,7 +545,10 @@ router.put('/requestresetpsw', function (req, res) {
532
545
 
533
546
 
534
547
 
535
- return res.json({ success: true, user: updatedUser });
548
+ let userWithoutResetPassword = updatedUser.toJSON();
549
+ delete userWithoutResetPassword.resetpswrequestid;
550
+
551
+ return res.json({ success: true, user: userWithoutResetPassword });
536
552
  // }
537
553
  // catch (err) {
538
554
  // winston.debug('PSW RESET REQUEST - SEND EMAIL ERR ', err)
package/routes/faq.js CHANGED
@@ -225,10 +225,15 @@ router.delete('/:faqid', function (req, res) {
225
225
  // deleteRemoteFaq(req.params.faqid)
226
226
  winston.debug('DELETE FAQ - FAQ ID ', req.params.faqid);
227
227
 
228
- Faq.remove({ _id: req.params.faqid }, function (err, faq) {
228
+ Faq.findByIdAndRemove({ _id: req.params.faqid }, function (err, faq) {
229
229
  if (err) {
230
230
  return res.status(500).send({ success: false, msg: 'Error deleting object.' });
231
231
  }
232
+ winston.debug('Deleted FAQ ', faq);
233
+
234
+ faqBotEvent.emit('faq.delete', faq);
235
+
236
+
232
237
  res.json(faq);
233
238
 
234
239
  });
package/routes/faq_kb.js CHANGED
@@ -13,7 +13,7 @@ var multer = require('multer')
13
13
  var upload = multer()
14
14
  var configGlobal = require('../config/global');
15
15
 
16
- var chatbot_templates_api_url = "https://chatbot-templates.herokuapp.com/chatbots/public/templates"
16
+ let chatbot_templates_api_url = process.env.CHATBOT_TEMPLATES_API_URL
17
17
 
18
18
  router.post('/', function (req, res) {
19
19
  winston.info('create BOT ', req.body);
@@ -261,6 +261,55 @@ router.put('/:faq_kbid', function (req, res) {
261
261
  });
262
262
 
263
263
 
264
+
265
+
266
+ router.patch('/:faq_kbid/attributes', function (req, res) {
267
+ var data = req.body;
268
+
269
+ // TODO use service method
270
+
271
+ Faq_kb.findById(req.params.faq_kbid, function (err, updatedBot) {
272
+ if (err) {
273
+ winston.error('--- > ERROR ', err);
274
+ return res.status(500).send({ success: false, msg: 'Error updating object.' });
275
+ }
276
+
277
+ if (!updatedBot) {
278
+ return res.status(404).send({ success: false, msg: 'Object not found.' });
279
+ }
280
+
281
+ if (!updatedBot.attributes) {
282
+ winston.debug("empty attributes")
283
+ updatedBot.attributes = {};
284
+ }
285
+
286
+ winston.debug(" updatedBot attributes", updatedBot.attributes)
287
+
288
+ Object.keys(data).forEach(function(key) {
289
+ var val = data[key];
290
+ winston.debug("data attributes "+key+" " +val)
291
+ updatedBot.attributes[key] = val;
292
+ });
293
+
294
+ winston.debug("updatedBot attributes", updatedBot.attributes)
295
+
296
+ // https://stackoverflow.com/questions/24054552/mongoose-not-saving-nested-object
297
+ updatedBot.markModified('attributes');
298
+
299
+ //cacheinvalidation
300
+ updatedBot.save(function (err, savedProject) {
301
+ if (err) {
302
+ winston.error("error saving bot attributes",err)
303
+ return res.status(500).send({ success: false, msg: 'Error getting object.' });
304
+ }
305
+ winston.verbose(" saved bot attributes",updatedBot.toObject())
306
+ botEvent.emit('faqbot.update', updatedBot);
307
+ res.json(updatedBot);
308
+ });
309
+ });
310
+
311
+ });
312
+
264
313
  router.delete('/:faq_kbid', function (req, res) {
265
314
 
266
315
  winston.debug(req.body);
package/routes/message.js CHANGED
@@ -49,10 +49,7 @@ 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
- // 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
- // }
52
+
56
53
  // const errors = validationResult(req);
57
54
  // if (!errors.isEmpty()) {
58
55
  // return res.status(422).json({ errors: errors.array() });
@@ -103,6 +100,12 @@ async (req, res) => {
103
100
  winston.debug("project_user", project_user);
104
101
  }
105
102
 
103
+
104
+ // sponz: 4/01/23 disable it
105
+ if (!req.body.text && (!req.body.type || req.body.type=="text") ) {
106
+ return res.status(422).json({ errors: ["text field is required"] });
107
+ }
108
+
106
109
  if (sender) {
107
110
 
108
111
  var isObjectId = mongoose.Types.ObjectId.isValid(sender);
package/routes/project.js CHANGED
@@ -407,6 +407,54 @@ router.patch('/:projectid', [passport.authenticate(['basic', 'jwt'], { session:
407
407
  });
408
408
  });
409
409
 
410
+ router.patch('/:projectid/attributes', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('admin')], function (req, res) {
411
+ var data = req.body;
412
+
413
+ // TODO use service method
414
+
415
+ Project.findById(req.params.projectid, function (err, updatedProject) {
416
+ if (err) {
417
+ winston.error('--- > ERROR ', err);
418
+ return res.status(500).send({ success: false, msg: 'Error updating object.' });
419
+ }
420
+
421
+ if (!updatedProject) {
422
+ return res.status(404).send({ success: false, msg: 'Object not found.' });
423
+ }
424
+
425
+ if (!updatedProject.attributes) {
426
+ winston.debug("empty attributes")
427
+ updatedProject.attributes = {};
428
+ }
429
+
430
+ winston.debug(" updatedProject attributes", updatedProject.attributes)
431
+
432
+ Object.keys(data).forEach(function(key) {
433
+ var val = data[key];
434
+ winston.debug("data attributes "+key+" " +val)
435
+ updatedProject.attributes[key] = val;
436
+ });
437
+
438
+ winston.debug(" updatedProject attributes", updatedProject.attributes)
439
+
440
+ // https://stackoverflow.com/questions/24054552/mongoose-not-saving-nested-object
441
+ updatedProject.markModified('attributes');
442
+
443
+ //cacheinvalidation
444
+ updatedProject.save(function (err, savedProject) {
445
+ if (err) {
446
+ winston.error("error saving project attributes",err)
447
+ return res.status(500).send({ success: false, msg: 'Error getting object.' });
448
+ }
449
+ winston.verbose(" saved project attributes",savedProject.toObject())
450
+ projectEvent.emit('project.update', savedProject);
451
+
452
+ res.json(savedProject);
453
+ });
454
+ });
455
+
456
+ });
457
+
410
458
 
411
459
  router.post('/:projectid/ban', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('admin')], function (req, res) {
412
460
  winston.debug('PATCH PROJECT REQ BODY ', req.body);
@@ -453,7 +501,7 @@ router.get('/:projectid', [passport.authenticate(['basic', 'jwt'], { session: fa
453
501
  let q = Project.findOne({_id: req.params.projectid, status:100});
454
502
  if (cacheEnabler.project) {
455
503
  q.cache(cacheUtil.longTTL, "projects:id:"+req.params.projectid) //project_cache
456
- winston.debug('project cache enabled');
504
+ winston.debug('project cache enabled for /project detail');
457
505
  }
458
506
  q.exec(function (err, project) {
459
507
  if (err) {
package/routes/widget.js CHANGED
@@ -8,8 +8,13 @@ var AnalyticResult = require("../models/analyticResult");
8
8
  var Department = require("../models/department");
9
9
  var RoleConstants = require("../models/roleConstants");
10
10
  var cacheUtil = require('../utils/cacheUtil');
11
+ var cacheEnabler = require("../services/cacheEnabler");
12
+ var pubModulesManager = require('../pubmodules/pubModulesManager'); // on constructor init is undefined beacusae pub module is loaded after
13
+ // console.log("pubModulesManager.cache", pubModulesManager.cache);
14
+ const Faq_kb = require("../models/faq_kb");
11
15
 
12
16
  router.get('/load', function(req, res, next) {
17
+
13
18
  winston.debug(req.projectid);
14
19
 
15
20
  // https://stackoverflow.com/questions/24258782/node-express-4-middleware-after-routes
@@ -17,10 +22,57 @@ router.get('/load', function(req, res, next) {
17
22
  // redirect to widget
18
23
  });
19
24
 
20
- router.get('/', function(req, res, next) {
25
+ router.get('/', async (req, res, next) => {
26
+
21
27
  winston.debug(req.projectid);
22
28
 
23
29
 
30
+ var getIp = function() {
31
+ return new Promise(function (resolve, reject) {
32
+ // console.log("getIp")
33
+ // var ip = req.ip;
34
+ var ip = req.headers['x-forwarded-for'] ||
35
+ req.connection.remoteAddress ||
36
+ req.socket.remoteAddress ||
37
+ (req.connection.socket ? req.connection.socket.remoteAddress : null);
38
+ winston.debug("ip:"+ ip);
39
+ return resolve(ip);
40
+ });
41
+ };
42
+
43
+
44
+
45
+ // console.log("pubModulesManager.cache",pubModulesManager.cache);
46
+ // console.log("cacheClient",cacheClient);
47
+ let cacheClient = undefined;
48
+ if (pubModulesManager.cache) {
49
+ cacheClient = pubModulesManager.cache._cache._cache; //_cache._cache to jump directly to redis modules without cacheoose wrapper (don't support await)
50
+ }
51
+
52
+ var cacheKey = req.projectid+":widgets";
53
+
54
+ if (cacheEnabler.widgets && cacheClient) {
55
+ winston.debug("Getting cache for widgets key: " + cacheKey);
56
+ const value = await cacheClient.get(cacheKey);
57
+
58
+ if (value) {
59
+ winston.debug("Getted cache for widgets key: " + cacheKey + " value:", value);
60
+
61
+ value.ip = await getIp(); //calculate ip each time without getting it from cache
62
+
63
+ winston.debug("value",value);
64
+
65
+ res.json(value);
66
+ // https://stackoverflow.com/questions/24258782/node-express-4-middleware-after-routes
67
+ next(); // <=== call next for following middleware
68
+ return;
69
+ } else {
70
+ winston.debug("Widget cache NOT found");
71
+ }
72
+
73
+ }
74
+ // console.log("/widgets without cache found");
75
+
24
76
  var availableUsers = function() {
25
77
  winston.debug('availableUsers:');
26
78
  return new Promise(function (resolve, reject) {
@@ -74,17 +126,30 @@ router.get('/', function(req, res, next) {
74
126
  };
75
127
 
76
128
 
77
- var getIp = function() {
129
+
130
+ var botsRules = function() {
78
131
  return new Promise(function (resolve, reject) {
79
- // var ip = req.ip;
80
- var ip = req.headers['x-forwarded-for'] ||
81
- req.connection.remoteAddress ||
82
- req.socket.remoteAddress ||
83
- (req.connection.socket ? req.connection.socket.remoteAddress : null);
84
- winston.debug("ip:"+ ip);
85
- return resolve(ip);
86
- });
87
- };
132
+ Faq_kb.find({ "id_project": req.projectid, "trashed": { $in: [null, false] } }, function (err, bots) {
133
+ winston.debug("bots",bots);
134
+ let rules = [];
135
+ bots.forEach(function(bot) {
136
+ winston.debug("bot.attributes",bot.attributes);
137
+ // && bot.attributes.rules.length > 0
138
+ if (bot.attributes && bot.attributes.rules) {
139
+ winston.debug("bot.attributes.rules",bot.attributes.rules);
140
+ bot.attributes.rules.forEach(function(rule) {
141
+ rules.push(rule);
142
+ });
143
+ // rules.concat(bot.attributes.rules);
144
+ }
145
+ });
146
+ winston.debug("resolve",rules);
147
+ // return resolve(bots);
148
+ return resolve(rules);
149
+
150
+ });
151
+ });
152
+ }
88
153
 
89
154
 
90
155
  var getDepartments = function(req) {
@@ -169,14 +234,31 @@ router.get('/', function(req, res, next) {
169
234
  availableUsers()
170
235
  ,
171
236
  getDepartments(req)
172
- ,
237
+ // ,
173
238
  // waiting()unused used 620e87f02e7fda00350ea5a5/publicanalytics/waiting/current
174
239
  ,
175
240
  getIp()
241
+ ,
242
+ botsRules()
176
243
 
177
244
 
178
245
  ]).then(function(all) {
179
- let result = {project: all[0], user_available: all[1], departments: all[2], waiting: all[3], ip: all[4]};
246
+ // console.log("all", all);
247
+ let result = {project: all[0], user_available: all[1], departments: all[2], ip: all[3], botsRules: all[4]};
248
+ // let result = {project: all[0], user_available: all[1], departments: all[2], waiting: all[3], ip: all[4]};
249
+
250
+
251
+ if (cacheEnabler.widgets && cacheClient) {
252
+ let cloned_result = Object.assign({}, result);
253
+ delete cloned_result.ip; //removing uncachable ip from cache
254
+ winston.debug("Creating cache for widgets key: " + cacheKey);
255
+ cacheClient.set(cacheKey, cloned_result, cacheUtil.longTTL, (err, reply) => {
256
+ winston.verbose("Created cache for widgets",{err:err});
257
+ winston.debug("Created cache for widgets reply:"+reply);
258
+ });
259
+
260
+ }
261
+
180
262
  res.json(result);
181
263
  // https://stackoverflow.com/questions/24258782/node-express-4-middleware-after-routes
182
264
  next(); // <=== call next for following middleware
@@ -24,6 +24,9 @@ class BotSubscriptionNotifier {
24
24
  // // url = url.replace ("$res_bot_url", prendi da env)
25
25
  // }
26
26
 
27
+ //Removed snapshot from request
28
+ delete payload.request.snapshot
29
+
27
30
  var json = {timestamp: Date.now(), payload: payload};
28
31
 
29
32
 
@@ -37,6 +37,11 @@ class CacheEnabler {
37
37
  this.project_user = false;
38
38
  }
39
39
 
40
+ this.widgets = true;
41
+ if (process.env.CACHE_WIDGETS_ENABLED=="false" || process.env.CACHE_WIDGETS_ENABLED==false) {
42
+ this.widgets = false;
43
+ }
44
+
40
45
  // this.user = true;
41
46
  // if (process.env.CACHE_USER_ENABLED=="false" || process.env.CACHE_USER_ENABLED==false) {
42
47
  // this.user = false;
@@ -195,7 +195,7 @@ getOperators(departmentid, projectid, nobot, disableWebHookCall, context) {
195
195
  let q = Project.findOne({_id: projectid, status: 100})
196
196
  if (cacheEnabler.project) {
197
197
  q.cache(cacheUtil.longTTL, "projects:id:"+projectid) //project_cache
198
- winston.debug('project cache enabled');
198
+ winston.debug('project cache enabled for getOperators');
199
199
  }
200
200
  return q.exec(function(err, project){
201
201
  if (err) {
@@ -14,7 +14,7 @@ class OperatingHoursService {
14
14
  let q = Project.findOne({_id: projectId, status: 100});
15
15
  if (cacheEnabler.project) {
16
16
  q.cache(cacheUtil.longTTL, "projects:id:"+projectId) //project_cache
17
- winston.debug('project cache enabled');
17
+ winston.debug('project cache enabled for projectIsOpenNow');
18
18
  }
19
19
  q.exec(function (err, project) {
20
20
  // winston.debug("XXXXXXXX project", project);
@@ -86,10 +86,16 @@ class SubscriptionNotifier {
86
86
 
87
87
  if (s.global==true){
88
88
  signOptions.audience = 'https://tiledesk.com';
89
- secret = process.env.GLOBAL_SECRET || config.secret;
89
+
90
+ var alg = process.env.GLOBAL_SECRET_ALGORITHM;
91
+ if (alg) {
92
+ signOptions.algorithm = alg;
93
+ }
94
+
95
+ secret = process.env.GLOBAL_SECRET_OR_PRIVATE_KEY || process.env.GLOBAL_SECRET || config.secret;
90
96
  }
91
97
 
92
- var token = jwt.sign(sJson, secret, signOptions);
98
+ var token = jwt.sign(sJson, secret, signOptions); //priv_jwt pp_jwt
93
99
  json["token"] = token;
94
100
 
95
101
 
@@ -75,7 +75,9 @@
75
75
  <body itemscope itemtype="http://schema.org/EmailMessage" style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none; width: 100% !important; height: 100%; line-height: 1.6em; background-color: #f6f6f6; margin: 0;" bgcolor="#f6f6f6">
76
76
 
77
77
  {{#if baseScope.replyEnabled}}
78
+ {{#if request_id}}
78
79
  <div>\# Please type your reply above this line \#</div>
80
+ {{/if}}
79
81
  {{/if}}
80
82
 
81
83
  <table class="main" width="100%" cellpadding="0" cellspacing="0" style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; border-radius: 3px; background-color: #fff; margin: 0; border: 1px solid #e9e9e9;" bgcolor="#fff">
@@ -90,7 +90,7 @@
90
90
 
91
91
  <div style="text-align:center">
92
92
  <a href="http://www.tiledesk.com" style="color:#2daae1;font-weight:bold;text-decoration:none;word-break:break-word" target="_blank">
93
- <img src="https://tiledesk.com/wp-content/uploads/2022/09/tiledeesk_log_email.png" class="CToWUd">
93
+ <img src="https://tiledesk.com/wp-content/uploads/2023/01/tiledesk_log_email_200.png" class="CToWUd">
94
94
  </a>
95
95
  </div>
96
96
  </tr>
@@ -903,7 +903,7 @@ it('createMultiTextNoSenderNoText', function (done) {
903
903
  .end(function(err, res) {
904
904
  //console.log("res", res);
905
905
  console.log("res.body", res.body);
906
- res.should.have.status(500);
906
+ res.should.have.status(200);
907
907
 
908
908
  done();
909
909
  });
@@ -22,7 +22,7 @@ var cacheUtil = require('../utils/cacheUtil');
22
22
  var mongoose = require('mongoose');
23
23
  const requestConstants = require("../models/requestConstants");
24
24
  var RoleConstants = require('../models/roleConstants');
25
- let configSecret = process.env.GLOBAL_SECRET || config.secret;
25
+ let configSecretOrPubicKay = process.env.GLOBAL_SECRET_OR_PUB_KEY || process.env.GLOBAL_SECRET || config.secret;
26
26
  var cacheEnabler = require("../services/cacheEnabler");
27
27
 
28
28
 
@@ -71,14 +71,14 @@ class WebSocketServer {
71
71
 
72
72
  var token = queryParameter.token;
73
73
  winston.debug('token:'+ token);
74
- winston.debug('configSecret:'+ configSecret);
74
+ winston.debug('configSecretOrPubicKay:'+ configSecretOrPubicKay);
75
75
 
76
76
 
77
77
  if (!token)
78
78
  cb(false, 401, 'Unauthorized');
79
79
  else {
80
80
  token = token.replace('JWT ', '');
81
- jwt.verify(token, configSecret, function (err, decoded) {
81
+ jwt.verify(token, configSecretOrPubicKay, function (err, decoded) { //pub_jwt pp_jwt
82
82
  if (err) {
83
83
  winston.error('WebSocket error verifing websocket jwt token ', err);
84
84
  return cb(false, 401, 'Unauthorized');
@@ -189,7 +189,7 @@ class WebSocketServer {
189
189
 
190
190
  if (cacheEnabler.project) {
191
191
  q.cache(cacheUtil.defaultTTL, "projects:id:"+projectId) //project_cache
192
- winston.debug('project cache enabled');
192
+ winston.debug('project cache enabled for websocket');
193
193
  }
194
194
 
195
195
  return q.exec(function(err, project) {