@tiledesk/tiledesk-server 2.3.22 → 2.3.24
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 +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);
|