@tiledesk/tiledesk-server 2.3.6 → 2.3.7-1.2

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 (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;