@tiledesk/tiledesk-server 2.17.4 → 2.18.3
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 +8 -3
- package/app.js +4 -0
- package/channels/chat21/chat21WebHook.js +6 -1
- package/docs/routes-answered.md +153 -0
- 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 +104 -0
- package/models/department.js +3 -0
- package/models/groupMemberSchama.js +19 -0
- package/models/kb_setting.js +74 -4
- 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/answered.js +227 -0
- 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 +32 -19
- 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
|
@@ -272,9 +272,25 @@ getOperators(departmentid, projectid, nobot, disableWebHookCall, context) {
|
|
|
272
272
|
// console.log('OPERATORS - »»»» BOT IS DEFINED - !!! DEPT HAS NOT GROUP ID')
|
|
273
273
|
// console.log('OPERATORS - »»»» BOT IS DEFINED -> ID BOT', department.id_bot);
|
|
274
274
|
// console.log('OPERATORS - »»»» nobot ', nobot)
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
275
|
+
winston.debug("main_flow_cache_2 departmentService project users");
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
// rolequery
|
|
279
|
+
// var role = [RoleConstants.OWNER, RoleConstants.ADMIN, RoleConstants.SUPERVISOR, RoleConstants.AGENT];
|
|
280
|
+
// var qpu = Project_user.find({ id_project: projectid, role: { $in : role }, status: "active" });
|
|
281
|
+
var qpu = Project_user.find({ id_project: projectid, roleType: RoleConstants.TYPE_AGENTS, status: "active" });
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
// use this. $in doesn't use index very well
|
|
285
|
+
// var qpu = Project_user.findOne({ id_project: projectid, $or: [{ "role": RoleConstants.AGENT }, { "role": RoleConstants.SUPERVISOR }, { "role": RoleConstants.ADMIN }, { "role": RoleConstants.OWNER }], status: "active" })
|
|
286
|
+
|
|
287
|
+
if (cacheEnabler.project_user) {
|
|
288
|
+
qpu.cache(cacheUtil.queryTTL, projectid+":project_users:query:teammates:available") //request_cache
|
|
289
|
+
winston.debug('project_user cache enabled');
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
return qpu.exec(function (err, project_users) {
|
|
278
294
|
if (err) {
|
|
279
295
|
winston.error('-- > 2 DEPT FIND BY ID ERR ', err)
|
|
280
296
|
return reject(err);
|
|
@@ -369,12 +385,12 @@ getOperators(departmentid, projectid, nobot, disableWebHookCall, context) {
|
|
|
369
385
|
// console.log('D-2 GROUP -> [ FIND PROJECT USERS: ALL and AVAILABLE (with OH) ] -> MEMBERS LENGHT: ', group[0].members.length);
|
|
370
386
|
// console.log('D-2 GROUP -> [ FIND PROJECT USERS: ALL and AVAILABLE (with OH) ] -> MEMBERS ID: ', group[0].members);
|
|
371
387
|
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
//
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
//return Project_user.find({ id_project: projectid, id_user: group[0].members, role: { $in : [RoleConstants.OWNER, RoleConstants.ADMIN, RoleConstants.AGENT]} }).exec(function (err, project_users) {
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
// rolequery
|
|
391
|
+
|
|
392
|
+
return Project_user.find({ id_project: projectid, id_user: { $in : group[0].members}, roleType: RoleConstants.TYPE_AGENTS, status: "active" }).exec(function (err, project_users) {
|
|
393
|
+
// return Project_user.find({ id_project: projectid, id_user: { $in : group[0].members}, role: { $in : [RoleConstants.OWNER, RoleConstants.ADMIN, RoleConstants.SUPERVISOR, RoleConstants.AGENT]}, status: "active" }).exec(function (err, project_users) {
|
|
378
394
|
|
|
379
395
|
// console.log('D-2 GROUP -> [ FIND PROJECT USERS: ALL and AVAILABLE (with OH) ] -> PROJECT ID ', projectid);
|
|
380
396
|
if (err) {
|
|
@@ -436,8 +452,20 @@ getOperators(departmentid, projectid, nobot, disableWebHookCall, context) {
|
|
|
436
452
|
|
|
437
453
|
return new Promise(function (resolve, reject) {
|
|
438
454
|
|
|
439
|
-
var role = [RoleConstants.OWNER, RoleConstants.ADMIN, RoleConstants.SUPERVISOR, RoleConstants.AGENT];
|
|
440
|
-
|
|
455
|
+
// var role = [RoleConstants.OWNER, RoleConstants.ADMIN, RoleConstants.SUPERVISOR, RoleConstants.AGENT];
|
|
456
|
+
// rolequery
|
|
457
|
+
var qpu = Project_user.find({ id_project: projectid, roleType: RoleConstants.TYPE_AGENTS, status: "active" });
|
|
458
|
+
// var qpu = Project_user.find({ id_project: projectid, role: { $in : role }, status: "active" });
|
|
459
|
+
|
|
460
|
+
// use this. $in doesn't use index very well
|
|
461
|
+
if (cacheEnabler.project_user) {
|
|
462
|
+
qpu.cache(cacheUtil.queryTTL, projectid+":project_users:query:teammates:available") //request_cache
|
|
463
|
+
winston.debug('project_user cache enabled');
|
|
464
|
+
}
|
|
465
|
+
// return Project_user.find({ id_project: projectid , role: { $in : role }, status: "active" }).exec(function (err, project_users) {
|
|
466
|
+
return qpu.exec(function (err, project_users) {
|
|
467
|
+
|
|
468
|
+
|
|
441
469
|
if (err) {
|
|
442
470
|
winston.error('D-3 NO GROUP -> [ FIND PROJECT USERS: ALL and AVAILABLE (with OH) ] -> ERR ', err)
|
|
443
471
|
return reject(err);
|
package/services/emailService.js
CHANGED
|
@@ -282,7 +282,6 @@ class EmailService {
|
|
|
282
282
|
// }
|
|
283
283
|
|
|
284
284
|
async send(mail, quoteEnabled, project, quoteManager) {
|
|
285
|
-
|
|
286
285
|
if (!this.enabled) {
|
|
287
286
|
winston.info('EmailService is disabled. Not sending email');
|
|
288
287
|
return 0;
|
|
@@ -339,7 +338,8 @@ class EmailService {
|
|
|
339
338
|
if (mail.callback) {
|
|
340
339
|
mail.callback(error, { info: info });
|
|
341
340
|
}
|
|
342
|
-
return winston.error("Error sending email ", { error: error, mailConfig: mail.config, mailOptions: mailOptions });
|
|
341
|
+
//return winston.error("Error sending email ", { error: error, mailConfig: mail.config, mailOptions: mailOptions });
|
|
342
|
+
return winston.error("Error sending email ", { error: error, mailConfig: mail.config });
|
|
343
343
|
}
|
|
344
344
|
winston.verbose('Email sent:', { info: info });
|
|
345
345
|
winston.debug('Email sent:', { info: info, mailOptions: mailOptions });
|
|
@@ -4,6 +4,7 @@ var emailService = require("../services/emailService");
|
|
|
4
4
|
var Project_user = require("../models/project_user");
|
|
5
5
|
var mongoose = require('mongoose');
|
|
6
6
|
var winston = require('../config/winston');
|
|
7
|
+
var RoleConstants = require("../models/roleConstants");
|
|
7
8
|
|
|
8
9
|
class Pending_Invitation {
|
|
9
10
|
|
|
@@ -91,6 +92,7 @@ class Pending_Invitation {
|
|
|
91
92
|
id_project: invite.id_project,
|
|
92
93
|
id_user: newUserId,
|
|
93
94
|
role: invite.role,
|
|
95
|
+
roleType : RoleConstants.TYPE_AGENTS,
|
|
94
96
|
user_available: true,
|
|
95
97
|
createdBy: invite.createdBy,
|
|
96
98
|
updatedBy: invite.createdBy
|
|
@@ -8,6 +8,7 @@ var projectEvent = require("../event/projectEvent");
|
|
|
8
8
|
var winston = require('../config/winston');
|
|
9
9
|
const cacheEnabler = require("./cacheEnabler");
|
|
10
10
|
const cacheUtil = require("../utils/cacheUtil");
|
|
11
|
+
var RoleConstants = require("../models/roleConstants");
|
|
11
12
|
|
|
12
13
|
class ProjectService {
|
|
13
14
|
|
|
@@ -33,7 +34,8 @@ class ProjectService {
|
|
|
33
34
|
var newProject_user = new Project_user({
|
|
34
35
|
id_project: savedProject._id,
|
|
35
36
|
id_user: createdBy,
|
|
36
|
-
role:
|
|
37
|
+
role: RoleConstants.OWNER,
|
|
38
|
+
roleType : RoleConstants.TYPE_AGENTS,
|
|
37
39
|
user_available: true,
|
|
38
40
|
createdBy: createdBy,
|
|
39
41
|
updatedBy: createdBy
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var Project = require("../models/project");
|
|
4
3
|
var Project_user = require("../models/project_user");
|
|
5
|
-
var mongoose = require('mongoose');
|
|
6
|
-
var User = require('../models/user');
|
|
7
4
|
var winston = require('../config/winston');
|
|
8
|
-
|
|
5
|
+
|
|
6
|
+
var Role = require('../models/role');
|
|
7
|
+
var cacheUtil = require('../utils/cacheUtil');
|
|
8
|
+
var cacheEnabler = require("../services/cacheEnabler");
|
|
9
9
|
|
|
10
10
|
class ProjectUserService {
|
|
11
11
|
|
|
@@ -42,6 +42,69 @@ class ProjectUserService {
|
|
|
42
42
|
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
+
async getWithPermissions(id_user, id_project, user_sub) {
|
|
46
|
+
var project_user = await this.get(id_user, id_project, user_sub);
|
|
47
|
+
winston.debug("getWithPermissions for id_user " + id_user + " project_user ", project_user);
|
|
48
|
+
|
|
49
|
+
if (project_user) {
|
|
50
|
+
winston.debug("getWithPermissions project_user role: " + project_user.role);
|
|
51
|
+
|
|
52
|
+
var role = await this.getPermissions(project_user.role, id_project);
|
|
53
|
+
|
|
54
|
+
if (role) {
|
|
55
|
+
project_user._doc.rolePermissions = role.permissions; //https://github.com/Automattic/mongoose/issues/4614
|
|
56
|
+
// project_user.set("rolePermissions", role);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return project_user;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
async getPermissions(role, id_project) {
|
|
66
|
+
// var cacheManager = require('../utils/cacheManager');
|
|
67
|
+
// cacheManager.getClient().get("find in cache")
|
|
68
|
+
let q = Role.findOne({"name":role, "id_project": id_project});
|
|
69
|
+
|
|
70
|
+
let cache_key = id_project+":roles:"+role;
|
|
71
|
+
|
|
72
|
+
if (cacheEnabler.role) {
|
|
73
|
+
q.cache(cacheUtil.defaultTTL, cache_key);
|
|
74
|
+
winston.debug("cacheEnabler.role enabled");
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
var role = await q.exec();
|
|
78
|
+
|
|
79
|
+
if (role)
|
|
80
|
+
winston.debug("getWithPermissions role ", role.toJSON());
|
|
81
|
+
|
|
82
|
+
return role;
|
|
83
|
+
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
async get(id_user, id_project, user_sub) {
|
|
87
|
+
// JWT_HERE
|
|
88
|
+
var query = { id_project: id_project, id_user: id_user, status: "active"};
|
|
89
|
+
let cache_key = id_project+":project_users:iduser:"+id_user;
|
|
90
|
+
|
|
91
|
+
if (user_sub && (user_sub=="userexternal" || user_sub=="guest")) {
|
|
92
|
+
query = { id_project: id_project, uuid_user: id_user, status: "active"};
|
|
93
|
+
cache_key = id_project+":project_users:uuid_user:"+id_user;
|
|
94
|
+
}
|
|
95
|
+
winston.debug("hasRoleOrType query " + JSON.stringify(query));
|
|
96
|
+
|
|
97
|
+
let q = Project_user.findOne(query);
|
|
98
|
+
if (cacheEnabler.project_user) {
|
|
99
|
+
q.cache(cacheUtil.defaultTTL, cache_key);
|
|
100
|
+
winston.debug("cacheEnabler.project_user enabled");
|
|
101
|
+
}
|
|
102
|
+
var project_user = await q.exec();
|
|
103
|
+
winston.debug("ProjectUserUtil project_user", project_user);
|
|
104
|
+
|
|
105
|
+
return project_user;
|
|
106
|
+
}
|
|
107
|
+
|
|
45
108
|
}
|
|
46
109
|
var projectUserService = new ProjectUserService();
|
|
47
110
|
|
|
@@ -111,6 +111,14 @@ class SubscriptionNotifierQueued {
|
|
|
111
111
|
winston.debug('SubscriptionNotifier project_user.update sent');
|
|
112
112
|
});
|
|
113
113
|
});
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
authEvent.on("project_user.update.agent", function(event) {
|
|
117
|
+
setImmediate(() => {
|
|
118
|
+
subscriptionNotifier.subscribe('project_user.update.agent', event.updatedProject_userPopulated);
|
|
119
|
+
winston.debug('SubscriptionNotifier project_user.update.agent sent');
|
|
120
|
+
});
|
|
121
|
+
});
|
|
114
122
|
|
|
115
123
|
winston.info('SubscriptionNotifierQueued started');
|
|
116
124
|
}
|
|
@@ -25,12 +25,10 @@ class UpdateRequestSnapshotQueued {
|
|
|
25
25
|
requestEvent.on(snapshotUpdateKey, function (data) {
|
|
26
26
|
setImmediate(() => {
|
|
27
27
|
winston.debug("updateRequestSnapshot on request.snapshot.update ", data);
|
|
28
|
-
console.log("updateRequestSnapshot on request.snapshot.update ", data);
|
|
29
28
|
|
|
30
29
|
const request = data.request;
|
|
31
30
|
const snapshot = data.snapshot;
|
|
32
31
|
const agentsArray = snapshot?.agents || [];
|
|
33
|
-
console.log("(queue) updateRequestSnapshot snapshot agents length: ", agentsArray.length);
|
|
34
32
|
|
|
35
33
|
if (!request || !request.request_id || !request.id_project) {
|
|
36
34
|
winston.error("updateRequestSnapshot: Invalid request data", data);
|
|
@@ -57,7 +55,6 @@ class UpdateRequestSnapshotQueued {
|
|
|
57
55
|
return;
|
|
58
56
|
}
|
|
59
57
|
if (updatedRequest) {
|
|
60
|
-
console.log("updateRequestSnapshot updated snapshot.agents for request " + updatedRequest.request_id, new Date());
|
|
61
58
|
winston.debug("updateRequestSnapshot updated snapshot.agents for request " + updatedRequest.request_id);
|
|
62
59
|
} else {
|
|
63
60
|
winston.warn("updateRequestSnapshot: Request not found for " + request.request_id);
|
|
@@ -48,6 +48,7 @@ describe('DepartmentService()', function () {
|
|
|
48
48
|
id_project: savedProject._id,
|
|
49
49
|
id_user: savedUser2._id,
|
|
50
50
|
role: roleConstants.AGENT,
|
|
51
|
+
roleType : RoleConstants.TYPE_AGENTS,
|
|
51
52
|
user_available: true,
|
|
52
53
|
createdBy: savedUser2._id,
|
|
53
54
|
updatedBy: savedUser2._id,
|
|
@@ -62,6 +63,7 @@ describe('DepartmentService()', function () {
|
|
|
62
63
|
id_project: savedProject._id,
|
|
63
64
|
id_user: savedUser3._id,
|
|
64
65
|
role: roleConstants.AGENT,
|
|
66
|
+
roleType : RoleConstants.TYPE_AGENTS,
|
|
65
67
|
user_available: true,
|
|
66
68
|
createdBy: savedUser3._id,
|
|
67
69
|
updatedBy: savedUser3._id,
|
|
@@ -126,6 +128,7 @@ describe('DepartmentService()', function () {
|
|
|
126
128
|
id_project: savedProject._id,
|
|
127
129
|
id_user: savedUser2._id,
|
|
128
130
|
role: roleConstants.AGENT,
|
|
131
|
+
roleType : RoleConstants.TYPE_AGENTS,
|
|
129
132
|
user_available: true,
|
|
130
133
|
createdBy: savedUser2._id,
|
|
131
134
|
updatedBy: savedUser2._id,
|
|
@@ -247,6 +250,7 @@ describe('DepartmentService()', function () {
|
|
|
247
250
|
id_project: savedProject._id,
|
|
248
251
|
id_user: savedUser2._id,
|
|
249
252
|
role: roleConstants.AGENT,
|
|
253
|
+
roleType : RoleConstants.TYPE_AGENTS,
|
|
250
254
|
user_available: false,
|
|
251
255
|
createdBy: savedUser2._id,
|
|
252
256
|
updatedBy: savedUser2._id,
|
|
@@ -325,6 +329,7 @@ describe('DepartmentService()', function () {
|
|
|
325
329
|
id_project: savedProject._id,
|
|
326
330
|
id_user: savedUser2._id,
|
|
327
331
|
role: roleConstants.AGENT,
|
|
332
|
+
roleType : RoleConstants.TYPE_AGENTS,
|
|
328
333
|
user_available: false,
|
|
329
334
|
createdBy: savedUser2._id,
|
|
330
335
|
updatedBy: savedUser2._id,
|
package/test/messageRoute.js
CHANGED
|
@@ -9,7 +9,7 @@ var userService = require('../services/userService');
|
|
|
9
9
|
var leadService = require('../services/leadService');
|
|
10
10
|
var messageService = require('../services/messageService');
|
|
11
11
|
var Project_user = require("../models/project_user");
|
|
12
|
-
var
|
|
12
|
+
var RoleConstants = require('../models/roleConstants');
|
|
13
13
|
const uuidv4 = require('uuid/v4');
|
|
14
14
|
|
|
15
15
|
//Require the dev-dependencies
|
|
@@ -223,7 +223,8 @@ describe('MessageRoute', () => {
|
|
|
223
223
|
// _id: new mongoose.Types.ObjectId(),
|
|
224
224
|
id_project: savedProject._id,
|
|
225
225
|
id_user: savedUser2._id,
|
|
226
|
-
role:
|
|
226
|
+
role: RoleConstants.AGENT,
|
|
227
|
+
roleType : RoleConstants.TYPE_AGENTS,
|
|
227
228
|
user_available: true,
|
|
228
229
|
createdBy: savedUser2._id,
|
|
229
230
|
updatedBy: savedUser2._id,
|
|
@@ -298,7 +299,8 @@ describe('MessageRoute', () => {
|
|
|
298
299
|
// _id: new mongoose.Types.ObjectId(),
|
|
299
300
|
id_project: savedProject._id,
|
|
300
301
|
uuid_user: uid,
|
|
301
|
-
role:
|
|
302
|
+
role: RoleConstants.USER,
|
|
303
|
+
roleType : RoleConstants.TYPE_USERS,
|
|
302
304
|
user_available: true,
|
|
303
305
|
createdBy: savedUser._id,
|
|
304
306
|
updatedBy: savedUser._id,
|
|
@@ -875,7 +877,8 @@ describe('MessageRoute', () => {
|
|
|
875
877
|
// _id: new mongoose.Types.ObjectId(),
|
|
876
878
|
id_project: savedProject._id,
|
|
877
879
|
id_user: savedUser2._id,
|
|
878
|
-
role:
|
|
880
|
+
role: RoleConstants.USER,
|
|
881
|
+
roleType : RoleConstants.TYPE_USERS,
|
|
879
882
|
user_available: true,
|
|
880
883
|
createdBy: savedUser2._id,
|
|
881
884
|
updatedBy: savedUser2._id,
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
//During the test the env variable is set to test
|
|
2
|
+
process.env.NODE_ENV = 'test';
|
|
3
|
+
process.env.LOG_LEVEL = 'error';
|
|
4
|
+
process.env.ADMIN_EMAIL = "admin@tiledesk.com";
|
|
5
|
+
|
|
6
|
+
let log = false;
|
|
7
|
+
var projectService = require('../services/projectService');
|
|
8
|
+
var userService = require('../services/userService');
|
|
9
|
+
|
|
10
|
+
//Require the dev-dependencies
|
|
11
|
+
let chai = require('chai');
|
|
12
|
+
let chaiHttp = require('chai-http');
|
|
13
|
+
let server = require('../app');
|
|
14
|
+
let should = chai.should();
|
|
15
|
+
var fs = require('fs');
|
|
16
|
+
const path = require('path');
|
|
17
|
+
|
|
18
|
+
// chai.config.includeStack = true;
|
|
19
|
+
|
|
20
|
+
var expect = chai.expect;
|
|
21
|
+
var assert = chai.assert;
|
|
22
|
+
|
|
23
|
+
chai.use(chaiHttp);
|
|
24
|
+
|
|
25
|
+
describe('ProjectUserRoute', () => {
|
|
26
|
+
|
|
27
|
+
describe('Delete', () => {
|
|
28
|
+
|
|
29
|
+
it('delete-project-user-and-remove-from-group', (done) => {
|
|
30
|
+
|
|
31
|
+
let email_owner = "owner-signup-" + Date.now() + "@email.com";
|
|
32
|
+
let email_agent = "agent-signup-" + Date.now() + "@email.com";
|
|
33
|
+
var pwd = "pwd";
|
|
34
|
+
|
|
35
|
+
userService.signup(email_owner, pwd, "Owner Firstname", "Owner Lastname").then((owner) => {
|
|
36
|
+
userService.signup(email_agent, pwd, "Agent Firstname", "Agent Lastname").then((agent) => {
|
|
37
|
+
projectService.create("test-project", owner._id).then((project) => {
|
|
38
|
+
|
|
39
|
+
// Invite agent on the project
|
|
40
|
+
chai.request(server)
|
|
41
|
+
.post('/' + project._id + "/project_users/invite")
|
|
42
|
+
.auth(email_owner, pwd)
|
|
43
|
+
.set('content-type', 'application/json')
|
|
44
|
+
.send({ email: email_agent, role: "agent", userAvailable: false })
|
|
45
|
+
.end((err, res) => {
|
|
46
|
+
|
|
47
|
+
if (err) { console.error("err: ", err); }
|
|
48
|
+
if (log) { console.log("Invite agent to project res.body: ", res.body) };
|
|
49
|
+
|
|
50
|
+
res.should.have.status(200);
|
|
51
|
+
res.body.should.be.a('object');
|
|
52
|
+
expect(res.body.id_user).to.equal(agent._id.toString());
|
|
53
|
+
|
|
54
|
+
let pu_id = res.body._id;
|
|
55
|
+
|
|
56
|
+
// Create group
|
|
57
|
+
chai.request(server)
|
|
58
|
+
.post('/' + project._id + "/groups")
|
|
59
|
+
.auth(email_owner, pwd)
|
|
60
|
+
.set('content-type', 'application/json')
|
|
61
|
+
.send({ name: "test-group", members: [owner._id, agent._id] })
|
|
62
|
+
.end((err, res) => {
|
|
63
|
+
|
|
64
|
+
if (err) { console.error("err: ", err); }
|
|
65
|
+
if (log) { console.log("Create group res.body: ", res.body) };
|
|
66
|
+
|
|
67
|
+
res.should.have.status(200);
|
|
68
|
+
res.body.should.be.a('object');
|
|
69
|
+
expect(res.body.name).to.equal("test-group");
|
|
70
|
+
expect(res.body.members.length).to.equal(2);
|
|
71
|
+
expect(res.body.members[0]).to.equal(owner._id.toString())
|
|
72
|
+
expect(res.body.members[1]).to.equal(agent._id.toString())
|
|
73
|
+
|
|
74
|
+
let group_id = res.body._id;
|
|
75
|
+
|
|
76
|
+
// Remove project user from project
|
|
77
|
+
chai.request(server)
|
|
78
|
+
.delete('/' + project._id + '/project_users/' + pu_id + '?soft=true')
|
|
79
|
+
.auth(email_owner, pwd)
|
|
80
|
+
.set('content-type', 'application/json')
|
|
81
|
+
.end((err, res) => {
|
|
82
|
+
|
|
83
|
+
if (err) { console.error("err: ", err); }
|
|
84
|
+
if (log) { console.log("Delete project user res.body: ", res.body) };
|
|
85
|
+
|
|
86
|
+
res.should.have.status(200);
|
|
87
|
+
res.body.should.be.a('object');
|
|
88
|
+
|
|
89
|
+
// Check group
|
|
90
|
+
chai.request(server)
|
|
91
|
+
.get('/' + project._id + '/groups/' + group_id)
|
|
92
|
+
.auth(email_owner, pwd)
|
|
93
|
+
.set('content-type', 'application/json')
|
|
94
|
+
.end((err, res) => {
|
|
95
|
+
if (err) { console.error("err: ", err); }
|
|
96
|
+
if (log) { console.log("Check group res.body: ", res.body) };
|
|
97
|
+
|
|
98
|
+
res.should.have.status(200);
|
|
99
|
+
res.body.should.be.a('object');
|
|
100
|
+
expect(res.body.members.length).to.equal(1);
|
|
101
|
+
expect(res.body.members[0]).to.equal(owner._id.toString())
|
|
102
|
+
|
|
103
|
+
done()
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
})
|
|
107
|
+
})
|
|
108
|
+
})
|
|
109
|
+
})
|
|
110
|
+
})
|
|
111
|
+
})
|
|
112
|
+
}).timeout(5000);
|
|
113
|
+
|
|
114
|
+
})
|
|
115
|
+
|
|
116
|
+
});
|
package/test/requestService.js
CHANGED
|
@@ -10,6 +10,7 @@ let should = chai.should();
|
|
|
10
10
|
var config = require('../config/database');
|
|
11
11
|
var mongoose = require('mongoose');
|
|
12
12
|
var winston = require('../config/winston');
|
|
13
|
+
var RoleConstants = require('../models/roleConstants');
|
|
13
14
|
|
|
14
15
|
let log = false;
|
|
15
16
|
|
|
@@ -991,7 +992,8 @@ describe('RequestService', function () {
|
|
|
991
992
|
// _id: new mongoose.Types.ObjectId(),
|
|
992
993
|
id_project: savedProject._id.toString(),
|
|
993
994
|
id_user: savedUser2._id.toString(),
|
|
994
|
-
role:
|
|
995
|
+
role: RoleConstants.AGENT,
|
|
996
|
+
roleType : RoleConstants.TYPE_AGENTS,
|
|
995
997
|
user_available: false,
|
|
996
998
|
createdBy: userid,
|
|
997
999
|
updatedBy: userid
|
|
@@ -1073,7 +1075,8 @@ describe('RequestService', function () {
|
|
|
1073
1075
|
// _id: new mongoose.Types.ObjectId(),
|
|
1074
1076
|
id_project: savedProject._id.toString(),
|
|
1075
1077
|
id_user: savedUser2._id.toString(),
|
|
1076
|
-
role:
|
|
1078
|
+
role: RoleConstants.AGENT,
|
|
1079
|
+
roleType : RoleConstants.TYPE_AGENTS,
|
|
1077
1080
|
user_available: false,
|
|
1078
1081
|
createdBy: userid,
|
|
1079
1082
|
updatedBy: userid
|
|
@@ -1338,7 +1341,8 @@ describe('RequestService', function () {
|
|
|
1338
1341
|
// _id: new mongoose.Types.ObjectId(),
|
|
1339
1342
|
id_project: savedProject._id.toString(),
|
|
1340
1343
|
id_user: savedUser2._id.toString(),
|
|
1341
|
-
role:
|
|
1344
|
+
role: RoleConstants.AGENT,
|
|
1345
|
+
roleType : RoleConstants.TYPE_AGENTS,
|
|
1342
1346
|
user_available: true,
|
|
1343
1347
|
createdBy: userid,
|
|
1344
1348
|
updatedBy: userid
|
package/test-int/bot.js
CHANGED
|
@@ -16,7 +16,7 @@ var Department = require('../models/department');
|
|
|
16
16
|
var Faq = require('../models/faq');
|
|
17
17
|
var faqBotSupport = require('../services/faqBotSupport');
|
|
18
18
|
var Project_user = require("../models/project_user");
|
|
19
|
-
|
|
19
|
+
var RoleConstants = require('../models/roleConstants');
|
|
20
20
|
var expect = chai.expect;
|
|
21
21
|
var assert = chai.assert;
|
|
22
22
|
|
|
@@ -255,7 +255,8 @@ describe('bot', () => {
|
|
|
255
255
|
// _id: new mongoose.Types.ObjectId(),
|
|
256
256
|
id_project: savedProject._id.toString(),
|
|
257
257
|
id_user: savedUser2._id.toString(),
|
|
258
|
-
role:
|
|
258
|
+
role: RoleConstants.AGENT,
|
|
259
|
+
roleType : RoleConstants.TYPE_AGENTS,
|
|
259
260
|
user_available: true,
|
|
260
261
|
createdBy: savedUser._id,
|
|
261
262
|
updatedBy: savedUser._id
|