@tiledesk/tiledesk-server 2.17.4 → 2.18.1
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 +4 -3
- package/app.js +2 -0
- package/channels/chat21/chat21WebHook.js +6 -1
- package/event/authEvent.js +16 -0
- package/event/projectUserEvent.js +39 -0
- package/event/roleEvent.js +9 -0
- package/middleware/has-role.js +160 -121
- package/middleware/passport.js +180 -179
- package/migrations/1757601159298-project_user_role_type.js +45 -0
- package/models/department.js +3 -0
- package/models/groupMemberSchama.js +19 -0
- package/models/kb_setting.js +6 -2
- package/models/permissionConstants.js +19 -0
- package/models/project_user.js +86 -8
- package/models/request.js +1 -0
- package/models/role.js +31 -0
- package/models/roleConstants.js +2 -0
- package/package.json +1 -1
- package/pubmodules/analytics/analytics.js +2 -2
- package/pubmodules/cache/mongoose-cachegoose-fn.js +37 -0
- package/pubmodules/canned/cannedResponseRoute.js +34 -6
- package/pubmodules/routing-queue/listener.js +7 -1
- package/pubmodules/trigger/rulesTrigger.js +1 -6
- package/routes/auth.js +3 -1
- package/routes/department.js +7 -1
- package/routes/message.js +4 -1
- package/routes/project.js +41 -3
- package/routes/project_user.js +62 -11
- package/routes/request.js +32 -30
- package/routes/roles.js +151 -0
- package/routes/unanswered.js +1 -1
- package/routes/widget.js +3 -1
- package/services/cacheEnabler.js +5 -8
- package/services/departmentService.js +39 -11
- package/services/emailService.js +2 -2
- package/services/pendingInvitationService.js +2 -0
- package/services/projectService.js +3 -1
- package/services/projectUserService.js +67 -4
- package/services/subscriptionNotifierQueued.js +8 -0
- package/services/updateRequestSnapshotQueued.js +0 -3
- package/test/departmentService.js +5 -0
- package/test/messageRoute.js +7 -4
- package/test/projectUserRoute.js +116 -0
- package/test/requestService.js +7 -3
- package/test-int/bot.js +3 -2
- package/websocket/webSocketServer.js +273 -225
- package/routes/auth_newjwt.js +0 -648
package/models/role.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
var mongoose = require('mongoose');
|
|
2
|
+
var Schema = mongoose.Schema;
|
|
3
|
+
var winston = require('../config/winston');
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
var RoleSchema = new Schema({
|
|
7
|
+
name: {
|
|
8
|
+
type: String,
|
|
9
|
+
required: true,
|
|
10
|
+
index:true
|
|
11
|
+
},
|
|
12
|
+
permissions: [String],
|
|
13
|
+
// permissions: {
|
|
14
|
+
// type: String,
|
|
15
|
+
// required: true
|
|
16
|
+
// },
|
|
17
|
+
id_project: {
|
|
18
|
+
type: String,
|
|
19
|
+
required: true,
|
|
20
|
+
index: true
|
|
21
|
+
},
|
|
22
|
+
|
|
23
|
+
});
|
|
24
|
+
var role = mongoose.model('role', RoleSchema);
|
|
25
|
+
|
|
26
|
+
if (process.env.MONGOOSE_SYNCINDEX) {
|
|
27
|
+
role.syncIndexes();
|
|
28
|
+
winston.verbose("role syncIndexes")
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
module.exports = role;
|
package/models/roleConstants.js
CHANGED
package/package.json
CHANGED
|
@@ -1780,7 +1780,7 @@ router.get('/tags/:type', async (req, res) => {
|
|
|
1780
1780
|
date: { $gte: startDate, $lte: endDate }
|
|
1781
1781
|
}
|
|
1782
1782
|
|
|
1783
|
-
|
|
1783
|
+
winston.debug("analytics tags query: ", query)
|
|
1784
1784
|
|
|
1785
1785
|
let result = await Analytics.find(query).catch((err) => {
|
|
1786
1786
|
winston.error("Error finding Analytics: ", err);
|
|
@@ -1821,7 +1821,7 @@ router.get('/tags/:type', async (req, res) => {
|
|
|
1821
1821
|
|
|
1822
1822
|
// Assembly final result
|
|
1823
1823
|
let data = { dates, series };
|
|
1824
|
-
|
|
1824
|
+
|
|
1825
1825
|
|
|
1826
1826
|
return res.status(200).send(data);
|
|
1827
1827
|
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
var triggerEventEmitter = require("../trigger/event/triggerEventEmitter");
|
|
12
12
|
var subscriptionEvent = require("../../event/subscriptionEvent");
|
|
13
|
+
var roleEvent = require("../../event/roleEvent");
|
|
13
14
|
|
|
14
15
|
var winston = require('../../config/winston');
|
|
15
16
|
|
|
@@ -837,7 +838,43 @@
|
|
|
837
838
|
});
|
|
838
839
|
});
|
|
839
840
|
});
|
|
841
|
+
|
|
842
|
+
|
|
843
|
+
roleEvent.on('role.create', function(role) {
|
|
844
|
+
setImmediate(() => {
|
|
845
|
+
var key =role.id_project+":roles:"+role.name;
|
|
846
|
+
winston.verbose("Deleting cache for role.create with key: " + key);
|
|
847
|
+
winston.verbose("Creating cache for department.create with key: " + key);
|
|
848
|
+
client.set(key, role, cacheUtil.defaultTTL, (err, reply) => {
|
|
849
|
+
winston.debug("Created cache for role.create",reply);
|
|
850
|
+
winston.verbose("Created cache for role.create",{err:err});
|
|
851
|
+
});
|
|
852
|
+
|
|
853
|
+
});
|
|
854
|
+
});
|
|
855
|
+
|
|
856
|
+
roleEvent.on('role.update', function(role) {
|
|
857
|
+
setImmediate(() => {
|
|
858
|
+
var key =role.id_project+":roles:"+role.name;
|
|
859
|
+
winston.verbose("Deleting cache for role.update with key: " + key);
|
|
860
|
+
client.set(key, role, cacheUtil.defaultTTL, (err, reply) => {
|
|
861
|
+
winston.debug("Updated cache for role.update",reply);
|
|
862
|
+
winston.verbose("Updated cache for role.update",{err:err});
|
|
863
|
+
});
|
|
864
|
+
});
|
|
865
|
+
});
|
|
840
866
|
|
|
867
|
+
roleEvent.on("role.delete", function(role) {
|
|
868
|
+
setImmediate(() => {
|
|
869
|
+
var key =role.id_project+":roles:"+role.name;
|
|
870
|
+
winston.verbose("Deleting cache for role.delete with key: " + key);
|
|
871
|
+
del(client._cache._engine.client, key, function (err, reply) {
|
|
872
|
+
winston.debug("Deleted cache for role.delete",reply);
|
|
873
|
+
winston.verbose("Deleted cache for role.delete",{err:err});
|
|
874
|
+
});
|
|
875
|
+
});
|
|
876
|
+
});
|
|
877
|
+
|
|
841
878
|
}
|
|
842
879
|
|
|
843
880
|
|
|
@@ -3,6 +3,7 @@ var router = express.Router();
|
|
|
3
3
|
var CannedResponse = require("./cannedResponse");
|
|
4
4
|
var winston = require('../../config/winston');
|
|
5
5
|
const RoleConstants = require('../../models/roleConstants');
|
|
6
|
+
const roleConstants = require('../../models/roleConstants');
|
|
6
7
|
// const CannedResponseEvent = require('../event/CannedResponseEvent');
|
|
7
8
|
|
|
8
9
|
|
|
@@ -16,13 +17,18 @@ router.post('/', function (req, res) {
|
|
|
16
17
|
text: req.body.text,
|
|
17
18
|
id_project: req.projectid,
|
|
18
19
|
createdBy: req.user.id,
|
|
19
|
-
updatedBy: req.user.id
|
|
20
|
+
updatedBy: req.user.id,
|
|
21
|
+
shared: false
|
|
20
22
|
});
|
|
21
23
|
|
|
22
24
|
if (req.projectuser.role == 'owner' || req.projectuser.role == 'admin') {
|
|
23
25
|
newCannedResponse.shared = true;
|
|
24
26
|
} else {
|
|
25
|
-
|
|
27
|
+
if (req.projectuser.roleType === roleConstants.TYPE_AGENTS) {
|
|
28
|
+
if (req.body.shared && req.body.shared === true) {
|
|
29
|
+
newCannedResponse.shared = true;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
26
32
|
}
|
|
27
33
|
|
|
28
34
|
newCannedResponse.save(function (err, savedCannedResponse) {
|
|
@@ -40,8 +46,8 @@ router.put('/:cannedResponseid', async function (req, res) {
|
|
|
40
46
|
winston.debug(req.body);
|
|
41
47
|
const canned_id = req.params.cannedResponseid;
|
|
42
48
|
const id_project = req.projectid;
|
|
43
|
-
let user_role = req.projectuser
|
|
44
|
-
|
|
49
|
+
let user_role = req.projectuser?.role;
|
|
50
|
+
let roleType = req.projectuser?.roleType || null;
|
|
45
51
|
var update = {};
|
|
46
52
|
|
|
47
53
|
const allowedFields = ['title', 'text', 'attributes']
|
|
@@ -79,6 +85,12 @@ router.put('/:cannedResponseid', async function (req, res) {
|
|
|
79
85
|
winston.warn("Not allowed. User " + req.user.id + " can't modify a canned response of user " + canned.createdBy);
|
|
80
86
|
return res.status(403).send({ success: false, error: "Not allowed to modify a non administration canned response"})
|
|
81
87
|
}
|
|
88
|
+
}
|
|
89
|
+
else if (roleType === RoleConstants.TYPE_AGENTS) {
|
|
90
|
+
if (canned.hasOwnProperty('shared') && canned.shared === false && canned.createdBy !== req.user.id) {
|
|
91
|
+
winston.warn("Not allowed. User " + req.user.id + " can't modify a canned response of user " + canned.createdBy);
|
|
92
|
+
return res.status(403).send({ success: false, error: "Not allowed to modify a non administration canned response"})
|
|
93
|
+
}
|
|
82
94
|
} else {
|
|
83
95
|
winston.warn("User " + req.user.id + "trying to modify canned with role " + user_role);
|
|
84
96
|
return res.status(401).send({ success: false, error: "Unauthorized"})
|
|
@@ -100,6 +112,7 @@ router.delete('/:cannedResponseid', async function (req, res) {
|
|
|
100
112
|
const canned_id = req.params.cannedResponseid;
|
|
101
113
|
const id_project = req.projectid;
|
|
102
114
|
let user_role = req.projectuser.role;
|
|
115
|
+
let roleType = req.projectuser?.roleType || null;
|
|
103
116
|
|
|
104
117
|
let canned = await CannedResponse.findOne({ _id: canned_id, id_project: id_project }).catch((err) => {
|
|
105
118
|
winston.error("Error finding canned response: ", err);
|
|
@@ -128,7 +141,14 @@ router.delete('/:cannedResponseid', async function (req, res) {
|
|
|
128
141
|
winston.warn("Not allowed. User " + req.user.id + " can't delete a canned response of user " + canned.createdBy);
|
|
129
142
|
return res.status(403).send({ success: false, error: "Not allowed to delete a non administration canned response"})
|
|
130
143
|
}
|
|
131
|
-
}
|
|
144
|
+
}
|
|
145
|
+
else if (roleType === RoleConstants.TYPE_AGENTS) {
|
|
146
|
+
if (canned.hasOwnProperty('shared') && canned.shared === false && canned.createdBy !== req.user.id) {
|
|
147
|
+
winston.warn("Not allowed. User " + req.user.id + " can't delete a canned response of user " + canned.createdBy);
|
|
148
|
+
return res.status(403).send({ success: false, error: "Not allowed to delete a non administration canned response"})
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
132
152
|
winston.warn("User " + req.user.id + "trying to delete canned with role " + user_role);
|
|
133
153
|
return res.status(401).send({ success: false, error: "Unauthorized"})
|
|
134
154
|
}
|
|
@@ -149,6 +169,7 @@ router.delete('/:cannedResponseid/physical', async function (req, res) {
|
|
|
149
169
|
const canned_id = req.params.cannedResponseid;
|
|
150
170
|
const id_project = req.projectid;
|
|
151
171
|
let user_role = req.projectuser.role;
|
|
172
|
+
let roleType = req.projectuser?.roleType || null;
|
|
152
173
|
|
|
153
174
|
let canned = await CannedResponse.findOne({ _id: canned_id, id_project: id_project }).catch((err) => {
|
|
154
175
|
winston.error("Error finding canned response: ", err);
|
|
@@ -177,7 +198,14 @@ router.delete('/:cannedResponseid/physical', async function (req, res) {
|
|
|
177
198
|
winston.warn("Not allowed. User " + req.user.id + " can't delete a canned response of user " + canned.createdBy);
|
|
178
199
|
return res.status(403).send({ success: false, error: "Not allowed to delete a non administration canned response"})
|
|
179
200
|
}
|
|
180
|
-
}
|
|
201
|
+
}
|
|
202
|
+
else if (roleType === RoleConstants.TYPE_AGENTS) {
|
|
203
|
+
if (canned.hasOwnProperty('shared') && canned.shared === false && canned.createdBy !== req.user.id) {
|
|
204
|
+
winston.warn("Not allowed. User " + req.user.id + " can't delete a canned response of user " + canned.createdBy);
|
|
205
|
+
return res.status(403).send({ success: false, error: "Not allowed to delete a non administration canned response"})
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
181
209
|
winston.warn("User " + req.user.id + "trying to delete canned with role " + user_role);
|
|
182
210
|
return res.status(401).send({ success: false, error: "Unauthorized"})
|
|
183
211
|
}
|
|
@@ -110,7 +110,13 @@ class Listener {
|
|
|
110
110
|
var query = {id_project: operatorsResult.id_project, status: {$lt:1000}};
|
|
111
111
|
// asyncForEach(operatorsResult.available_agents, async (aa) => {
|
|
112
112
|
for (const aa of operatorsResult.available_agents) {
|
|
113
|
-
|
|
113
|
+
let user_id;
|
|
114
|
+
if (aa.id_user._id) {
|
|
115
|
+
user_id = aa.id_user._id.toString();// attento qui
|
|
116
|
+
} else {
|
|
117
|
+
user_id = aa.id_user;// attento qui
|
|
118
|
+
}
|
|
119
|
+
query.participants = user_id;
|
|
114
120
|
winston.debug("department operators query:" , query);
|
|
115
121
|
|
|
116
122
|
|
|
@@ -1164,11 +1164,8 @@ class RulesTrigger {
|
|
|
1164
1164
|
lead: createdLead, requester: puser
|
|
1165
1165
|
};
|
|
1166
1166
|
|
|
1167
|
-
|
|
1167
|
+
|
|
1168
1168
|
return requestService.create(new_request).then(function (savedRequest) {
|
|
1169
|
-
//console.log("[Performance] (rulesTrigger) requestService.create time: " + (Date.now() - t1));
|
|
1170
|
-
// performance console log
|
|
1171
|
-
// console.log("************* request created trigger: "+new Date().toISOString());
|
|
1172
1169
|
|
|
1173
1170
|
if (attributes) {
|
|
1174
1171
|
attributes.sendnotification = false; // sembra nn funzionae
|
|
@@ -1177,9 +1174,7 @@ class RulesTrigger {
|
|
|
1177
1174
|
var senderFullname = fullname || 'Guest'; // guest_here
|
|
1178
1175
|
|
|
1179
1176
|
// create(sender, senderFullname, recipient, text, id_project, createdBy, status, attributes, type, metadata, language) {
|
|
1180
|
-
//let t2 = Date.now();
|
|
1181
1177
|
return messageService.create( id_user, senderFullname , savedRequest.request_id, text, id_project, id_user, MessageConstants.CHAT_MESSAGE_STATUS.SENDING, attributes, type, eventTrigger.event.metadata, language).then(function(savedMessage) {
|
|
1182
|
-
//console.log("[Performance] (rulesTrigger) messageService.create time: " + (Date.now() - t2));
|
|
1183
1178
|
return savedMessage;
|
|
1184
1179
|
});
|
|
1185
1180
|
}).catch(function (err) {
|
package/routes/auth.js
CHANGED
|
@@ -197,6 +197,7 @@ function (req, res) {
|
|
|
197
197
|
id_project: req.body.id_project, //attentoqui
|
|
198
198
|
uuid_user: req.user._id,
|
|
199
199
|
role: RoleConstants.GUEST,
|
|
200
|
+
roleType : RoleConstants.TYPE_USERS,
|
|
200
201
|
user_available: true,
|
|
201
202
|
createdBy: req.user._id,
|
|
202
203
|
updatedBy: req.user._id
|
|
@@ -408,6 +409,7 @@ router.post('/signinWithCustomToken', [
|
|
|
408
409
|
uuid_user: req.user._id,
|
|
409
410
|
// id_user: req.user._id,
|
|
410
411
|
role: role,
|
|
412
|
+
roleType : RoleConstants.TYPE_USERS, //RICONtROLLA QUIA
|
|
411
413
|
user_available: true,
|
|
412
414
|
createdBy: req.user._id, //oppure req.user.id attento problema
|
|
413
415
|
updatedBy: req.user._id
|
|
@@ -486,7 +488,7 @@ router.post('/signinWithCustomToken', [
|
|
|
486
488
|
} else {
|
|
487
489
|
winston.debug('different role : '+role + " " + project_user.role);
|
|
488
490
|
}
|
|
489
|
-
|
|
491
|
+
// rolecheck
|
|
490
492
|
if (req.user.role && (req.user.role === RoleConstants.OWNER || req.user.role === RoleConstants.ADMIN || req.user.role === RoleConstants.AGENT)) {
|
|
491
493
|
let userFromDB = await User.findOne({email: req.user.email.toLowerCase(), status: 100}).exec();
|
|
492
494
|
|
package/routes/department.js
CHANGED
|
@@ -24,6 +24,7 @@ router.post('/', [passport.authenticate(['basic', 'jwt'], { session: false }), v
|
|
|
24
24
|
default: req.body.default,
|
|
25
25
|
status: req.body.status,
|
|
26
26
|
id_group: req.body.id_group,
|
|
27
|
+
groups: req.body.groups,
|
|
27
28
|
id_project: req.projectid,
|
|
28
29
|
createdBy: req.user.id,
|
|
29
30
|
updatedBy: req.user.id
|
|
@@ -79,7 +80,9 @@ router.put('/:departmentid', [passport.authenticate(['basic', 'jwt'], { session:
|
|
|
79
80
|
if (req.body.status!=undefined) {
|
|
80
81
|
update.status = req.body.status;
|
|
81
82
|
}
|
|
82
|
-
|
|
83
|
+
if (req.body.groups!=undefined) {
|
|
84
|
+
update.groups = req.body.groups;
|
|
85
|
+
}
|
|
83
86
|
|
|
84
87
|
|
|
85
88
|
Department.findByIdAndUpdate(req.params.departmentid, update, { new: true, upsert: true }, function (err, updatedDepartment) {
|
|
@@ -121,6 +124,9 @@ router.put('/:departmentid', [passport.authenticate(['basic', 'jwt'], { session:
|
|
|
121
124
|
if (req.body.id_group!=undefined) {
|
|
122
125
|
update.id_group = req.body.id_group;
|
|
123
126
|
}
|
|
127
|
+
if (req.body.groups!=undefined) {
|
|
128
|
+
update.groups = req.body.groups;
|
|
129
|
+
}
|
|
124
130
|
|
|
125
131
|
|
|
126
132
|
Department.findByIdAndUpdate(req.params.departmentid, update, { new: true, upsert: true }, function (err, updatedDepartment) {
|
package/routes/message.js
CHANGED
|
@@ -268,7 +268,10 @@ async (req, res) => {
|
|
|
268
268
|
|
|
269
269
|
// TOOD update also request attributes and sourcePage
|
|
270
270
|
// return requestService.incrementMessagesCountByRequestId(request.request_id, request.id_project).then(function(savedRequest) {
|
|
271
|
-
|
|
271
|
+
Request.findOneAndUpdate({request_id: request.request_id, id_project: request.id_project}, { "attributes.last_message": savedMessage}).catch((err) => {
|
|
272
|
+
winston.error("Create message - saved last message in request error: ", error);
|
|
273
|
+
})
|
|
274
|
+
|
|
272
275
|
|
|
273
276
|
if (request.participants && request.participants.indexOf(sender) > -1) { //update waiitng time if write an agent (member of participants)
|
|
274
277
|
winston.debug("updateWaitingTimeByRequestId");
|
package/routes/project.js
CHANGED
|
@@ -900,8 +900,10 @@ router.get('/', [passport.authenticate(['basic', 'jwt'], { session: false }), va
|
|
|
900
900
|
var sortQuery={};
|
|
901
901
|
sortQuery[sortField] = direction;
|
|
902
902
|
|
|
903
|
+
// rolequery
|
|
903
904
|
|
|
904
|
-
Project_user.find({ id_user: req.user._id ,
|
|
905
|
+
Project_user.find({ id_user: req.user._id , roleType: RoleConstants.TYPE_AGENTS, status: "active"}).
|
|
906
|
+
// Project_user.find({ id_user: req.user._id , role: { $in : [RoleConstants.OWNER, RoleConstants.ADMIN, RoleConstants.SUPERVISOR, RoleConstants.AGENT]}, status: "active"}).
|
|
905
907
|
// populate('id_project').
|
|
906
908
|
populate({
|
|
907
909
|
path: 'id_project',
|
|
@@ -1037,8 +1039,10 @@ router.get('/:projectid/users/availables', async (req, res) => {
|
|
|
1037
1039
|
if (isOpen === false) {
|
|
1038
1040
|
return res.json(available_agents_array);
|
|
1039
1041
|
}
|
|
1042
|
+
// rolequery
|
|
1043
|
+
let query = { id_project: projectid, user_available: true, roleType: RoleConstants.TYPE_AGENTS };
|
|
1044
|
+
// let query = { id_project: projectid, user_available: true, role: { $in : [RoleConstants.OWNER, RoleConstants.ADMIN, RoleConstants.SUPERVISOR, RoleConstants.AGENT]} };
|
|
1040
1045
|
|
|
1041
|
-
let query = { id_project: projectid, user_available: true, role: { $in : [RoleConstants.OWNER, RoleConstants.ADMIN, RoleConstants.SUPERVISOR, RoleConstants.AGENT]} };
|
|
1042
1046
|
|
|
1043
1047
|
if (dep_id) {
|
|
1044
1048
|
let department = await Department.findById(dep_id).catch((err) => {
|
|
@@ -1052,7 +1056,41 @@ router.get('/:projectid/users/availables', async (req, res) => {
|
|
|
1052
1056
|
}
|
|
1053
1057
|
|
|
1054
1058
|
let group_id = department.id_group;
|
|
1055
|
-
|
|
1059
|
+
let groups = department.groups;
|
|
1060
|
+
|
|
1061
|
+
if (groups && Array.isArray(groups) && groups.length > 0) {
|
|
1062
|
+
// Converti i group_id in ObjectId per la query
|
|
1063
|
+
const groupIds = groups
|
|
1064
|
+
.map(g => g.group_id)
|
|
1065
|
+
.filter(id => !!id)
|
|
1066
|
+
.map(id => mongoose.Types.ObjectId(id));
|
|
1067
|
+
|
|
1068
|
+
if (groupIds.length > 0) {
|
|
1069
|
+
const dbGroups = await Group.find({ _id: { $in: groupIds } }).catch((err) => {
|
|
1070
|
+
winston.error("(Users Availables) find groups error: ", err);
|
|
1071
|
+
return res.status(500).send({ success: false, error: err });
|
|
1072
|
+
});
|
|
1073
|
+
|
|
1074
|
+
if (!dbGroups || dbGroups.length === 0) {
|
|
1075
|
+
winston.error("(Users Availables) no valid groups found");
|
|
1076
|
+
return res.status(404).send({ success: false, error: "No valid groups found" });
|
|
1077
|
+
}
|
|
1078
|
+
|
|
1079
|
+
// Filtra i gruppi abilitati
|
|
1080
|
+
const enabledGroups = dbGroups.filter(g => g.enabled !== false);
|
|
1081
|
+
|
|
1082
|
+
if (enabledGroups.length === 0) {
|
|
1083
|
+
winston.error("(Users Availables) all groups are disabled");
|
|
1084
|
+
return res.status(403).send({ success: false, error: "All groups are currently disabled" });
|
|
1085
|
+
}
|
|
1086
|
+
|
|
1087
|
+
// Raccogli tutti i membri (stringhe) e rimuovi duplicati
|
|
1088
|
+
const members = [...new Set(enabledGroups.flatMap(g => g.members))];
|
|
1089
|
+
|
|
1090
|
+
query.id_user = { $in: members };
|
|
1091
|
+
}
|
|
1092
|
+
}
|
|
1093
|
+
else if (group_id) {
|
|
1056
1094
|
let group = await Group.findById(group_id).catch((err) => {
|
|
1057
1095
|
winston.error("(Users Availables) find group error: ", err)
|
|
1058
1096
|
return res.status(500).send({ success: false, error: err })
|
package/routes/project_user.js
CHANGED
|
@@ -16,6 +16,7 @@ var passport = require('passport');
|
|
|
16
16
|
require('../middleware/passport')(passport);
|
|
17
17
|
var validtoken = require('../middleware/valid-token')
|
|
18
18
|
var roleChecker = require('../middleware/has-role');
|
|
19
|
+
const puEvent = require('../event/projectUserEvent');
|
|
19
20
|
|
|
20
21
|
|
|
21
22
|
router.post('/invite', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('admin')], function (req, res) {
|
|
@@ -56,18 +57,30 @@ router.post('/invite', [passport.authenticate(['basic', 'jwt'], { session: false
|
|
|
56
57
|
|
|
57
58
|
} else {
|
|
58
59
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
60
|
+
/**
|
|
61
|
+
* *** IT IS NOT ALLOWED TO INVITE A USER WHO IS ALREADY A MEMBER OF THE PROJECT ***
|
|
62
|
+
* FIND THE PROJECT USERS FOR THE PROJECT ID PASSED BY THE CLIENT IN THE BODY OF THE REQUEST
|
|
63
|
+
* IF THE ID OF THE USER FOUND FOR THE EMAIL (PASSED IN THE BODY OF THE REQUEST - see above)
|
|
64
|
+
* MATCHES ONE OF THE USER ID CONTENTS IN THE PROJECTS USER OBJECT STOP THE WORKFLOW AND RETURN AN ERROR */
|
|
65
|
+
|
|
66
|
+
// rolequery
|
|
67
|
+
// var role = [RoleConstants.OWNER, RoleConstants.ADMIN, RoleConstants.SUPERVISOR, RoleConstants.AGENT];
|
|
68
|
+
// winston.debug("role", role);
|
|
69
|
+
|
|
70
|
+
// winston.debug("PROJECT USER ROUTES - req projectid", req.projectid);
|
|
71
|
+
return Project_user.findOne({ id_project: req.projectid, id_user: user._id, roleType: RoleConstants.TYPE_AGENTS, status: "active"}, function (err, puser) {
|
|
72
|
+
// return Project_user.find({ id_project: req.projectid, role: { $in : role }, status: "active"}, function (err, projectuser) {
|
|
73
|
+
//puser = projectuser
|
|
74
|
+
|
|
75
|
+
winston.debug('PRJCT-USERS FOUND (FILTERED FOR THE PROJECT ID) ', puser )
|
|
62
76
|
if (err) {
|
|
63
77
|
winston.error("Error inviting an already existing user: ", err);
|
|
64
78
|
return res.status(500).send({ success: false, msg: "An error occurred on inviting user " + email + " on project " + id_project })
|
|
65
79
|
}
|
|
66
80
|
|
|
67
|
-
if (!roles.includes(req.body.role)) {
|
|
68
|
-
|
|
69
|
-
}
|
|
70
|
-
|
|
81
|
+
// if (!roles.includes(req.body.role)) {
|
|
82
|
+
// return res.status(400).send({ success: false, msg: 'Invalid role specified: ' + req.body.role });
|
|
83
|
+
// }
|
|
71
84
|
let user_available = typeof req.body.user_available === 'boolean' ? req.body.user_available : true
|
|
72
85
|
|
|
73
86
|
if (puser) {
|
|
@@ -76,7 +89,20 @@ router.post('/invite', [passport.authenticate(['basic', 'jwt'], { session: false
|
|
|
76
89
|
return res.status(403).send({ success: false, msg: 'Forbidden. User is already a member', code: 4001 });
|
|
77
90
|
}
|
|
78
91
|
|
|
79
|
-
|
|
92
|
+
winston.debug('NO ERROR, SO CREATE AND SAVE A NEW PROJECT USER ')
|
|
93
|
+
|
|
94
|
+
var newProject_user = new Project_user({
|
|
95
|
+
// _id: new mongoose.Types.ObjectId(),
|
|
96
|
+
id_project: req.projectid,
|
|
97
|
+
id_user: user._id,
|
|
98
|
+
role: req.body.role,
|
|
99
|
+
roleType : RoleConstants.TYPE_AGENTS,
|
|
100
|
+
user_available: user_available,
|
|
101
|
+
createdBy: req.user.id,
|
|
102
|
+
updatedBy: req.user.id
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
return newProject_user.save(function (err, savedProject_user) {
|
|
80
106
|
if (err) {
|
|
81
107
|
winston.error("Error update existing project user before inviting it ", err)
|
|
82
108
|
return res.status(500).send({ success: false, msg: "An error occurred on inviting user " + email + " on project " + id_project })
|
|
@@ -101,6 +127,7 @@ router.post('/invite', [passport.authenticate(['basic', 'jwt'], { session: false
|
|
|
101
127
|
id_project: id_project,
|
|
102
128
|
id_user: user._id,
|
|
103
129
|
role: req.body.role,
|
|
130
|
+
roleType : RoleConstants.TYPE_AGENTS,
|
|
104
131
|
user_available: user_available,
|
|
105
132
|
createdBy: req.user.id,
|
|
106
133
|
updatedBy: req.user.id
|
|
@@ -138,6 +165,7 @@ router.post('/', [passport.authenticate(['basic', 'jwt'], { session: false }), v
|
|
|
138
165
|
// role: RoleConstants.USER,
|
|
139
166
|
// - Create project_user endpoint by agent (Ticketing) now is with Guest Role
|
|
140
167
|
role: RoleConstants.GUEST,
|
|
168
|
+
roleType : RoleConstants.TYPE_USERS,
|
|
141
169
|
user_available: false,
|
|
142
170
|
tags: req.body.tags,
|
|
143
171
|
createdBy: req.user.id,
|
|
@@ -298,6 +326,7 @@ router.delete('/:project_userid', [passport.authenticate(['basic', 'jwt'], { ses
|
|
|
298
326
|
return res.status(404).send({ success: false, error: 'Project user not found with id ' + pu_id });
|
|
299
327
|
}
|
|
300
328
|
|
|
329
|
+
puEvent.emit('project_user.deleted', project_user);
|
|
301
330
|
// Event 'project_user.delete' not working - Check it and improve it to manage soft/hard delete
|
|
302
331
|
return res.status(200).send(project_user);
|
|
303
332
|
|
|
@@ -324,6 +353,7 @@ router.delete('/:project_userid', [passport.authenticate(['basic', 'jwt'], { ses
|
|
|
324
353
|
});
|
|
325
354
|
}
|
|
326
355
|
|
|
356
|
+
puEvent.emit('project_user.deleted', project_user);
|
|
327
357
|
return res.status(200).send(project_user);
|
|
328
358
|
});
|
|
329
359
|
}
|
|
@@ -387,6 +417,20 @@ router.put('/:project_userid/restore', [passport.authenticate(['basic', 'jwt'],
|
|
|
387
417
|
});
|
|
388
418
|
});
|
|
389
419
|
|
|
420
|
+
router.get('/me', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('agent', ['subscription'])], function (req, res, next) {
|
|
421
|
+
if (!req.project) {
|
|
422
|
+
return res.status(404).send({ success: false, msg: 'Project not found.' });
|
|
423
|
+
}
|
|
424
|
+
var project_user = req.projectuser;
|
|
425
|
+
|
|
426
|
+
var pu = project_user.toJSON();
|
|
427
|
+
|
|
428
|
+
pu.isBusy = ProjectUserUtil.isBusy(project_user, req.project.settings && req.project.settings.max_agent_assigned_chat);
|
|
429
|
+
res.json([pu]);
|
|
430
|
+
|
|
431
|
+
|
|
432
|
+
});
|
|
433
|
+
|
|
390
434
|
router.get('/:project_userid', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('agent', ['subscription'])], function (req, res) {
|
|
391
435
|
// router.get('/details/:project_userid', function (req, res) {
|
|
392
436
|
// winston.debug("PROJECT USER ROUTES - req projectid", req.projectid);
|
|
@@ -513,18 +557,25 @@ router.get('/users/:user_id', [passport.authenticate(['basic', 'jwt'], { session
|
|
|
513
557
|
*/
|
|
514
558
|
router.get('/', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('agent', ['bot', 'subscription'])], function (req, res) {
|
|
515
559
|
|
|
516
|
-
|
|
560
|
+
// rolequery
|
|
561
|
+
// var role = [RoleConstants.OWNER, RoleConstants.ADMIN, RoleConstants.SUPERVISOR, RoleConstants.AGENT];
|
|
517
562
|
|
|
563
|
+
var query;
|
|
518
564
|
if (req.query.role) {
|
|
519
565
|
role = req.query.role;
|
|
566
|
+
winston.debug("role", role);
|
|
567
|
+
query = {id_project: req.projectid, role: { $in : role } };
|
|
568
|
+
} else {
|
|
569
|
+
query = {id_project: req.projectid, roleType: RoleConstants.TYPE_AGENTS };
|
|
520
570
|
}
|
|
521
|
-
winston.debug("role", role);
|
|
522
571
|
|
|
523
|
-
var query = { id_project: req.projectid, role: { $in : role } };
|
|
524
572
|
if (!req.query.trashed || req.query.trashed === 'false' || req.query.trashed === false) {
|
|
525
573
|
query.trashed = { $ne: true };
|
|
526
574
|
}
|
|
527
575
|
|
|
576
|
+
// var query = {id_project: req.projectid, role: { $in : role } };
|
|
577
|
+
|
|
578
|
+
|
|
528
579
|
if (req.query.presencestatus) {
|
|
529
580
|
query["presence.status"] = req.query.presencestatus;
|
|
530
581
|
}
|