@tiledesk/tiledesk-server 2.4.46 → 2.4.47
Sign up to get free protection for your applications and to get access to all the features.
package/jobs.js
CHANGED
@@ -93,9 +93,9 @@ async function main()
|
|
93
93
|
jobsManager.listenActivityArchiver(activityArchiver);
|
94
94
|
|
95
95
|
|
96
|
-
|
97
|
-
|
98
|
-
|
96
|
+
let routingQueueQueued = require('./pubmodules/routing-queue').listenerQueued;
|
97
|
+
winston.debug("routingQueueQueued");
|
98
|
+
jobsManager.listenRoutingQueue(routingQueueQueued);
|
99
99
|
|
100
100
|
|
101
101
|
|
package/jobsManager.js
CHANGED
@@ -45,14 +45,14 @@ class JobsManager {
|
|
45
45
|
this.emailNotification.requestNotification.listen();
|
46
46
|
}
|
47
47
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
48
|
+
listenRoutingQueue(routingQueue) {
|
49
|
+
winston.info("JobsManager routingQueue started");
|
50
|
+
if ( this.jobWorkerEnabled == true) {
|
51
|
+
return winston.info("JobsManager jobWorkerEnabled is enabled. Skipping listener for routingQueue");
|
52
|
+
}
|
53
|
+
this.routingQueue = routingQueue;
|
54
|
+
this.routingQueue.listen();
|
55
|
+
}
|
56
56
|
|
57
57
|
listenScheduler(scheduler) {
|
58
58
|
winston.info("JobsManager scheduler started");
|
package/package.json
CHANGED
@@ -51,6 +51,7 @@ class PubModulesManager {
|
|
51
51
|
this.jobsManager = undefined;
|
52
52
|
|
53
53
|
this.routingQueue = undefined;
|
54
|
+
this.routingQueueQueued = undefined;
|
54
55
|
|
55
56
|
this.cache = undefined;
|
56
57
|
|
@@ -407,8 +408,11 @@ class PubModulesManager {
|
|
407
408
|
|
408
409
|
try {
|
409
410
|
this.routingQueue = require('./routing-queue').listener;
|
411
|
+
this.routingQueueQueued = require('./routing-queue').listenerQueued;
|
412
|
+
|
410
413
|
// this.routingQueue.listen();
|
411
414
|
winston.debug("this.routingQueue:"+ this.routingQueue);
|
415
|
+
winston.debug("this.routingQueueQueued:"+ this.routingQueueQueued);
|
412
416
|
|
413
417
|
winston.info("PubModulesManager routing queue initialized");
|
414
418
|
} catch(err) {
|
@@ -515,13 +519,21 @@ class PubModulesManager {
|
|
515
519
|
|
516
520
|
if (this.routingQueue) {
|
517
521
|
try {
|
518
|
-
this.routingQueue.listen();
|
519
|
-
// this.jobsManager.listenRoutingQueue(this.routingQueue);
|
522
|
+
this.routingQueue.listen();
|
520
523
|
winston.info("PubModulesManager routingQueue started");
|
521
524
|
} catch(err) {
|
522
525
|
winston.info("PubModulesManager error starting routingQueue module", err);
|
523
526
|
}
|
524
527
|
}
|
528
|
+
if (this.routingQueueQueued) {
|
529
|
+
try {
|
530
|
+
// this.routingQueueQueued.listen();
|
531
|
+
this.jobsManager.listenRoutingQueue(this.routingQueueQueued);
|
532
|
+
winston.info("PubModulesManager routingQueue queued started");
|
533
|
+
} catch(err) {
|
534
|
+
winston.info("PubModulesManager error starting routingQueue queued module", err);
|
535
|
+
}
|
536
|
+
}
|
525
537
|
|
526
538
|
// if (this.dialogFlow) {
|
527
539
|
// try {
|
@@ -1,13 +1,7 @@
|
|
1
|
-
const projectEvent = require('../../event/projectEvent');
|
2
1
|
const departmentEvent = require('../../event/departmentEvent');
|
3
|
-
const authEvent = require('../../event/authEvent');
|
4
|
-
const requestEvent = require('../../event/requestEvent');
|
5
2
|
var Request = require('../../models/request');
|
6
|
-
var Project = require('../../models/project');
|
7
|
-
var Project_user = require('../../models/project_user');
|
8
3
|
var winston = require('../../config/winston');
|
9
4
|
|
10
|
-
var ProjectUserUtil = require("../../utils/project_userUtil");
|
11
5
|
|
12
6
|
// var request = require('retry-request', {
|
13
7
|
// request: require('request')
|
@@ -55,42 +49,6 @@ class Listener {
|
|
55
49
|
// };
|
56
50
|
}
|
57
51
|
|
58
|
-
// db.getCollection('project_users').find({"number_assigned_requests" : {"$lt":0}}).count()
|
59
|
-
|
60
|
-
|
61
|
-
updateProjectUser(id_user, id_project, operation) {
|
62
|
-
winston.debug("updateProjectUser start");
|
63
|
-
return Project_user
|
64
|
-
.findOneAndUpdate({id_user: id_user, id_project: id_project}, {$inc : {'number_assigned_requests' : operation}}, {new: true, upsert:false}, function(err, updatedPU) {
|
65
|
-
if (err) {
|
66
|
-
return winston.error(err);
|
67
|
-
}
|
68
|
-
winston.debug("number_assigned_requests +1 :" + updatedPU.id);
|
69
|
-
|
70
|
-
updatedPU.populate({path:'id_user', select:{'firstname':1, 'lastname':1}},function (err, updatedProject_userPopulated){
|
71
|
-
|
72
|
-
var pu = updatedProject_userPopulated.toJSON();
|
73
|
-
|
74
|
-
return Project.findById(id_project).exec(function(err, project) {
|
75
|
-
pu.isBusy = ProjectUserUtil.isBusy(updatedProject_userPopulated, project.settings && project.settings.max_agent_assigned_chat);
|
76
|
-
winston.debug("pu.isBusy: "+ pu.isBusy);
|
77
|
-
authEvent.emit('project_user.update', {updatedProject_userPopulated:pu, req: undefined, skipArchive: true});
|
78
|
-
})
|
79
|
-
|
80
|
-
});
|
81
|
-
|
82
|
-
});
|
83
|
-
}
|
84
|
-
|
85
|
-
updateParticipatingProjectUsers(request, operation) {
|
86
|
-
winston.debug("request.participatingAgents", request.participatingAgents);
|
87
|
-
if (request.participatingAgents.length>0) {
|
88
|
-
request.participatingAgents.forEach(user => {
|
89
|
-
winston.debug("request.participatingAgents user",user); //it is a user and not a project_user
|
90
|
-
this.updateProjectUser(user.id, request.id_project, operation);
|
91
|
-
});
|
92
|
-
}
|
93
|
-
}
|
94
52
|
|
95
53
|
listen() {
|
96
54
|
|
@@ -101,57 +59,6 @@ class Listener {
|
|
101
59
|
}
|
102
60
|
|
103
61
|
var that = this;
|
104
|
-
|
105
|
-
// TODO fai versione che passa anche project
|
106
|
-
requestEvent.on('request.create', async (request) => {
|
107
|
-
setImmediate(() => {
|
108
|
-
this.updateParticipatingProjectUsers(request, +1);
|
109
|
-
});
|
110
|
-
});
|
111
|
-
|
112
|
-
// TODO usa versione complete con project per evitare query??
|
113
|
-
requestEvent.on('request.close', async (request) => {
|
114
|
-
setImmediate(() => {
|
115
|
-
this.updateParticipatingProjectUsers(request, -1);
|
116
|
-
});
|
117
|
-
});
|
118
|
-
|
119
|
-
|
120
|
-
requestEvent.on('request.participants.join', async (data) => {
|
121
|
-
var request = data.request;
|
122
|
-
var member = data.member;
|
123
|
-
setImmediate(() => {
|
124
|
-
this.updateProjectUser(member, request.id_project, 1);
|
125
|
-
});
|
126
|
-
});
|
127
|
-
|
128
|
-
requestEvent.on('request.participants.leave', async (data) => {
|
129
|
-
var request = data.request;
|
130
|
-
var member = data.member;
|
131
|
-
setImmediate(() => {
|
132
|
-
this.updateProjectUser(member, request.id_project, -1);
|
133
|
-
});
|
134
|
-
});
|
135
|
-
|
136
|
-
requestEvent.on('request.participants.update', async (data) => {
|
137
|
-
var request = data.request;
|
138
|
-
var removedParticipants = data.removedParticipants;
|
139
|
-
var addedParticipants = data.addedParticipants;
|
140
|
-
|
141
|
-
setImmediate(() => {
|
142
|
-
|
143
|
-
addedParticipants.forEach(participant => {
|
144
|
-
winston.debug('addedParticipants participant', participant);
|
145
|
-
this.updateProjectUser(participant, request.id_project, 1);
|
146
|
-
});
|
147
|
-
|
148
|
-
removedParticipants.forEach(participant => {
|
149
|
-
winston.debug('removedParticipants participant', participant);
|
150
|
-
this.updateProjectUser(participant, request.id_project, -1);
|
151
|
-
});
|
152
|
-
|
153
|
-
});
|
154
|
-
});
|
155
62
|
|
156
63
|
departmentEvent.on('operator.select.base2', async (res) => {
|
157
64
|
// departmentEvent.prependListener('operator.select', async (data) => {
|
@@ -170,9 +77,7 @@ class Listener {
|
|
170
77
|
|
171
78
|
}
|
172
79
|
|
173
|
-
|
174
|
-
|
175
|
-
|
80
|
+
|
176
81
|
|
177
82
|
|
178
83
|
|
@@ -0,0 +1,194 @@
|
|
1
|
+
const authEvent = require('../../event/authEvent');
|
2
|
+
const requestEvent = require('../../event/requestEvent');
|
3
|
+
var Project = require('../../models/project');
|
4
|
+
var Project_user = require('../../models/project_user');
|
5
|
+
var winston = require('../../config/winston');
|
6
|
+
|
7
|
+
var ProjectUserUtil = require("../../utils/project_userUtil");
|
8
|
+
|
9
|
+
// var request = require('retry-request', {
|
10
|
+
// request: require('request')
|
11
|
+
// });
|
12
|
+
|
13
|
+
// TODO riabilitare questo
|
14
|
+
|
15
|
+
// const ROUTE_QUEUE_ENDPOINT = process.env.ROUTE_QUEUE_ENDPOINT;
|
16
|
+
// winston.debug("ROUTE_QUEUE_ENDPOINT: " + ROUTE_QUEUE_ENDPOINT);
|
17
|
+
|
18
|
+
// if (ROUTE_QUEUE_ENDPOINT) {
|
19
|
+
// winston.info("Route queue endpoint: " + ROUTE_QUEUE_ENDPOINT);
|
20
|
+
// } else {
|
21
|
+
// winston.info("Route queue endpoint not configured");
|
22
|
+
// }
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
// TODO web socket is not supported with queue
|
28
|
+
class Listener {
|
29
|
+
|
30
|
+
|
31
|
+
constructor() {
|
32
|
+
this.enabled = true;
|
33
|
+
if (process.env.ROUTE_QUEUE_ENABLED=="false" || process.env.ROUTE_QUEUE_ENABLED==false) {
|
34
|
+
this.enabled = false;
|
35
|
+
}
|
36
|
+
winston.debug("Listener this.enabled: "+ this.enabled);
|
37
|
+
}
|
38
|
+
|
39
|
+
|
40
|
+
// db.getCollection('project_users').find({"number_assigned_requests" : {"$lt":0}}).count()
|
41
|
+
|
42
|
+
|
43
|
+
updateProjectUser(id_user, id_project, operation) {
|
44
|
+
winston.debug("Route queue updateProjectUser start");
|
45
|
+
return Project_user
|
46
|
+
.findOneAndUpdate({id_user: id_user, id_project: id_project}, {$inc : {'number_assigned_requests' : operation}}, {new: true, upsert:false}, function(err, updatedPU) {
|
47
|
+
if (err) {
|
48
|
+
return winston.error(err);
|
49
|
+
}
|
50
|
+
winston.debug("Route queue number_assigned_requests +1 :" + updatedPU.id);
|
51
|
+
|
52
|
+
updatedPU.populate({path:'id_user', select:{'firstname':1, 'lastname':1}},function (err, updatedProject_userPopulated){
|
53
|
+
|
54
|
+
var pu = updatedProject_userPopulated.toJSON();
|
55
|
+
|
56
|
+
return Project.findById(id_project).exec(function(err, project) {
|
57
|
+
pu.isBusy = ProjectUserUtil.isBusy(updatedProject_userPopulated, project.settings && project.settings.max_agent_assigned_chat);
|
58
|
+
winston.debug("Route queue pu.isBusy: "+ pu.isBusy);
|
59
|
+
|
60
|
+
authEvent.emit('project_user.update', {updatedProject_userPopulated:pu, req: undefined, skipArchive: true}); //if queued with jobs -> websocket notification on project_user.update doesn't work??? forse si in quanto viene convertito in .pub.queue e poi rifunziiona
|
61
|
+
|
62
|
+
|
63
|
+
// project_user.update triggers activityArchiver(tested), cache invalidation(tested), subscriptionNotifierQueued and websocket(tested works from queue i trigger ws)
|
64
|
+
if (requestEvent.queueEnabled) { //force to .queue to be catched into the queue (activity archiver, subscriptionNotifierQueued )
|
65
|
+
authEvent.emit('project_user.update.queue', {updatedProject_userPopulated:pu, req: undefined, skipArchive: true});
|
66
|
+
}
|
67
|
+
|
68
|
+
})
|
69
|
+
|
70
|
+
});
|
71
|
+
|
72
|
+
});
|
73
|
+
}
|
74
|
+
|
75
|
+
updateParticipatingProjectUsers(request, operation) {
|
76
|
+
winston.debug("Route queue request.participatingAgents", request.participatingAgents);
|
77
|
+
if (request.participatingAgents.length>0) {
|
78
|
+
request.participatingAgents.forEach(user => {
|
79
|
+
winston.debug("request.participatingAgents user",user); //it is a user and not a project_user
|
80
|
+
this.updateProjectUser(user.id, request.id_project, operation);
|
81
|
+
});
|
82
|
+
}
|
83
|
+
}
|
84
|
+
|
85
|
+
listen() {
|
86
|
+
|
87
|
+
if (this.enabled==true) {
|
88
|
+
winston.info("Route queue with queue Listener listen");
|
89
|
+
} else {
|
90
|
+
return winston.info("Route queue with queue Listener disabled");
|
91
|
+
}
|
92
|
+
|
93
|
+
var that = this;
|
94
|
+
|
95
|
+
// TODO fai versione che passa anche project
|
96
|
+
var requestCreateKey = 'request.create';
|
97
|
+
if (requestEvent.queueEnabled) {
|
98
|
+
requestCreateKey = 'request.create.queue';
|
99
|
+
}
|
100
|
+
winston.debug('Route queue requestCreateKey: ' + requestCreateKey);
|
101
|
+
|
102
|
+
requestEvent.on(requestCreateKey, async (request) => {
|
103
|
+
setImmediate(() => {
|
104
|
+
winston.debug('Route queue requestCreate');
|
105
|
+
this.updateParticipatingProjectUsers(request, +1);
|
106
|
+
});
|
107
|
+
});
|
108
|
+
|
109
|
+
// TODO usa versione complete con project per evitare query??
|
110
|
+
var requestCloseKey = 'request.close'; //request.close event here queued under job
|
111
|
+
if (requestEvent.queueEnabled) {
|
112
|
+
requestCloseKey = 'request.close.queue';
|
113
|
+
}
|
114
|
+
winston.debug('Route queue requestCloseKey: ' + requestCloseKey);
|
115
|
+
|
116
|
+
requestEvent.on(requestCloseKey, async (request) => { //request.close event here noqueued
|
117
|
+
winston.debug("request.close event here 4")
|
118
|
+
setImmediate(() => {
|
119
|
+
winston.debug('Route queue requestClose');
|
120
|
+
this.updateParticipatingProjectUsers(request, -1);
|
121
|
+
});
|
122
|
+
});
|
123
|
+
|
124
|
+
|
125
|
+
var requestParticipantsJoinKey = 'request.participants.join';
|
126
|
+
if (requestEvent.queueEnabled) {
|
127
|
+
requestParticipantsJoinKey = 'request.participants.join.queue';
|
128
|
+
}
|
129
|
+
winston.debug('Route queue requestParticipantsJoinKey: ' + requestParticipantsJoinKey);
|
130
|
+
|
131
|
+
requestEvent.on(requestParticipantsJoinKey, async (data) => {
|
132
|
+
winston.debug('Route queue ParticipantsJoin');
|
133
|
+
|
134
|
+
var request = data.request;
|
135
|
+
var member = data.member;
|
136
|
+
setImmediate(() => {
|
137
|
+
this.updateProjectUser(member, request.id_project, 1);
|
138
|
+
});
|
139
|
+
});
|
140
|
+
|
141
|
+
var requestParticipantsLeaveKey = 'request.participants.leave';
|
142
|
+
if (requestEvent.queueEnabled) {
|
143
|
+
requestParticipantsLeaveKey = 'request.participants.leave.queue';
|
144
|
+
}
|
145
|
+
winston.debug('Route queue requestParticipantsLeaveKey: ' + requestParticipantsLeaveKey);
|
146
|
+
|
147
|
+
requestEvent.on(requestParticipantsLeaveKey, async (data) => {
|
148
|
+
winston.debug('Route queue ParticipantsLeave');
|
149
|
+
|
150
|
+
var request = data.request;
|
151
|
+
var member = data.member;
|
152
|
+
setImmediate(() => {
|
153
|
+
this.updateProjectUser(member, request.id_project, -1);
|
154
|
+
});
|
155
|
+
});
|
156
|
+
|
157
|
+
var requestParticipantsUpdateKey = 'request.participants.update';
|
158
|
+
if (requestEvent.queueEnabled) {
|
159
|
+
requestParticipantsUpdateKey = 'request.participants.update.queue';
|
160
|
+
}
|
161
|
+
winston.debug('Route queue requestParticipantsUpdateKey: ' + requestParticipantsUpdateKey);
|
162
|
+
|
163
|
+
requestEvent.on(requestParticipantsUpdateKey, async (data) => {
|
164
|
+
winston.debug('Route queue Participants Update');
|
165
|
+
|
166
|
+
var request = data.request;
|
167
|
+
var removedParticipants = data.removedParticipants;
|
168
|
+
var addedParticipants = data.addedParticipants;
|
169
|
+
|
170
|
+
setImmediate(() => {
|
171
|
+
|
172
|
+
addedParticipants.forEach(participant => {
|
173
|
+
winston.debug('addedParticipants participant', participant);
|
174
|
+
this.updateProjectUser(participant, request.id_project, 1);
|
175
|
+
});
|
176
|
+
|
177
|
+
removedParticipants.forEach(participant => {
|
178
|
+
winston.debug('removedParticipants participant', participant);
|
179
|
+
this.updateProjectUser(participant, request.id_project, -1);
|
180
|
+
});
|
181
|
+
|
182
|
+
});
|
183
|
+
});
|
184
|
+
|
185
|
+
|
186
|
+
|
187
|
+
}
|
188
|
+
|
189
|
+
}
|
190
|
+
|
191
|
+
var listener = new Listener();
|
192
|
+
|
193
|
+
|
194
|
+
module.exports = listener;
|