@tiledesk/tiledesk-server 2.3.21 → 2.3.23
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/app.js +19 -4
- package/channels/chat21/chat21WebHook.js +8 -7
- package/event/messageEvent.js +13 -5
- package/middleware/passport.js +1 -1
- package/package.json +3 -3
- package/pubmodules/cache/mongoose-cachegoose-fn.js +77 -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 +11 -6
- package/routes/project.js +10 -4
- package/routes/request.js +11 -6
- package/services/cacheEnabler.js +45 -0
- package/services/operatingHoursService.js +8 -4
- package/services/requestService.js +46 -28
- package/services/subscriptionNotifier.js +8 -3
- package/websocket/webSocketServer.js +9 -4
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,19 +127,26 @@ 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
145
|
geoService.listen();
|
139
146
|
|
147
|
+
|
148
|
+
|
149
|
+
|
140
150
|
var faqBotHandler = require('./services/faqBotHandler');
|
141
151
|
faqBotHandler.listen();
|
142
152
|
|
@@ -148,6 +158,7 @@ channelManager.listen();
|
|
148
158
|
|
149
159
|
var IPFilter = require('./middleware/ipFilter');
|
150
160
|
|
161
|
+
// job_here
|
151
162
|
var BanUserNotifier = require('./services/banUserNotifier');
|
152
163
|
BanUserNotifier.listen();
|
153
164
|
|
@@ -310,9 +321,13 @@ var projectSetter = function (req, res, next) {
|
|
310
321
|
winston.debug("projectSetter projectid:" + projectid);
|
311
322
|
|
312
323
|
if (projectid) {
|
313
|
-
|
314
|
-
|
315
|
-
|
324
|
+
|
325
|
+
let q = Project.findOne({_id: projectid, status: 100});
|
326
|
+
if (cacheEnabler.trigger) {
|
327
|
+
q.cache(cacheUtil.defaultTTL, "projects:id:"+projectid) //project_cache
|
328
|
+
winston.debug('project cache enabled');
|
329
|
+
}
|
330
|
+
q.exec(function(err, project){
|
316
331
|
if (err) {
|
317
332
|
winston.warn("Problem getting project with id: " + projectid + " req.originalUrl: " + req.originalUrl);
|
318
333
|
}
|
@@ -202,7 +202,7 @@ router.post('/', function (req, res) {
|
|
202
202
|
}
|
203
203
|
|
204
204
|
|
205
|
-
|
205
|
+
|
206
206
|
|
207
207
|
|
208
208
|
var new_request = {
|
@@ -210,7 +210,7 @@ router.post('/', function (req, res) {
|
|
210
210
|
departmentid:departmentid, sourcePage:sourcePage, language:language, userAgent:client, status:requestStatus, createdBy: undefined,
|
211
211
|
attributes:rAttributes, subject:undefined, preflight:false, channel:undefined, location:undefined,
|
212
212
|
lead:createdLead, requester:project_user
|
213
|
-
|
213
|
+
|
214
214
|
};
|
215
215
|
|
216
216
|
winston.debug("new_request", new_request);
|
@@ -296,12 +296,10 @@ router.post('/', function (req, res) {
|
|
296
296
|
// TODO it doesn't work for internal requests bacause participanets == message.sender⁄
|
297
297
|
if (request.participants && request.participants.indexOf(message.sender) > -1) { //update waiitng time if write an agent (member of participants)
|
298
298
|
winston.debug("updateWaitingTimeByRequestId");
|
299
|
-
|
300
299
|
return requestService.updateWaitingTimeByRequestId(request.request_id, request.id_project).then(function(upRequest) {
|
301
300
|
return res.json(upRequest);
|
302
301
|
});
|
303
302
|
}else {
|
304
|
-
|
305
303
|
return res.json(savedMessage);
|
306
304
|
}
|
307
305
|
// });
|
@@ -380,9 +378,12 @@ router.post('/', function (req, res) {
|
|
380
378
|
var query = {request_id: recipient_id, id_project: projectId};
|
381
379
|
winston.debug('query:'+ projectId);
|
382
380
|
|
383
|
-
|
384
|
-
|
385
|
-
|
381
|
+
let q = Request.findOne(query);
|
382
|
+
if (cacheEnabler.trigger) {
|
383
|
+
q.cache(cacheUtil.defaultTTL, projectId+":requests:request_id:"+recipient_id); //request_cache
|
384
|
+
winston.debug('project cache enabled');
|
385
|
+
}
|
386
|
+
return q.exec(function(err, request) {
|
386
387
|
|
387
388
|
if (err) {
|
388
389
|
winston.error("Error finding request with query ", query);
|
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 {
|
@@ -56,20 +56,27 @@ function populateMessageWithRequest(message, eventPrefix) {
|
|
56
56
|
|
57
57
|
// cacherequest // requestcachefarequi populaterequired cacheveryhightpriority
|
58
58
|
|
59
|
-
Request.findOne({request_id: message.recipient, id_project: message.id_project}).
|
59
|
+
let q = Request.findOne({request_id: message.recipient, id_project: message.id_project}).
|
60
60
|
populate('lead').
|
61
61
|
populate('department').
|
62
62
|
populate('participatingBots').
|
63
63
|
populate('participatingAgents').
|
64
64
|
populate({path:'requester',populate:{path:'id_user'}}).
|
65
|
-
lean()
|
65
|
+
lean();
|
66
|
+
|
67
|
+
|
66
68
|
//perche lean?
|
67
69
|
// TODO availableAgentsCount nn c'è per il lean problema trigger
|
68
70
|
// request.department._id DA CORREGGERE ANCHE PER REQUEST.CREATE
|
69
71
|
// request.department.hasBot
|
70
72
|
// request.isOpen
|
71
|
-
|
72
|
-
|
73
|
+
|
74
|
+
|
75
|
+
if (cacheEnabler.request) {
|
76
|
+
q.cache(cacheUtil.defaultTTL, message.id_project+":requests:request_id:"+message.recipient) //request_cache ma con lean????attento metti a parte
|
77
|
+
winston.debug('request cache enabled');
|
78
|
+
}
|
79
|
+
q.exec(function (err, request) {
|
73
80
|
|
74
81
|
if (err) {
|
75
82
|
winston.error("Error getting request on messageEvent.populateMessage",err );
|
@@ -163,6 +170,7 @@ messageEvent.on('message.update.simple', populateMessageUpdate);
|
|
163
170
|
|
164
171
|
|
165
172
|
// riattiva commentato per performance
|
173
|
+
// // spostare su classe
|
166
174
|
|
167
175
|
|
168
176
|
// 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.23",
|
5
5
|
"scripts": {
|
6
6
|
"start": "node ./bin/www",
|
7
7
|
"pretest": "mongodb-runner start",
|
@@ -41,14 +41,14 @@
|
|
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.10",
|
45
45
|
"app-root-path": "^3.0.0",
|
46
46
|
"bcrypt-nodejs": "0.0.3",
|
47
47
|
"body-parser": "^1.20.0",
|
48
|
+
"cachegoose": "^8.0.0",
|
48
49
|
"cookie-parser": "^1.4.6",
|
49
50
|
"cors": "^2.8.5",
|
50
51
|
"csv-express": "^1.2.2",
|
51
|
-
"cachegoose": "^8.0.0",
|
52
52
|
"debug": "^4.3.4",
|
53
53
|
"dotenv": "^8.6.0",
|
54
54
|
"email-templates": "^8.1.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
|
|
@@ -448,8 +449,82 @@
|
|
448
449
|
|
449
450
|
// fai cache per subscription.create, .update .delete
|
450
451
|
|
451
|
-
// fai cache per trigger.create, .update .delete
|
452
452
|
|
453
|
+
if (subscriptionEvent) {
|
454
|
+
subscriptionEvent.on('subscription.create', function(trigger) {
|
455
|
+
setImmediate(() => {
|
456
|
+
|
457
|
+
var key =trigger.id_project+":subscriptions:*";
|
458
|
+
winston.verbose("Deleting cache for subscription.create with key: " + key);
|
459
|
+
client.del(key, function (err, reply) {
|
460
|
+
winston.debug("Deleted cache for subscription.create",reply);
|
461
|
+
winston.verbose("Deleted cache for subscription.create",{err:err});
|
462
|
+
});
|
463
|
+
});
|
464
|
+
});
|
465
|
+
|
466
|
+
subscriptionEvent.on('subscription.update', function(trigger) {
|
467
|
+
setImmediate(() => {
|
468
|
+
var key =trigger.id_project+":subscriptions:*";
|
469
|
+
winston.verbose("Deleting cache for subscription.update with key: " + key);
|
470
|
+
client.del(key, function (err, reply) {
|
471
|
+
winston.debug("Deleted cache for subscription.update",reply);
|
472
|
+
winston.verbose("Deleted cache for subscription.update",{err:err});
|
473
|
+
});
|
474
|
+
});
|
475
|
+
});
|
476
|
+
|
477
|
+
subscriptionEvent.on("subscription.delete", function(trigger) {
|
478
|
+
setImmediate(() => {
|
479
|
+
var key =trigger.id_project+":subscriptions:*";
|
480
|
+
winston.verbose("Deleting cache for subscription.delete with key: " + key);
|
481
|
+
client.del(key, function (err, reply) {
|
482
|
+
winston.debug("Deleted cache for subscription.delete",reply);
|
483
|
+
winston.verbose("Deleted cache for subscription.delete",{err:err});
|
484
|
+
});
|
485
|
+
});
|
486
|
+
});
|
487
|
+
|
488
|
+
}
|
489
|
+
|
490
|
+
|
491
|
+
if (triggerEventEmitter) {
|
492
|
+
triggerEventEmitter.on('trigger.create', function(trigger) {
|
493
|
+
setImmediate(() => {
|
494
|
+
|
495
|
+
var key =trigger.id_project+":triggers:*";
|
496
|
+
winston.verbose("Deleting cache for trigger.create with key: " + key);
|
497
|
+
client.del(key, function (err, reply) {
|
498
|
+
winston.debug("Deleted cache for trigger.create",reply);
|
499
|
+
winston.verbose("Deleted cache for trigger.create",{err:err});
|
500
|
+
});
|
501
|
+
});
|
502
|
+
});
|
503
|
+
|
504
|
+
triggerEventEmitter.on('trigger.update', function(trigger) {
|
505
|
+
setImmediate(() => {
|
506
|
+
var key =trigger.id_project+":triggers:*";
|
507
|
+
winston.verbose("Deleting cache for trigger.update with key: " + key);
|
508
|
+
client.del(key, function (err, reply) {
|
509
|
+
winston.debug("Deleted cache for trigger.update",reply);
|
510
|
+
winston.verbose("Deleted cache for trigger.update",{err:err});
|
511
|
+
});
|
512
|
+
});
|
513
|
+
});
|
514
|
+
|
515
|
+
triggerEventEmitter.on("trigger.delete", function(trigger) {
|
516
|
+
setImmediate(() => {
|
517
|
+
var key =trigger.id_project+":triggers:*";
|
518
|
+
winston.verbose("Deleting cache for trigger.delete with key: " + key);
|
519
|
+
client.del(key, function (err, reply) {
|
520
|
+
winston.debug("Deleted cache for trigger.delete",reply);
|
521
|
+
winston.verbose("Deleted cache for trigger.delete",{err:err});
|
522
|
+
});
|
523
|
+
});
|
524
|
+
});
|
525
|
+
|
526
|
+
}
|
527
|
+
|
453
528
|
//jwt
|
454
529
|
|
455
530
|
// 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) //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) //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);
|
@@ -289,7 +295,6 @@ async (req, res) => {
|
|
289
295
|
});
|
290
296
|
|
291
297
|
|
292
|
-
|
293
298
|
// router.put('/:messageid', function(req, res) {
|
294
299
|
|
295
300
|
// 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.trigger) {
|
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) {
|
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,45 @@
|
|
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.project_user = true;
|
25
|
+
if (process.env.CACHE_PROJECT_USER_ENABLED=="false" || process.env.CACHE_PROJECT_USER_ENABLED==false) {
|
26
|
+
this.project_user = false;
|
27
|
+
}
|
28
|
+
|
29
|
+
this.user = true;
|
30
|
+
if (process.env.CACHE_USER_ENABLED=="false" || process.env.CACHE_USER_ENABLED==false) {
|
31
|
+
this.user = false;
|
32
|
+
}
|
33
|
+
|
34
|
+
this.message = true;
|
35
|
+
if (process.env.CACHE_MESSAGE_ENABLED=="false" || process.env.CACHE_MESSAGE_ENABLED==false) {
|
36
|
+
this.message = false;
|
37
|
+
}
|
38
|
+
}
|
39
|
+
}
|
40
|
+
|
41
|
+
|
42
|
+
var cacheEnabler = new CacheEnabler();
|
43
|
+
|
44
|
+
|
45
|
+
module.exports = cacheEnabler;
|
@@ -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.trigger) {
|
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,7 @@ 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
|
+
|
39
43
|
if (project.profile && (project.profile.type === 'free' && project.trialExpired === true) || (project.profile.type === 'payment' && project.isActiveSubscription === false)) {
|
40
44
|
winston.debug('O ---> [ OHS ] -> trial Expired OR Subscription NOT Active - PROJECT ALWAYS OPEN')
|
41
45
|
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) //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) //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) {
|
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;
|
@@ -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.trigger) {
|
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);
|