@tiledesk/tiledesk-server 2.3.6 → 2.3.7-1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (126) hide show
  1. package/.github/workflows/docker-community-worker-push-latest.yml +23 -0
  2. package/.github/workflows/docker-image-tag-worker-community-tag-push.yml +22 -0
  3. package/CHANGELOG.md +361 -3
  4. package/Dockerfile-jobs +31 -0
  5. package/app.js +62 -69
  6. package/channels/chat21/chat21Handler.js +37 -6
  7. package/channels/chat21/chat21WebHook.js +62 -34
  8. package/channels/chat21/package-lock.json +663 -706
  9. package/channels/chat21/package.json +2 -2
  10. package/config/labels/widget.json +337 -136
  11. package/deploy.sh +2 -0
  12. package/event/messageEvent.js +110 -9
  13. package/jobs.js +80 -0
  14. package/jobsManager.js +47 -0
  15. package/middleware/has-role.js +10 -3
  16. package/middleware/ipFilter.js +220 -0
  17. package/middleware/passport.js +8 -2
  18. package/models/department.js +1 -1
  19. package/models/faq.js +77 -25
  20. package/models/faq_kb.js +19 -0
  21. package/models/message.js +10 -8
  22. package/models/project.js +10 -0
  23. package/models/project_user.js +10 -0
  24. package/models/request.js +12 -1
  25. package/package.json +12 -11
  26. package/pubmodules/activities/activityArchiver.js +216 -90
  27. package/pubmodules/activities/routes/activity.js +1 -1
  28. package/pubmodules/apps/index.js +8 -0
  29. package/pubmodules/apps/listener.js +27 -0
  30. package/pubmodules/cache/index.js +2 -0
  31. package/pubmodules/cache/mongoose-cachegoose-fn.js +630 -0
  32. package/pubmodules/canned/cannedResponse.js +4 -0
  33. package/pubmodules/canned/cannedResponseRoute.js +10 -5
  34. package/pubmodules/dialogflow/index.js +10 -0
  35. package/pubmodules/dialogflow/listener.js +66 -0
  36. package/pubmodules/emailNotification/requestNotification.js +58 -28
  37. package/pubmodules/events/eventRoute.js +49 -24
  38. package/pubmodules/messageTransformer/messageHandlebarsTransformerInterceptor.js +6 -1
  39. package/pubmodules/messageTransformer/messageTransformerInterceptor.js +10 -4
  40. package/pubmodules/pubModulesManager.js +173 -7
  41. package/pubmodules/queue/index.js +4 -0
  42. package/pubmodules/queue/reconnect.js +331 -0
  43. package/pubmodules/queue/reconnectFanout.js +256 -0
  44. package/pubmodules/rasa/listener.js +5 -5
  45. package/pubmodules/routing-queue/index.js +3 -0
  46. package/pubmodules/routing-queue/listener.js +328 -0
  47. package/pubmodules/rules/conciergeBot.js +2 -2
  48. package/pubmodules/scheduler/tasks/closeAgentUnresponsiveRequestTask.js +6 -1
  49. package/pubmodules/scheduler/tasks/closeBotUnresponsiveRequestTask.js +7 -1
  50. package/pubmodules/tilebot/index.js +11 -0
  51. package/pubmodules/tilebot/listener.js +85 -0
  52. package/pubmodules/trigger/rulesTrigger.js +137 -14
  53. package/pubmodules/trigger/start.js +5 -1
  54. package/pubmodules/whatsapp/index.js +7 -0
  55. package/pubmodules/whatsapp/listener.js +32 -0
  56. package/routes/auth.js +7 -2
  57. package/routes/campaigns.js +3 -3
  58. package/routes/department.js +3 -2
  59. package/routes/email.js +32 -2
  60. package/routes/faq.js +37 -2
  61. package/routes/faq_kb.js +496 -133
  62. package/routes/faqpub.js +5 -0
  63. package/routes/lead.js +56 -0
  64. package/routes/message.js +196 -14
  65. package/routes/messagesRoot.js +39 -0
  66. package/routes/project.js +76 -4
  67. package/routes/project_user.js +11 -1
  68. package/routes/project_user_test.js +19 -0
  69. package/routes/request.js +134 -30
  70. package/routes/troubleshooting.js +12 -0
  71. package/routes/users-util.js +39 -0
  72. package/routes/users.js +1 -1
  73. package/routes/widget.js +64 -2
  74. package/services/BotSubscriptionNotifier.js +5 -0
  75. package/services/banUserNotifier.js +86 -0
  76. package/services/cacheEnabler.js +56 -0
  77. package/services/chatbotService.js +101 -0
  78. package/services/departmentService.js +25 -3
  79. package/services/emailService.js +170 -28
  80. package/services/faqBotHandler.js +2 -3
  81. package/services/faqService.js +28 -3
  82. package/services/geoService.js +36 -6
  83. package/services/labelService.js +1 -1
  84. package/services/leadService.js +3 -2
  85. package/services/messageService.js +4 -2
  86. package/services/modulesManager.js +23 -76
  87. package/services/operatingHoursService.js +9 -4
  88. package/services/requestService.js +75 -39
  89. package/services/subscriptionNotifier.js +9 -4
  90. package/services/trainingService.js +106 -0
  91. package/template/email/assignedEmailMessage.html +21 -11
  92. package/template/email/assignedRequest.html +21 -11
  93. package/template/email/beenInvitedExistingUser.html +16 -6
  94. package/template/email/beenInvitedNewUser.html +16 -6
  95. package/template/email/emailDirect.html +130 -0
  96. package/template/email/newMessage.html +18 -8
  97. package/template/email/newMessageFollower.html +22 -12
  98. package/template/email/passwordChanged.html +15 -5
  99. package/template/email/pooledEmailMessage.html +21 -11
  100. package/template/email/pooledRequest.html +20 -10
  101. package/template/email/resetPassword.html +15 -5
  102. package/template/email/sendTranscript.html +7 -4
  103. package/template/email/ticket.html +17 -7
  104. package/template/email/verify.html +15 -5
  105. package/test/cannedRoute.js +157 -0
  106. package/test/chatbot-mock.js +127 -0
  107. package/test/example-json-intents.txt +1 -0
  108. package/test/example-json.txt +1 -0
  109. package/test/example.json +1 -0
  110. package/test/faqRoute.js +353 -208
  111. package/test/faqkbRoute.js +669 -64
  112. package/test/imageRoute.js +1 -1
  113. package/test/messageRoute.js +387 -5
  114. package/test/requestRoute.js +6 -6
  115. package/test/requestService.js +55 -4
  116. package/test-int/cache-project.js +90 -0
  117. package/test-int/cache-project_user.js +88 -0
  118. package/utils/UIDGenerator.js +20 -0
  119. package/utils/cacheUtil.js +2 -2
  120. package/utils/orgUtil.js +3 -3
  121. package/utils/promiseUtil.js +31 -0
  122. package/utils/recipientEmailUtil.js +66 -0
  123. package/utils/sendEmailUtil.js +34 -0
  124. package/utils/sendMessageUtil.js +1 -1
  125. package/utils/stringUtil.js +12 -0
  126. package/websocket/webSocketServer.js +33 -10
