@tiledesk/tiledesk-server 2.3.22 → 2.3.24
Sign up to get free protection for your applications and to get access to all the features.
- package/CHANGELOG.md +24 -6
- package/app.js +19 -5
- package/channels/chat21/chat21WebHook.js +20 -11
- package/event/messageEvent.js +33 -12
- package/middleware/passport.js +1 -1
- package/package.json +2 -2
- package/pubmodules/cache/mongoose-cachegoose-fn.js +106 -2
- package/pubmodules/messageTransformer/messageHandlebarsTransformerInterceptor.js +6 -1
- package/pubmodules/messageTransformer/messageTransformerInterceptor.js +10 -4
- package/pubmodules/routing-queue/listener.js +1 -1
- package/pubmodules/trigger/rulesTrigger.js +16 -4
- package/routes/message.js +13 -5
- package/routes/project.js +10 -4
- package/routes/request.js +11 -6
- package/services/cacheEnabler.js +51 -0
- package/services/departmentService.js +25 -3
- package/services/operatingHoursService.js +9 -4
- package/services/requestService.js +46 -28
- package/services/subscriptionNotifier.js +8 -3
- package/websocket/webSocketServer.js +10 -5
package/CHANGELOG.md
CHANGED
@@ -1,6 +1,25 @@
|
|
1
1
|
|
2
2
|
|
3
|
+
💥 TILEDESK SERVER v2.3.23 💥
|
4
|
+
🚀 TAGGED AND PUBLISHED ON NPM 🚀
|
5
|
+
🚀 IN PRODUCTION 🚀
|
6
|
+
(https://www.npmjs.com/package/@tiledesk/tiledesk-server/v/2.3.17)
|
7
|
+
|
8
|
+
# 2.3.23 -> PROD
|
9
|
+
- cacheEnabler + trigger cache + subscription cache
|
10
|
+
- project cache with cacheEnabler
|
11
|
+
- request cache with cacheEnabler
|
12
|
+
- Updated dependency @tiledesk/tiledesk-tybot-connector to 0.1.10
|
13
|
+
- Added trigger and subscription cache invalidation rules
|
14
|
+
|
15
|
+
# 2.3.22
|
16
|
+
- added cacheoose dep package.json
|
17
|
+
- Updated dependency @tiledesk/tiledesk-tybot-connector to 0.1.8
|
18
|
+
|
3
19
|
# 2.3.21
|
20
|
+
- log fix
|
21
|
+
- Updated dependency @tiledesk/tiledesk-tybot-connector to 0.1.7
|
22
|
+
- Moved cache module to public module
|
4
23
|
- filter request by smartAssignment
|
5
24
|
|
6
25
|
# 2.3.20
|
@@ -11,14 +30,13 @@
|
|
11
30
|
- Moved route-queue to public module
|
12
31
|
- Disable queue module if JOB_WORKER_ENABLED is true
|
13
32
|
|
33
|
+
# 2.3.18.2
|
34
|
+
- logfix
|
14
35
|
|
36
|
+
# 2.3.18.1
|
37
|
+
- Updated dependency @tiledesk/tiledesk-tybot-connector to 0.1.10
|
15
38
|
|
16
|
-
|
17
|
-
🚀 TAGGED AND PUBLISHED ON NPM 🚀
|
18
|
-
🚀 IN PRODUCTION 🚀
|
19
|
-
(https://www.npmjs.com/package/@tiledesk/tiledesk-server/v/2.3.17)
|
20
|
-
|
21
|
-
# 2.3.18 -> PROD
|
39
|
+
# 2.3.18
|
22
40
|
- Added profileStatus field to the project_user model
|
23
41
|
- Added smartAssignment field to the request model
|
24
42
|
- Canned responses default limit value increased from 40 to 1000
|
package/app.js
CHANGED
@@ -33,6 +33,9 @@ var roleChecker = require('./middleware/has-role');
|
|
33
33
|
const MaskData = require("maskdata");
|
34
34
|
var winston = require('./config/winston');
|
35
35
|
|
36
|
+
|
37
|
+
// DATABASE CONNECTION
|
38
|
+
|
36
39
|
// https://bretkikehara.wordpress.com/2013/05/02/nodejs-creating-your-first-global-module/
|
37
40
|
var databaseUri = process.env.DATABASE_URI || process.env.MONGODB_URI || config.database;
|
38
41
|
|
@@ -78,7 +81,7 @@ mongoose.set('useCreateIndex', true);
|
|
78
81
|
mongoose.set('useUnifiedTopology', false);
|
79
82
|
|
80
83
|
|
81
|
-
|
84
|
+
// ROUTES DECLARATION
|
82
85
|
var auth = require('./routes/auth');
|
83
86
|
var authtest = require('./routes/authtest');
|
84
87
|
var authtestWithRoleCheck = require('./routes/authtestWithRoleCheck');
|
@@ -124,18 +127,24 @@ var bootDataLoader = require('./services/bootDataLoader');
|
|
124
127
|
var settingDataLoader = require('./services/settingDataLoader');
|
125
128
|
var schemaMigrationService = require('./services/schemaMigrationService');
|
126
129
|
var RouterLogger = require('./models/routerLogger');
|
130
|
+
var cacheEnabler = require("./services/cacheEnabler");
|
127
131
|
|
128
132
|
require('./services/mongoose-cache-fn')(mongoose);
|
129
133
|
|
134
|
+
|
130
135
|
var subscriptionNotifier = require('./services/subscriptionNotifier');
|
131
136
|
subscriptionNotifier.start();
|
132
137
|
|
133
138
|
var botSubscriptionNotifier = require('./services/BotSubscriptionNotifier');
|
134
139
|
botSubscriptionNotifier.start();
|
135
140
|
|
141
|
+
// job_here
|
142
|
+
|
136
143
|
|
137
144
|
var geoService = require('./services/geoService');
|
138
|
-
geoService.listen();
|
145
|
+
geoService.listen();
|
146
|
+
|
147
|
+
|
139
148
|
|
140
149
|
var faqBotHandler = require('./services/faqBotHandler');
|
141
150
|
faqBotHandler.listen();
|
@@ -148,6 +157,7 @@ channelManager.listen();
|
|
148
157
|
|
149
158
|
var IPFilter = require('./middleware/ipFilter');
|
150
159
|
|
160
|
+
// job_here
|
151
161
|
var BanUserNotifier = require('./services/banUserNotifier');
|
152
162
|
BanUserNotifier.listen();
|
153
163
|
|
@@ -310,9 +320,13 @@ var projectSetter = function (req, res, next) {
|
|
310
320
|
winston.debug("projectSetter projectid:" + projectid);
|
311
321
|
|
312
322
|
if (projectid) {
|
313
|
-
|
314
|
-
|
315
|
-
|
323
|
+
|
324
|
+
let q = Project.findOne({_id: projectid, status: 100});
|
325
|
+
if (cacheEnabler.project) {
|
326
|
+
q.cache(cacheUtil.defaultTTL, "projects:id:"+projectid) //project_cache
|
327
|
+
winston.debug('project cache enabled');
|
328
|
+
}
|
329
|
+
q.exec(function(err, project){
|
316
330
|
if (err) {
|
317
331
|
winston.warn("Problem getting project with id: " + projectid + " req.originalUrl: " + req.originalUrl);
|
318
332
|
}
|
@@ -9,6 +9,8 @@ var Project_user = require("../../models/project_user");
|
|
9
9
|
var RequestConstants = require("../../models/requestConstants");
|
10
10
|
|
11
11
|
var cacheUtil = require('../../utils/cacheUtil');
|
12
|
+
var cacheEnabler = require("../../services/cacheEnabler");
|
13
|
+
|
12
14
|
|
13
15
|
var mongoose = require('mongoose');
|
14
16
|
var winston = require('../../config/winston');
|
@@ -73,11 +75,17 @@ router.post('/', function (req, res) {
|
|
73
75
|
winston.debug("Chat21 message", message);
|
74
76
|
|
75
77
|
// requestcachefarequi nocachepopulatereqired
|
76
|
-
|
78
|
+
let q = Request.findOne({request_id: message.recipient})
|
79
|
+
|
80
|
+
if (cacheEnabler.request) {
|
81
|
+
q.cache(cacheUtil.defaultTTL, "requests:request_id:"+message.recipient+":simple"); //request_cache
|
82
|
+
// project_id not available
|
83
|
+
winston.debug('request cache enabled');
|
84
|
+
}
|
85
|
+
return q.exec(function(err, request) {
|
86
|
+
|
77
87
|
// before request_id id_project unique - commented
|
78
|
-
|
79
|
-
// .cache(cacheUtil.defaultTTL, req.projectid+":requests:request_id:"+requestid) project_id not available
|
80
|
-
.exec(function(err, request) {
|
88
|
+
|
81
89
|
|
82
90
|
if (err) {
|
83
91
|
return res.status(500).send({success: false, msg: 'Error getting the request.', err:err});
|
@@ -296,12 +304,10 @@ router.post('/', function (req, res) {
|
|
296
304
|
// TODO it doesn't work for internal requests bacause participanets == message.sender⁄
|
297
305
|
if (request.participants && request.participants.indexOf(message.sender) > -1) { //update waiitng time if write an agent (member of participants)
|
298
306
|
winston.debug("updateWaitingTimeByRequestId");
|
299
|
-
|
300
307
|
return requestService.updateWaitingTimeByRequestId(request.request_id, request.id_project).then(function(upRequest) {
|
301
308
|
return res.json(upRequest);
|
302
309
|
});
|
303
310
|
}else {
|
304
|
-
|
305
311
|
return res.json(savedMessage);
|
306
312
|
}
|
307
313
|
// });
|
@@ -380,9 +386,12 @@ router.post('/', function (req, res) {
|
|
380
386
|
var query = {request_id: recipient_id, id_project: projectId};
|
381
387
|
winston.debug('query:'+ projectId);
|
382
388
|
|
383
|
-
|
384
|
-
|
385
|
-
.
|
389
|
+
let q = Request.findOne(query);
|
390
|
+
// if (cacheEnabler.request) {
|
391
|
+
// q.cache(cacheUtil.defaultTTL, projectId+":requests:request_id:"+recipient_id+":simple"); //request_cache NOT IMPORTANT HERE
|
392
|
+
// winston.debug('project cache enabled');
|
393
|
+
// }
|
394
|
+
return q.exec(function(err, request) {
|
386
395
|
|
387
396
|
if (err) {
|
388
397
|
winston.error("Error finding request with query ", query);
|
@@ -464,7 +473,7 @@ router.post('/', function (req, res) {
|
|
464
473
|
|
465
474
|
// requestcachefarequi populaterequired
|
466
475
|
return Request.findOne({request_id: request_id, id_project: id_project})
|
467
|
-
.populate('lead') //TODO posso prenderlo da snapshot senza populate
|
476
|
+
.populate('lead') //TODO posso prenderlo da snapshot senza populate cache_attention
|
468
477
|
.exec(function(err, request) {
|
469
478
|
if (err){
|
470
479
|
winston.error(err);
|
@@ -631,7 +640,7 @@ else if (req.body.event_type == "typing-start") {
|
|
631
640
|
// requestcachefarequi nocachepopulatereqired
|
632
641
|
return Request.findOne({request_id: recipient_id})
|
633
642
|
//TOD errore cache sistemare e riabbilitare->
|
634
|
-
// .cache(cacheUtil.defaultTTL, req.projectid+":requests:request_id:"+recipient_id)
|
643
|
+
// .cache(cacheUtil.defaultTTL, req.projectid+":requests:request_id:"+recipient_id) cache_attention
|
635
644
|
.exec(function(err, request) {
|
636
645
|
if (err){
|
637
646
|
winston.error(err);
|
package/event/messageEvent.js
CHANGED
@@ -7,7 +7,7 @@ var MessageConstants = require("../models/messageConstants");
|
|
7
7
|
var message2Event = require("../event/message2Event");
|
8
8
|
|
9
9
|
var cacheUtil = require('../utils/cacheUtil');
|
10
|
-
|
10
|
+
var cacheEnabler = require("../services/cacheEnabler");
|
11
11
|
|
12
12
|
|
13
13
|
class MessageEvent extends EventEmitter {
|
@@ -34,14 +34,18 @@ function emitCompleteMessage(message) {
|
|
34
34
|
}
|
35
35
|
|
36
36
|
messageEvent.on('message.create', emitCompleteMessage);
|
37
|
-
|
37
|
+
|
38
|
+
// messageEvent.on('message.update.simple', emitCompleteMessage); //if populateMessageUpdate is disabled then you must forward message.update event from message.update.simple
|
39
|
+
messageEvent.on('message.update', emitCompleteMessage); // i must restore populateMessageWithRequest. see below
|
38
40
|
|
39
41
|
function populateMessageCreate(message) {
|
40
42
|
return populateMessageWithRequest(message, 'message.create');
|
41
43
|
}
|
42
44
|
function populateMessageUpdate(message) {
|
43
|
-
|
44
|
-
return; // do not populate message.update it's not used by anyone.
|
45
|
+
return populateMessageWithRequest(message, 'message.update');
|
46
|
+
// return; // do not populate message.update it's not used by anyone.
|
47
|
+
///it is used by \agent interceptor. Without populateMessageWithRequest \agent sent by bot doesn't work. i must restore populateMessageWithRequest
|
48
|
+
// Not used by webhook. populate for message.update is slow.
|
45
49
|
}
|
46
50
|
|
47
51
|
|
@@ -56,26 +60,35 @@ function populateMessageWithRequest(message, eventPrefix) {
|
|
56
60
|
|
57
61
|
// cacherequest // requestcachefarequi populaterequired cacheveryhightpriority
|
58
62
|
|
59
|
-
Request.findOne({request_id: message.recipient, id_project: message.id_project}).
|
63
|
+
let q = Request.findOne({request_id: message.recipient, id_project: message.id_project}).
|
60
64
|
populate('lead').
|
61
65
|
populate('department').
|
62
66
|
populate('participatingBots').
|
63
67
|
populate('participatingAgents').
|
64
68
|
populate({path:'requester',populate:{path:'id_user'}}).
|
65
|
-
lean()
|
69
|
+
lean();
|
70
|
+
|
71
|
+
|
66
72
|
//perche lean?
|
67
73
|
// TODO availableAgentsCount nn c'è per il lean problema trigger
|
68
74
|
// request.department._id DA CORREGGERE ANCHE PER REQUEST.CREATE
|
69
75
|
// request.department.hasBot
|
70
76
|
// request.isOpen
|
71
|
-
|
72
|
-
|
77
|
+
winston.info('message Event populate');
|
78
|
+
if (cacheEnabler.request) {
|
79
|
+
q.cache(cacheUtil.defaultTTL, message.id_project+":requests:request_id:"+message.recipient) //request_cache ma con lean????attento metti a parte
|
80
|
+
winston.debug('request cache enabled');
|
81
|
+
}
|
82
|
+
q.exec(function (err, request) {
|
73
83
|
|
74
84
|
if (err) {
|
75
85
|
winston.error("Error getting request on messageEvent.populateMessage",err );
|
76
86
|
return messageEvent.emit(eventPrefix, message);
|
77
87
|
}
|
78
88
|
|
89
|
+
winston.debug('message Event populate after query');
|
90
|
+
|
91
|
+
|
79
92
|
if (request) {
|
80
93
|
winston.debug("request is defined in messageEvent",request );
|
81
94
|
|
@@ -84,9 +97,14 @@ function populateMessageWithRequest(message, eventPrefix) {
|
|
84
97
|
|
85
98
|
if (request.department && request.department.id_bot) {
|
86
99
|
// if (request.department) {
|
87
|
-
Faq_kb.findById(request.department.id_bot)
|
88
|
-
|
89
|
-
.
|
100
|
+
let qbot = Faq_kb.findById(request.department.id_bot)
|
101
|
+
|
102
|
+
if (cacheEnabler.faq_kb) {
|
103
|
+
qbot.cache(cacheUtil.defaultTTL, message.id_project+":faq_kbs:id:"+request.department.id_bot)
|
104
|
+
winston.debug('faq_kb cache enabled');
|
105
|
+
}
|
106
|
+
|
107
|
+
qbot.exec(function(err, bot) {
|
90
108
|
winston.debug('bot', bot);
|
91
109
|
requestJson.department.bot = bot
|
92
110
|
|
@@ -162,7 +180,10 @@ messageEvent.on('message.update.simple', populateMessageUpdate);
|
|
162
180
|
|
163
181
|
|
164
182
|
|
165
|
-
// riattiva commentato per performance
|
183
|
+
// // riattiva commentato per performance
|
184
|
+
|
185
|
+
// // spostare su classe
|
186
|
+
|
166
187
|
|
167
188
|
|
168
189
|
// var messageCreateKey = 'message.create';
|
package/middleware/passport.js
CHANGED
@@ -138,7 +138,7 @@ module.exports = function(passport) {
|
|
138
138
|
|
139
139
|
winston.debug("project id: "+ AudienceId );
|
140
140
|
Project.findOne({_id: AudienceId, status: 100}).select('+jwtSecret')
|
141
|
-
//@DISABLED_CACHE .cache(cacheUtil.queryTTL, "projects:query:id:status:100:"+AudienceId+":select:+jwtSecret")
|
141
|
+
//@DISABLED_CACHE .cache(cacheUtil.queryTTL, "projects:query:id:status:100:"+AudienceId+":select:+jwtSecret") //project_cache
|
142
142
|
.exec(function (err, project){
|
143
143
|
if (err) {
|
144
144
|
winston.error("auth Project err: ", {error:err, decoded: decoded} );
|
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.
|
4
|
+
"version": "2.3.24",
|
5
5
|
"scripts": {
|
6
6
|
"start": "node ./bin/www",
|
7
7
|
"pretest": "mongodb-runner start",
|
@@ -41,7 +41,7 @@
|
|
41
41
|
"@tiledesk/tiledesk-chatbot-util": "^0.8.33",
|
42
42
|
"@tiledesk/tiledesk-json-rules-engine": "^4.0.3",
|
43
43
|
"@tiledesk/tiledesk-rasa-connector": "^1.0.10",
|
44
|
-
"@tiledesk/tiledesk-tybot-connector": "^0.1.
|
44
|
+
"@tiledesk/tiledesk-tybot-connector": "^0.1.14",
|
45
45
|
"app-root-path": "^3.0.0",
|
46
46
|
"bcrypt-nodejs": "0.0.3",
|
47
47
|
"body-parser": "^1.20.0",
|
@@ -6,7 +6,8 @@
|
|
6
6
|
var authEvent = require("../../event/authEvent");
|
7
7
|
var labelEvent = require("../../event/labelEvent");
|
8
8
|
|
9
|
-
|
9
|
+
var triggerEventEmitter = require("../trigger/event/triggerEventEmitter");
|
10
|
+
var subscriptionEvent = require("../../event/subscriptionEvent");
|
10
11
|
|
11
12
|
var winston = require('../../config/winston');
|
12
13
|
|
@@ -202,6 +203,35 @@
|
|
202
203
|
|
203
204
|
|
204
205
|
|
206
|
+
requestEvent.on("request.create.simple", function(request) {
|
207
|
+
setImmediate(() => {
|
208
|
+
var key = request.id_project+":requests:id:"+request.id+":simple";
|
209
|
+
winston.verbose("Creating cache for request.create.simple with key: " + key);
|
210
|
+
|
211
|
+
client.set(key, request, defaultTTL, (err, reply) => {
|
212
|
+
winston.debug("Created cache for request.create.simple",reply);
|
213
|
+
winston.verbose("Created cache for request.create.simple",{err:err});
|
214
|
+
});
|
215
|
+
|
216
|
+
|
217
|
+
var key = "requests:id:"+request.request_id+":simple"; //without project for chat21 webhook
|
218
|
+
winston.verbose("Creating cache for request.create.simple with key: " + key);
|
219
|
+
|
220
|
+
client.set(key, request, defaultTTL, (err, reply) => {
|
221
|
+
winston.debug("Created cache for request.create.simple",reply);
|
222
|
+
winston.verbose("Created cache for request.create.simple",{err:err});
|
223
|
+
});
|
224
|
+
|
225
|
+
var key = request.id_project+":requests:request_id:"+request.request_id+":simple";
|
226
|
+
winston.verbose("Creating cache for request.create.simple with key: " + key);
|
227
|
+
client.set(key, request, defaultTTL, (err, reply) => {
|
228
|
+
winston.debug("Created cache for request.create.simple",reply);
|
229
|
+
winston.verbose("Created cache for request.create.simple",{err:err});
|
230
|
+
});
|
231
|
+
|
232
|
+
})
|
233
|
+
});
|
234
|
+
|
205
235
|
requestEvent.on("request.create", function(request) {
|
206
236
|
setImmediate(() => {
|
207
237
|
var key = request.id_project+":requests:id:"+request.id;
|
@@ -448,8 +478,82 @@
|
|
448
478
|
|
449
479
|
// fai cache per subscription.create, .update .delete
|
450
480
|
|
451
|
-
// fai cache per trigger.create, .update .delete
|
452
481
|
|
482
|
+
if (subscriptionEvent) {
|
483
|
+
subscriptionEvent.on('subscription.create', function(trigger) {
|
484
|
+
setImmediate(() => {
|
485
|
+
|
486
|
+
var key =trigger.id_project+":subscriptions:*";
|
487
|
+
winston.verbose("Deleting cache for subscription.create with key: " + key);
|
488
|
+
client.del(key, function (err, reply) {
|
489
|
+
winston.debug("Deleted cache for subscription.create",reply);
|
490
|
+
winston.verbose("Deleted cache for subscription.create",{err:err});
|
491
|
+
});
|
492
|
+
});
|
493
|
+
});
|
494
|
+
|
495
|
+
subscriptionEvent.on('subscription.update', function(trigger) {
|
496
|
+
setImmediate(() => {
|
497
|
+
var key =trigger.id_project+":subscriptions:*";
|
498
|
+
winston.verbose("Deleting cache for subscription.update with key: " + key);
|
499
|
+
client.del(key, function (err, reply) {
|
500
|
+
winston.debug("Deleted cache for subscription.update",reply);
|
501
|
+
winston.verbose("Deleted cache for subscription.update",{err:err});
|
502
|
+
});
|
503
|
+
});
|
504
|
+
});
|
505
|
+
|
506
|
+
subscriptionEvent.on("subscription.delete", function(trigger) {
|
507
|
+
setImmediate(() => {
|
508
|
+
var key =trigger.id_project+":subscriptions:*";
|
509
|
+
winston.verbose("Deleting cache for subscription.delete with key: " + key);
|
510
|
+
client.del(key, function (err, reply) {
|
511
|
+
winston.debug("Deleted cache for subscription.delete",reply);
|
512
|
+
winston.verbose("Deleted cache for subscription.delete",{err:err});
|
513
|
+
});
|
514
|
+
});
|
515
|
+
});
|
516
|
+
|
517
|
+
}
|
518
|
+
|
519
|
+
|
520
|
+
if (triggerEventEmitter) {
|
521
|
+
triggerEventEmitter.on('trigger.create', function(trigger) {
|
522
|
+
setImmediate(() => {
|
523
|
+
|
524
|
+
var key =trigger.id_project+":triggers:*";
|
525
|
+
winston.verbose("Deleting cache for trigger.create with key: " + key);
|
526
|
+
client.del(key, function (err, reply) {
|
527
|
+
winston.debug("Deleted cache for trigger.create",reply);
|
528
|
+
winston.verbose("Deleted cache for trigger.create",{err:err});
|
529
|
+
});
|
530
|
+
});
|
531
|
+
});
|
532
|
+
|
533
|
+
triggerEventEmitter.on('trigger.update', function(trigger) {
|
534
|
+
setImmediate(() => {
|
535
|
+
var key =trigger.id_project+":triggers:*";
|
536
|
+
winston.verbose("Deleting cache for trigger.update with key: " + key);
|
537
|
+
client.del(key, function (err, reply) {
|
538
|
+
winston.debug("Deleted cache for trigger.update",reply);
|
539
|
+
winston.verbose("Deleted cache for trigger.update",{err:err});
|
540
|
+
});
|
541
|
+
});
|
542
|
+
});
|
543
|
+
|
544
|
+
triggerEventEmitter.on("trigger.delete", function(trigger) {
|
545
|
+
setImmediate(() => {
|
546
|
+
var key =trigger.id_project+":triggers:*";
|
547
|
+
winston.verbose("Deleting cache for trigger.delete with key: " + key);
|
548
|
+
client.del(key, function (err, reply) {
|
549
|
+
winston.debug("Deleted cache for trigger.delete",reply);
|
550
|
+
winston.verbose("Deleted cache for trigger.delete",{err:err});
|
551
|
+
});
|
552
|
+
});
|
553
|
+
});
|
554
|
+
|
555
|
+
}
|
556
|
+
|
453
557
|
//jwt
|
454
558
|
|
455
559
|
// fai cache faq
|
@@ -4,6 +4,7 @@ const Request = require('../../models/request');
|
|
4
4
|
var winston = require('../../config/winston');
|
5
5
|
var cacheUtil = require('../../utils/cacheUtil');
|
6
6
|
var handlebars = require('handlebars');
|
7
|
+
var cacheEnabler = require("../../services/cacheEnabler");
|
7
8
|
|
8
9
|
class MessageHandlebarsTransformerInterceptor {
|
9
10
|
|
@@ -38,8 +39,12 @@ class MessageHandlebarsTransformerInterceptor {
|
|
38
39
|
populate({path:'requester',populate:{path:'id_user'}});
|
39
40
|
// }
|
40
41
|
|
42
|
+
if (cacheEnabler.request) {
|
43
|
+
q1.cache(cacheUtil.defaultTTL, message.id_project+":requests:request_id:"+message.recipient) //request_cache
|
44
|
+
winston.debug('request cache enabled');
|
45
|
+
}
|
46
|
+
|
41
47
|
var request = await q1
|
42
|
-
//@DISABLED_CACHE .cache(cacheUtil.defaultTTL, message.id_project+":requests:request_id:"+message.recipient)
|
43
48
|
.exec();
|
44
49
|
|
45
50
|
|
@@ -5,6 +5,7 @@ const Request = require('../../models/request');
|
|
5
5
|
var winston = require('../../config/winston');
|
6
6
|
var i8nUtil = require("../../utils/i8nUtil");
|
7
7
|
var cacheUtil = require('../../utils/cacheUtil');
|
8
|
+
var cacheEnabler = require("../../services/cacheEnabler");
|
8
9
|
|
9
10
|
//TODO rename to LabelMessageTransformerInterceptor
|
10
11
|
class MessageTransformerInterceptor {
|
@@ -36,15 +37,20 @@ class MessageTransformerInterceptor {
|
|
36
37
|
|
37
38
|
var language = "EN";
|
38
39
|
|
39
|
-
|
40
|
-
var request = await Request.findOne({request_id: message.recipient, id_project: message.id_project})
|
40
|
+
let q = Request.findOne({request_id: message.recipient, id_project: message.id_project});
|
41
41
|
// populate('lead').
|
42
42
|
// populate('department').
|
43
43
|
// populate('participatingBots').
|
44
44
|
// populate('participatingAgents').
|
45
45
|
// populate({path:'requester',populate:{path:'id_user'}}).
|
46
|
-
|
47
|
-
|
46
|
+
|
47
|
+
if (cacheEnabler.request) {
|
48
|
+
q.cache(cacheUtil.defaultTTL, message.id_project+":requests:request_id:"+message.recipient+":simple") //request_cache nocachepopulatereqired
|
49
|
+
winston.debug('request cache enabled');
|
50
|
+
}
|
51
|
+
|
52
|
+
|
53
|
+
var request = await q.exec();
|
48
54
|
|
49
55
|
winston.debug('request mti: ', request);
|
50
56
|
|
@@ -157,7 +157,7 @@ class Listener {
|
|
157
157
|
// departmentEvent.prependListener('operator.select', async (data) => {
|
158
158
|
|
159
159
|
var operatorsResult = res.result;
|
160
|
-
winston.
|
160
|
+
winston.debug('operator.select.base2 res', res);
|
161
161
|
|
162
162
|
|
163
163
|
var disableWebHookCall = res.disableWebHookCall;
|
@@ -19,6 +19,7 @@ var LeadConstants = require('../../models/leadConstants');
|
|
19
19
|
var operatingHoursService = require("../../services/operatingHoursService");
|
20
20
|
var sendMessageUtil = require("../../utils/sendMessageUtil");
|
21
21
|
var cacheUtil = require("../../utils/cacheUtil");
|
22
|
+
var cacheEnabler = require("../../services/cacheEnabler");
|
22
23
|
|
23
24
|
|
24
25
|
|
@@ -54,6 +55,8 @@ class RulesTrigger {
|
|
54
55
|
setImmediate(() => {
|
55
56
|
|
56
57
|
requestEvent.on('request.support_group.created', function(request) {
|
58
|
+
|
59
|
+
|
57
60
|
// requestEvent.on('request.create', function(request) {
|
58
61
|
var requestJson = request.toJSON();
|
59
62
|
operatingHoursService.projectIsOpenNow(request.id_project, function (isOpen, err) {
|
@@ -865,11 +868,12 @@ class RulesTrigger {
|
|
865
868
|
return requestService.create(new_request).then(function (savedRequest) {
|
866
869
|
|
867
870
|
|
871
|
+
|
868
872
|
if (attributes) {
|
869
873
|
attributes.sendnotification = false; // sembra nn funzionae
|
870
874
|
}
|
871
875
|
|
872
|
-
var senderFullname = fullname || 'Guest';
|
876
|
+
var senderFullname = fullname || 'Guest'; // guest_here
|
873
877
|
|
874
878
|
// create(sender, senderFullname, recipient, text, id_project, createdBy, status, attributes, type, metadata, language) {
|
875
879
|
return messageService.create( id_user, senderFullname , savedRequest.request_id, text,
|
@@ -925,9 +929,17 @@ class RulesTrigger {
|
|
925
929
|
|
926
930
|
winston.debug('trigger query', query);
|
927
931
|
|
928
|
-
Trigger.find(query)
|
929
|
-
|
930
|
-
|
932
|
+
let q = Trigger.find(query);
|
933
|
+
|
934
|
+
if (cacheEnabler.trigger) {
|
935
|
+
q.cache(cacheUtil.longTTL, event.id_project+":triggers:trigger.key:"+eventKey) //CACHE_TRIGGER
|
936
|
+
winston.debug('trigger cache enabled');
|
937
|
+
|
938
|
+
}
|
939
|
+
|
940
|
+
q.exec(function(err, triggers) {
|
941
|
+
|
942
|
+
|
931
943
|
if (err) {
|
932
944
|
winston.error('Error gettting bots ', err);
|
933
945
|
return 0;
|
package/routes/message.js
CHANGED
@@ -13,7 +13,9 @@ var leadService = require('../services/leadService');
|
|
13
13
|
var winston = require('../config/winston');
|
14
14
|
|
15
15
|
var MessageConstants = require("../models/messageConstants");
|
16
|
+
|
16
17
|
var cacheUtil = require('../utils/cacheUtil');
|
18
|
+
var cacheEnabler = require("../services/cacheEnabler");
|
17
19
|
|
18
20
|
const { check, validationResult } = require('express-validator');
|
19
21
|
|
@@ -51,7 +53,7 @@ async (req, res) => {
|
|
51
53
|
return res.status(422).json({ errors: errors.array() });
|
52
54
|
}
|
53
55
|
|
54
|
-
|
56
|
+
|
55
57
|
var project_user = req.projectuser;
|
56
58
|
var sender = req.body.sender;
|
57
59
|
var fullname = req.body.senderFullname || req.user.fullName;
|
@@ -60,15 +62,19 @@ async (req, res) => {
|
|
60
62
|
let messageStatus = req.body.status || MessageConstants.CHAT_MESSAGE_STATUS.SENDING;
|
61
63
|
winston.debug('messageStatus: ' + messageStatus);
|
62
64
|
|
65
|
+
let q = Request.findOne({request_id: req.params.request_id, id_project: req.projectid});
|
66
|
+
if (cacheEnabler.request) {
|
67
|
+
q.cache(cacheUtil.defaultTTL, req.projectid+":requests:request_id:"+req.params.request_id+":simple") //request_cache
|
68
|
+
winston.debug('request cache enabled');
|
69
|
+
}
|
63
70
|
// cacherequest // requestcachefarequi nocachepopulatereqired
|
64
|
-
return
|
71
|
+
return q.exec(async(err, request) => {
|
65
72
|
// .populate('lead')
|
66
73
|
// .populate('department')
|
67
74
|
// .populate('participatingBots')
|
68
75
|
// .populate('participatingAgents')
|
69
76
|
// .populate({path:'requester',populate:{path:'id_user'}})
|
70
|
-
|
71
|
-
.exec(async(err, request) => {
|
77
|
+
|
72
78
|
|
73
79
|
if (err) {
|
74
80
|
winston.log({
|
@@ -268,7 +274,7 @@ async (req, res) => {
|
|
268
274
|
}).catch(function(err){
|
269
275
|
winston.log({
|
270
276
|
level: 'error',
|
271
|
-
message: 'Error creating message: '+ JSON.stringify(err) + " " + JSON.stringify(req.body) ,
|
277
|
+
message: 'Error creating message endpoint: '+ JSON.stringify(err) + " " + JSON.stringify(req.body) ,
|
272
278
|
label: req.projectid
|
273
279
|
});
|
274
280
|
// winston.error("Error creating message", err);
|
@@ -290,6 +296,8 @@ async (req, res) => {
|
|
290
296
|
|
291
297
|
|
292
298
|
|
299
|
+
|
300
|
+
|
293
301
|
// router.put('/:messageid', function(req, res) {
|
294
302
|
|
295
303
|
// console.log(req.body);
|
package/routes/project.js
CHANGED
@@ -18,7 +18,7 @@ var validtoken = require('../middleware/valid-token')
|
|
18
18
|
var RoleConstants = require("../models/roleConstants");
|
19
19
|
var cacheUtil = require('../utils/cacheUtil');
|
20
20
|
var orgUtil = require("../utils/orgUtil");
|
21
|
-
|
21
|
+
var cacheEnabler = require("../services/cacheEnabler");
|
22
22
|
|
23
23
|
router.post('/', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken], async (req, res) => {
|
24
24
|
|
@@ -430,6 +430,9 @@ router.delete('/:projectid/ban/:banid', [passport.authenticate(['basic', 'jwt'],
|
|
430
430
|
|
431
431
|
// winston.info('quiiiiii');
|
432
432
|
//cacheinvalidation
|
433
|
+
|
434
|
+
|
435
|
+
// devi prendere id utente prima di eliminarlo
|
433
436
|
Project.findByIdAndUpdate(req.params.projectid, { $pull: { bannedUsers: { "_id": req.params.banid }}}, { new: true, upsert: false }, function (err, updatedProject) {
|
434
437
|
if (err) {
|
435
438
|
winston.error('Error putting project ', err);
|
@@ -447,9 +450,12 @@ Project.findByIdAndUpdate(req.params.projectid, { $pull: { bannedUsers: { "_id":
|
|
447
450
|
//roleChecker.hasRole('agent') works because req.params.projectid is valid using :projectid of this method
|
448
451
|
router.get('/:projectid', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('agent', ['subscription'])], function (req, res) {
|
449
452
|
winston.debug(req.body);
|
450
|
-
Project.findOne({_id: req.params.projectid, status:100})
|
451
|
-
|
452
|
-
|
453
|
+
let q = Project.findOne({_id: req.params.projectid, status:100});
|
454
|
+
if (cacheEnabler.project) {
|
455
|
+
q.cache(cacheUtil.defaultTTL, "projects:id:"+req.params.projectid) //project_cache
|
456
|
+
winston.debug('project cache enabled');
|
457
|
+
}
|
458
|
+
q.exec(function (err, project) {
|
453
459
|
if (err) {
|
454
460
|
winston.error('Error getting project ', err);
|
455
461
|
return res.status(500).send({ success: false, msg: 'Error getting object.' });
|
package/routes/request.js
CHANGED
@@ -16,7 +16,7 @@ var MessageConstants = require("../models/messageConstants");
|
|
16
16
|
var Message = require("../models/message");
|
17
17
|
var cacheUtil = require('../utils/cacheUtil');
|
18
18
|
var RequestConstants = require("../models/requestConstants");
|
19
|
-
|
19
|
+
var cacheEnabler = require("../services/cacheEnabler");
|
20
20
|
|
21
21
|
csv = require('csv-express');
|
22
22
|
csv.separator = ';';
|
@@ -1257,17 +1257,22 @@ router.get('/:requestid', function (req, res) {
|
|
1257
1257
|
var requestid = req.params.requestid;
|
1258
1258
|
winston.debug("get request by id: "+requestid);
|
1259
1259
|
|
1260
|
-
|
1261
|
-
Request.findOne({request_id: requestid, id_project: req.projectid})
|
1260
|
+
|
1261
|
+
let q = Request.findOne({request_id: requestid, id_project: req.projectid})
|
1262
1262
|
// .select("+snapshot.agents")
|
1263
1263
|
.populate('lead')
|
1264
1264
|
.populate('department')
|
1265
1265
|
.populate('participatingBots')
|
1266
1266
|
.populate('participatingAgents')
|
1267
|
-
.populate({path:'requester',populate:{path:'id_user'}})
|
1268
|
-
|
1267
|
+
.populate({path:'requester',populate:{path:'id_user'}});
|
1268
|
+
|
1269
|
+
// if (cacheEnabler.request) { cache disabled beacuse cacheoose don't support .populate without lean. here cache is not important
|
1270
|
+
// q.cache(cacheUtil.defaultTTL, req.projectid+":requests:request_id:"+requestid) //request_cache
|
1271
|
+
// winston.debug('request cache enabled');
|
1272
|
+
// }
|
1273
|
+
//
|
1269
1274
|
// .populate({path:'requester',populate:{path:'id_user', select:{'firstname':1, 'lastname':1}}})
|
1270
|
-
.exec(function(err, request) {
|
1275
|
+
q.exec(function(err, request) {
|
1271
1276
|
if (err) {
|
1272
1277
|
winston.error("error getting request by id ", err);
|
1273
1278
|
return res.status(500).send({ success: false, msg: 'Error getting object.' });
|
@@ -0,0 +1,51 @@
|
|
1
|
+
|
2
|
+
class CacheEnabler {
|
3
|
+
constructor() {
|
4
|
+
this.trigger = true;
|
5
|
+
if (process.env.CACHE_TRIGGER_ENABLED=="false" || process.env.CACHE_TRIGGER_ENABLED==false) {
|
6
|
+
this.trigger = false;
|
7
|
+
}
|
8
|
+
|
9
|
+
this.subscription = true;
|
10
|
+
if (process.env.CACHE_SUBSCRIPTION_ENABLED=="false" || process.env.CACHE_SUBSCRIPTION_ENABLED==false) {
|
11
|
+
this.subscription = false;
|
12
|
+
}
|
13
|
+
|
14
|
+
this.project = true;
|
15
|
+
if (process.env.CACHE_PROJECT_ENABLED=="false" || process.env.CACHE_PROJECT_ENABLED==false) {
|
16
|
+
this.project = false;
|
17
|
+
}
|
18
|
+
|
19
|
+
this.request = true;
|
20
|
+
if (process.env.CACHE_REQUEST_ENABLED=="false" || process.env.CACHE_REQUEST_ENABLED==false) {
|
21
|
+
this.request = false;
|
22
|
+
}
|
23
|
+
|
24
|
+
this.faq_kb = true;
|
25
|
+
if (process.env.CACHE_FAQ_KB_ENABLED=="false" || process.env.CACHE_FAQ_KB_ENABLED==false) {
|
26
|
+
this.faq_kb = false;
|
27
|
+
}
|
28
|
+
|
29
|
+
|
30
|
+
// this.project_user = true;
|
31
|
+
// if (process.env.CACHE_PROJECT_USER_ENABLED=="false" || process.env.CACHE_PROJECT_USER_ENABLED==false) {
|
32
|
+
// this.project_user = false;
|
33
|
+
// }
|
34
|
+
|
35
|
+
// this.user = true;
|
36
|
+
// if (process.env.CACHE_USER_ENABLED=="false" || process.env.CACHE_USER_ENABLED==false) {
|
37
|
+
// this.user = false;
|
38
|
+
// }
|
39
|
+
|
40
|
+
// this.message = true;
|
41
|
+
// if (process.env.CACHE_MESSAGE_ENABLED=="false" || process.env.CACHE_MESSAGE_ENABLED==false) {
|
42
|
+
// this.message = false;
|
43
|
+
// }
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
47
|
+
|
48
|
+
var cacheEnabler = new CacheEnabler();
|
49
|
+
|
50
|
+
|
51
|
+
module.exports = cacheEnabler;
|
@@ -8,6 +8,8 @@ var winston = require('../config/winston');
|
|
8
8
|
const departmentEvent = require('../event/departmentEvent');
|
9
9
|
const Request = require('../models/request');
|
10
10
|
const RoleConstants = require ('../models/roleConstants')
|
11
|
+
var cacheEnabler = require("../services/cacheEnabler");
|
12
|
+
var cacheUtil = require("../utils/cacheUtil");
|
11
13
|
|
12
14
|
class DepartmentService {
|
13
15
|
|
@@ -86,7 +88,7 @@ roundRobin(operatorSelectedEvent) {
|
|
86
88
|
|
87
89
|
// let lastRequests = await
|
88
90
|
// requestcachefarequi nocachepopulatereqired
|
89
|
-
Request.find(query).sort({_id:-1}).limit(1).exec(function (err, lastRequests) {
|
91
|
+
Request.find(query).sort({_id:-1}).limit(1).exec(function (err, lastRequests) { // cache_attention
|
90
92
|
if (err) {
|
91
93
|
winston.error('Error getting request for RoundRobinOperator', err);
|
92
94
|
return reject(err);
|
@@ -190,7 +192,12 @@ getOperators(departmentid, projectid, nobot, disableWebHookCall, context) {
|
|
190
192
|
// console.log("»»» »»» --> DEPT ID ", departmentid);
|
191
193
|
|
192
194
|
|
193
|
-
|
195
|
+
let q = Project.findOne({_id: projectid, status: 100})
|
196
|
+
if (cacheEnabler.project) {
|
197
|
+
q.cache(cacheUtil.defaultTTL, "projects:id:"+projectid) //project_cache
|
198
|
+
winston.debug('project cache enabled');
|
199
|
+
}
|
200
|
+
return q.exec(function(err, project){
|
194
201
|
if (err) {
|
195
202
|
winston.error('Project findById ', err);
|
196
203
|
return reject(err);
|
@@ -205,6 +212,7 @@ getOperators(departmentid, projectid, nobot, disableWebHookCall, context) {
|
|
205
212
|
// TODO questo lo abiliterei solo esplicitamete se si flagga opzione su progetto per performance
|
206
213
|
if (disableWebHookCall==undefined) {
|
207
214
|
//if pro enabled disableWebHookCall = false
|
215
|
+
//secondo me qui manca un parentesi tonda per gli or
|
208
216
|
if (project.profile && (project.profile.type === 'free' && project.trialExpired === false) || (project.profile.type === 'payment' && project.isActiveSubscription === true)) {
|
209
217
|
// winston.info('disableWebHookCall pro');
|
210
218
|
disableWebHookCall = false;
|
@@ -389,6 +397,7 @@ getOperators(departmentid, projectid, nobot, disableWebHookCall, context) {
|
|
389
397
|
|
390
398
|
let objectToReturn = { available_agents: _available_agents, agents: project_users, operators: selectedoperator, department: department, group: group, id_project: projectid, project: project, context: context };
|
391
399
|
|
400
|
+
// var objectToReturnRoundRobin = objectToReturn;
|
392
401
|
that.roundRobin(objectToReturn).then(function(objectToReturnRoundRobin){
|
393
402
|
|
394
403
|
winston.debug("context2",context);
|
@@ -450,6 +459,8 @@ getOperators(departmentid, projectid, nobot, disableWebHookCall, context) {
|
|
450
459
|
|
451
460
|
let objectToReturn = { available_agents: _available_agents, agents: project_users, operators: selectedoperator, department: department, id_project: projectid, project: project, context: context };
|
452
461
|
|
462
|
+
// var objectToReturnRoundRobin = objectToReturn;
|
463
|
+
|
453
464
|
that.roundRobin(objectToReturn).then(function(objectToReturnRoundRobin) {
|
454
465
|
winston.debug("context2",context);
|
455
466
|
departmentEvent.emit('operator.select.base1', {result:objectToReturnRoundRobin, disableWebHookCall: disableWebHookCall, resolve: resolve, reject: reject, context: context});
|
@@ -543,8 +554,19 @@ getOperators(departmentid, projectid, nobot, disableWebHookCall, context) {
|
|
543
554
|
|
544
555
|
// console.log('-- > OPERATORS [ getRandomAvailableOperator ] - PROJECT USER AVAILABLE LENGHT ', project_users_available.length);
|
545
556
|
if (project_users_available.length > 0) {
|
557
|
+
|
558
|
+
|
559
|
+
// new
|
560
|
+
// num between 0 and 1 * es 3 ->
|
561
|
+
// let randomIndex = Math.round(Math.random() * project_users_available.length);
|
562
|
+
// // let randomIndex = Math.floor(Math.random() * project_users_available.length);
|
563
|
+
|
564
|
+
// console.log("randomIndex",randomIndex);
|
565
|
+
// var operator = project_users_available[randomIndex];
|
566
|
+
// // console.log('OPERATORS - SELECTED MEMBER ID', operator.id_user);
|
567
|
+
|
546
568
|
var operator = project_users_available[Math.floor(Math.random() * project_users_available.length)];
|
547
|
-
|
569
|
+
|
548
570
|
|
549
571
|
return [{ id_user: operator.id_user }];
|
550
572
|
// return [operator];
|
@@ -4,16 +4,19 @@ var Project = require("../models/project");
|
|
4
4
|
var moment_tz = require('moment-timezone');
|
5
5
|
var winston = require('../config/winston');
|
6
6
|
var cacheUtil = require('../utils/cacheUtil');
|
7
|
-
|
7
|
+
var cacheEnabler = require("../services/cacheEnabler");
|
8
8
|
|
9
9
|
class OperatingHoursService {
|
10
10
|
|
11
11
|
projectIsOpenNow(projectId, callback) {
|
12
12
|
|
13
13
|
// winston.debug('O ---> [ OHS ] -> PROJECT ID ', projectId)
|
14
|
-
Project.findOne({_id: projectId, status: 100})
|
15
|
-
|
16
|
-
|
14
|
+
let q = Project.findOne({_id: projectId, status: 100});
|
15
|
+
if (cacheEnabler.project) {
|
16
|
+
q.cache(cacheUtil.defaultTTL, "projects:id:"+projectId) //project_cache
|
17
|
+
winston.debug('project cache enabled');
|
18
|
+
}
|
19
|
+
q.exec(function (err, project) {
|
17
20
|
// winston.debug("XXXXXXXX project", project);
|
18
21
|
if (err) {
|
19
22
|
winston.error("O ---> [ OHS ] -> ERROR GETTING PROJECT ", err);
|
@@ -36,6 +39,8 @@ class OperatingHoursService {
|
|
36
39
|
|
37
40
|
// IF THE TRIAL IS EXPIRED OR IF THE SUBSCIPTION IS NOT ACTIVE THE PROJECT IS ALWAYS OPEN EVEN IF activeOperatingHours IS SETTED TO true AND, FOR EXAMPLE,
|
38
41
|
// THE USER HAS SETTED ALL DAYS TO CLOSED
|
42
|
+
|
43
|
+
//secondo me qui manca un parentesi tonda per gli or
|
39
44
|
if (project.profile && (project.profile.type === 'free' && project.trialExpired === true) || (project.profile.type === 'payment' && project.isActiveSubscription === false)) {
|
40
45
|
winston.debug('O ---> [ OHS ] -> trial Expired OR Subscription NOT Active - PROJECT ALWAYS OPEN')
|
41
46
|
callback(true, null) ;
|
@@ -12,6 +12,7 @@ var RequestConstants = require("../models/requestConstants");
|
|
12
12
|
var requestUtil = require("../utils/requestUtil");
|
13
13
|
var cacheUtil = require("../utils/cacheUtil");
|
14
14
|
var arrayUtil = require("../utils/arrayUtil");
|
15
|
+
var cacheEnabler = require("../services/cacheEnabler");
|
15
16
|
|
16
17
|
class RequestService {
|
17
18
|
|
@@ -226,10 +227,14 @@ class RequestService {
|
|
226
227
|
winston.debug("id_project:" + id_project);
|
227
228
|
winston.debug("nobot:"+ nobot);
|
228
229
|
|
229
|
-
|
230
|
-
.findOne({request_id: request_id, id_project: id_project})
|
231
|
-
|
232
|
-
|
230
|
+
let q= Request
|
231
|
+
.findOne({request_id: request_id, id_project: id_project});
|
232
|
+
|
233
|
+
if (cacheEnabler.request) {
|
234
|
+
q.cache(cacheUtil.defaultTTL, id_project+":requests:request_id:"+request_id+":simple") //request_cache
|
235
|
+
winston.debug('request cache enabled');
|
236
|
+
}
|
237
|
+
return q.exec( function(err, request) {
|
233
238
|
|
234
239
|
if (err) {
|
235
240
|
winston.error(err);
|
@@ -378,10 +383,15 @@ class RequestService {
|
|
378
383
|
// winston.debug("request_id", request_id);
|
379
384
|
// winston.debug("newstatus", newstatus);
|
380
385
|
|
381
|
-
|
382
|
-
.findOne({request_id: request_id, id_project: id_project})
|
383
|
-
|
384
|
-
|
386
|
+
let q = Request
|
387
|
+
.findOne({request_id: request_id, id_project: id_project});
|
388
|
+
|
389
|
+
if (cacheEnabler.request) {
|
390
|
+
q.cache(cacheUtil.defaultTTL, id_project+":requests:request_id:"+request_id+":simple") //request_cache
|
391
|
+
winston.debug('request cache enabled');
|
392
|
+
}
|
393
|
+
|
394
|
+
return q.exec( function(err, request) {
|
385
395
|
|
386
396
|
if (err) {
|
387
397
|
winston.error(err);
|
@@ -502,6 +512,8 @@ class RequestService {
|
|
502
512
|
try {
|
503
513
|
// getOperators(departmentid, projectid, nobot, disableWebHookCall, context) {
|
504
514
|
var result = await departmentService.getOperators(departmentid, id_project, false, undefined, context);
|
515
|
+
console.log("************* after get operator: "+new Date().toISOString());
|
516
|
+
|
505
517
|
winston.debug("getOperators", result);
|
506
518
|
} catch(err) {
|
507
519
|
return reject(err);
|
@@ -933,25 +945,27 @@ class RequestService {
|
|
933
945
|
|
934
946
|
}
|
935
947
|
|
936
|
-
// unused
|
937
|
-
incrementMessagesCountByRequestId(request_id, id_project) {
|
938
948
|
|
939
|
-
return new Promise(function (resolve, reject) {
|
940
|
-
// winston.debug("request_id", request_id);
|
941
|
-
// winston.debug("newstatus", newstatus);
|
942
949
|
|
943
|
-
|
944
|
-
|
945
|
-
if (err) {
|
946
|
-
winston.error(err);
|
947
|
-
return reject(err);
|
948
|
-
}
|
949
|
-
winston.debug("Message count +1");
|
950
|
-
return resolve(updatedRequest);
|
951
|
-
});
|
952
|
-
});
|
950
|
+
// unused
|
951
|
+
incrementMessagesCountByRequestId(request_id, id_project) {
|
953
952
|
|
954
|
-
|
953
|
+
return new Promise(function (resolve, reject) {
|
954
|
+
// winston.debug("request_id", request_id);
|
955
|
+
// winston.debug("newstatus", newstatus);
|
956
|
+
|
957
|
+
return Request
|
958
|
+
.findOneAndUpdate({request_id: request_id, id_project: id_project}, {$inc : {'messages.messages_count' : 1}}, {new: true, upsert:false}, function(err, updatedRequest) {
|
959
|
+
if (err) {
|
960
|
+
winston.error(err);
|
961
|
+
return reject(err);
|
962
|
+
}
|
963
|
+
winston.debug("Message count +1");
|
964
|
+
return resolve(updatedRequest);
|
965
|
+
});
|
966
|
+
});
|
967
|
+
|
968
|
+
}
|
955
969
|
|
956
970
|
updateWaitingTimeByRequestId(request_id, id_project) {
|
957
971
|
|
@@ -959,15 +973,19 @@ class RequestService {
|
|
959
973
|
// winston.debug("request_id", request_id);
|
960
974
|
// winston.debug("newstatus", newstatus);
|
961
975
|
|
962
|
-
|
976
|
+
let q = Request
|
963
977
|
.findOne({request_id: request_id, id_project: id_project})
|
964
978
|
.populate('lead')
|
965
979
|
.populate('department')
|
966
980
|
.populate('participatingBots')
|
967
981
|
.populate('participatingAgents')
|
968
|
-
.populate({path:'requester',populate:{path:'id_user'}})
|
969
|
-
|
970
|
-
.
|
982
|
+
.populate({path:'requester',populate:{path:'id_user'}});
|
983
|
+
|
984
|
+
// 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
|
985
|
+
// q.cache(cacheUtil.defaultTTL, id_project+":requests:request_id:"+request_id) //request_cache
|
986
|
+
// winston.debug('request cache enabled');
|
987
|
+
// }
|
988
|
+
q.exec(function(err, request) {
|
971
989
|
if (err) {
|
972
990
|
winston.error(err);
|
973
991
|
return reject(err);
|
@@ -21,6 +21,7 @@ var jwt = require('jsonwebtoken');
|
|
21
21
|
var config = require('../config/database'); // get db config file
|
22
22
|
var cacheUtil = require("../utils/cacheUtil");
|
23
23
|
|
24
|
+
var cacheEnabler = require("../services/cacheEnabler");
|
24
25
|
|
25
26
|
var webhook_origin = process.env.WEBHOOK_ORIGIN || "http://localhost:3000";
|
26
27
|
winston.debug("webhook_origin: "+webhook_origin);
|
@@ -36,9 +37,13 @@ class SubscriptionNotifier {
|
|
36
37
|
|
37
38
|
findSubscriber(event, id_project) {
|
38
39
|
return new Promise(function (resolve, reject) {
|
39
|
-
Subscription.find({event:event, $or:[{id_project: id_project}, {global: true}]})
|
40
|
-
|
41
|
-
|
40
|
+
let q = Subscription.find({event:event, $or:[{id_project: id_project}, {global: true}]});
|
41
|
+
if (cacheEnabler.subscription) {
|
42
|
+
q.cache(cacheUtil.longTTL, id_project+":subscriptions:event:"+event); //CACHE_SUBSCRIPTION
|
43
|
+
winston.debug('subscription cache enabled');
|
44
|
+
}
|
45
|
+
|
46
|
+
q.select("+secret +global")
|
42
47
|
.exec(function (err, subscriptions) {
|
43
48
|
// if (subscriptions && subscriptions.length>0) {
|
44
49
|
// winston.debug("Subscription.notify", event, item , "length", subscriptions.length);
|
@@ -23,7 +23,7 @@ var mongoose = require('mongoose');
|
|
23
23
|
const requestConstants = require("../models/requestConstants");
|
24
24
|
var RoleConstants = require('../models/roleConstants');
|
25
25
|
let configSecret = process.env.GLOBAL_SECRET || config.secret;
|
26
|
-
|
26
|
+
var cacheEnabler = require("../services/cacheEnabler");
|
27
27
|
|
28
28
|
|
29
29
|
var lastRequestsLimit = process.env.WS_HISTORY_REQUESTS_LIMIT || 100;
|
@@ -93,7 +93,7 @@ class WebSocketServer {
|
|
93
93
|
// winston.debug('ok websocket');
|
94
94
|
|
95
95
|
User.findOne({_id: identifier, status: 100}, 'email firstname lastname emailverified id')
|
96
|
-
//@DISABLED_CACHE .cache(cacheUtil.defaultTTL, "users:id:"+identifier)
|
96
|
+
//@DISABLED_CACHE .cache(cacheUtil.defaultTTL, "users:id:"+identifier) //user_cache
|
97
97
|
.exec(function (err, user) {
|
98
98
|
|
99
99
|
|
@@ -185,9 +185,14 @@ class WebSocketServer {
|
|
185
185
|
winston.debug('projectId: '+projectId);
|
186
186
|
|
187
187
|
|
188
|
-
|
189
|
-
|
190
|
-
.
|
188
|
+
let q = Project.findOne({ _id: projectId, status: 100})
|
189
|
+
|
190
|
+
if (cacheEnabler.project) {
|
191
|
+
q.cache(cacheUtil.defaultTTL, "projects:id:"+projectId) //project_cache
|
192
|
+
winston.debug('project cache enabled');
|
193
|
+
}
|
194
|
+
|
195
|
+
return q.exec(function(err, project) {
|
191
196
|
if (err) {
|
192
197
|
winston.error('WebSocket - Error getting Project', err);
|
193
198
|
return reject(err);
|