@tiledesk/tiledesk-server 2.3.23 → 2.3.25
Sign up to get free protection for your applications and to get access to all the features.
- package/CHANGELOG.md +37 -6
- package/app.js +2 -3
- package/channels/chat21/chat21WebHook.js +20 -12
- package/event/messageEvent.js +22 -9
- package/package.json +3 -3
- package/pubmodules/cache/mongoose-cachegoose-fn.js +30 -1
- package/pubmodules/dialogflow/index.js +10 -0
- package/pubmodules/dialogflow/listener.js +66 -0
- package/pubmodules/messageTransformer/messageTransformerInterceptor.js +1 -1
- package/pubmodules/pubModulesManager.js +30 -1
- package/routes/message.js +5 -2
- package/routes/project.js +1 -1
- package/routes/request.js +4 -4
- package/services/cacheEnabler.js +18 -12
- package/services/departmentService.js +25 -3
- package/services/modulesManager.js +13 -67
- package/services/operatingHoursService.js +2 -1
- package/services/requestService.js +6 -6
- package/websocket/webSocketServer.js +2 -2
package/CHANGELOG.md
CHANGED
@@ -1,6 +1,38 @@
|
|
1
|
+
# 2.3.25
|
2
|
+
- Emebedded DialogFlow connector to 1.7.4
|
3
|
+
|
4
|
+
# 2.3.24
|
5
|
+
- Increased cache TTL from: standardTTL from 120 to 300, longTTL from 1200 to 3600
|
6
|
+
- Added cache request.create.simple, + cacheEnabler. name fix
|
7
|
+
- Disabled unapplicable cache for updateWaitingTimeByRequestId and find request by id REST API
|
8
|
+
- Updated dependency @tiledesk/tiledesk-tybot-connector to 0.1.14
|
9
|
+
- Restored populateMessageWithRequest. Bug with \agent command. Try to resolve performance with cache
|
10
|
+
- Added cache for chat21 webhook event type message. The cache key is without the project id
|
11
|
+
- Disabled cache for chat21 webhook conversation archived method
|
12
|
+
- Added cache for message event lookup
|
13
|
+
- Added cache for chat21 webhook event type message
|
14
|
+
- Added cache for getoperator method of department service
|
15
|
+
|
16
|
+
💥 TILEDESK SERVER v2.3.23 💥
|
17
|
+
🚀 TAGGED AND PUBLISHED ON NPM 🚀
|
18
|
+
🚀 IN PRODUCTION 🚀
|
19
|
+
(https://www.npmjs.com/package/@tiledesk/tiledesk-server/v/2.3.17)
|
1
20
|
|
21
|
+
# 2.3.23 -> PROD
|
22
|
+
- cacheEnabler + trigger cache + subscription cache
|
23
|
+
- project cache with cacheEnabler
|
24
|
+
- request cache with cacheEnabler
|
25
|
+
- Updated dependency @tiledesk/tiledesk-tybot-connector to 0.1.10
|
26
|
+
- Added trigger and subscription cache invalidation rules
|
27
|
+
|
28
|
+
# 2.3.22
|
29
|
+
- added cacheoose dep package.json
|
30
|
+
- Updated dependency @tiledesk/tiledesk-tybot-connector to 0.1.8
|
2
31
|
|
3
32
|
# 2.3.21
|
33
|
+
- log fix
|
34
|
+
- Updated dependency @tiledesk/tiledesk-tybot-connector to 0.1.7
|
35
|
+
- Moved cache module to public module
|
4
36
|
- filter request by smartAssignment
|
5
37
|
|
6
38
|
# 2.3.20
|
@@ -11,14 +43,13 @@
|
|
11
43
|
- Moved route-queue to public module
|
12
44
|
- Disable queue module if JOB_WORKER_ENABLED is true
|
13
45
|
|
46
|
+
# 2.3.18.6 -> PROD
|
47
|
+
- logfix
|
14
48
|
|
49
|
+
# 2.3.18.1
|
50
|
+
- Updated dependency @tiledesk/tiledesk-tybot-connector to 0.1.10
|
15
51
|
|
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
|
52
|
+
# 2.3.18
|
22
53
|
- Added profileStatus field to the project_user model
|
23
54
|
- Added smartAssignment field to the request model
|
24
55
|
- Canned responses default limit value increased from 40 to 1000
|
package/app.js
CHANGED
@@ -142,8 +142,7 @@ botSubscriptionNotifier.start();
|
|
142
142
|
|
143
143
|
|
144
144
|
var geoService = require('./services/geoService');
|
145
|
-
geoService.listen();
|
146
|
-
|
145
|
+
geoService.listen();
|
147
146
|
|
148
147
|
|
149
148
|
|
@@ -323,7 +322,7 @@ var projectSetter = function (req, res, next) {
|
|
323
322
|
if (projectid) {
|
324
323
|
|
325
324
|
let q = Project.findOne({_id: projectid, status: 100});
|
326
|
-
if (cacheEnabler.
|
325
|
+
if (cacheEnabler.project) {
|
327
326
|
q.cache(cacheUtil.defaultTTL, "projects:id:"+projectid) //project_cache
|
328
327
|
winston.debug('project cache enabled');
|
329
328
|
}
|
@@ -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});
|
@@ -202,7 +210,7 @@ router.post('/', function (req, res) {
|
|
202
210
|
}
|
203
211
|
|
204
212
|
|
205
|
-
|
213
|
+
|
206
214
|
|
207
215
|
|
208
216
|
var new_request = {
|
@@ -210,7 +218,7 @@ router.post('/', function (req, res) {
|
|
210
218
|
departmentid:departmentid, sourcePage:sourcePage, language:language, userAgent:client, status:requestStatus, createdBy: undefined,
|
211
219
|
attributes:rAttributes, subject:undefined, preflight:false, channel:undefined, location:undefined,
|
212
220
|
lead:createdLead, requester:project_user
|
213
|
-
|
221
|
+
|
214
222
|
};
|
215
223
|
|
216
224
|
winston.debug("new_request", new_request);
|
@@ -379,10 +387,10 @@ router.post('/', function (req, res) {
|
|
379
387
|
winston.debug('query:'+ projectId);
|
380
388
|
|
381
389
|
let q = Request.findOne(query);
|
382
|
-
if (cacheEnabler.
|
383
|
-
|
384
|
-
|
385
|
-
}
|
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
|
+
// }
|
386
394
|
return q.exec(function(err, request) {
|
387
395
|
|
388
396
|
if (err) {
|
@@ -465,7 +473,7 @@ router.post('/', function (req, res) {
|
|
465
473
|
|
466
474
|
// requestcachefarequi populaterequired
|
467
475
|
return Request.findOne({request_id: request_id, id_project: id_project})
|
468
|
-
.populate('lead') //TODO posso prenderlo da snapshot senza populate
|
476
|
+
.populate('lead') //TODO posso prenderlo da snapshot senza populate cache_attention
|
469
477
|
.exec(function(err, request) {
|
470
478
|
if (err){
|
471
479
|
winston.error(err);
|
@@ -632,7 +640,7 @@ else if (req.body.event_type == "typing-start") {
|
|
632
640
|
// requestcachefarequi nocachepopulatereqired
|
633
641
|
return Request.findOne({request_id: recipient_id})
|
634
642
|
//TOD errore cache sistemare e riabbilitare->
|
635
|
-
// .cache(cacheUtil.defaultTTL, req.projectid+":requests:request_id:"+recipient_id)
|
643
|
+
// .cache(cacheUtil.defaultTTL, req.projectid+":requests:request_id:"+recipient_id) cache_attention
|
636
644
|
.exec(function(err, request) {
|
637
645
|
if (err){
|
638
646
|
winston.error(err);
|
package/event/messageEvent.js
CHANGED
@@ -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
|
|
@@ -70,8 +74,7 @@ function populateMessageWithRequest(message, eventPrefix) {
|
|
70
74
|
// request.department._id DA CORREGGERE ANCHE PER REQUEST.CREATE
|
71
75
|
// request.department.hasBot
|
72
76
|
// request.isOpen
|
73
|
-
|
74
|
-
|
77
|
+
winston.info('message Event populate');
|
75
78
|
if (cacheEnabler.request) {
|
76
79
|
q.cache(cacheUtil.defaultTTL, message.id_project+":requests:request_id:"+message.recipient) //request_cache ma con lean????attento metti a parte
|
77
80
|
winston.debug('request cache enabled');
|
@@ -83,6 +86,9 @@ function populateMessageWithRequest(message, eventPrefix) {
|
|
83
86
|
return messageEvent.emit(eventPrefix, message);
|
84
87
|
}
|
85
88
|
|
89
|
+
winston.debug('message Event populate after query');
|
90
|
+
|
91
|
+
|
86
92
|
if (request) {
|
87
93
|
winston.debug("request is defined in messageEvent",request );
|
88
94
|
|
@@ -91,9 +97,14 @@ function populateMessageWithRequest(message, eventPrefix) {
|
|
91
97
|
|
92
98
|
if (request.department && request.department.id_bot) {
|
93
99
|
// if (request.department) {
|
94
|
-
Faq_kb.findById(request.department.id_bot)
|
95
|
-
|
96
|
-
.
|
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) {
|
97
108
|
winston.debug('bot', bot);
|
98
109
|
requestJson.department.bot = bot
|
99
110
|
|
@@ -169,10 +180,12 @@ messageEvent.on('message.update.simple', populateMessageUpdate);
|
|
169
180
|
|
170
181
|
|
171
182
|
|
172
|
-
// riattiva commentato per performance
|
183
|
+
// // riattiva commentato per performance
|
184
|
+
|
173
185
|
// // spostare su classe
|
174
186
|
|
175
187
|
|
188
|
+
|
176
189
|
// var messageCreateKey = 'message.create';
|
177
190
|
// if (messageEvent.queueEnabled) {
|
178
191
|
// messageCreateKey = 'message.create.queue';
|
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.25",
|
5
5
|
"scripts": {
|
6
6
|
"start": "node ./bin/www",
|
7
7
|
"pretest": "mongodb-runner start",
|
@@ -29,7 +29,6 @@
|
|
29
29
|
"tiledesk-server": "./bin/www"
|
30
30
|
},
|
31
31
|
"optionalDependencies": {
|
32
|
-
"@tiledesk-ent/tiledesk-server-dialogflow": "^1.1.6",
|
33
32
|
"@tiledesk-ent/tiledesk-server-jwthistory": "^1.1.9",
|
34
33
|
"@tiledesk-ent/tiledesk-server-payments": "^1.1.6",
|
35
34
|
"@tiledesk-ent/tiledesk-server-request-history": "^1.1.5",
|
@@ -41,7 +40,8 @@
|
|
41
40
|
"@tiledesk/tiledesk-chatbot-util": "^0.8.33",
|
42
41
|
"@tiledesk/tiledesk-json-rules-engine": "^4.0.3",
|
43
42
|
"@tiledesk/tiledesk-rasa-connector": "^1.0.10",
|
44
|
-
"@tiledesk/tiledesk-tybot-connector": "^0.1.
|
43
|
+
"@tiledesk/tiledesk-tybot-connector": "^0.1.14",
|
44
|
+
"@tiledesk/tiledesk-dialogflow-connector": "^1.7.4",
|
45
45
|
"app-root-path": "^3.0.0",
|
46
46
|
"bcrypt-nodejs": "0.0.3",
|
47
47
|
"body-parser": "^1.20.0",
|
@@ -13,7 +13,7 @@
|
|
13
13
|
|
14
14
|
var cachegoose = require('cachegoose');
|
15
15
|
|
16
|
-
var defaultTTL = process.env.CACHE_DEFAULT_TTL ||
|
16
|
+
var defaultTTL = process.env.CACHE_DEFAULT_TTL || 300;
|
17
17
|
|
18
18
|
|
19
19
|
function listen(client) {
|
@@ -203,6 +203,35 @@
|
|
203
203
|
|
204
204
|
|
205
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
|
+
|
206
235
|
requestEvent.on("request.create", function(request) {
|
207
236
|
setImmediate(() => {
|
208
237
|
var key = request.id_project+":requests:id:"+request.id;
|
@@ -0,0 +1,66 @@
|
|
1
|
+
const botEvent = require('../../event/botEvent');
|
2
|
+
var Faq_kb = require("../../models/faq_kb");
|
3
|
+
var winston = require('../../config/winston');
|
4
|
+
const df = require("@tiledesk/tiledesk-dialogflow-connector");
|
5
|
+
var configGlobal = require('../../config/global');
|
6
|
+
|
7
|
+
var port = process.env.PORT || '3000';
|
8
|
+
|
9
|
+
const BOT_DIALOGFLOW_ENDPOINT = process.env.BOT_DIALOGFLOW_ENDPOINT || "http://localhost:" + port+ "/modules/dialogflow";
|
10
|
+
winston.debug("BOT_DIALOGFLOW_ENDPOINT: " + BOT_DIALOGFLOW_ENDPOINT);
|
11
|
+
|
12
|
+
// if (BOT_DIALOGFLOW_ENDPOINT) {
|
13
|
+
winston.info("Dialogflow endpoint: " + BOT_DIALOGFLOW_ENDPOINT);
|
14
|
+
// } else {
|
15
|
+
// winston.info("Dialogflow endpoint not configured");
|
16
|
+
// }
|
17
|
+
|
18
|
+
|
19
|
+
const apiUrl = process.env.API_URL || configGlobal.apiUrl;
|
20
|
+
winston.info('Dialogflow apiUrl: '+ apiUrl);
|
21
|
+
|
22
|
+
class Listener {
|
23
|
+
|
24
|
+
listen(config) {
|
25
|
+
|
26
|
+
winston.debug('dialogflow Listener listen');
|
27
|
+
|
28
|
+
var that = this;
|
29
|
+
|
30
|
+
|
31
|
+
df.startApp(
|
32
|
+
{
|
33
|
+
MONGODB_URI: config.databaseUri,
|
34
|
+
API_ENDPOINT: apiUrl,
|
35
|
+
log: process.env.DIALOGFLOW_LOG
|
36
|
+
}, () => {
|
37
|
+
winston.info("Dialogflow route successfully started.");
|
38
|
+
}
|
39
|
+
);
|
40
|
+
|
41
|
+
botEvent.on('faqbot.create', function(bot) {
|
42
|
+
if (BOT_DIALOGFLOW_ENDPOINT) {
|
43
|
+
|
44
|
+
if (bot.type==="dialogflow") {
|
45
|
+
// bot.url = BOT_DIALOGFLOW_ENDPOINT;
|
46
|
+
|
47
|
+
Faq_kb.findByIdAndUpdate(bot.id, {"url":BOT_DIALOGFLOW_ENDPOINT}, { new: true, upsert: true }, function (err, savedFaq_kb) {
|
48
|
+
|
49
|
+
// bot.save(function (err, savedFaq_kb) {
|
50
|
+
if (err) {
|
51
|
+
return winston.error('error saving faqkb dialogflow ', err)
|
52
|
+
}
|
53
|
+
winston.verbose('Saved faqkb dialogflow', savedFaq_kb.toObject())
|
54
|
+
});
|
55
|
+
}
|
56
|
+
}
|
57
|
+
});
|
58
|
+
|
59
|
+
}
|
60
|
+
|
61
|
+
}
|
62
|
+
|
63
|
+
var listener = new Listener();
|
64
|
+
|
65
|
+
|
66
|
+
module.exports = listener;
|
@@ -45,7 +45,7 @@ class MessageTransformerInterceptor {
|
|
45
45
|
// populate({path:'requester',populate:{path:'id_user'}}).
|
46
46
|
|
47
47
|
if (cacheEnabler.request) {
|
48
|
-
q.cache(cacheUtil.defaultTTL, message.id_project+":requests:request_id:"+message.recipient) //request_cache nocachepopulatereqired
|
48
|
+
q.cache(cacheUtil.defaultTTL, message.id_project+":requests:request_id:"+message.recipient+":simple") //request_cache nocachepopulatereqired
|
49
49
|
winston.debug('request cache enabled');
|
50
50
|
}
|
51
51
|
|
@@ -41,6 +41,8 @@ class PubModulesManager {
|
|
41
41
|
this.routingQueue = undefined;
|
42
42
|
|
43
43
|
this.cache = undefined;
|
44
|
+
|
45
|
+
this.dialogFlow = undefined;
|
44
46
|
}
|
45
47
|
|
46
48
|
|
@@ -55,6 +57,11 @@ class PubModulesManager {
|
|
55
57
|
app.use('/modules/tilebot', this.tilebotRoute);
|
56
58
|
winston.info("ModulesManager tilebot controller loaded");
|
57
59
|
}
|
60
|
+
|
61
|
+
if (this.dialogFlow) {
|
62
|
+
app.use("/modules/dialogFlow", this.dialogFlow.dialogflowRoute);
|
63
|
+
winston.info("ModulesManager dialogFlow controller loaded");
|
64
|
+
}
|
58
65
|
|
59
66
|
}
|
60
67
|
useUnderProjects(app) {
|
@@ -335,7 +342,20 @@ class PubModulesManager {
|
|
335
342
|
}
|
336
343
|
}
|
337
344
|
|
345
|
+
|
338
346
|
|
347
|
+
try {
|
348
|
+
this.dialogFlow = require('./dialogflow');
|
349
|
+
winston.debug("this.dialogFlow:"+ this.dialogFlow);
|
350
|
+
this.dialogFlow.listener.listen(config);
|
351
|
+
winston.info("PubModulesManager dialogFlow initialized");
|
352
|
+
} catch(err) {
|
353
|
+
if (err.code == 'MODULE_NOT_FOUND') {
|
354
|
+
winston.info("PubModulesManager init dialogFlow module not found");
|
355
|
+
}else {
|
356
|
+
winston.error("PubModulesManager error initializing init dialogFlow module", err);
|
357
|
+
}
|
358
|
+
}
|
339
359
|
}
|
340
360
|
|
341
361
|
start() {
|
@@ -411,11 +431,20 @@ class PubModulesManager {
|
|
411
431
|
}
|
412
432
|
}
|
413
433
|
|
434
|
+
// if (this.dialogFlow) {
|
435
|
+
// try {
|
436
|
+
// this.dialogFlow.listen();
|
437
|
+
// winston.info("PubModulesManager dialogFlow started");
|
438
|
+
// } catch(err) {
|
439
|
+
// winston.info("PubModulesManager error starting dialogFlow module", err);
|
440
|
+
// }
|
441
|
+
// }
|
442
|
+
|
414
443
|
|
415
444
|
}
|
416
445
|
|
417
446
|
|
418
|
-
|
447
|
+
|
419
448
|
}
|
420
449
|
|
421
450
|
var pubModulesManager = new PubModulesManager();
|
package/routes/message.js
CHANGED
@@ -53,7 +53,7 @@ async (req, res) => {
|
|
53
53
|
return res.status(422).json({ errors: errors.array() });
|
54
54
|
}
|
55
55
|
|
56
|
-
|
56
|
+
|
57
57
|
var project_user = req.projectuser;
|
58
58
|
var sender = req.body.sender;
|
59
59
|
var fullname = req.body.senderFullname || req.user.fullName;
|
@@ -64,7 +64,7 @@ async (req, res) => {
|
|
64
64
|
|
65
65
|
let q = Request.findOne({request_id: req.params.request_id, id_project: req.projectid});
|
66
66
|
if (cacheEnabler.request) {
|
67
|
-
q.cache(cacheUtil.defaultTTL, req.projectid+":requests:request_id:"+req.params.request_id) //request_cache
|
67
|
+
q.cache(cacheUtil.defaultTTL, req.projectid+":requests:request_id:"+req.params.request_id+":simple") //request_cache
|
68
68
|
winston.debug('request cache enabled');
|
69
69
|
}
|
70
70
|
// cacherequest // requestcachefarequi nocachepopulatereqired
|
@@ -295,6 +295,9 @@ async (req, res) => {
|
|
295
295
|
});
|
296
296
|
|
297
297
|
|
298
|
+
|
299
|
+
|
300
|
+
|
298
301
|
// router.put('/:messageid', function(req, res) {
|
299
302
|
|
300
303
|
// console.log(req.body);
|
package/routes/project.js
CHANGED
@@ -451,7 +451,7 @@ Project.findByIdAndUpdate(req.params.projectid, { $pull: { bannedUsers: { "_id":
|
|
451
451
|
router.get('/:projectid', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('agent', ['subscription'])], function (req, res) {
|
452
452
|
winston.debug(req.body);
|
453
453
|
let q = Project.findOne({_id: req.params.projectid, status:100});
|
454
|
-
if (cacheEnabler.
|
454
|
+
if (cacheEnabler.project) {
|
455
455
|
q.cache(cacheUtil.defaultTTL, "projects:id:"+req.params.projectid) //project_cache
|
456
456
|
winston.debug('project cache enabled');
|
457
457
|
}
|
package/routes/request.js
CHANGED
@@ -1266,10 +1266,10 @@ router.get('/:requestid', function (req, res) {
|
|
1266
1266
|
.populate('participatingAgents')
|
1267
1267
|
.populate({path:'requester',populate:{path:'id_user'}});
|
1268
1268
|
|
1269
|
-
if (cacheEnabler.request) {
|
1270
|
-
|
1271
|
-
|
1272
|
-
}
|
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
1273
|
//
|
1274
1274
|
// .populate({path:'requester',populate:{path:'id_user', select:{'firstname':1, 'lastname':1}}})
|
1275
1275
|
q.exec(function(err, request) {
|
package/services/cacheEnabler.js
CHANGED
@@ -21,20 +21,26 @@ class CacheEnabler {
|
|
21
21
|
this.request = false;
|
22
22
|
}
|
23
23
|
|
24
|
-
this.
|
25
|
-
if (process.env.
|
26
|
-
this.
|
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
27
|
}
|
28
28
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
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
|
+
// }
|
38
44
|
}
|
39
45
|
}
|
40
46
|
|
@@ -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];
|
@@ -36,12 +36,8 @@ class ModulesManager {
|
|
36
36
|
this.facebookRoute = undefined;
|
37
37
|
this.jwthistoryArchiver = undefined;
|
38
38
|
this.jwthistoryRoute = undefined;
|
39
|
-
this.dialogflowListener = undefined;
|
40
39
|
this.requestHistoryArchiver = undefined;
|
41
|
-
this.requestHistoryRoute = undefined;
|
42
|
-
// this.routingQueue = undefined;
|
43
|
-
// this.queue = undefined;
|
44
|
-
// this.cache = undefined;
|
40
|
+
this.requestHistoryRoute = undefined;
|
45
41
|
this.visitorCounterRoute = undefined;
|
46
42
|
this.visitorCounterMiddleware = undefined;
|
47
43
|
this.widgetsRoute = undefined;
|
@@ -202,62 +198,19 @@ class ModulesManager {
|
|
202
198
|
|
203
199
|
|
204
200
|
|
205
|
-
try {
|
206
|
-
this.dialogflowListener = require('@tiledesk-ent/tiledesk-server-dialogflow').listener;
|
207
|
-
// this.dialogflowListener.listen();
|
208
|
-
winston.debug("this.dialogflowListener:"+ this.dialogflowListener);
|
209
|
-
|
210
|
-
winston.info("ModulesManager dialogflow initialized");
|
211
|
-
} catch(err) {
|
212
|
-
if (err.code == 'MODULE_NOT_FOUND') {
|
213
|
-
winston.info("ModulesManager init dialogflow module not found");
|
214
|
-
}else {
|
215
|
-
winston.error("ModulesManager error initializing init dialogflow module", err);
|
216
|
-
}
|
217
|
-
}
|
218
|
-
|
219
|
-
|
220
201
|
// try {
|
221
|
-
// this.
|
222
|
-
// // this.
|
223
|
-
// winston.debug("this.
|
202
|
+
// this.dialogflowListener = require('@tiledesk-ent/tiledesk-server-dialogflow').listener;
|
203
|
+
// // this.dialogflowListener.listen();
|
204
|
+
// winston.debug("this.dialogflowListener:"+ this.dialogflowListener);
|
224
205
|
|
225
|
-
// winston.info("ModulesManager
|
206
|
+
// winston.info("ModulesManager dialogflow initialized");
|
226
207
|
// } catch(err) {
|
227
208
|
// if (err.code == 'MODULE_NOT_FOUND') {
|
228
|
-
// winston.info("ModulesManager init
|
209
|
+
// winston.info("ModulesManager init dialogflow module not found");
|
229
210
|
// }else {
|
230
|
-
// winston.error("ModulesManager error initializing init
|
211
|
+
// winston.error("ModulesManager error initializing init dialogflow module", err);
|
231
212
|
// }
|
232
|
-
// }
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
// try {
|
237
|
-
// this.queue = require('@tiledesk-ent/tiledesk-server-queue');
|
238
|
-
// winston.debug("this.queue:"+ this.queue);
|
239
|
-
|
240
|
-
// winston.info("ModulesManager queue initialized");
|
241
|
-
// } catch(err) {
|
242
|
-
// if (err.code == 'MODULE_NOT_FOUND') {
|
243
|
-
// winston.info("ModulesManager init queue module not found");
|
244
|
-
// }else {
|
245
|
-
// winston.error("ModulesManager error initializing init queue module", err);
|
246
|
-
// }
|
247
|
-
// }
|
248
|
-
|
249
|
-
|
250
|
-
// try {
|
251
|
-
// this.cache = require('@tiledesk-ent/tiledesk-server-cache').cachegoose(config.mongoose);
|
252
|
-
// winston.debug("this.cache:"+ this.cache);
|
253
|
-
// winston.info("ModulesManager cache initialized");
|
254
|
-
// } catch(err) {
|
255
|
-
// if (err.code == 'MODULE_NOT_FOUND') {
|
256
|
-
// winston.info("ModulesManager init cache module not found");
|
257
|
-
// }else {
|
258
|
-
// winston.error("ModulesManager error initializing init cache module", err);
|
259
|
-
// }
|
260
|
-
// }
|
213
|
+
// }
|
261
214
|
|
262
215
|
|
263
216
|
|
@@ -330,22 +283,15 @@ class ModulesManager {
|
|
330
283
|
winston.info("ModulesManager error starting requestHistoryArchiver module", err);
|
331
284
|
}
|
332
285
|
}
|
333
|
-
|
286
|
+
|
287
|
+
// if (this.dialogflowListener) {
|
334
288
|
// try {
|
335
|
-
// this.
|
336
|
-
// winston.info("ModulesManager
|
289
|
+
// this.dialogflowListener.listen();
|
290
|
+
// winston.info("ModulesManager dialogflowListener started");
|
337
291
|
// } catch(err) {
|
338
|
-
// winston.info("ModulesManager error starting
|
292
|
+
// winston.info("ModulesManager error starting dialogflowListener module", err);
|
339
293
|
// }
|
340
294
|
// }
|
341
|
-
if (this.dialogflowListener) {
|
342
|
-
try {
|
343
|
-
this.dialogflowListener.listen();
|
344
|
-
winston.info("ModulesManager dialogflowListener started");
|
345
|
-
} catch(err) {
|
346
|
-
winston.info("ModulesManager error starting dialogflowListener module", err);
|
347
|
-
}
|
348
|
-
}
|
349
295
|
|
350
296
|
|
351
297
|
|
@@ -12,7 +12,7 @@ class OperatingHoursService {
|
|
12
12
|
|
13
13
|
// winston.debug('O ---> [ OHS ] -> PROJECT ID ', projectId)
|
14
14
|
let q = Project.findOne({_id: projectId, status: 100});
|
15
|
-
if (cacheEnabler.
|
15
|
+
if (cacheEnabler.project) {
|
16
16
|
q.cache(cacheUtil.defaultTTL, "projects:id:"+projectId) //project_cache
|
17
17
|
winston.debug('project cache enabled');
|
18
18
|
}
|
@@ -40,6 +40,7 @@ class OperatingHoursService {
|
|
40
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,
|
41
41
|
// THE USER HAS SETTED ALL DAYS TO CLOSED
|
42
42
|
|
43
|
+
//secondo me qui manca un parentesi tonda per gli or
|
43
44
|
if (project.profile && (project.profile.type === 'free' && project.trialExpired === true) || (project.profile.type === 'payment' && project.isActiveSubscription === false)) {
|
44
45
|
winston.debug('O ---> [ OHS ] -> trial Expired OR Subscription NOT Active - PROJECT ALWAYS OPEN')
|
45
46
|
callback(true, null) ;
|
@@ -231,7 +231,7 @@ class RequestService {
|
|
231
231
|
.findOne({request_id: request_id, id_project: id_project});
|
232
232
|
|
233
233
|
if (cacheEnabler.request) {
|
234
|
-
q.cache(cacheUtil.defaultTTL, id_project+":requests:request_id:"+request_id) //request_cache
|
234
|
+
q.cache(cacheUtil.defaultTTL, id_project+":requests:request_id:"+request_id+":simple") //request_cache
|
235
235
|
winston.debug('request cache enabled');
|
236
236
|
}
|
237
237
|
return q.exec( function(err, request) {
|
@@ -387,7 +387,7 @@ class RequestService {
|
|
387
387
|
.findOne({request_id: request_id, id_project: id_project});
|
388
388
|
|
389
389
|
if (cacheEnabler.request) {
|
390
|
-
q.cache(cacheUtil.defaultTTL, id_project+":requests:request_id:"+request_id) //request_cache
|
390
|
+
q.cache(cacheUtil.defaultTTL, id_project+":requests:request_id:"+request_id+":simple") //request_cache
|
391
391
|
winston.debug('request cache enabled');
|
392
392
|
}
|
393
393
|
|
@@ -981,10 +981,10 @@ class RequestService {
|
|
981
981
|
.populate('participatingAgents')
|
982
982
|
.populate({path:'requester',populate:{path:'id_user'}});
|
983
983
|
|
984
|
-
if (cacheEnabler.request) {
|
985
|
-
|
986
|
-
|
987
|
-
}
|
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
988
|
q.exec(function(err, request) {
|
989
989
|
if (err) {
|
990
990
|
winston.error(err);
|
@@ -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
|
|
@@ -187,7 +187,7 @@ class WebSocketServer {
|
|
187
187
|
|
188
188
|
let q = Project.findOne({ _id: projectId, status: 100})
|
189
189
|
|
190
|
-
if (cacheEnabler.
|
190
|
+
if (cacheEnabler.project) {
|
191
191
|
q.cache(cacheUtil.defaultTTL, "projects:id:"+projectId) //project_cache
|
192
192
|
winston.debug('project cache enabled');
|
193
193
|
}
|