package/routes/faqpub.js CHANGED
@@ -27,6 +27,11 @@ router.get('/', function (req, res, next) {
27
27
 
28
28
  // query.$text = {"$search": "question"};
29
29
 
30
+ // TODO ORDER BY SCORE
31
+ // return Faq.find(query, {score: { $meta: "textScore" } })
32
+ // .sort( { score: { $meta: "textScore" } } ) //https://docs.mongodb.com/manual/reference/operator/query/text/#sort-by-text-search-score
33
+
34
+
30
35
  return Faq.find(query).
31
36
  populate({path:'faq_kb'}).//, match: { trashed: { $in: [null, false] } }}).
32
37
  exec(function (err, faq) {
package/routes/lead.js CHANGED
@@ -88,11 +88,67 @@ router.put('/:leadid', function (req, res) {
88
88
  if (req.body.email!=undefined) {
89
89
  leadEvent.emit('lead.email.update', updatedLead);
90
90
  }
91
+
92
+ if (req.body.email!=undefined || req.body.fullname!=undefined) {
93
+ leadEvent.emit('lead.fullname.email.update', updatedLead);
94
+ }
91
95
 
92
96
  res.json(updatedLead);
93
97
  });
94
98
  });
95
99
 
100
+
101
+
102
+ router.patch('/:leadid/attributes', function (req, res) {
103
+ var data = req.body;
104
+
105
+ // TODO use service method
106
+
107
+ Lead.findById(req.params.leadid, function (err, lead) {
108
+ if (err) {
109
+ winston.error('--- > ERROR ', err);
110
+ return res.status(500).send({ success: false, msg: 'Error updating object.' });
111
+ }
112
+
113
+ if (!lead) {
114
+ return res.status(404).send({ success: false, msg: 'Object not found.' });
115
+ }
116
+
117
+ if (!lead.attributes) {
118
+ winston.debug("empty attributes")
119
+ lead.attributes = {};
120
+ }
121
+
122
+ winston.debug(" lead attributes", lead.attributes)
123
+
124
+ Object.keys(data).forEach(function(key) {
125
+ var val = data[key];
126
+ winston.debug("data attributes "+key+" " +val)
127
+ lead.attributes[key] = val;
128
+ });
129
+
130
+ winston.debug(" lead attributes", lead.attributes)
131
+
132
+ // https://stackoverflow.com/questions/24054552/mongoose-not-saving-nested-object
133
+ lead.markModified('attributes');
134
+
135
+ //cacheinvalidation
136
+ lead.save(function (err, savedLead) {
137
+ if (err) {
138
+ winston.error("error saving lead attributes",err)
139
+ return res.status(500).send({ success: false, msg: 'Error getting object.' });
140
+ }
141
+ winston.verbose(" saved lead attributes",savedLead.toObject())
142
+ leadEvent.emit('lead.update', savedLead);
143
+
144
+ res.json(savedLead);
145
+ });
146
+ });
147
+
148
+ });
149
+
150
+
151
+
96
152
  // router.put('/:leadid', function (req, res) {
97
153
  // winston.debug(req.body);
98
154
  // var update = {};
package/routes/message.js CHANGED
@@ -13,12 +13,15 @@ var leadService = require('../services/leadService');
13
13
  var winston = require('../config/winston');
14
14
 
15
15
  var MessageConstants = require("../models/messageConstants");
16
+
16
17
  var cacheUtil = require('../utils/cacheUtil');
18
+ var cacheEnabler = require("../services/cacheEnabler");
17
19
 
18
20
  const { check, validationResult } = require('express-validator');
19
21
 
20
22
  var Project_user = require("../models/project_user");
21
23
  var mongoose = require('mongoose');
24
+ var PromiseUtil = require("../utils/promiseUtil");
22
25
 
23
26
  csv = require('csv-express');
24
27
  csv.separator = ';';
@@ -46,12 +49,20 @@ async (req, res) => {
46
49
  winston.debug('req.params: ', req.params);
47
50
  winston.debug('req.params.request_id: ' + req.params.request_id);
48
51
 
49
- const errors = validationResult(req);
50
- if (!errors.isEmpty()) {
51
- return res.status(422).json({ errors: errors.array() });
52
- }
52
+ // sponz: 4/01/23 disable it
53
+ // if (!req.body.text && (!req.body.type || req.body.type=="text") ) {
54
+ // return res.status(422).json({ errors: ["text field is required"] });
55
+ // }
56
+ // const errors = validationResult(req);
57
+ // if (!errors.isEmpty()) {
58
+ // return res.status(422).json({ errors: errors.array() });
59
+ // }
60
+
61
+
62
+
53
63
 
54
-
64
+ // TODO se sei agent non puoi cambiare sender
65
+ // verificare validazione invio immagine senza caption
55
66
  var project_user = req.projectuser;
56
67
  var sender = req.body.sender;
57
68
  var fullname = req.body.senderFullname || req.user.fullName;
@@ -60,15 +71,19 @@ async (req, res) => {
60
71
  let messageStatus = req.body.status || MessageConstants.CHAT_MESSAGE_STATUS.SENDING;
61
72
  winston.debug('messageStatus: ' + messageStatus);
62
73
 
74
+ let q = Request.findOne({request_id: req.params.request_id, id_project: req.projectid});
75
+ if (cacheEnabler.request) {
76
+ q.cache(cacheUtil.defaultTTL, req.projectid+":requests:request_id:"+req.params.request_id+":simple") //request_cache
77
+ winston.debug('request cache enabled');
78
+ }
63
79
  // cacherequest // requestcachefarequi nocachepopulatereqired
64
- return Request.findOne({request_id: req.params.request_id, id_project: req.projectid})
80
+ return q.exec(async(err, request) => {
65
81
  // .populate('lead')
66
82
  // .populate('department')
67
83
  // .populate('participatingBots')
68
84
  // .populate('participatingAgents')
69
85
  // .populate({path:'requester',populate:{path:'id_user'}})
70
- //@DISABLED_CACHE .cache(cacheUtil.defaultTTL, req.projectid+":requests:request_id:"+req.params.request_id)
71
- .exec(async(err, request) => {
86
+
72
87
 
73
88
  if (err) {
74
89
  winston.log({
@@ -236,7 +251,7 @@ async (req, res) => {
236
251
 
237
252
  if (request.participants && request.participants.indexOf(sender) > -1) { //update waiitng time if write an agent (member of participants)
238
253
  winston.debug("updateWaitingTimeByRequestId");
239
- return requestService.updateWaitingTimeByRequestId(request.request_id, request.id_project).then(function(upRequest) {
254
+ return requestService.updateWaitingTimeByRequestId(request.request_id, request.id_project, true).then(function(upRequest) {
240
255
  let message = savedMessage.toJSON();
241
256
  message.request = upRequest;
242
257
 
@@ -246,13 +261,26 @@ async (req, res) => {
246
261
  }else {
247
262
  let message = savedMessage.toJSON();
248
263
 
249
- request.populate('lead')
264
+ winston.debug("getting request for response");
265
+
266
+ let q =
267
+ Request.findOne({request_id: request.request_id, id_project: request.id_project})
268
+ // request
269
+ .populate('lead')
250
270
  .populate('department')
251
271
  .populate('participatingBots')
252
272
  .populate('participatingAgents')
253
273
  // .populate('followers')
254
- .populate({path:'requester',populate:{path:'id_user'}})
255
- .execPopulate(function (err, requestPopulated){
274
+ .populate({path:'requester',populate:{path:'id_user'}});
275
+
276
+
277
+ if (cacheEnabler.request) {
278
+ q.cache(cacheUtil.defaultTTL, request.id_project+":requests:request_id:"+request.request_id)
279
+ winston.debug('request cache enabled for messages');
280
+ }
281
+
282
+ q.exec(function (err, requestPopulated){
283
+ // q.execPopulate(function (err, requestPopulated){
256
284
 
257
285
  if (err) {
258
286
  return winston.error("Error gettting savedRequestPopulated for send Message", err);
@@ -268,10 +296,10 @@ async (req, res) => {
268
296
  }).catch(function(err){
269
297
  winston.log({
270
298
  level: 'error',
271
- message: 'Error creating message: '+ JSON.stringify(err) + " " + JSON.stringify(req.body) ,
299
+ message: 'Error creating message endpoint: '+ JSON.stringify(err) + " " + JSON.stringify(req.body) ,
272
300
  label: req.projectid
273
301
  });
274
- // winston.error("Error creating message", err);
302
+ winston.error("Error creating message", err);
275
303
  return res.status(500).send({success: false, msg: 'Error creating message', err:err });
276
304
  });
277
305
 
@@ -290,6 +318,160 @@ async (req, res) => {
290
318
 
291
319
 
292
320
 
321
+
322
+
323
+
324
+ // router.post('/multi2', async (req, res, next) => {
325
+
326
+ // if ( !req.body instanceof Array ) {
327
+ // return res.status(422).json({ errors: ["request body is not array"] });
328
+ // }
329
+ // req.url = '/';
330
+ // winston.info('--- > req.url'+req.url);
331
+
332
+ // req.method = 'POST';
333
+
334
+ // let promises = [];
335
+
336
+ // req.body.forEach(function(message,index) {
337
+ // promises.push(router.handle(req, res, next));
338
+ // });
339
+ // winston.info('--- >promises', promises);
340
+
341
+ // Promise.all(promises).then((values) => {
342
+ // console.log("finito",values);
343
+ // return res.status(200).json({ "success": true });
344
+ // }).catch((err) => {
345
+ // console.log("errore",err);
346
+ // });
347
+ // });
348
+
349
+
350
+
351
+
352
+ router.post('/multi',
353
+ async (req, res) => {
354
+
355
+ winston.debug('req.body post message', req.body);
356
+ winston.debug('req.params: ', req.params);
357
+ winston.debug('req.params.request_id: ' + req.params.request_id);
358
+
359
+ const errors = validationResult(req);
360
+ if (!errors.isEmpty()) {
361
+ return res.status(422).json({ errors: errors.array() });
362
+ }
363
+
364
+ var project_user = req.projectuser;
365
+
366
+ let q = Request.findOne({request_id: req.params.request_id, id_project: req.projectid});
367
+ // if (cacheEnabler.request) {
368
+ // q.cache(cacheUtil.defaultTTL, req.projectid+":requests:request_id:"+req.params.request_id+":simple") //request_cache
369
+ // winston.debug('request cache enabled');
370
+ // }
371
+ return q.exec(async(err, request) => {
372
+
373
+
374
+ if (err) {
375
+ winston.log({
376
+ level: 'error',
377
+ message: 'Error getting the request: '+ JSON.stringify(err) + " " + JSON.stringify(req.body) ,
378
+ label: req.projectid
379
+ });
380
+ // winston.error('Error getting the request.', err);
381
+ return res.status(500).send({success: false, msg: 'Error getting the request.', err:err});
382
+ }
383
+
384
+ if (!request) { //the request doen't exists create it
385
+ return res.status(404).send({success: false, msg: 'Request doesn\'t exist.', err:err});
386
+ } else {
387
+
388
+
389
+
390
+ winston.debug("request exists", request.toObject());
391
+
392
+
393
+ let promises = [];
394
+
395
+ let sender;
396
+ let fullname;
397
+ let email;
398
+ let text;
399
+ let attributes;
400
+ let type;
401
+ let metadata;
402
+ let language;
403
+ let channel;
404
+ let messageStatus;
405
+
406
+ req.body.forEach(function(message,index) {
407
+
408
+ sender = message.sender;
409
+ fullname = message.senderFullname || req.user.fullName;
410
+ email = message.email || req.user.email;
411
+
412
+ text = message.text;
413
+ attributes = message.attributes;
414
+ type = message.type;
415
+ metadata = message.metadata;
416
+ language = message.language;
417
+ channel = message.channel;
418
+ messageStatus = message.status || MessageConstants.CHAT_MESSAGE_STATUS.SENDING;
419
+ // create(sender, senderFullname, recipient, text, id_project, createdBy, status, attributes, type, metadata, language, channel_type, channel) {
420
+ let promise = messageService.create(sender || req.user._id, fullname, req.params.request_id, text,
421
+ request.id_project, null, messageStatus, attributes, type, metadata, language, undefined, channel);
422
+
423
+ promises.push(promise);
424
+ });
425
+ winston.debug('--- >promises', promises);
426
+
427
+ //Promise.all(promises).then((values) => {
428
+ PromiseUtil.doAllSequentually(promises).then((values) => {
429
+ winston.info('Inserted multiple messages with values: ', values);
430
+ return res.status(200).json(values);
431
+ }).catch((err) => {
432
+ winston.error('Error inserting multiple messages.', err);
433
+ return res.status(500).send({success: false, msg: 'Error inserting multiple messages.', err:err});
434
+
435
+ });
436
+
437
+
438
+
439
+
440
+
441
+
442
+ }
443
+
444
+
445
+
446
+ });
447
+
448
+
449
+
450
+
451
+ });
452
+
453
+
454
+
455
+
456
+
457
+
458
+
459
+
460
+
461
+
462
+ // router.patch('/:messageid', function(req, res) {
463
+
464
+ // winston.info(req.body);
465
+
466
+ // Message.findByIdAndUpdate(req.params.messageid, req.body, {new: true, upsert:true}, function(err, updatedMessage) {
467
+ // if (err) {
468
+ // return res.status(500).send({success: false, msg: 'Error updating object.'});
469
+ // }
470
+ // res.json(updatedMessage);
471
+ // });
472
+ // });
473
+
474
+
293
475
  // router.put('/:messageid', function(req, res) {
294
476
 
295
477
  // console.log(req.body);
@@ -5,6 +5,7 @@ var router = express.Router({mergeParams: true});
5
5
 
6
6
  var MessageConstants = require("../models/messageConstants");
7
7
  var Message = require("../models/message");
8
+ var Request = require("../models/request");
8
9
  var messageService = require("../services/messageService");
9
10
  var winston = require('../config/winston');
10
11
  var fastCsv = require("fast-csv");
@@ -65,6 +66,44 @@ router.post('/',
65
66
 
66
67
 
67
68
 
69
+ router.get('/',roleChecker.hasRoleOrTypes('owner'), function(req, res) {
70
+
71
+ const DEFAULT_LIMIT = 10;
72
+
73
+ var limit = DEFAULT_LIMIT; // Number of rows per page
74
+
75
+ // console.log("req.query.populate_request",req.query.populate_request);
76
+ if (req.query.limit) {
77
+ limit = parseInt(req.query.limit);
78
+ }
79
+ if (limit > 50) {
80
+ limit = DEFAULT_LIMIT;
81
+ }
82
+
83
+
84
+ var page = 0;
85
+
86
+ if (req.query.page) {
87
+ page = req.query.page;
88
+ }
89
+
90
+ var skip = page * limit;
91
+
92
+ return Message.find({id_project: req.projectid}).sort({createdAt: 'desc'}).
93
+ skip(skip).limit(limit).lean().exec(async (err, messages) => {
94
+ if (err) return next(err);
95
+
96
+ if (req.query.populate_request) {
97
+ // console.log("pupulate")
98
+ for (var i = 0; i < messages.length; i++) {
99
+ messages[i].request = await Request.findOne({request_id:messages[i].recipient, id_project: messages[i].id_project }).exec();
100
+ }
101
+ }
102
+
103
+ res.json(messages);
104
+ });
105
+ });
106
+
68
107
  router.get('/csv', roleChecker.hasRoleOrTypes('owner'), function(req, res) {
69
108
 
70
109
 
package/routes/project.js CHANGED
@@ -18,7 +18,7 @@ var validtoken = require('../middleware/valid-token')
18
18
  var RoleConstants = require("../models/roleConstants");
19
19
  var cacheUtil = require('../utils/cacheUtil');
20
20
  var orgUtil = require("../utils/orgUtil");
21
-
21
+ var cacheEnabler = require("../services/cacheEnabler");
22
22
 
23
23
  router.post('/', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken], async (req, res) => {
24
24
 
@@ -213,6 +213,22 @@ router.put('/:projectid', [passport.authenticate(['basic', 'jwt'], { session: fa
213
213
  update.ipFilter = req.body.ipFilter;
214
214
  }
215
215
 
216
+ if (req.body.ipFilterDenyEnabled!=undefined) {
217
+ update.ipFilterDenyEnabled = req.body.ipFilterDenyEnabled;
218
+ }
219
+
220
+ if (req.body.ipFilterDeny!=undefined) {
221
+ update.ipFilterDeny = req.body.ipFilterDeny;
222
+ }
223
+
224
+ if (req.body.bannedUsers!=undefined) {
225
+ update.bannedUsers = req.body.bannedUsers;
226
+ }
227
+
228
+
229
+
230
+
231
+
216
232
 
217
233
  // if (req.body.defaultLanguage!=undefined) {
218
234
  // update.defaultLanguage = req.body.defaultLanguage;
@@ -360,6 +376,19 @@ router.patch('/:projectid', [passport.authenticate(['basic', 'jwt'], { session:
360
376
  if (req.body.ipFilter!=undefined) {
361
377
  update.ipFilter = req.body.ipFilter;
362
378
  }
379
+
380
+ if (req.body.ipFilterDenyEnabled!=undefined) {
381
+ update.ipFilterDenyEnabled = req.body.ipFilterDenyEnabled;
382
+ }
383
+
384
+ if (req.body.ipFilterDeny!=undefined) {
385
+ update.ipFilterDeny = req.body.ipFilterDeny;
386
+ }
387
+
388
+ if (req.body.bannedUsers!=undefined) {
389
+ update.bannedUsers = req.body.bannedUsers;
390
+ }
391
+
363
392
 
364
393
  // if (req.body.defaultLanguage!=undefined) {
365
394
  // update.defaultLanguage = req.body.defaultLanguage;
@@ -378,12 +407,55 @@ router.patch('/:projectid', [passport.authenticate(['basic', 'jwt'], { session:
378
407
  });
379
408
  });
380
409
 
410
+
411
+ router.post('/:projectid/ban', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('admin')], function (req, res) {
412
+ winston.debug('PATCH PROJECT REQ BODY ', req.body);
413
+
414
+ var ban = {};
415
+ ban.id = req.body.id;
416
+ ban.ip = req.body.ip;
417
+
418
+ Project.findByIdAndUpdate(req.params.projectid, { $push: { bannedUsers: ban } }, { new: true, upsert: false }, function (err, updatedProject) {
419
+ if (err) {
420
+ winston.error('Error putting project ', err);
421
+ return res.status(500).send({ success: false, msg: 'Error patching object.' });
422
+ }
423
+ projectEvent.emit('project.update', updatedProject );
424
+ projectEvent.emit('project.update.user.ban', {banInfo: ban, project: updatedProject });
425
+ res.json(updatedProject);
426
+ });
427
+
428
+ });
429
+ router.delete('/:projectid/ban/:banid', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('admin')], function (req, res) {
430
+
431
+ // winston.info('quiiiiii');
432
+ //cacheinvalidation
433
+
434
+
435
+ // devi prendere id utente prima di eliminarlo
436
+ Project.findByIdAndUpdate(req.params.projectid, { $pull: { bannedUsers: { "_id": req.params.banid }}}, { new: true, upsert: false }, function (err, updatedProject) {
437
+ if (err) {
438
+ winston.error('Error putting project ', err);
439
+ return res.status(500).send({ success: false, msg: 'Error patching object.' });
440
+ }
441
+ projectEvent.emit('project.update', updatedProject );
442
+ projectEvent.emit('project.update.user.unban', {banInfo: req.params.banid, project: updatedProject});
443
+ res.json(updatedProject);
444
+ });
445
+
446
+ });
447
+
448
+
449
+
381
450
  //roleChecker.hasRole('agent') works because req.params.projectid is valid using :projectid of this method
382
451
  router.get('/:projectid', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('agent', ['subscription'])], function (req, res) {
383
452
  winston.debug(req.body);
384
- Project.findOne({_id: req.params.projectid, status:100})
385
- //@DISABLED_CACHE .cache(cacheUtil.defaultTTL, "projects:id:"+req.params.projectid)
386
- .exec(function (err, project) {
453
+ let q = Project.findOne({_id: req.params.projectid, status:100});
454
+ if (cacheEnabler.project) {
455
+ q.cache(cacheUtil.longTTL, "projects:id:"+req.params.projectid) //project_cache
456
+ winston.debug('project cache enabled');
457
+ }
458
+ q.exec(function (err, project) {
387
459
  if (err) {
388
460
  winston.error('Error getting project ', err);
389
461
  return res.status(500).send({ success: false, msg: 'Error getting object.' });
@@ -220,6 +220,10 @@ router.put('/', [passport.authenticate(['basic', 'jwt'], { session: false }), va
220
220
  if (req.body.user_available!=undefined) {
221
221
  update.user_available = req.body.user_available;
222
222
  }
223
+
224
+ if (req.body.profileStatus!=undefined) {
225
+ update.profileStatus = req.body.profileStatus;
226
+ }
223
227
 
224
228
  if (req.body.max_assigned_chat!=undefined) {
225
229
  update.max_assigned_chat = req.body.max_assigned_chat;
@@ -241,6 +245,7 @@ router.put('/', [passport.authenticate(['basic', 'jwt'], { session: false }), va
241
245
 
242
246
 
243
247
 
248
+
244
249
  Project_user.findByIdAndUpdate(req.projectuser.id, update, { new: true, upsert: true }, function (err, updatedProject_user) {
245
250
  if (err) {
246
251
  winston.error("Error gettting project_user for update", err);
@@ -274,6 +279,10 @@ router.put('/:project_userid', [passport.authenticate(['basic', 'jwt'], { sessio
274
279
  update.user_available = req.body.user_available;
275
280
  }
276
281
 
282
+ if (req.body.profileStatus!=undefined) {
283
+ update.profileStatus = req.body.profileStatus;
284
+ }
285
+
277
286
  if (req.body.max_assigned_chat!=undefined) {
278
287
  update.max_assigned_chat = req.body.max_assigned_chat;
279
288
  }
@@ -366,7 +375,8 @@ router.get('/:project_userid', [passport.authenticate(['basic', 'jwt'], { sessio
366
375
  });
367
376
 
368
377
 
369
- router.get('/users/search', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('agent', ['subscription'])], async (req, res, next) => {
378
+ router.get('/users/search', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('user', ['subscription'])], async (req, res, next) => { //changed for smtp
379
+ // router.get('/users/search', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('agent', ['subscription'])], async (req, res, next) => {
370
380
  winston.debug("--> users search ");
371
381
 
372
382
  if (!req.project) {
@@ -0,0 +1,19 @@
1
+ var express = require('express');
2
+ var router = express.Router({mergeParams: true});
3
+
4
+ var passport = require('passport');
5
+ require('../middleware/passport')(passport);
6
+ var validtoken = require('../middleware/valid-token')
7
+ var roleChecker = require('../middleware/has-role');
8
+
9
+
10
+
11
+ router.get('/test', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('agent', ['subscription'])], function (req, res) {
12
+ // console.log("req.projectuser",req.projectuser);
13
+ res.json(req.projectuser);
14
+
15
+ });
16
+
17
+
18
+
19
+ module.exports = router;