@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.
- package/.github/workflows/docker-community-worker-push-latest.yml +23 -0
- package/.github/workflows/docker-image-tag-worker-community-tag-push.yml +22 -0
- package/CHANGELOG.md +361 -3
- package/Dockerfile-jobs +31 -0
- package/app.js +62 -69
- package/channels/chat21/chat21Handler.js +37 -6
- package/channels/chat21/chat21WebHook.js +62 -34
- package/channels/chat21/package-lock.json +663 -706
- package/channels/chat21/package.json +2 -2
- package/config/labels/widget.json +337 -136
- package/deploy.sh +2 -0
- package/event/messageEvent.js +110 -9
- package/jobs.js +80 -0
- package/jobsManager.js +47 -0
- package/middleware/has-role.js +10 -3
- package/middleware/ipFilter.js +220 -0
- package/middleware/passport.js +8 -2
- package/models/department.js +1 -1
- package/models/faq.js +77 -25
- package/models/faq_kb.js +19 -0
- package/models/message.js +10 -8
- package/models/project.js +10 -0
- package/models/project_user.js +10 -0
- package/models/request.js +12 -1
- package/package.json +12 -11
- package/pubmodules/activities/activityArchiver.js +216 -90
- package/pubmodules/activities/routes/activity.js +1 -1
- package/pubmodules/apps/index.js +8 -0
- package/pubmodules/apps/listener.js +27 -0
- package/pubmodules/cache/index.js +2 -0
- package/pubmodules/cache/mongoose-cachegoose-fn.js +630 -0
- package/pubmodules/canned/cannedResponse.js +4 -0
- package/pubmodules/canned/cannedResponseRoute.js +10 -5
- package/pubmodules/dialogflow/index.js +10 -0
- package/pubmodules/dialogflow/listener.js +66 -0
- package/pubmodules/emailNotification/requestNotification.js +58 -28
- package/pubmodules/events/eventRoute.js +49 -24
- package/pubmodules/messageTransformer/messageHandlebarsTransformerInterceptor.js +6 -1
- package/pubmodules/messageTransformer/messageTransformerInterceptor.js +10 -4
- package/pubmodules/pubModulesManager.js +173 -7
- package/pubmodules/queue/index.js +4 -0
- package/pubmodules/queue/reconnect.js +331 -0
- package/pubmodules/queue/reconnectFanout.js +256 -0
- package/pubmodules/rasa/listener.js +5 -5
- package/pubmodules/routing-queue/index.js +3 -0
- package/pubmodules/routing-queue/listener.js +328 -0
- package/pubmodules/rules/conciergeBot.js +2 -2
- package/pubmodules/scheduler/tasks/closeAgentUnresponsiveRequestTask.js +6 -1
- package/pubmodules/scheduler/tasks/closeBotUnresponsiveRequestTask.js +7 -1
- package/pubmodules/tilebot/index.js +11 -0
- package/pubmodules/tilebot/listener.js +85 -0
- package/pubmodules/trigger/rulesTrigger.js +137 -14
- package/pubmodules/trigger/start.js +5 -1
- package/pubmodules/whatsapp/index.js +7 -0
- package/pubmodules/whatsapp/listener.js +32 -0
- package/routes/auth.js +7 -2
- package/routes/campaigns.js +3 -3
- package/routes/department.js +3 -2
- package/routes/email.js +32 -2
- package/routes/faq.js +37 -2
- package/routes/faq_kb.js +496 -133
- package/routes/faqpub.js +5 -0
- package/routes/lead.js +56 -0
- package/routes/message.js +196 -14
- package/routes/messagesRoot.js +39 -0
- package/routes/project.js +76 -4
- package/routes/project_user.js +11 -1
- package/routes/project_user_test.js +19 -0
- package/routes/request.js +134 -30
- package/routes/troubleshooting.js +12 -0
- package/routes/users-util.js +39 -0
- package/routes/users.js +1 -1
- package/routes/widget.js +64 -2
- package/services/BotSubscriptionNotifier.js +5 -0
- package/services/banUserNotifier.js +86 -0
- package/services/cacheEnabler.js +56 -0
- package/services/chatbotService.js +101 -0
- package/services/departmentService.js +25 -3
- package/services/emailService.js +170 -28
- package/services/faqBotHandler.js +2 -3
- package/services/faqService.js +28 -3
- package/services/geoService.js +36 -6
- package/services/labelService.js +1 -1
- package/services/leadService.js +3 -2
- package/services/messageService.js +4 -2
- package/services/modulesManager.js +23 -76
- package/services/operatingHoursService.js +9 -4
- package/services/requestService.js +75 -39
- package/services/subscriptionNotifier.js +9 -4
- package/services/trainingService.js +106 -0
- package/template/email/assignedEmailMessage.html +21 -11
- package/template/email/assignedRequest.html +21 -11
- package/template/email/beenInvitedExistingUser.html +16 -6
- package/template/email/beenInvitedNewUser.html +16 -6
- package/template/email/emailDirect.html +130 -0
- package/template/email/newMessage.html +18 -8
- package/template/email/newMessageFollower.html +22 -12
- package/template/email/passwordChanged.html +15 -5
- package/template/email/pooledEmailMessage.html +21 -11
- package/template/email/pooledRequest.html +20 -10
- package/template/email/resetPassword.html +15 -5
- package/template/email/sendTranscript.html +7 -4
- package/template/email/ticket.html +17 -7
- package/template/email/verify.html +15 -5
- package/test/cannedRoute.js +157 -0
- package/test/chatbot-mock.js +127 -0
- package/test/example-json-intents.txt +1 -0
- package/test/example-json.txt +1 -0
- package/test/example.json +1 -0
- package/test/faqRoute.js +353 -208
- package/test/faqkbRoute.js +669 -64
- package/test/imageRoute.js +1 -1
- package/test/messageRoute.js +387 -5
- package/test/requestRoute.js +6 -6
- package/test/requestService.js +55 -4
- package/test-int/cache-project.js +90 -0
- package/test-int/cache-project_user.js +88 -0
- package/utils/UIDGenerator.js +20 -0
- package/utils/cacheUtil.js +2 -2
- package/utils/orgUtil.js +3 -3
- package/utils/promiseUtil.js +31 -0
- package/utils/recipientEmailUtil.js +66 -0
- package/utils/sendEmailUtil.js +34 -0
- package/utils/sendMessageUtil.js +1 -1
- package/utils/stringUtil.js +12 -0
- 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
|
-
|
|
50
|
-
if (!
|
|
51
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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);
|
package/routes/messagesRoot.js
CHANGED
|
@@ -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
|
-
|
|
386
|
-
|
|
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.' });
|
package/routes/project_user.js
CHANGED
|
@@ -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('
|
|
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;
|