@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.
Files changed (47) hide show
  1. package/CHANGELOG.md +4 -3
  2. package/app.js +2 -0
  3. package/channels/chat21/chat21WebHook.js +6 -1
  4. package/event/authEvent.js +16 -0
  5. package/event/projectUserEvent.js +39 -0
  6. package/event/roleEvent.js +9 -0
  7. package/middleware/has-role.js +160 -121
  8. package/middleware/passport.js +180 -179
  9. package/migrations/1757601159298-project_user_role_type.js +45 -0
  10. package/models/department.js +3 -0
  11. package/models/groupMemberSchama.js +19 -0
  12. package/models/kb_setting.js +6 -2
  13. package/models/permissionConstants.js +19 -0
  14. package/models/project_user.js +86 -8
  15. package/models/request.js +1 -0
  16. package/models/role.js +31 -0
  17. package/models/roleConstants.js +2 -0
  18. package/package.json +1 -1
  19. package/pubmodules/analytics/analytics.js +2 -2
  20. package/pubmodules/cache/mongoose-cachegoose-fn.js +37 -0
  21. package/pubmodules/canned/cannedResponseRoute.js +34 -6
  22. package/pubmodules/routing-queue/listener.js +7 -1
  23. package/pubmodules/trigger/rulesTrigger.js +1 -6
  24. package/routes/auth.js +3 -1
  25. package/routes/department.js +7 -1
  26. package/routes/message.js +4 -1
  27. package/routes/project.js +41 -3
  28. package/routes/project_user.js +62 -11
  29. package/routes/request.js +32 -30
  30. package/routes/roles.js +151 -0
  31. package/routes/unanswered.js +1 -1
  32. package/routes/widget.js +3 -1
  33. package/services/cacheEnabler.js +5 -8
  34. package/services/departmentService.js +39 -11
  35. package/services/emailService.js +2 -2
  36. package/services/pendingInvitationService.js +2 -0
  37. package/services/projectService.js +3 -1
  38. package/services/projectUserService.js +67 -4
  39. package/services/subscriptionNotifierQueued.js +8 -0
  40. package/services/updateRequestSnapshotQueued.js +0 -3
  41. package/test/departmentService.js +5 -0
  42. package/test/messageRoute.js +7 -4
  43. package/test/projectUserRoute.js +116 -0
  44. package/test/requestService.js +7 -3
  45. package/test-int/bot.js +3 -2
  46. package/websocket/webSocketServer.js +273 -225
  47. 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;
@@ -1,4 +1,6 @@
1
1
  module.exports = {
2
+ TYPE_AGENTS : 1,
3
+ TYPE_USERS : 2,
2
4
  // SUPERADMIN : 'superadmin',
3
5
  OWNER : 'owner',
4
6
  ADMIN : 'admin',
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.17.4",
4
+ "version": "2.18.1",
5
5
  "scripts": {
6
6
  "start": "node ./bin/www",
7
7
  "pretest": "mongodb-runner start",
@@ -1780,7 +1780,7 @@ router.get('/tags/:type', async (req, res) => {
1780
1780
  date: { $gte: startDate, $lte: endDate }
1781
1781
  }
1782
1782
 
1783
- console.log("analytics tags query: ", query)
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
- console.log(data);
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
- newCannedResponse.shared = false;
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.role;
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
- } else {
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
- } else {
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
- query.participants = aa.id_user._id.toString();// attento qui
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
- //let t1 = Date.now();
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
 
@@ -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
- // console.log("savedRequest.participants.indexOf(message.sender)", savedRequest.participants.indexOf(message.sender));
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 , role: { $in : [RoleConstants.OWNER, RoleConstants.ADMIN, RoleConstants.SUPERVISOR, RoleConstants.AGENT]}, status: "active"}).
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
- if (group_id) {
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 })
@@ -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
- let roles = [RoleConstants.OWNER, RoleConstants.ADMIN, RoleConstants.SUPERVISOR, RoleConstants.AGENT];
60
-
61
- Project_user.findOne({ id_project: id_project, id_user: user._id, role: { $in: roles }}, (err, puser) => {
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
- return res.status(400).send({ success: false, msg: 'Invalid role specified: ' + req.body.role });
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
- Project_user.findByIdAndUpdate(puser._id, { role: req.body.role, user_available: user_available, trashed: false, status: 'active' }, { new: true}, (err, updatedPuser) => {
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
- var role = [RoleConstants.OWNER, RoleConstants.ADMIN, RoleConstants.SUPERVISOR, RoleConstants.AGENT];
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
  }