@tiledesk/tiledesk-server 2.2.23 → 2.2.28

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 (41) hide show
  1. package/CHANGELOG.md +22 -1
  2. package/README.md +6 -0
  3. package/app.js +73 -3
  4. package/bin/www +4 -1
  5. package/channels/chat21/chat21WebHook.js +1 -1
  6. package/config/email.js +1 -1
  7. package/config/global.js +2 -0
  8. package/config/labels/widget.json +781 -611
  9. package/event/messageEvent.js +4 -4
  10. package/middleware/has-role.js +1 -1
  11. package/middleware/passport.js +3 -3
  12. package/models/project.js +10 -0
  13. package/models/project_user.js +2 -0
  14. package/models/request.js +1 -1
  15. package/package.json +4 -3
  16. package/pubmodules/emailNotification/requestNotification.js +4 -4
  17. package/pubmodules/messageTransformer/messageHandlebarsTransformerInterceptor.js +3 -3
  18. package/pubmodules/messageTransformer/messageTransformerInterceptor.js +3 -3
  19. package/pubmodules/rules/conciergeBot.js +5 -2
  20. package/pubmodules/scheduler/tasks/closeBotUnresponsiveRequestTask.js +12 -3
  21. package/routes/department.js +1 -1
  22. package/routes/faq_kb.js +2 -3
  23. package/routes/labels.js +2 -0
  24. package/routes/message.js +1 -1
  25. package/routes/project.js +73 -1
  26. package/routes/project_user.js +11 -4
  27. package/routes/request.js +15 -0
  28. package/routes/user-request.js +15 -0
  29. package/routes/widget.js +1 -1
  30. package/services/departmentService.js +5 -4
  31. package/services/faqBotHandler.js +1 -1
  32. package/services/faqService.js +62 -29
  33. package/services/labelService-no-default.js +2 -2
  34. package/services/labelService.js +1 -1
  35. package/services/leadService.js +2 -2
  36. package/services/operatingHoursService.js +1 -1
  37. package/services/requestService.js +3 -3
  38. package/utils/orgUtil.js +74 -0
  39. package/utils/sendMessageUtil.js +2 -2
  40. package/websocket/webSocketServer.js +10 -10
  41. package/services/faqBotSupport copy.js_consplit +0 -453
