@tiledesk/tiledesk-server 2.4.100 → 2.4.101
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/app.js +45 -9
- package/event/emailEvent.js +13 -0
- package/event/integrationEvent.js +13 -0
- package/models/integrations.js +23 -0
- package/package.json +1 -1
- package/pubmodules/cache/mongoose-cachegoose-fn.js +12 -0
- package/pubmodules/emailNotification/requestNotification.js +1 -0
- package/routes/auth.js +14 -5
- package/routes/email.js +4 -2
- package/routes/faq.js +1 -0
- package/routes/integration.js +199 -0
- package/routes/kbsettings.js +8 -76
- package/routes/openai.js +52 -14
- package/routes/project.js +3 -4
- package/routes/quotes.js +52 -0
- package/routes/request.js +515 -499
- package/routes/users.js +5 -1
- package/services/QuoteManager.js +317 -0
- package/services/cacheEnabler.js +5 -0
- package/services/emailService.js +610 -586
- package/services/messageService.js +283 -202
- package/services/openaiService.js +12 -12
- package/services/requestService.js +1764 -1421
- package/services/trainingService.js +6 -2
- package/test/messageService.js +154 -92
- package/test/mock/MockTdCache.js +46 -0
- package/test/mock/emailMock.js +9 -0
- package/test/mock/messageMock.js +46 -0
- package/test/mock/projectMock.js +171 -0
- package/test/mock/requestMock.js +127 -0
- package/test/quoteManager.js +282 -0
- package/test/requestRoute.js +1 -1
- package/test/requestService.js +1196 -1079
- package/utils/TdCache.js +253 -0
package/routes/request.js
CHANGED
@@ -34,39 +34,55 @@ const { check, validationResult } = require('express-validator');
|
|
34
34
|
|
35
35
|
|
36
36
|
|
37
|
+
router.post('/simple', [check('first_text').notEmpty()], async (req, res) => {
|
38
|
+
|
39
|
+
var startTimestamp = new Date();
|
40
|
+
const errors = validationResult(req);
|
41
|
+
|
42
|
+
if (!errors.isEmpty()) {
|
43
|
+
return res.status(422).json({ errors: errors.array() });
|
44
|
+
}
|
45
|
+
|
46
|
+
if (req.projectuser) {
|
47
|
+
winston.debug("req.projectuser", req.projectuser);
|
48
|
+
}
|
49
|
+
|
50
|
+
var project_user = req.projectuser;
|
51
|
+
})
|
52
|
+
|
37
53
|
// undocumented, used by test
|
38
54
|
|
39
55
|
// TODO make a synchronous chat21 version (with query parameter?) with request.support_group.create
|
40
|
-
router.post('/',
|
41
|
-
[
|
42
|
-
|
43
|
-
],
|
44
|
-
async (req, res)
|
56
|
+
router.post('/',
|
57
|
+
[
|
58
|
+
check('first_text').notEmpty(),
|
59
|
+
],
|
60
|
+
async (req, res) => {
|
45
61
|
|
46
|
-
|
47
|
-
|
62
|
+
var startTimestamp = new Date();
|
63
|
+
winston.debug("request create timestamp: " + startTimestamp);
|
48
64
|
|
49
|
-
|
65
|
+
winston.debug("req.body", req.body);
|
50
66
|
|
51
|
-
|
52
|
-
|
67
|
+
winston.debug("req.projectid: " + req.projectid);
|
68
|
+
winston.debug("req.user.id: " + req.user.id);
|
53
69
|
|
54
70
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
71
|
+
const errors = validationResult(req);
|
72
|
+
if (!errors.isEmpty()) {
|
73
|
+
return res.status(422).json({ errors: errors.array() });
|
74
|
+
}
|
59
75
|
|
60
76
|
if (req.projectuser) {
|
61
|
-
winston.debug("req.projectuser", req.projectuser);
|
77
|
+
winston.debug("req.projectuser", req.projectuser);
|
62
78
|
}
|
63
|
-
|
79
|
+
|
64
80
|
var project_user = req.projectuser;
|
65
81
|
|
66
82
|
var sender = req.body.sender;
|
67
83
|
var fullname = req.body.senderFullname || req.user.fullName;
|
68
84
|
var email = req.body.email || req.user.email;
|
69
|
-
|
85
|
+
|
70
86
|
let messageStatus = req.body.status || MessageConstants.CHAT_MESSAGE_STATUS.SENDING;
|
71
87
|
winston.debug('messageStatus: ' + messageStatus);
|
72
88
|
|
@@ -76,71 +92,71 @@ async (req, res) => {
|
|
76
92
|
if (sender) {
|
77
93
|
|
78
94
|
var isObjectId = mongoose.Types.ObjectId.isValid(sender);
|
79
|
-
winston.debug("isObjectId:"+ isObjectId);
|
80
|
-
|
81
|
-
|
82
|
-
|
95
|
+
winston.debug("isObjectId:" + isObjectId);
|
96
|
+
|
97
|
+
var queryProjectUser = { id_project: req.projectid, status: "active" };
|
98
|
+
|
83
99
|
if (isObjectId) {
|
84
100
|
queryProjectUser.id_user = sender;
|
85
101
|
} else {
|
86
102
|
queryProjectUser.uuid_user = sender;
|
87
103
|
}
|
88
|
-
|
104
|
+
|
89
105
|
winston.debug("queryProjectUser", queryProjectUser);
|
90
|
-
|
91
|
-
project_user = await Project_user.findOne(queryProjectUser).populate({path:'id_user', select:{'firstname':1, 'lastname':1, 'email':1}})
|
106
|
+
|
107
|
+
project_user = await Project_user.findOne(queryProjectUser).populate({ path: 'id_user', select: { 'firstname': 1, 'lastname': 1, 'email': 1 } })
|
92
108
|
winston.debug("project_user", project_user);
|
93
|
-
|
109
|
+
|
94
110
|
if (!project_user) {
|
95
|
-
return res.status(403).send({success: false, msg: 'Unauthorized. Project_user not found with user id : '+ sender });
|
111
|
+
return res.status(403).send({ success: false, msg: 'Unauthorized. Project_user not found with user id : ' + sender });
|
96
112
|
}
|
97
113
|
|
98
|
-
if (
|
114
|
+
if (project_user.id_user) {
|
99
115
|
fullname = project_user.id_user.fullName;
|
100
|
-
winston.debug("pu fullname: "+ fullname);
|
116
|
+
winston.debug("pu fullname: " + fullname);
|
101
117
|
email = project_user.id_user.email;
|
102
|
-
winston.debug("pu email: "+ email);
|
118
|
+
winston.debug("pu email: " + email);
|
103
119
|
} else if (project_user.uuid_user) {
|
104
|
-
var lead = await Lead.findOne({lead_id: project_user.uuid_user, id_project: req.projectid});
|
105
|
-
winston.debug("lead: ",lead);
|
120
|
+
var lead = await Lead.findOne({ lead_id: project_user.uuid_user, id_project: req.projectid });
|
121
|
+
winston.debug("lead: ", lead);
|
106
122
|
if (lead) {
|
107
123
|
fullname = lead.fullname;
|
108
|
-
winston.debug("lead fullname: "+ fullname);
|
124
|
+
winston.debug("lead fullname: " + fullname);
|
109
125
|
email = lead.email;
|
110
|
-
winston.debug("lead email: "+ email);
|
111
|
-
}else {
|
112
|
-
winston.warn("lead not found: " + JSON.stringify({lead_id: project_user.uuid_user, id_project: req.projectid}));
|
126
|
+
winston.debug("lead email: " + email);
|
127
|
+
} else {
|
128
|
+
winston.warn("lead not found: " + JSON.stringify({ lead_id: project_user.uuid_user, id_project: req.projectid }));
|
113
129
|
}
|
114
|
-
|
130
|
+
|
115
131
|
} else {
|
116
132
|
winston.warn("pu fullname and email empty");
|
117
133
|
}
|
118
|
-
|
134
|
+
|
119
135
|
}
|
120
136
|
|
121
137
|
|
122
138
|
// createIfNotExistsWithLeadId(lead_id, fullname, email, id_project, createdBy, attributes) {
|
123
139
|
return leadService.createIfNotExistsWithLeadId(sender || req.user._id, fullname, email, req.projectid, null, req.body.attributes || req.user.attributes)
|
124
|
-
.then(function(createdLead) {
|
140
|
+
.then(function (createdLead) {
|
125
141
|
|
126
142
|
|
127
143
|
|
128
|
-
var new_request = {
|
129
|
-
request_id: request_id,
|
144
|
+
var new_request = {
|
145
|
+
request_id: request_id,
|
130
146
|
project_user_id: req.projectuser._id,
|
131
|
-
lead_id: createdLead._id,
|
132
|
-
id_project:req.projectid,
|
133
|
-
first_text: req.body.first_text,
|
134
|
-
departmentid: req.body.departmentid,
|
135
|
-
sourcePage:req.body.sourcePage,
|
136
|
-
language: req.body.language,
|
137
|
-
userAgent:req.body.userAgent,
|
138
|
-
status:null,
|
147
|
+
lead_id: createdLead._id,
|
148
|
+
id_project: req.projectid,
|
149
|
+
first_text: req.body.first_text,
|
150
|
+
departmentid: req.body.departmentid,
|
151
|
+
sourcePage: req.body.sourcePage,
|
152
|
+
language: req.body.language,
|
153
|
+
userAgent: req.body.userAgent,
|
154
|
+
status: null,
|
139
155
|
createdBy: req.user._id,
|
140
|
-
attributes: req.body.attributes,
|
141
|
-
subject: req.body.subject,
|
142
|
-
preflight:undefined,
|
143
|
-
channel: req.body.channel,
|
156
|
+
attributes: req.body.attributes,
|
157
|
+
subject: req.body.subject,
|
158
|
+
preflight: undefined,
|
159
|
+
channel: req.body.channel,
|
144
160
|
location: req.body.location,
|
145
161
|
participants: req.body.participants,
|
146
162
|
lead: createdLead, requester: project_user,
|
@@ -149,38 +165,38 @@ async (req, res) => {
|
|
149
165
|
};
|
150
166
|
|
151
167
|
return requestService.create(new_request).then(function (savedRequest) {
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
168
|
+
// createWithIdAndRequester(request_id, project_user_id, lead_id, id_project, first_text, departmentid, sourcePage, language, userAgent, status, createdBy, attributes) {
|
169
|
+
// return requestService.createWithIdAndRequester(request_id, req.projectuser._id, createdLead._id, req.projectid,
|
170
|
+
// req.body.text, req.body.departmentid, req.body.sourcePage,
|
171
|
+
// req.body.language, req.body.userAgent, null, req.user._id, req.body.attributes, req.body.subject).then(function (savedRequest) {
|
156
172
|
|
157
173
|
|
158
174
|
// return messageService.create(sender || req.user._id, fullname, request_id, req.body.text,
|
159
175
|
// req.projectid, req.user._id, messageStatus, req.body.attributes, req.body.type, req.body.metadata, req.body.language, undefined, req.body.channel).then(function(savedMessage){
|
160
|
-
|
176
|
+
|
161
177
|
// create(sender, senderFullname, recipient, text, id_project, createdBy, status, attributes, type, metadata) {
|
162
178
|
// return messageService.create(req.body.sender || req.user._id, req.body.senderFullname || req.user.fullName, request_id, req.body.text,
|
163
179
|
// req.projectid, req.user._id, messageStatus, req.body.attributes, req.body.type, req.body.metadata).then(function(savedMessage){
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
180
|
+
|
181
|
+
|
182
|
+
winston.debug('res.json(savedRequest)');
|
183
|
+
var endTimestamp = new Date();
|
184
|
+
winston.verbose("request create end: " + (endTimestamp - startTimestamp));
|
185
|
+
return res.json(savedRequest);
|
186
|
+
// });
|
187
|
+
// });
|
188
|
+
});
|
189
|
+
|
190
|
+
|
191
|
+
|
192
|
+
|
193
|
+
|
194
|
+
}).catch(function (err) {
|
195
|
+
winston.error('Error saving request.', err);
|
196
|
+
return res.status(500).send({ success: false, msg: 'Error saving object.', err: err });
|
197
|
+
|
198
|
+
});
|
182
199
|
});
|
183
|
-
});
|
184
200
|
|
185
201
|
|
186
202
|
|
@@ -192,11 +208,11 @@ router.patch('/:requestid', function (req, res) {
|
|
192
208
|
// const update = _.assign({ "updatedAt": new Date() }, req.body);
|
193
209
|
//const update = req.body;
|
194
210
|
const update = {};
|
195
|
-
|
211
|
+
|
196
212
|
if (req.body.lead) {
|
197
213
|
update.lead = req.body.lead;
|
198
214
|
}
|
199
|
-
|
215
|
+
|
200
216
|
// TODO test it. does it work?
|
201
217
|
if (req.body.status) {
|
202
218
|
update.status = req.body.status;
|
@@ -205,7 +221,7 @@ router.patch('/:requestid', function (req, res) {
|
|
205
221
|
if (req.body.tags) {
|
206
222
|
update.tags = req.body.tags;
|
207
223
|
}
|
208
|
-
|
224
|
+
|
209
225
|
if (req.body.notes) {
|
210
226
|
update.notes = req.body.notes;
|
211
227
|
}
|
@@ -241,46 +257,46 @@ router.patch('/:requestid', function (req, res) {
|
|
241
257
|
update.priority = req.body.priority;
|
242
258
|
}
|
243
259
|
|
244
|
-
if (req.body.smartAssignment!=undefined) {
|
260
|
+
if (req.body.smartAssignment != undefined) {
|
245
261
|
update.smartAssignment = req.body.smartAssignment;
|
246
262
|
}
|
247
|
-
|
248
|
-
if (req.body.workingStatus!=undefined) {
|
263
|
+
|
264
|
+
if (req.body.workingStatus != undefined) {
|
249
265
|
update.workingStatus = req.body.workingStatus;
|
250
266
|
}
|
251
|
-
|
267
|
+
|
252
268
|
|
253
269
|
if (req.body.channelName) {
|
254
270
|
update["channel.name"] = req.body.channelName;
|
255
271
|
}
|
256
272
|
|
257
273
|
|
258
|
-
|
259
|
-
winston.verbose("Request patch update",update);
|
274
|
+
|
275
|
+
winston.verbose("Request patch update", update);
|
260
276
|
|
261
277
|
//cacheinvalidation
|
262
|
-
return Request.findOneAndUpdate({"request_id":req.params.requestid, "id_project": req.projectid}, { $set: update }, { new: true, upsert: false })
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
if (err) {
|
271
|
-
winston.error('Error patching request.', err);
|
272
|
-
return res.status(500).send({ success: false, msg: 'Error updating object.' });
|
273
|
-
}
|
278
|
+
return Request.findOneAndUpdate({ "request_id": req.params.requestid, "id_project": req.projectid }, { $set: update }, { new: true, upsert: false })
|
279
|
+
.populate('lead')
|
280
|
+
.populate('department')
|
281
|
+
.populate('participatingBots')
|
282
|
+
.populate('participatingAgents')
|
283
|
+
.populate({ path: 'requester', populate: { path: 'id_user' } })
|
284
|
+
.exec(function (err, request) {
|
274
285
|
|
275
|
-
|
276
|
-
|
277
|
-
|
286
|
+
if (err) {
|
287
|
+
winston.error('Error patching request.', err);
|
288
|
+
return res.status(500).send({ success: false, msg: 'Error updating object.' });
|
289
|
+
}
|
278
290
|
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
291
|
+
if (!request) {
|
292
|
+
return res.status(404).send({ success: false, msg: 'Request not found' });
|
293
|
+
}
|
294
|
+
|
295
|
+
requestEvent.emit("request.update", request);
|
296
|
+
requestEvent.emit("request.update.comment", { comment: "PATCH", request: request }); //Deprecated
|
297
|
+
requestEvent.emit("request.updated", { comment: "PATCH", request: request, patch: update });
|
298
|
+
return res.json(request);
|
299
|
+
});
|
284
300
|
|
285
301
|
});
|
286
302
|
|
@@ -288,15 +304,15 @@ router.patch('/:requestid', function (req, res) {
|
|
288
304
|
// TODO make a synchronous chat21 version (with query parameter?) with request.support_group.created
|
289
305
|
router.put('/:requestid/close', function (req, res) {
|
290
306
|
winston.debug(req.body);
|
291
|
-
|
307
|
+
|
292
308
|
// closeRequestByRequestId(request_id, id_project, skipStatsUpdate, notify, closed_by)
|
293
309
|
const closed_by = req.user.id;
|
294
|
-
return requestService.closeRequestByRequestId(req.params.requestid, req.projectid, false, true, closed_by, req.body.force).then(function(closedRequest) {
|
310
|
+
return requestService.closeRequestByRequestId(req.params.requestid, req.projectid, false, true, closed_by, req.body.force).then(function (closedRequest) {
|
311
|
+
|
312
|
+
winston.verbose("request closed", closedRequest);
|
295
313
|
|
296
|
-
|
314
|
+
return res.json(closedRequest);
|
297
315
|
|
298
|
-
return res.json(closedRequest);
|
299
|
-
|
300
316
|
});
|
301
317
|
|
302
318
|
|
@@ -305,12 +321,12 @@ router.put('/:requestid/close', function (req, res) {
|
|
305
321
|
router.put('/:requestid/reopen', function (req, res) {
|
306
322
|
winston.debug(req.body);
|
307
323
|
// reopenRequestByRequestId(request_id, id_project) {
|
308
|
-
return requestService.reopenRequestByRequestId(req.params.requestid, req.projectid).then(function(reopenRequest) {
|
324
|
+
return requestService.reopenRequestByRequestId(req.params.requestid, req.projectid).then(function (reopenRequest) {
|
309
325
|
|
310
326
|
winston.verbose("request reopen", reopenRequest);
|
311
327
|
|
312
328
|
return res.json(reopenRequest);
|
313
|
-
});
|
329
|
+
});
|
314
330
|
|
315
331
|
|
316
332
|
});
|
@@ -323,27 +339,27 @@ router.put('/:requestid/assignee', function (req, res) {
|
|
323
339
|
});
|
324
340
|
|
325
341
|
// TODO make a synchronous chat21 version (with query parameter?) with request.support_group.created
|
326
|
-
router.post('/:requestid/participants',
|
327
|
-
[
|
328
|
-
|
329
|
-
],
|
330
|
-
function (req, res) {
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
342
|
+
router.post('/:requestid/participants',
|
343
|
+
[
|
344
|
+
check('member').notEmpty(),
|
345
|
+
],
|
346
|
+
function (req, res) {
|
347
|
+
winston.debug(req.body);
|
348
|
+
|
349
|
+
const errors = validationResult(req);
|
350
|
+
if (!errors.isEmpty()) {
|
351
|
+
return res.status(422).json({ errors: errors.array() });
|
352
|
+
}
|
353
|
+
|
354
|
+
//addParticipantByRequestId(request_id, id_project, member)
|
355
|
+
return requestService.addParticipantByRequestId(req.params.requestid, req.projectid, req.body.member).then(function (updatedRequest) {
|
340
356
|
|
341
357
|
winston.verbose("participant added", updatedRequest);
|
342
358
|
|
343
359
|
return res.json(updatedRequest);
|
360
|
+
});
|
361
|
+
|
344
362
|
});
|
345
|
-
|
346
|
-
});
|
347
363
|
|
348
364
|
// TODO make a synchronous chat21 version (with query parameter?) with request.support_group.created
|
349
365
|
/*
|
@@ -356,40 +372,40 @@ router.put('/:requestid/participants', function (req, res) {
|
|
356
372
|
winston.debug("req.body", req.body);
|
357
373
|
|
358
374
|
var participants = [];
|
359
|
-
req.body.forEach(function(participant,index) {
|
375
|
+
req.body.forEach(function (participant, index) {
|
360
376
|
participants.push(participant);
|
361
377
|
});
|
362
378
|
winston.debug("var participants", participants);
|
363
|
-
|
379
|
+
|
364
380
|
//setParticipantsByRequestId(request_id, id_project, participants)
|
365
|
-
return requestService.setParticipantsByRequestId(req.params.requestid, req.projectid, participants
|
381
|
+
return requestService.setParticipantsByRequestId(req.params.requestid, req.projectid, participants).then(function (updatedRequest) {
|
366
382
|
|
367
|
-
|
383
|
+
winston.debug("participant set", updatedRequest);
|
368
384
|
|
369
|
-
|
385
|
+
return res.json(updatedRequest);
|
370
386
|
});
|
371
|
-
|
387
|
+
|
372
388
|
});
|
373
389
|
|
374
390
|
// TODO make a synchronous chat21 version (with query parameter?) with request.support_group.created
|
375
391
|
router.delete('/:requestid/participants/:participantid', function (req, res) {
|
376
392
|
winston.debug(req.body);
|
377
|
-
|
378
|
-
//removeParticipantByRequestId(request_id, id_project, member)
|
379
|
-
return requestService.removeParticipantByRequestId(req.params.requestid, req.projectid, req.params.participantid ).then(function(updatedRequest) {
|
380
393
|
|
381
|
-
|
394
|
+
//removeParticipantByRequestId(request_id, id_project, member)
|
395
|
+
return requestService.removeParticipantByRequestId(req.params.requestid, req.projectid, req.params.participantid).then(function (updatedRequest) {
|
382
396
|
|
383
|
-
|
397
|
+
winston.verbose("participant removed", updatedRequest);
|
398
|
+
|
399
|
+
return res.json(updatedRequest);
|
384
400
|
});
|
385
|
-
|
386
|
-
|
401
|
+
|
402
|
+
|
387
403
|
});
|
388
404
|
|
389
405
|
// // TODO deprecated
|
390
406
|
// router.delete('/:requestid/participants', function (req, res) {
|
391
407
|
// winston.debug(req.body);
|
392
|
-
|
408
|
+
|
393
409
|
// //removeParticipantByRequestId(request_id, id_project, member)
|
394
410
|
// return requestService.removeParticipantByRequestId(req.params.requestid, req.projectid, req.body.member ).then(function(updatedRequest) {
|
395
411
|
|
@@ -397,8 +413,8 @@ router.delete('/:requestid/participants/:participantid', function (req, res) {
|
|
397
413
|
|
398
414
|
// return res.json(updatedRequest);
|
399
415
|
// });
|
400
|
-
|
401
|
-
|
416
|
+
|
417
|
+
|
402
418
|
// });
|
403
419
|
|
404
420
|
|
@@ -408,49 +424,49 @@ router.delete('/:requestid/participants/:participantid', function (req, res) {
|
|
408
424
|
|
409
425
|
router.put('/:requestid/assign', function (req, res) {
|
410
426
|
winston.debug(req.body);
|
411
|
-
|
427
|
+
|
412
428
|
// leggi la request se già assegnata o già chiusa (1000) esci
|
413
429
|
|
414
|
-
|
415
|
-
|
416
|
-
.exec(
|
417
|
-
|
430
|
+
//cacheinvalidation
|
431
|
+
return Request.findOne({ "request_id": req.params.requestid, "id_project": req.projectid })
|
432
|
+
.exec(function (err, request) {
|
433
|
+
|
418
434
|
if (err) {
|
419
435
|
winston.error('Error patching request.', err);
|
420
436
|
return res.status(500).send({ success: false, msg: 'Error updating object.' });
|
421
437
|
}
|
422
|
-
|
438
|
+
|
423
439
|
if (!request) {
|
424
440
|
return res.status(404).send({ success: false, msg: 'Request not found' });
|
425
441
|
}
|
426
442
|
|
427
|
-
if (request.status === RequestConstants.ASSIGNED
|
443
|
+
if (request.status === RequestConstants.ASSIGNED || request.status === RequestConstants.SERVED || request.status === RequestConstants.CLOSED) {
|
428
444
|
winston.info('Request already assigned');
|
429
445
|
return res.json(request);
|
430
446
|
}
|
431
|
-
|
432
|
-
requestService.route(req.params.requestid, req.body.departmentid, req.projectid, req.body.nobot, req.body.no_populate).then(function(updatedRequest) {
|
433
|
-
|
447
|
+
//route(request_id, departmentid, id_project) {
|
448
|
+
requestService.route(req.params.requestid, req.body.departmentid, req.projectid, req.body.nobot, req.body.no_populate).then(function (updatedRequest) {
|
449
|
+
|
434
450
|
winston.debug("department changed", updatedRequest);
|
435
451
|
|
436
452
|
return res.json(updatedRequest);
|
437
|
-
}).catch(function(error)
|
453
|
+
}).catch(function (error) {
|
438
454
|
winston.error('Error changing the department.', error)
|
439
455
|
return res.status(500).send({ success: false, msg: 'Error changing the department.' });
|
440
456
|
})
|
441
|
-
|
457
|
+
});
|
442
458
|
});
|
443
459
|
|
444
460
|
// TODO make a synchronous chat21 version (with query parameter?) with request.support_group.created
|
445
461
|
router.put('/:requestid/departments', function (req, res) {
|
446
462
|
winston.debug(req.body);
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
winston.debug("department changed", updatedRequest);
|
463
|
+
//route(request_id, departmentid, id_project) {
|
464
|
+
requestService.route(req.params.requestid, req.body.departmentid, req.projectid, req.body.nobot, req.body.no_populate).then(function (updatedRequest) {
|
451
465
|
|
452
|
-
|
453
|
-
|
466
|
+
winston.debug("department changed", updatedRequest);
|
467
|
+
|
468
|
+
return res.json(updatedRequest);
|
469
|
+
}).catch(function (error) {
|
454
470
|
winston.error('Error changing the department.', error)
|
455
471
|
return res.status(500).send({ success: false, msg: 'Error changing the department.' });
|
456
472
|
})
|
@@ -459,42 +475,42 @@ router.put('/:requestid/departments', function (req, res) {
|
|
459
475
|
|
460
476
|
router.put('/:requestid/agent', async (req, res) => {
|
461
477
|
winston.debug(req.body);
|
462
|
-
|
463
|
-
|
478
|
+
//route(request_id, departmentid, id_project) {
|
464
479
|
|
465
|
-
var request = await Request.findOne({"request_id":req.params.requestid, id_project:req.projectid})
|
466
|
-
.exec();
|
467
|
-
|
468
|
-
if (!request) {
|
469
|
-
return res.status(404).send({ success: false, msg: 'Object not found.' });
|
470
|
-
}
|
471
480
|
|
472
|
-
|
473
|
-
|
481
|
+
var request = await Request.findOne({ "request_id": req.params.requestid, id_project: req.projectid })
|
482
|
+
.exec();
|
474
483
|
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
departmentid = defaultDepartment.id;
|
479
|
-
}
|
480
|
-
winston.debug("departmentid after: "+ departmentid);
|
484
|
+
if (!request) {
|
485
|
+
return res.status(404).send({ success: false, msg: 'Object not found.' });
|
486
|
+
}
|
481
487
|
|
482
|
-
|
483
|
-
|
484
|
-
winston.debug("department changed", updatedRequest);
|
488
|
+
var departmentid = request.department;
|
489
|
+
winston.debug("departmentid before: " + departmentid);
|
485
490
|
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
+
if (!departmentid) {
|
492
|
+
var defaultDepartment = await departmentService.getDefaultDepartment(req.projectid);
|
493
|
+
winston.debug("defaultDepartment: ", defaultDepartment);
|
494
|
+
departmentid = defaultDepartment.id;
|
495
|
+
}
|
496
|
+
winston.debug("departmentid after: " + departmentid);
|
497
|
+
|
498
|
+
requestService.route(req.params.requestid, departmentid, req.projectid, true, undefined).then(function (updatedRequest) {
|
499
|
+
|
500
|
+
winston.debug("department changed", updatedRequest);
|
501
|
+
|
502
|
+
return res.json(updatedRequest);
|
503
|
+
}).catch(function (error) {
|
504
|
+
winston.error('Error changing the department.', error)
|
505
|
+
return res.status(500).send({ success: false, msg: 'Error changing the department.' });
|
506
|
+
})
|
491
507
|
|
492
508
|
|
493
509
|
});
|
494
510
|
|
495
511
|
// router.post('/:requestid/attributes', function (req, res) {
|
496
512
|
// winston.debug(req.body);
|
497
|
-
|
513
|
+
|
498
514
|
// //return Request.findOneAndUpdate({"request_id":req.params.requestid},{ $push: { attributes: req.body } } , { new: true, upsert: false }, function (err, updatedMessage) {
|
499
515
|
// return Request.findOneAndUpdate({"request_id":req.params.requestid},{ $set: { attributes: req.body } } , { new: true, upsert: false }, function (err, updatedMessage) {
|
500
516
|
// if (err) {
|
@@ -509,7 +525,7 @@ router.put('/:requestid/agent', async (req, res) => {
|
|
509
525
|
|
510
526
|
// router.put('/:requestid/attributes/:attributeid', function (req, res) {
|
511
527
|
// winston.debug(req.body);
|
512
|
-
|
528
|
+
|
513
529
|
// return Request.findOneAndUpdate({"request_id":req.params.requestid, "attributes._id": req.params.attributeid},{ $set: { "attributes.$": req.body}} , { new: true, upsert: false }, function (err, updatedMessage) {
|
514
530
|
// if (err) {
|
515
531
|
// winston.error('Error patching request.', err);
|
@@ -523,7 +539,7 @@ router.put('/:requestid/agent', async (req, res) => {
|
|
523
539
|
|
524
540
|
// router.delete('/:requestid/attributes/:attributeid', function (req, res) {
|
525
541
|
// winston.debug(req.body);
|
526
|
-
|
542
|
+
|
527
543
|
|
528
544
|
// return Request.findOneAndUpdate({"request_id":req.params.requestid},{ "$pull": { "attributes": { "_id": req.params.attributeid } }} , { new: true, upsert: false }, function (err, updatedMessage) {
|
529
545
|
// if (err) {
|
@@ -537,19 +553,19 @@ router.put('/:requestid/agent', async (req, res) => {
|
|
537
553
|
// });
|
538
554
|
|
539
555
|
|
540
|
-
router.patch('/:requestid/attributes',
|
556
|
+
router.patch('/:requestid/attributes', function (req, res) {
|
541
557
|
var data = req.body;
|
542
558
|
var id_project = req.projectid;
|
543
559
|
|
544
560
|
// TODO use service method
|
545
561
|
|
546
|
-
Request.findOne({"request_id":req.params.requestid, id_project:id_project})
|
547
|
-
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
562
|
+
Request.findOne({ "request_id": req.params.requestid, id_project: id_project })
|
563
|
+
.populate('lead')
|
564
|
+
.populate('department')
|
565
|
+
.populate('participatingBots')
|
566
|
+
.populate('participatingAgents')
|
567
|
+
.populate({ path: 'requester', populate: { path: 'id_user' } })
|
568
|
+
.exec(function (err, request) {
|
553
569
|
if (err) {
|
554
570
|
return res.status(500).send({ success: false, msg: 'Error getting object.' });
|
555
571
|
}
|
@@ -557,210 +573,210 @@ router.patch('/:requestid/attributes', function (req, res) {
|
|
557
573
|
return res.status(404).send({ success: false, msg: 'Object not found.' });
|
558
574
|
}
|
559
575
|
|
560
|
-
|
576
|
+
|
561
577
|
if (!request.attributes) {
|
562
578
|
winston.debug("empty attributes")
|
563
579
|
request.attributes = {};
|
564
580
|
}
|
565
581
|
|
566
582
|
winston.debug(" req attributes", request.attributes)
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
590
|
-
|
591
|
-
|
592
|
-
|
593
|
-
|
583
|
+
|
584
|
+
Object.keys(data).forEach(function (key) {
|
585
|
+
var val = data[key];
|
586
|
+
winston.debug("data attributes " + key + " " + val)
|
587
|
+
request.attributes[key] = val;
|
588
|
+
});
|
589
|
+
|
590
|
+
winston.debug(" req attributes", request.attributes)
|
591
|
+
|
592
|
+
// https://stackoverflow.com/questions/24054552/mongoose-not-saving-nested-object
|
593
|
+
request.markModified('attributes');
|
594
|
+
|
595
|
+
//cacheinvalidation
|
596
|
+
request.save(function (err, savedRequest) {
|
597
|
+
if (err) {
|
598
|
+
winston.error("error saving request attributes", err)
|
599
|
+
return res.status(500).send({ success: false, msg: 'Error getting object.' });
|
600
|
+
}
|
601
|
+
winston.verbose(" saved request attributes", savedRequest.toObject())
|
602
|
+
requestEvent.emit("request.update", savedRequest);
|
603
|
+
requestEvent.emit("request.update.comment", { comment: "ATTRIBUTES_PATCH", request: savedRequest });//Deprecated
|
604
|
+
requestEvent.emit("request.updated", { comment: "ATTRIBUTES_PATCH", request: savedRequest, patch: { attributes: data } });
|
605
|
+
requestEvent.emit("request.attributes.update", savedRequest);
|
606
|
+
res.json(savedRequest);
|
607
|
+
});
|
608
|
+
});
|
609
|
+
|
594
610
|
});
|
595
611
|
|
596
|
-
router.post('/:requestid/notes',
|
612
|
+
router.post('/:requestid/notes', function (req, res) {
|
597
613
|
var note = {};
|
598
614
|
note.text = req.body.text;
|
599
615
|
// note.id_project = req.projectid;
|
600
616
|
note.createdBy = req.user.id;
|
601
617
|
|
602
618
|
//cacheinvalidation
|
603
|
-
return Request.findOneAndUpdate({request_id:req.params.requestid, id_project:req.projectid},{ $push: { notes: note } }
|
619
|
+
return Request.findOneAndUpdate({ request_id: req.params.requestid, id_project: req.projectid }, { $push: { notes: note } }, { new: true, upsert: false })
|
604
620
|
.populate('lead')
|
605
621
|
.populate('department')
|
606
622
|
.populate('participatingBots')
|
607
|
-
.populate('participatingAgents')
|
608
|
-
.populate({path:'requester',populate:{path:'id_user'}})
|
609
|
-
.exec(
|
623
|
+
.populate('participatingAgents')
|
624
|
+
.populate({ path: 'requester', populate: { path: 'id_user' } })
|
625
|
+
.exec(function (err, updatedRequest) {
|
610
626
|
|
611
|
-
|
612
|
-
|
613
|
-
|
614
|
-
|
615
|
-
|
616
|
-
|
617
|
-
|
627
|
+
if (err) {
|
628
|
+
winston.error('Error adding request note.', err);
|
629
|
+
return res.status(500).send({ success: false, msg: 'Error adding request object.' });
|
630
|
+
}
|
631
|
+
requestEvent.emit("request.update", updatedRequest);
|
632
|
+
requestEvent.emit("request.update.comment", { comment: "NOTE_ADD", request: updatedRequest });//Deprecated
|
633
|
+
requestEvent.emit("request.updated", { comment: "NOTE_ADD", request: updatedRequest, patch: { notes: note } });
|
618
634
|
|
619
|
-
|
620
|
-
|
635
|
+
return res.json(updatedRequest);
|
636
|
+
});
|
621
637
|
|
622
638
|
});
|
623
639
|
|
624
640
|
|
625
|
-
router.delete('/:requestid/notes/:noteid',
|
626
|
-
|
627
|
-
|
628
|
-
return Request.findOneAndUpdate({request_id: req.params.requestid, id_project:req.projectid},{ $pull: { notes: { "_id": req.params.noteid }
|
641
|
+
router.delete('/:requestid/notes/:noteid', function (req, res) {
|
642
|
+
|
643
|
+
//cacheinvalidation
|
644
|
+
return Request.findOneAndUpdate({ request_id: req.params.requestid, id_project: req.projectid }, { $pull: { notes: { "_id": req.params.noteid } } }, { new: true, upsert: false })
|
629
645
|
.populate('lead')
|
630
646
|
.populate('department')
|
631
647
|
.populate('participatingBots')
|
632
|
-
.populate('participatingAgents')
|
633
|
-
.populate({path:'requester',populate:{path:'id_user'}})
|
634
|
-
.exec(
|
648
|
+
.populate('participatingAgents')
|
649
|
+
.populate({ path: 'requester', populate: { path: 'id_user' } })
|
650
|
+
.exec(function (err, updatedRequest) {
|
635
651
|
|
636
|
-
|
637
|
-
|
638
|
-
|
639
|
-
|
640
|
-
|
641
|
-
|
642
|
-
|
652
|
+
if (err) {
|
653
|
+
winston.error('Error adding request note.', err);
|
654
|
+
return res.status(500).send({ success: false, msg: 'Error adding request object.' });
|
655
|
+
}
|
656
|
+
requestEvent.emit("request.update", updatedRequest);
|
657
|
+
requestEvent.emit("request.update.comment", { comment: "NOTE_DELETE", request: updatedRequest });//Deprecated
|
658
|
+
// requestEvent.emit("request.updated", {comment:"NOTE_DELETE",request:updatedRequest, patch: {notes:req.params.noteid}});
|
643
659
|
|
644
|
-
|
645
|
-
|
660
|
+
return res.json(updatedRequest);
|
661
|
+
});
|
646
662
|
|
647
663
|
});
|
648
664
|
|
649
665
|
|
650
666
|
|
651
667
|
//TODO add cc
|
652
|
-
router.post('/:requestid/email/send',
|
653
|
-
|
668
|
+
router.post('/:requestid/email/send',
|
669
|
+
async (req, res) => {
|
654
670
|
|
655
671
|
|
656
|
-
|
657
|
-
|
672
|
+
let text = req.body.text;
|
673
|
+
winston.debug("text: " + text);
|
658
674
|
|
659
|
-
|
660
|
-
|
675
|
+
let request_id = req.params.requestid;
|
676
|
+
winston.debug("request_id: " + request_id);
|
661
677
|
|
662
|
-
|
663
|
-
|
678
|
+
let subject = req.body.subject;
|
679
|
+
winston.info("subject: " + subject);
|
664
680
|
|
665
|
-
|
681
|
+
winston.debug("req.project", req.project);
|
666
682
|
|
667
|
-
|
668
|
-
|
683
|
+
let replyto = req.body.replyto;
|
684
|
+
winston.debug("replyto: " + replyto);
|
669
685
|
|
670
686
|
|
671
|
-
|
672
|
-
|
673
|
-
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
|
681
|
-
|
687
|
+
let q = Request.findOne({ request_id: request_id, id_project: req.projectid })
|
688
|
+
// .select("+snapshot.agents")
|
689
|
+
.populate('lead')
|
690
|
+
q.exec(function (err, request) {
|
691
|
+
if (err) {
|
692
|
+
winston.error("error getting request by id ", err);
|
693
|
+
return res.status(500).send({ success: false, msg: 'Error getting object.' });
|
694
|
+
}
|
695
|
+
if (!request) {
|
696
|
+
return res.status(404).send({ success: false, msg: 'Object not found.' });
|
697
|
+
}
|
682
698
|
|
683
699
|
|
684
700
|
|
685
|
-
|
701
|
+
winston.info("Sending an email with text : " + text + " to request_id " + request_id);
|
686
702
|
|
687
|
-
|
688
|
-
|
689
|
-
|
703
|
+
if (!request.lead.email) {
|
704
|
+
res.json({ "no queued": true });
|
705
|
+
}
|
690
706
|
|
691
|
-
|
692
|
-
|
707
|
+
let newto = request.lead.email
|
708
|
+
winston.info("Sending an email newto " + newto);
|
693
709
|
|
694
|
-
|
695
|
-
|
710
|
+
//sendEmailDirect(to, text, project, request_id, subject, tokenQueryString, sourcePage, payload)
|
711
|
+
emailService.sendEmailDirect(newto, text, req.project, request_id, subject, undefined, undefined, undefined, replyto);
|
696
712
|
|
697
|
-
|
713
|
+
res.json({ "queued": true });
|
698
714
|
|
699
715
|
|
700
|
-
|
716
|
+
});
|
701
717
|
|
702
718
|
|
703
719
|
|
704
|
-
|
705
|
-
});
|
706
720
|
|
721
|
+
});
|
707
722
|
|
708
723
|
|
709
724
|
|
710
|
-
|
711
|
-
|
712
|
-
|
713
|
-
|
714
|
-
|
715
|
-
|
716
|
-
|
717
|
-
|
718
|
-
|
719
|
-
|
720
|
-
|
721
|
-
|
722
|
-
|
723
|
-
|
725
|
+
|
726
|
+
router.post('/:requestid/followers',
|
727
|
+
[
|
728
|
+
check('member').notEmpty(),
|
729
|
+
],
|
730
|
+
function (req, res) {
|
731
|
+
winston.info("followers add", req.body);
|
732
|
+
|
733
|
+
const errors = validationResult(req);
|
734
|
+
if (!errors.isEmpty()) {
|
735
|
+
return res.status(422).json({ errors: errors.array() });
|
736
|
+
}
|
737
|
+
|
738
|
+
//addParticipantByRequestId(request_id, id_project, member)
|
739
|
+
return requestService.addFollowerByRequestId(req.params.requestid, req.projectid, req.body.member).then(function (updatedRequest) {
|
724
740
|
|
725
741
|
winston.verbose("participant added", updatedRequest);
|
726
742
|
|
727
743
|
return res.json(updatedRequest);
|
744
|
+
});
|
745
|
+
|
728
746
|
});
|
729
|
-
|
730
|
-
});
|
731
747
|
|
732
748
|
|
733
749
|
router.put('/:requestid/followers', function (req, res) {
|
734
750
|
winston.debug("req.body", req.body);
|
735
751
|
|
736
752
|
var followers = [];
|
737
|
-
req.body.forEach(function(follower,index) {
|
753
|
+
req.body.forEach(function (follower, index) {
|
738
754
|
followers.push(follower);
|
739
755
|
});
|
740
756
|
winston.debug("var followers", followers);
|
741
|
-
|
757
|
+
|
742
758
|
// setFollowersByRequestId(request_id, id_project, newfollowers)
|
743
|
-
return requestService.setFollowersByRequestId(req.params.requestid, req.projectid, followers
|
759
|
+
return requestService.setFollowersByRequestId(req.params.requestid, req.projectid, followers).then(function (updatedRequest) {
|
744
760
|
|
745
|
-
|
761
|
+
winston.debug("followers set", updatedRequest);
|
746
762
|
|
747
|
-
|
763
|
+
return res.json(updatedRequest);
|
748
764
|
});
|
749
|
-
|
765
|
+
|
750
766
|
});
|
751
767
|
|
752
768
|
router.delete('/:requestid/followers/:followerid', function (req, res) {
|
753
769
|
winston.debug(req.body);
|
754
|
-
|
755
|
-
//removeFollowerByRequestId(request_id, id_project, member)
|
756
|
-
return requestService.removeFollowerByRequestId(req.params.requestid, req.projectid, req.params.followerid ).then(function(updatedRequest) {
|
757
770
|
|
758
|
-
|
771
|
+
//removeFollowerByRequestId(request_id, id_project, member)
|
772
|
+
return requestService.removeFollowerByRequestId(req.params.requestid, req.projectid, req.params.followerid).then(function (updatedRequest) {
|
759
773
|
|
760
|
-
|
774
|
+
winston.verbose("follower removed", updatedRequest);
|
775
|
+
|
776
|
+
return res.json(updatedRequest);
|
761
777
|
});
|
762
|
-
|
763
|
-
|
778
|
+
|
779
|
+
|
764
780
|
});
|
765
781
|
|
766
782
|
|
@@ -769,21 +785,21 @@ router.delete('/:requestid/followers/:followerid', function (req, res) {
|
|
769
785
|
|
770
786
|
|
771
787
|
// TODO make a synchronous chat21 version (with query parameter?) with request.support_group.created
|
772
|
-
router.delete('/:requestid',
|
773
|
-
|
788
|
+
router.delete('/:requestid', function (req, res) {
|
789
|
+
|
774
790
|
var projectuser = req.projectuser;
|
775
791
|
|
776
792
|
|
777
|
-
if (projectuser.role != "owner"
|
793
|
+
if (projectuser.role != "owner") {
|
778
794
|
return res.status(403).send({ success: false, msg: 'Unauthorized.' });
|
779
795
|
}
|
780
796
|
|
781
|
-
Message.deleteMany({recipient:req.params.requestid}, function(err) {
|
782
|
-
|
783
|
-
|
784
|
-
|
785
|
-
|
786
|
-
|
797
|
+
Message.deleteMany({ recipient: req.params.requestid }, function (err) {
|
798
|
+
if (err) {
|
799
|
+
return res.status(500).send({ success: false, msg: 'Error deleting messages.' });
|
800
|
+
}
|
801
|
+
winston.verbose('Messages deleted for the recipient: ' + req.params.requestid);
|
802
|
+
});
|
787
803
|
|
788
804
|
|
789
805
|
Request.remove({ request_id: req.params.requestid }, function (err, request) {
|
@@ -794,9 +810,9 @@ router.delete('/:requestid', function (req, res) {
|
|
794
810
|
|
795
811
|
if (!request) {
|
796
812
|
return res.status(404).send({ success: false, msg: 'Object not found.' });
|
797
|
-
}
|
798
|
-
|
799
|
-
winston.verbose('Request deleted with request_id: '+ req.params.requestid
|
813
|
+
}
|
814
|
+
|
815
|
+
winston.verbose('Request deleted with request_id: ' + req.params.requestid);
|
800
816
|
|
801
817
|
requestEvent.emit('request.delete', request);
|
802
818
|
|
@@ -807,12 +823,12 @@ router.delete('/:requestid', function (req, res) {
|
|
807
823
|
|
808
824
|
|
809
825
|
|
810
|
-
router.delete('/id/:id',
|
811
|
-
|
826
|
+
router.delete('/id/:id', function (req, res) {
|
827
|
+
|
812
828
|
var projectuser = req.projectuser;
|
813
829
|
|
814
830
|
|
815
|
-
if (projectuser.role != "owner"
|
831
|
+
if (projectuser.role != "owner") {
|
816
832
|
return res.status(403).send({ success: false, msg: 'Unauthorized.' });
|
817
833
|
}
|
818
834
|
|
@@ -824,9 +840,9 @@ router.delete('/id/:id', function (req, res) {
|
|
824
840
|
|
825
841
|
if (!request) {
|
826
842
|
return res.status(404).send({ success: false, msg: 'Object not found.' });
|
827
|
-
}
|
828
|
-
|
829
|
-
winston.verbose('Request deleted with id: '+ req.params.id
|
843
|
+
}
|
844
|
+
|
845
|
+
winston.verbose('Request deleted with id: ' + req.params.id);
|
830
846
|
|
831
847
|
requestEvent.emit('request.delete', request);
|
832
848
|
|
@@ -868,21 +884,21 @@ router.get('/', function (req, res, next) {
|
|
868
884
|
winston.debug('REQUEST ROUTE - SKIP PAGE ', skip);
|
869
885
|
|
870
886
|
|
871
|
-
var query = { "id_project": req.projectid, "status": {$lt:1000}, preflight:false};
|
887
|
+
var query = { "id_project": req.projectid, "status": { $lt: 1000 }, preflight: false };
|
872
888
|
|
873
889
|
var projectuser = req.projectuser;
|
874
890
|
|
875
891
|
|
876
892
|
if (req.user instanceof Subscription) {
|
877
|
-
|
893
|
+
//all request
|
878
894
|
} else if (projectuser && (projectuser.role == "owner" || projectuser.role == "admin")) {
|
879
|
-
|
880
|
-
|
895
|
+
//all request
|
896
|
+
// per uni mostrare solo quelle priprio quindi solo participants
|
881
897
|
if (req.query.mine) {
|
882
|
-
query["$or"] = [
|
898
|
+
query["$or"] = [{ "snapshot.agents.id_user": req.user.id }, { "participants": req.user.id }];
|
883
899
|
}
|
884
|
-
}else {
|
885
|
-
query["$or"] = [
|
900
|
+
} else {
|
901
|
+
query["$or"] = [{ "snapshot.agents.id_user": req.user.id }, { "participants": req.user.id }];
|
886
902
|
}
|
887
903
|
|
888
904
|
// console.log('REQUEST ROUTE - req ', req);
|
@@ -912,7 +928,7 @@ router.get('/', function (req, res, next) {
|
|
912
928
|
if (req.query.status == 1000 || req.query.status == "1000") {
|
913
929
|
history_search = true;
|
914
930
|
}
|
915
|
-
if (req.query.status==="all") {
|
931
|
+
if (req.query.status === "all") {
|
916
932
|
history_search = true;
|
917
933
|
delete query.status;
|
918
934
|
}
|
@@ -930,7 +946,7 @@ router.get('/', function (req, res, next) {
|
|
930
946
|
}
|
931
947
|
|
932
948
|
winston.debug('req.query.hasbot', req.query.hasbot);
|
933
|
-
if (req.query.hasbot!=undefined) {
|
949
|
+
if (req.query.hasbot != undefined) {
|
934
950
|
winston.debug('req.query.hasbot', req.query.hasbot);
|
935
951
|
query.hasBot = req.query.hasbot;
|
936
952
|
}
|
@@ -966,8 +982,8 @@ router.get('/', function (req, res, next) {
|
|
966
982
|
* THE SEARCH FOR DATE INTERVAL OF THE HISTORY OF REQUESTS ARE DISABLED AND
|
967
983
|
* ARE DISPLAYED ONLY THE REQUESTS OF THE LAST 14 DAYS
|
968
984
|
*/
|
969
|
-
|
970
|
-
if (
|
985
|
+
//fixato. secondo me qui manca un parentesi tonda per gli or
|
986
|
+
if (history_search === true && req.project && req.project.profile && ((req.project.profile.type === 'free' && req.project.trialExpired === true) || (req.project.profile.type === 'payment' && req.project.isActiveSubscription === false))) {
|
971
987
|
|
972
988
|
|
973
989
|
var startdate = moment().subtract(14, "days").format("YYYY-MM-DD");
|
@@ -977,7 +993,7 @@ router.get('/', function (req, res, next) {
|
|
977
993
|
winston.debug('»»» REQUEST ROUTE - startdate ', startdate);
|
978
994
|
winston.debug('»»» REQUEST ROUTE - enddate ', enddate);
|
979
995
|
|
980
|
-
var enddatePlusOneDay=
|
996
|
+
var enddatePlusOneDay = moment(new Date()).add(1, 'days').toDate()
|
981
997
|
winston.debug('»»» REQUEST ROUTE - enddate + 1 days: ', enddatePlusOneDay);
|
982
998
|
|
983
999
|
// var enddatePlusOneDay = "2019-09-17T00:00:00.000Z"
|
@@ -986,12 +1002,12 @@ router.get('/', function (req, res, next) {
|
|
986
1002
|
winston.debug('REQUEST ROUTE - QUERY CREATED AT ', query.createdAt);
|
987
1003
|
|
988
1004
|
}
|
989
|
-
|
990
|
-
|
991
|
-
|
992
|
-
|
993
|
-
|
994
|
-
|
1005
|
+
|
1006
|
+
/**
|
1007
|
+
**! *** DATE RANGE USECASE 2 ***
|
1008
|
+
* in the tiledesk dashboard's HISTORY PAGE
|
1009
|
+
* WHEN THE USER SEARCH FOR DATE INTERVAL OF THE HISTORY OF REQUESTS
|
1010
|
+
*/
|
995
1011
|
if (req.query.start_date && req.query.end_date) {
|
996
1012
|
winston.debug('REQUEST ROUTE - REQ QUERY start_date ', req.query.start_date);
|
997
1013
|
winston.debug('REQUEST ROUTE - REQ QUERY end_date ', req.query.end_date);
|
@@ -1029,10 +1045,10 @@ router.get('/', function (req, res, next) {
|
|
1029
1045
|
var range = { $gte: new Date(Date.parse(startDate)).toISOString() };
|
1030
1046
|
if (req.query.filterRangeField) {
|
1031
1047
|
query[req.query.filterRangeField] = range;
|
1032
|
-
}else {
|
1048
|
+
} else {
|
1033
1049
|
query.createdAt = range;
|
1034
1050
|
}
|
1035
|
-
|
1051
|
+
|
1036
1052
|
winston.debug('REQUEST ROUTE - QUERY CREATED AT (only for start date)', query.createdAt);
|
1037
1053
|
}
|
1038
1054
|
// }
|
@@ -1056,7 +1072,7 @@ router.get('/', function (req, res, next) {
|
|
1056
1072
|
}
|
1057
1073
|
|
1058
1074
|
if (req.query.snap_department_id_bot_exists) {
|
1059
|
-
query["snapshot.department.id_bot"] = {"$exists": req.query.snap_department_id_bot_exists}
|
1075
|
+
query["snapshot.department.id_bot"] = { "$exists": req.query.snap_department_id_bot_exists }
|
1060
1076
|
winston.debug('REQUEST ROUTE - QUERY snap_department_id_bot_exists', query.snap_department_id_bot_exists);
|
1061
1077
|
}
|
1062
1078
|
|
@@ -1077,20 +1093,20 @@ router.get('/', function (req, res, next) {
|
|
1077
1093
|
|
1078
1094
|
if (req.query.channel) {
|
1079
1095
|
if (req.query.channel === "offline") {
|
1080
|
-
query["channel.name"] =
|
1081
|
-
} else
|
1082
|
-
query["channel.name"] =
|
1096
|
+
query["channel.name"] = { "$in": ["email", "form"] }
|
1097
|
+
} else if (req.query.channel === "online") {
|
1098
|
+
query["channel.name"] = { "$nin": ["email", "form"] }
|
1083
1099
|
} else {
|
1084
|
-
query["channel.name"] =
|
1100
|
+
query["channel.name"] = req.query.channel
|
1085
1101
|
}
|
1086
|
-
|
1102
|
+
|
1087
1103
|
winston.debug('REQUEST ROUTE - QUERY channel', query.channel);
|
1088
1104
|
}
|
1089
1105
|
|
1090
1106
|
if (req.query.priority) {
|
1091
1107
|
query.priority = req.query.priority;
|
1092
1108
|
}
|
1093
|
-
|
1109
|
+
|
1094
1110
|
|
1095
1111
|
var direction = -1; //-1 descending , 1 ascending
|
1096
1112
|
if (req.query.direction) {
|
@@ -1113,63 +1129,63 @@ router.get('/', function (req, res, next) {
|
|
1113
1129
|
|
1114
1130
|
var projection = undefined;
|
1115
1131
|
|
1116
|
-
if (req.query.full_text) {
|
1132
|
+
if (req.query.full_text) {
|
1133
|
+
|
1134
|
+
if (req.query.no_textscore != "true" && req.query.no_textscore != true) {
|
1135
|
+
winston.info('fulltext projection on');
|
1136
|
+
projection = { score: { $meta: "textScore" } };
|
1137
|
+
}
|
1117
1138
|
|
1118
|
-
if (req.query.no_textscore!= "true" && req.query.no_textscore!= true) {
|
1119
|
-
winston.info('fulltext projection on');
|
1120
|
-
projection = {score: { $meta: "textScore" } };
|
1121
|
-
}
|
1122
|
-
|
1123
1139
|
}
|
1124
1140
|
// requestcachefarequi populaterequired
|
1125
1141
|
var q1 = Request.find(query, projection).
|
1126
1142
|
skip(skip).limit(limit);
|
1127
1143
|
|
1128
1144
|
|
1129
|
-
|
1130
1145
|
|
1131
1146
|
|
1132
|
-
winston.debug('REQUEST ROUTE no_populate:' + req.query.no_populate);
|
1133
1147
|
|
1134
|
-
|
1135
|
-
|
1136
|
-
|
1148
|
+
winston.debug('REQUEST ROUTE no_populate:' + req.query.no_populate);
|
1149
|
+
|
1150
|
+
if (req.query.no_populate != "true" && req.query.no_populate != true) {
|
1151
|
+
winston.verbose('REQUEST ROUTE - no_polutate false ', req.headers);
|
1152
|
+
q1.populate('department').
|
1137
1153
|
populate('participatingBots'). //nico già nn gli usa
|
1138
1154
|
populate('participatingAgents'). //nico già nn gli usa
|
1139
1155
|
populate('lead').
|
1140
|
-
populate({path:'requester',populate:{path:'id_user'}}); //toglilo perche nico lo prende già da snapshot
|
1141
|
-
|
1142
|
-
|
1143
|
-
// cache(cacheUtil.defaultTTL, "requests-"+projectId).
|
1156
|
+
populate({ path: 'requester', populate: { path: 'id_user' } }); //toglilo perche nico lo prende già da snapshot
|
1157
|
+
}
|
1144
1158
|
|
1159
|
+
// cache(cacheUtil.defaultTTL, "requests-"+projectId).
|
1145
1160
|
|
1146
|
-
// if (req.query.select_snapshot) {
|
1147
|
-
// winston.info('select_snapshot');
|
1148
|
-
// q1.select("+snapshot");
|
1149
|
-
// // q1.select({ "snapshot": 1});
|
1150
|
-
// }
|
1151
1161
|
|
1152
|
-
|
1153
|
-
|
1154
|
-
|
1155
|
-
|
1156
|
-
|
1157
|
-
|
1158
|
-
|
1162
|
+
// if (req.query.select_snapshot) {
|
1163
|
+
// winston.info('select_snapshot');
|
1164
|
+
// q1.select("+snapshot");
|
1165
|
+
// // q1.select({ "snapshot": 1});
|
1166
|
+
// }
|
1167
|
+
|
1168
|
+
if (req.query.full_text) {
|
1169
|
+
winston.debug('fulltext sort');
|
1170
|
+
if (req.query.no_textscore != "true" && req.query.no_textscore != true) {
|
1171
|
+
q1.sort({ score: { $meta: "textScore" } }) //https://docs.mongodb.com/manual/reference/operator/query/text/#sort-by-text-search-score
|
1159
1172
|
}
|
1160
|
-
|
1173
|
+
} else {
|
1174
|
+
q1.sort(sortQuery);
|
1175
|
+
}
|
1176
|
+
|
1161
1177
|
|
1162
|
-
|
1178
|
+
// winston.info('q1',q1);
|
1163
1179
|
|
1164
1180
|
|
1165
|
-
|
1181
|
+
q1.exec();
|
1166
1182
|
|
1167
|
-
|
1168
|
-
|
1183
|
+
// TODO if ?onlycount=true do not perform find query but only
|
1184
|
+
// set q1 to undefined; to skip query
|
1169
1185
|
|
1170
|
-
var q2 =
|
1186
|
+
var q2 = Request.countDocuments(query).exec();
|
1171
1187
|
|
1172
|
-
if (req.query.no_count && req.query.no_count =="true") {
|
1188
|
+
if (req.query.no_count && req.query.no_count == "true") {
|
1173
1189
|
winston.info('REQUEST ROUTE - no_count ');
|
1174
1190
|
q2 = 0;
|
1175
1191
|
}
|
@@ -1179,7 +1195,7 @@ router.get('/', function (req, res, next) {
|
|
1179
1195
|
q2
|
1180
1196
|
];
|
1181
1197
|
|
1182
|
-
Promise.all(promises).then(function(results) {
|
1198
|
+
Promise.all(promises).then(function (results) {
|
1183
1199
|
var objectToReturn = {
|
1184
1200
|
perPage: limit,
|
1185
1201
|
count: results[1],
|
@@ -1189,15 +1205,15 @@ router.get('/', function (req, res, next) {
|
|
1189
1205
|
winston.debug('REQUEST ROUTE - objectToReturn ', objectToReturn);
|
1190
1206
|
|
1191
1207
|
const endExecTime = new Date();
|
1192
|
-
winston.verbose('REQUEST ROUTE - exec time: ' + (endExecTime-startExecTime));
|
1208
|
+
winston.verbose('REQUEST ROUTE - exec time: ' + (endExecTime - startExecTime));
|
1193
1209
|
|
1194
1210
|
return res.json(objectToReturn);
|
1195
1211
|
|
1196
|
-
}).catch(function(err){
|
1212
|
+
}).catch(function (err) {
|
1197
1213
|
winston.error('REQUEST ROUTE - REQUEST FIND ERR ', err);
|
1198
1214
|
return res.status(500).send({ success: false, msg: 'Error getting requests.', err: err });
|
1199
1215
|
});
|
1200
|
-
|
1216
|
+
|
1201
1217
|
|
1202
1218
|
});
|
1203
1219
|
|
@@ -1229,7 +1245,7 @@ router.get('/csv', function (req, res, next) {
|
|
1229
1245
|
|
1230
1246
|
if (req.query.full_text) {
|
1231
1247
|
winston.debug('req.query.fulltext', req.query.full_text);
|
1232
|
-
query.$text = {"$search": req.query.full_text};
|
1248
|
+
query.$text = { "$search": req.query.full_text };
|
1233
1249
|
}
|
1234
1250
|
|
1235
1251
|
if (req.query.status) {
|
@@ -1247,9 +1263,9 @@ router.get('/csv', function (req, res, next) {
|
|
1247
1263
|
winston.debug('req.query.participant', req.query.participant);
|
1248
1264
|
query.participants = req.query.participant;
|
1249
1265
|
}
|
1250
|
-
|
1266
|
+
|
1251
1267
|
winston.debug('req.query.hasbot', req.query.hasbot);
|
1252
|
-
if (req.query.hasbot!=undefined) {
|
1268
|
+
if (req.query.hasbot != undefined) {
|
1253
1269
|
winston.debug('req.query.hasbot', req.query.hasbot);
|
1254
1270
|
query.hasBot = req.query.hasbot;
|
1255
1271
|
}
|
@@ -1299,16 +1315,16 @@ router.get('/csv', function (req, res, next) {
|
|
1299
1315
|
var direction = 1; //-1 descending , 1 ascending
|
1300
1316
|
if (req.query.direction) {
|
1301
1317
|
direction = req.query.direction;
|
1302
|
-
}
|
1303
|
-
winston.debug("direction",direction);
|
1318
|
+
}
|
1319
|
+
winston.debug("direction", direction);
|
1304
1320
|
|
1305
1321
|
var sortField = "createdAt";
|
1306
1322
|
if (req.query.sort) {
|
1307
1323
|
sortField = req.query.sort;
|
1308
|
-
}
|
1309
|
-
winston.debug("sortField",sortField);
|
1324
|
+
}
|
1325
|
+
winston.debug("sortField", sortField);
|
1310
1326
|
|
1311
|
-
var sortQuery={};
|
1327
|
+
var sortQuery = {};
|
1312
1328
|
sortQuery[sortField] = direction;
|
1313
1329
|
|
1314
1330
|
winston.debug("sort query", sortQuery);
|
@@ -1321,124 +1337,124 @@ router.get('/csv', function (req, res, next) {
|
|
1321
1337
|
// aggiungi filtro per data marco
|
1322
1338
|
|
1323
1339
|
winston.debug('REQUEST ROUTE - REQUEST FIND ', query)
|
1324
|
-
|
1340
|
+
return Request.find(query, '-transcript -status -__v').
|
1325
1341
|
skip(skip).limit(limit).
|
1326
|
-
|
1327
|
-
|
1328
|
-
|
1329
|
-
|
1330
|
-
|
1331
|
-
|
1332
|
-
|
1333
|
-
|
1334
|
-
|
1335
|
-
|
1336
|
-
|
1337
|
-
|
1338
|
-
|
1339
|
-
|
1340
|
-
|
1341
|
-
|
1342
|
+
//populate('department', {'_id':-1, 'name':1}).
|
1343
|
+
populate('department').
|
1344
|
+
populate('lead').
|
1345
|
+
// populate('participatingBots').
|
1346
|
+
// populate('participatingAgents').
|
1347
|
+
lean().
|
1348
|
+
// populate({
|
1349
|
+
// path: 'department',
|
1350
|
+
// //select: { '_id': -1,'name':1}
|
1351
|
+
// select: {'name':1}
|
1352
|
+
// }).
|
1353
|
+
sort(sortQuery).
|
1354
|
+
exec(function (err, requests) {
|
1355
|
+
if (err) {
|
1356
|
+
winston.error('REQUEST ROUTE - REQUEST FIND ERR ', err)
|
1357
|
+
return res.status(500).send({ success: false, msg: 'Error getting csv requests.', err: err });
|
1358
|
+
}
|
1359
|
+
|
1360
|
+
|
1361
|
+
requests.forEach(function (element) {
|
1362
|
+
|
1363
|
+
var channel_name = "";
|
1364
|
+
if (element.channel && element.channel.name) {
|
1365
|
+
channel_name = element.channel.name;
|
1342
1366
|
}
|
1343
|
-
|
1367
|
+
delete element.channel;
|
1368
|
+
element.channel_name = channel_name;
|
1344
1369
|
|
1345
|
-
|
1370
|
+
var department_name = "";
|
1371
|
+
if (element.department && element.department.name) {
|
1372
|
+
department_name = element.department.name;
|
1373
|
+
}
|
1374
|
+
delete element.department;
|
1375
|
+
element.department_name = department_name;
|
1346
1376
|
|
1347
|
-
|
1348
|
-
|
1349
|
-
|
1350
|
-
|
1351
|
-
|
1352
|
-
element.channel_name = channel_name;
|
1377
|
+
var lead_fullname = "";
|
1378
|
+
if (element.lead && element.lead.fullname) {
|
1379
|
+
lead_fullname = element.lead.fullname
|
1380
|
+
}
|
1381
|
+
element.lead_fullname = lead_fullname;
|
1353
1382
|
|
1354
|
-
var department_name = "";
|
1355
|
-
if (element.department && element.department.name) {
|
1356
|
-
department_name = element.department.name;
|
1357
|
-
}
|
1358
|
-
delete element.department;
|
1359
|
-
element.department_name = department_name;
|
1360
1383
|
|
1361
|
-
|
1362
|
-
|
1363
|
-
|
1364
|
-
|
1365
|
-
element.lead_fullname = lead_fullname;
|
1384
|
+
var lead_email = "";
|
1385
|
+
if (element.lead && element.lead.email) {
|
1386
|
+
lead_email = element.lead.email
|
1387
|
+
}
|
1366
1388
|
|
1389
|
+
element.lead_email = lead_email;
|
1367
1390
|
|
1368
|
-
|
1369
|
-
|
1370
|
-
|
1371
|
-
}
|
1372
|
-
|
1373
|
-
element.lead_email = lead_email;
|
1391
|
+
var tags = [];
|
1392
|
+
var tagsString = "";
|
1393
|
+
if (element.tags && element.tags.length > 0) {
|
1374
1394
|
|
1375
|
-
|
1376
|
-
|
1377
|
-
|
1378
|
-
|
1379
|
-
|
1380
|
-
|
1381
|
-
tags.push(tag.tag);
|
1382
|
-
});
|
1383
|
-
}
|
1384
|
-
tagsString = tags.join(", ")
|
1395
|
+
element.tags.forEach(function (tag) {
|
1396
|
+
// tags = tags + tag.tag + ", ";
|
1397
|
+
tags.push(tag.tag);
|
1398
|
+
});
|
1399
|
+
}
|
1400
|
+
tagsString = tags.join(", ")
|
1385
1401
|
|
1386
|
-
|
1387
|
-
|
1388
|
-
element.tags = tagsString;
|
1402
|
+
winston.debug('tagsString ' + tagsString)
|
1389
1403
|
|
1404
|
+
element.tags = tagsString;
|
1390
1405
|
|
1391
|
-
// var participatingAgents = "";
|
1392
|
-
// if (element.participatingAgents && element.participatingAgents.length>0) {
|
1393
|
-
// element.participatingAgents.forEach(function(agent) {
|
1394
|
-
// participatingAgents = participatingAgents + ", " + agent;
|
1395
|
-
// });
|
1396
|
-
// }
|
1397
|
-
// // da terminare e testare. potrebbe essere troppo lenta la query per tanti record
|
1398
|
-
// element.participatingAgents = participatingAgents;
|
1399
|
-
|
1400
1406
|
|
1407
|
+
// var participatingAgents = "";
|
1408
|
+
// if (element.participatingAgents && element.participatingAgents.length>0) {
|
1409
|
+
// element.participatingAgents.forEach(function(agent) {
|
1410
|
+
// participatingAgents = participatingAgents + ", " + agent;
|
1411
|
+
// });
|
1412
|
+
// }
|
1413
|
+
// // da terminare e testare. potrebbe essere troppo lenta la query per tanti record
|
1414
|
+
// element.participatingAgents = participatingAgents;
|
1401
1415
|
|
1402
|
-
delete element.lead;
|
1403
1416
|
|
1404
|
-
delete element.attributes;
|
1405
1417
|
|
1406
|
-
|
1418
|
+
delete element.lead;
|
1407
1419
|
|
1408
|
-
|
1420
|
+
delete element.attributes;
|
1409
1421
|
|
1410
|
-
|
1422
|
+
delete element.notes;
|
1411
1423
|
|
1412
|
-
|
1424
|
+
// delete element.tags;
|
1413
1425
|
|
1414
|
-
|
1415
|
-
|
1426
|
+
delete element.channelOutbound;
|
1416
1427
|
|
1417
|
-
|
1418
|
-
});
|
1428
|
+
delete element.location;
|
1419
1429
|
|
1420
|
-
|
1430
|
+
delete element.snapshot;
|
1431
|
+
|
1432
|
+
|
1433
|
+
// TODO print also lead. use a library to flattize
|
1434
|
+
});
|
1435
|
+
|
1436
|
+
winston.debug('REQUEST ROUTE - REQUEST AS CSV', requests);
|
1437
|
+
|
1438
|
+
return res.csv(requests, true);
|
1439
|
+
});
|
1440
|
+
|
1441
|
+
// });
|
1421
1442
|
|
1422
|
-
return res.csv(requests, true);
|
1423
|
-
});
|
1424
|
-
|
1425
|
-
// });
|
1426
|
-
|
1427
1443
|
});
|
1428
1444
|
|
1429
1445
|
router.get('/:requestid', function (req, res) {
|
1430
1446
|
|
1431
1447
|
var requestid = req.params.requestid;
|
1432
|
-
winston.debug("get request by id: "+requestid);
|
1448
|
+
winston.debug("get request by id: " + requestid);
|
1449
|
+
|
1433
1450
|
|
1434
|
-
|
1435
|
-
|
1436
|
-
|
1437
|
-
|
1438
|
-
|
1439
|
-
|
1440
|
-
|
1441
|
-
.populate({path:'requester',populate:{path:'id_user'}});
|
1451
|
+
let q = Request.findOne({ request_id: requestid, id_project: req.projectid })
|
1452
|
+
// .select("+snapshot.agents")
|
1453
|
+
.populate('lead')
|
1454
|
+
.populate('department')
|
1455
|
+
.populate('participatingBots')
|
1456
|
+
.populate('participatingAgents')
|
1457
|
+
.populate({ path: 'requester', populate: { path: 'id_user' } });
|
1442
1458
|
|
1443
1459
|
// if (cacheEnabler.request) { cache disabled beacuse cacheoose don't support .populate without lean. here cache is not important
|
1444
1460
|
// q.cache(cacheUtil.defaultTTL, req.projectid+":requests:request_id:"+requestid) //request_cache
|
@@ -1446,7 +1462,7 @@ router.get('/:requestid', function (req, res) {
|
|
1446
1462
|
// }
|
1447
1463
|
//
|
1448
1464
|
// .populate({path:'requester',populate:{path:'id_user', select:{'firstname':1, 'lastname':1}}})
|
1449
|
-
q.exec(function(err, request) {
|
1465
|
+
q.exec(function (err, request) {
|
1450
1466
|
if (err) {
|
1451
1467
|
winston.error("error getting request by id ", err);
|
1452
1468
|
return res.status(500).send({ success: false, msg: 'Error getting object.' });
|