@@ -60,14 +60,14 @@ function populateMessageWithRequest(message, eventPrefix) {
60
60
  populate('participatingBots').
61
61
  populate('participatingAgents').
62
62
  populate({path:'requester',populate:{path:'id_user'}}).
63
- lean().
63
+ lean()
64
64
  //perche lean?
65
65
  // TODO availableAgentsCount nn c'è per il lean problema trigger
66
66
  // request.department._id DA CORREGGERE ANCHE PER REQUEST.CREATE
67
67
  // request.department.hasBot
68
68
  // request.isOpen
69
- cache(cacheUtil.defaultTTL, message.id_project+":requests:request_id:"+message.recipient).
70
- exec(function (err, request) {
69
+ //@DISABLED_CACHE .cache(cacheUtil.defaultTTL, message.id_project+":requests:request_id:"+message.recipient)
70
+ .exec(function (err, request) {
71
71
 
72
72
  if (err) {
73
73
  winston.error("Error getting request on messageEvent.populateMessage",err );
@@ -83,7 +83,7 @@ function populateMessageWithRequest(message, eventPrefix) {
83
83
  if (request.department && request.department.id_bot) {
84
84
  // if (request.department) {
85
85
  Faq_kb.findById(request.department.id_bot)
86
- .cache(cacheUtil.defaultTTL, message.id_project+":faq_kbs:id:"+request.department.id_bot)
86
+ //@DISABLED_CACHE .cache(cacheUtil.defaultTTL, message.id_project+":faq_kbs:id:"+request.department.id_bot)
87
87
  .exec(function(err, bot) {
88
88
  winston.debug('bot', bot);
89
89
  requestJson.department.bot = bot
@@ -138,7 +138,7 @@ class RoleChecker {
138
138
  winston.debug("hasRoleOrType query " + JSON.stringify(query));
139
139
 
140
140
  Project_user.findOne(query)
141
- .cache(cacheUtil.defaultTTL, req.params.projectid+":project_users:id:"+req.user.id)
141
+ //@DISABLED_CACHE .cache(cacheUtil.defaultTTL, req.params.projectid+":project_users:id:"+req.user.id)
142
142
  .exec(function (err, project_user) {
143
143
  if (err) {
144
144
  winston.error("Error getting project_user for hasrole",err);
@@ -129,7 +129,7 @@ module.exports = function(passport) {
129
129
 
130
130
  winston.debug("project id: "+ AudienceId );
131
131
  Project.findOne({_id: AudienceId, status: 100}).select('+jwtSecret')
132
- .cache(cacheUtil.queryTTL, "projects:query:id:status:100:"+AudienceId+":select:+jwtSecret")
132
+ //@DISABLED_CACHE .cache(cacheUtil.queryTTL, "projects:query:id:status:100:"+AudienceId+":select:+jwtSecret")
133
133
  .exec(function (err, project){
134
134
  if (err) {
135
135
  winston.error("auth Project err: ", {error:err, decoded: decoded} );
@@ -317,7 +317,7 @@ module.exports = function(passport) {
317
317
  } else {
318
318
  winston.debug("Passport JWT generic user");
319
319
  User.findOne({_id: identifier, status: 100})
320
- .cache(cacheUtil.defaultTTL, "users:id:"+identifier)
320
+ //@DISABLED_CACHE .cache(cacheUtil.defaultTTL, "users:id:"+identifier)
321
321
  .exec(function(err, user) {
322
322
  if (err) {
323
323
  winston.error("Passport JWT generic err ", err);
@@ -349,7 +349,7 @@ module.exports = function(passport) {
349
349
  winston.debug("email lowercase: " + email);
350
350
 
351
351
  User.findOne({ email: email, status: 100}, 'email firstname lastname password emailverified id')
352
- .cache(cacheUtil.defaultTTL, "users:email:"+email)
352
+ //@DISABLED_CACHE .cache(cacheUtil.defaultTTL, "users:email:"+email)
353
353
  .exec(function (err, user) {
354
354
 
355
355
  if (err) {
package/models/project.js CHANGED
@@ -101,6 +101,16 @@ var ProjectSchema = new Schema({
101
101
  return [new Channel({ name: 'chat21' })];
102
102
  }
103
103
  },
104
+ organization: {
105
+ type: String,
106
+ },
107
+ ipFilterEnabled:{
108
+ type: Boolean,
109
+ default: false
110
+ },
111
+ ipFilter: [{
112
+ type: String
113
+ }],
104
114
  // defaultLanguage: {
105
115
  // type: String,
106
116
  // required: true,
@@ -5,6 +5,7 @@ var Schema = mongoose.Schema;
5
5
  var winston = require('../config/winston');
6
6
  var RoleConstants = require('./roleConstants');
7
7
  var PresenceSchema = require('./presence');
8
+ var TagSchema = require("../models/tag");
8
9
 
9
10
 
10
11
 
@@ -58,6 +59,7 @@ var PresenceSchema = require('./presence');
58
59
  settings: {
59
60
  type: Object,
60
61
  },
62
+ tags: [TagSchema],
61
63
  createdBy: {
62
64
  type: String,
63
65
  required: true
package/models/request.js CHANGED
@@ -429,7 +429,7 @@ RequestSchema.index({ id_project: 1, status: 1, preflight:1, updatedAt: -1 }); /
429
429
 
430
430
  RequestSchema.index({ id_project: 1, preflight:1, updatedAt: -1 }); // used query ws (topic.endsWith('/requests'))
431
431
 
432
-
432
+ RequestSchema.index({ hasBot: 1, createdAt: 1 }); // suggested by atlas
433
433
 
434
434
 
435
435
  // cannot index parallel arrays [agents] [participants] {"driv
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.2.23",
4
+ "version": "2.2.28",
5
5
  "scripts": {
6
6
  "start": "node ./bin/www",
7
7
  "pretest": "mongodb-runner start",
@@ -38,7 +38,7 @@
38
38
  "@tiledesk-ent/tiledesk-server-groups": "^1.1.2",
39
39
  "@tiledesk-ent/tiledesk-server-jwthistory": "^1.1.9",
40
40
  "@tiledesk-ent/tiledesk-server-mt": "^1.1.7",
41
- "@tiledesk-ent/tiledesk-server-payments": "^1.1.5",
41
+ "@tiledesk-ent/tiledesk-server-payments": "^1.1.6",
42
42
  "@tiledesk-ent/tiledesk-server-queue": "^1.1.11",
43
43
  "@tiledesk-ent/tiledesk-server-request-history": "^1.1.5",
44
44
  "@tiledesk-ent/tiledesk-server-resthook": "^1.1.53",
@@ -61,6 +61,7 @@
61
61
  "email-templates": "^8.0.8",
62
62
  "eventemitter2": "^6.4.4",
63
63
  "express": "~4.17.1",
64
+ "express-ipfilter": "^1.2.0",
64
65
  "express-session": "^1.17.2",
65
66
  "express-validator": "^6.12.1",
66
67
  "fast-csv": "^4.3.6",
@@ -109,7 +110,7 @@
109
110
  "chai-string": "^1.5.0",
110
111
  "loadtest": "^5.1.2",
111
112
  "mocha": "^8.4.0",
112
- "mongodb-runner": "4.8.1",
113
+ "mongodb-runner": "4.8.3",
113
114
  "nodemon": "^2.0.12",
114
115
  "sinon": "^9.2.4",
115
116
  "sinon-mongoose": "^2.3.0"
@@ -376,7 +376,7 @@ sendToAgentEmailChannelEmail(projectid, message) {
376
376
  }
377
377
 
378
378
  User.findOne({_id: userid , status: 100})
379
- .cache(cacheUtil.defaultTTL, "users:id:"+userid)
379
+ //@DISABLED_CACHE .cache(cacheUtil.defaultTTL, "users:id:"+userid)
380
380
  .exec(function (err, user) {
381
381
  if (err) {
382
382
  // winston.debug(err);
@@ -430,7 +430,7 @@ sendToAgentEmailChannelEmail(projectid, message) {
430
430
  }
431
431
 
432
432
  User.findOne({_id: assignedId, status: 100})
433
- .cache(cacheUtil.defaultTTL, "users:id:"+assignedId)
433
+ //@DISABLED_CACHE .cache(cacheUtil.defaultTTL, "users:id:"+assignedId)
434
434
  .exec(function (err, user) {
435
435
  if (err) {
436
436
  winston.error("Error sending email to " + savedRequest.participants[0], err);
@@ -707,7 +707,7 @@ sendAgentEmail(projectid, savedRequest) {
707
707
  }
708
708
 
709
709
  User.findOne({_id: userid , status: 100})
710
- .cache(cacheUtil.defaultTTL, "users:id:"+userid)
710
+ //@DISABLED_CACHE .cache(cacheUtil.defaultTTL, "users:id:"+userid)
711
711
  .exec(function (err, user) {
712
712
  if (err) {
713
713
  // winston.debug(err);
@@ -769,7 +769,7 @@ sendAgentEmail(projectid, savedRequest) {
769
769
  return winston.warn("RequestNotification email notification for the user with id : " + assignedId + " not found project_user");
770
770
  }
771
771
  User.findOne({_id: assignedId, status: 100})
772
- .cache(cacheUtil.defaultTTL, "users:id:"+assignedId)
772
+ //@DISABLED_CACHE .cache(cacheUtil.defaultTTL, "users:id:"+assignedId)
773
773
  .exec(function (err, user) {
774
774
  if (err) {
775
775
  winston.error("Error sending email to " + savedRequest.participants[0], err);
@@ -38,9 +38,9 @@ class MessageHandlebarsTransformerInterceptor {
38
38
  populate({path:'requester',populate:{path:'id_user'}});
39
39
  // }
40
40
 
41
- var request = await q1.
42
- cache(cacheUtil.defaultTTL, message.id_project+":requests:request_id:"+message.recipient).
43
- exec();
41
+ var request = await q1
42
+ //@DISABLED_CACHE .cache(cacheUtil.defaultTTL, message.id_project+":requests:request_id:"+message.recipient)
43
+ .exec();
44
44
 
45
45
 
46
46
 
@@ -37,14 +37,14 @@ class MessageTransformerInterceptor {
37
37
  var language = "EN";
38
38
 
39
39
  // cacherequest // requestcachefarequi nocachepopulatereqired
40
- var request = await Request.findOne({request_id: message.recipient, id_project: message.id_project}).
40
+ var request = await Request.findOne({request_id: message.recipient, id_project: message.id_project})
41
41
  // populate('lead').
42
42
  // populate('department').
43
43
  // populate('participatingBots').
44
44
  // populate('participatingAgents').
45
45
  // populate({path:'requester',populate:{path:'id_user'}}).
46
- cache(cacheUtil.defaultTTL, message.id_project+":requests:request_id:"+message.recipient).
47
- exec();
46
+ //@DISABLED_CACHE .cache(cacheUtil.defaultTTL, message.id_project+":requests:request_id:"+message.recipient)
47
+ .exec();
48
48
 
49
49
  winston.debug('request mti: ', request);
50
50
 
@@ -70,8 +70,11 @@ devi mandare un messaggio welcome tu altrimenti il bot inserito successivamente
70
70
  //TESTA QUESTO
71
71
 
72
72
  winston.debug("message.request.status: "+message.request.status);
73
- winston.debug("message.request.department.id_bot: "+message.request.department.id_bot);
74
- if (message.request.status === 50 && message.request.department.id_bot == undefined) {
73
+
74
+ winston.debug("message.request.hasBot: "+message.request.hasBot);
75
+ // winston.info("message.request.department.id_bot: "+message.request.department.id_bot);
76
+ if (message.request.status === 50 && message.request.hasBot === false) {
77
+ // if (message.request.status === 50 && message.request.department.id_bot == undefined) {
75
78
  //apply only if the status is temp and no bot is available. with agent you must reroute to assign temp request to an agent
76
79
  winston.debug("rerouting");
77
80
  // reroute(request_id, id_project, nobot)
@@ -48,9 +48,15 @@ scheduleUnresponsiveRequests() {
48
48
  // }
49
49
 
50
50
  //https://crontab.guru/examples.html
51
- var s= schedule.scheduleJob(this.cronExp, function(fireDate){
52
- winston.debug('CloseBotUnresponsiveRequestTask scheduleUnresponsiveRequests job was supposed to run at ' + fireDate + ', but actually ran at ' + new Date());
53
- that.findUnresponsiveRequests();
51
+ var s= schedule.scheduleJob(this.cronExp, function(fireDate){ //TODO aggiungi un bias random
52
+
53
+ let timeInMs = Math.random() * (1000); // avoid cluster concurrent jobs in multiple nodes between 0 and 1sec
54
+ winston.info('timeInMs => '+ timeInMs);
55
+
56
+ setTimeout(function () {
57
+ winston.debug('CloseBotUnresponsiveRequestTask scheduleUnresponsiveRequests job was supposed to run at ' + fireDate + ', but actually ran at ' + new Date());
58
+ that.findUnresponsiveRequests();
59
+ },timeInMs );
54
60
  });
55
61
  }
56
62
 
@@ -65,6 +71,8 @@ findUnresponsiveRequests() {
65
71
  query.id_project = JSON.parse(this.queryProject);
66
72
  }
67
73
 
74
+
75
+
68
76
  winston.debug("CloseBotUnresponsiveRequestTask query",query);
69
77
 
70
78
  Request.find(query)
@@ -84,6 +92,7 @@ findUnresponsiveRequests() {
84
92
  winston.debug("CloseBotUnresponsiveRequestTask: found unresponsive requests ", requests);
85
93
 
86
94
  requests.forEach(request => {
95
+
87
96
  winston.debug("********unresponsive request ", request);
88
97
 
89
98
  return requestService.closeRequestByRequestId(request.request_id, request.id_project, false, false).then(function(updatedStatusRequest) {
@@ -166,7 +166,7 @@ router.get('/allstatus', [passport.authenticate(['basic', 'jwt'], { session: fal
166
166
  winston.debug("## GET ALL DEPTS QUERY (1)", query)
167
167
  // return Department.find({ "id_project": req.projectid }, function (err, departments) {
168
168
  return Department.find(query)
169
- .cache(cacheUtil.defaultTTL, req.projectid+":departments:query:allstatus")
169
+ //@DISABLED_CACHE .cache(cacheUtil.defaultTTL, req.projectid+":departments:query:allstatus")
170
170
  .exec(function (err, departments) {
171
171
  if (err) {
172
172
  winston.error('Error getting the departments.', err);
package/routes/faq_kb.js CHANGED
@@ -10,9 +10,8 @@ var httpUtil = require("../utils/httpUtil");
10
10
 
11
11
  router.post('/', function (req, res) {
12
12
  winston.info('create BOT ', req.body);
13
- // create(name, url, projectid, user_id, type, description) {
14
- faqService.create(req.body.name, req.body.url, req.projectid, req.user.id, req.body.type, req.body.description, undefined, undefined,
15
- req.body.language).then(function(savedFaq_kb) {
13
+ // create(name, url, projectid, user_id, type, description, webhook_url, webhook_enabled, language, template)
14
+ faqService.create(req.body.name, req.body.url, req.projectid, req.user.id, req.body.type, req.body.description, undefined, undefined, req.body.language, req.body.template).then(function(savedFaq_kb) {
16
15
  res.json(savedFaq_kb);
17
16
  });
18
17
 
package/routes/labels.js CHANGED
@@ -27,6 +27,8 @@ router.get('/default', function (req, res) {
27
27
  });
28
28
  // curl -v -X POST -H 'Content-Type:application/json' -d '{"lang":"IT"}' http://localhost:3000/123/labels/default/clone
29
29
 
30
+ // curl -v -X POST -H 'Content-Type:application/json' -u andrea.leo@f21.it:123456 -d '{"lang":"IT"}' http://localhost:3001/624c78e27b91d2a2ab49543a/labels/default/clone
31
+
30
32
  router.post('/default/clone',
31
33
  [
32
34
  passport.authenticate(['basic', 'jwt'], { session: false }),
package/routes/message.js CHANGED
@@ -66,7 +66,7 @@ async (req, res) => {
66
66
  // .populate('participatingBots')
67
67
  // .populate('participatingAgents')
68
68
  // .populate({path:'requester',populate:{path:'id_user'}})
69
- .cache(cacheUtil.defaultTTL, req.projectid+":requests:request_id:"+req.params.request_id)
69
+ //@DISABLED_CACHE .cache(cacheUtil.defaultTTL, req.projectid+":requests:request_id:"+req.params.request_id)
70
70
  .exec(async(err, request) => {
71
71
 
72
72
  if (err) {
package/routes/project.js CHANGED
@@ -15,6 +15,7 @@ require('../middleware/passport')(passport);
15
15
  var validtoken = require('../middleware/valid-token')
16
16
  var RoleConstants = require("../models/roleConstants");
17
17
  var cacheUtil = require('../utils/cacheUtil');
18
+ var orgUtil = require("../utils/orgUtil");
18
19
 
19
20
  router.put('/:projectid', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('admin')], function (req, res) {
20
21
  winston.debug('UPDATE PROJECT REQ BODY ', req.body);
@@ -151,6 +152,15 @@ router.put('/:projectid', [passport.authenticate(['basic', 'jwt'], { session: fa
151
152
  if (req.body.channels!=undefined) {
152
153
  update.channels = req.body.channels;
153
154
  }
155
+
156
+ if (req.body.ipFilterEnabled!=undefined) {
157
+ update.ipFilterEnabled = req.body.ipFilterEnabled;
158
+ }
159
+
160
+ if (req.body.ipFilter!=undefined) {
161
+ update.ipFilter = req.body.ipFilter;
162
+ }
163
+
154
164
 
155
165
  // if (req.body.defaultLanguage!=undefined) {
156
166
  // update.defaultLanguage = req.body.defaultLanguage;
@@ -291,6 +301,13 @@ router.patch('/:projectid', [passport.authenticate(['basic', 'jwt'], { session:
291
301
  update.channels = req.body.channels;
292
302
  }
293
303
 
304
+ if (req.body.ipFilterEnabled!=undefined) {
305
+ update.ipFilterEnabled = req.body.ipFilterEnabled;
306
+ }
307
+
308
+ if (req.body.ipFilter!=undefined) {
309
+ update.ipFilter = req.body.ipFilter;
310
+ }
294
311
 
295
312
  // if (req.body.defaultLanguage!=undefined) {
296
313
  // update.defaultLanguage = req.body.defaultLanguage;
@@ -313,7 +330,7 @@ router.patch('/:projectid', [passport.authenticate(['basic', 'jwt'], { session:
313
330
  router.get('/:projectid', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('agent', ['subscription'])], function (req, res) {
314
331
  winston.debug(req.body);
315
332
  Project.findOne({_id: req.params.projectid, status:100})
316
- .cache(cacheUtil.defaultTTL, "projects:id:"+req.params.projectid)
333
+ //@DISABLED_CACHE .cache(cacheUtil.defaultTTL, "projects:id:"+req.params.projectid)
317
334
  .exec(function (err, project) {
318
335
  if (err) {
319
336
  winston.error('Error getting project ', err);
@@ -362,6 +379,61 @@ router.get('/', [passport.authenticate(['basic', 'jwt'], { session: false }), va
362
379
  return res.status(500).send({ success: false, msg: 'Error getting object.' });
363
380
  }
364
381
 
382
+
383
+
384
+ //organization: if third sub domain iterate and put only project with organization==subdomain otherwise remove projects with org
385
+ winston.info("orgUtil.ORGANIZATION_ENABLED: " + orgUtil.ORGANIZATION_ENABLED);
386
+ if (orgUtil.ORGANIZATION_ENABLED == true ) {
387
+
388
+ // winston.info("project_users", project_users);
389
+ winston.info("project_users.length:"+ project_users.length);
390
+
391
+ let org = orgUtil.getOrg(req);
392
+ winston.info("org:"+ org);
393
+
394
+ if (org!=undefined) {
395
+ winston.info("org!=undefined");
396
+
397
+ var project_users = project_users.filter(function (projectUser) {
398
+ if (projectUser.id_project.organization && projectUser.id_project.organization === org ) {
399
+ winston.info("keep");
400
+ return true;
401
+ }
402
+ });
403
+
404
+ /* for (var i = 0; i < project_users.length; i++) {
405
+ winston.info("project_users[i].id_project.organization: " + project_users[i].id_project.organization);
406
+ if (project_users[i].id_project.organization && project_users[i].id_project.organization === org ) {
407
+ //keep
408
+ winston.info("keep");
409
+ } else {
410
+ // project_users.splice(i, 1); // 2nd parameter means remove one item only
411
+ winston.info("splice");
412
+ }
413
+ }*/
414
+ } else {
415
+
416
+ var project_users = project_users.filter(function (projectUser) {
417
+ if (projectUser.id_project.organization == undefined ) {
418
+ // winston.info("keep");
419
+ return true;
420
+ }
421
+ });
422
+
423
+
424
+ /*
425
+ for (var i = 0; i < project_users.length; i++) {
426
+ winston.info("project_users[i].id_project.organization: " + project_users[i].id_project.organization);
427
+ if (project_users[i].id_project.organization) {
428
+ project_users.splice(i, 1); // 2nd parameter means remove one item only
429
+ }
430
+ }*/
431
+ }
432
+ } else {
433
+ winston.info("no")
434
+ }
435
+
436
+
365
437
  project_users.sort((a, b) => (a.id_project && b.id_project && a.id_project.updatedAt > b.id_project.updatedAt) ? 1 : -1)
366
438
  project_users.reverse();
367
439
  res.json(project_users);
@@ -196,7 +196,8 @@ router.post('/', [passport.authenticate(['basic', 'jwt'], { session: false }), v
196
196
  // role: RoleConstants.USER,
197
197
  // - Create project_user endpoint by agent (Ticketing) now is with Guest Role
198
198
  role: RoleConstants.GUEST,
199
- user_available: false,
199
+ user_available: false,
200
+ tags: req.body.tags,
200
201
  createdBy: req.user.id,
201
202
  updatedBy: req.user.id
202
203
  });
@@ -234,6 +235,10 @@ router.put('/', [passport.authenticate(['basic', 'jwt'], { session: false }), va
234
235
  if (req.body["settings.email.notification.conversation.pooled"]!=undefined) {
235
236
  update["settings.email.notification.conversation.pooled"] = req.body["settings.email.notification.conversation.pooled"];
236
237
  }
238
+ if (req.body.tags!=undefined) {
239
+ update.tags = req.body.tags;
240
+ }
241
+
237
242
 
238
243
 
239
244
  Project_user.findByIdAndUpdate(req.projectuser.id, update, { new: true, upsert: true }, function (err, updatedProject_user) {
@@ -289,7 +294,9 @@ router.put('/:project_userid', [passport.authenticate(['basic', 'jwt'], { sessio
289
294
  update["settings.email.notification.conversation.pooled"] = req.body["settings.email.notification.conversation.pooled"];
290
295
  }
291
296
 
292
-
297
+ if (req.body.tags!=undefined) {
298
+ update.tags = req.body.tags;
299
+ }
293
300
 
294
301
  winston.debug("project_userid update", update);
295
302
 
@@ -462,8 +469,8 @@ router.get('/users/:user_id', [passport.authenticate(['basic', 'jwt'], { session
462
469
  * RETURN THE PROJECT-USERS OBJECTS FILTERD BY PROJECT-ID AND WITH NESTED THE USER OBJECT
463
470
  * WF: 1. GET PROJECT-USER by the passed project ID
464
471
  * 2. POPULATE THE user_id OF THE PROJECT-USER object WITH THE USER OBJECT
465
- */
466
- router.get('/', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('agent')], function (req, res) {
472
+ */
473
+ router.get('/', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('agent', ['subscription'])], function (req, res) {
467
474
 
468
475
  var role = [RoleConstants.OWNER, RoleConstants.ADMIN, RoleConstants.SUPERVISOR, RoleConstants.AGENT];
469
476
 
package/routes/request.js CHANGED
@@ -693,6 +693,10 @@ router.get('/', function (req, res, next) {
693
693
  query.location = req.query.location;
694
694
  }
695
695
 
696
+ if (req.query.ticket_id) {
697
+ query.ticket_id = req.query.ticket_id;
698
+ }
699
+
696
700
  // if (req.query.request_id) {
697
701
  // console.log('req.query.request_id', req.query.request_id);
698
702
  // query.request_id = req.query.request_id;
@@ -798,6 +802,17 @@ router.get('/', function (req, res, next) {
798
802
  winston.debug('REQUEST ROUTE - QUERY snap_department_id_bot_exists', query.snap_department_id_bot_exists);
799
803
  }
800
804
 
805
+ if (req.query.snap_lead_lead_id) {
806
+ query["snapshot.lead.lead_id"] = req.query.snap_lead_lead_id;
807
+ winston.debug('REQUEST ROUTE - QUERY snap_lead_lead_id', query.snap_lead_lead_id);
808
+ }
809
+
810
+ if (req.query.channel) {
811
+ query["channel.name"] = req.query.channel
812
+ winston.debug('REQUEST ROUTE - QUERY channel', query.channel);
813
+ }
814
+
815
+
801
816
  var direction = -1; //-1 descending , 1 ascending
802
817
  if (req.query.direction) {
803
818
  direction = req.query.direction;
@@ -4,6 +4,7 @@ var Request = require("../models/request");
4
4
  var winston = require('../config/winston');
5
5
  const requestEvent = require('../event/requestEvent');
6
6
  const { check, validationResult } = require('express-validator');
7
+ var requestService = require('../services/requestService');
7
8
 
8
9
 
9
10
  router.patch('/:requestid/rating', function (req, res) {
@@ -54,5 +55,19 @@ router.patch('/:requestid/rating', function (req, res) {
54
55
  });
55
56
 
56
57
 
58
+ router.put('/:requestid/closeg', function (req, res) {
59
+ winston.debug(req.body);
60
+
61
+ // closeRequestByRequestId(request_id, id_project)
62
+ return requestService.closeRequestByRequestId(req.params.requestid, req.projectid).then(function(closedRequest) {
63
+
64
+ winston.verbose("request closed", closedRequest);
65
+
66
+ return res.json(closedRequest);
67
+
68
+ });
69
+
70
+
71
+ });
57
72
 
58
73
  module.exports = router;
package/routes/widget.js CHANGED
@@ -117,7 +117,7 @@ router.get('/', function(req, res, next) {
117
117
  // TOOD add labels
118
118
  Promise.all([
119
119
  Project.findOne({_id: req.projectid, status: 100}).select('-settings')
120
- .cache(cacheUtil.queryTTL, "projects:query:id:status:100:"+req.projectid+":select:-settings")
120
+ //@DISABLED_CACHE .cache(cacheUtil.queryTTL, "projects:query:id:status:100:"+req.projectid+":select:-settings")
121
121
  ,
122
122
  availableUsers()
123
123
  ,
@@ -283,6 +283,7 @@ getOperators(departmentid, projectid, nobot, disableWebHookCall, context) {
283
283
  return resolve ({
284
284
  department: department, available_agents: _available_agents, agents: project_users,
285
285
  id_bot:department.id_bot, project: project,
286
+ context: context,
286
287
  // botprefix
287
288
  operators: [{ id_user: 'bot_' + department.id_bot }]
288
289
  });
@@ -386,7 +387,7 @@ getOperators(departmentid, projectid, nobot, disableWebHookCall, context) {
386
387
  selectedoperator = that.getRandomAvailableOperator(_available_agents);
387
388
  }
388
389
 
389
- let objectToReturn = { available_agents: _available_agents, agents: project_users, operators: selectedoperator, department: department, group: group, id_project: projectid, project: project };
390
+ let objectToReturn = { available_agents: _available_agents, agents: project_users, operators: selectedoperator, department: department, group: group, id_project: projectid, project: project, context: context };
390
391
 
391
392
  that.roundRobin(objectToReturn).then(function(objectToReturnRoundRobin){
392
393
 
@@ -409,7 +410,7 @@ getOperators(departmentid, projectid, nobot, disableWebHookCall, context) {
409
410
 
410
411
  } else {
411
412
  // here subscription notifier??
412
- var objectToReturn = { available_agents: [], agents: [], operators: [] };
413
+ var objectToReturn = { available_agents: [], agents: [], operators: [], context: context };
413
414
  return resolve(objectToReturn);
414
415
  }
415
416
 
@@ -447,7 +448,7 @@ getOperators(departmentid, projectid, nobot, disableWebHookCall, context) {
447
448
  selectedoperator = that.getRandomAvailableOperator(_available_agents);
448
449
  }
449
450
 
450
- let objectToReturn = { available_agents: _available_agents, agents: project_users, operators: selectedoperator, department: department, id_project: projectid, project: project };
451
+ let objectToReturn = { available_agents: _available_agents, agents: project_users, operators: selectedoperator, department: department, id_project: projectid, project: project, context: context };
451
452
 
452
453
  that.roundRobin(objectToReturn).then(function(objectToReturnRoundRobin) {
453
454
  winston.debug("context2",context);
@@ -474,7 +475,7 @@ getOperators(departmentid, projectid, nobot, disableWebHookCall, context) {
474
475
 
475
476
  } else {
476
477
  // here subscription notifier??
477
- let objectToReturn = { available_agents: [], agents: [], operators: [] };
478
+ let objectToReturn = { available_agents: [], agents: [], operators: [], context: context };
478
479
  return resolve(objectToReturn);
479
480
  }
480
481
 
@@ -88,7 +88,7 @@ class FaqBotHandler {
88
88
 
89
89
 
90
90
  Faq_kb.findById(botId)
91
- .cache(cacheUtil.defaultTTL, message.id_project+":faq_kbs:id:"+botId)
91
+ //@DISABLED_CACHE .cache(cacheUtil.defaultTTL, message.id_project+":faq_kbs:id:"+botId)
92
92
  .exec(function(err, faq_kb) {
93
93
  if (err) {
94
94
  return winston.error("Error getting bot object.",err);