@tiledesk/tiledesk-server 2.2.39 → 2.3.3
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 +24 -0
- package/LICENSE +14 -657
- package/README.md +17 -3
- package/app.js +14 -2
- package/channels/chat21/chat21WebHook.js +12 -1
- package/event/botEvent.js +1 -1
- package/event/subscriptionEvent.js +11 -0
- package/fonts/Roboto-Italic.ttf +0 -0
- package/fonts/Roboto-Medium.ttf +0 -0
- package/fonts/Roboto-MediumItalic.ttf +0 -0
- package/fonts/Roboto-Regular.ttf +0 -0
- package/middleware/passport.js +4 -1
- package/models/lead.js +2 -0
- package/models/request.js +38 -11
- package/models/subscriptionLog.js +34 -0
- package/models/tagLibrary.js +42 -0
- package/package.json +4 -11
- package/pubmodules/activities/activityArchiver.js +295 -0
- package/pubmodules/activities/index.js +3 -0
- package/pubmodules/activities/models/activity.js +88 -0
- package/pubmodules/activities/routes/activity.js +710 -0
- package/pubmodules/activities/test/activityRoute.js +85 -0
- package/pubmodules/analytics/analytics.js +1719 -0
- package/pubmodules/analytics/index.js +3 -0
- package/pubmodules/canned/cannedResponse.js +51 -0
- package/pubmodules/canned/cannedResponseRoute.js +157 -0
- package/pubmodules/canned/index.js +3 -0
- package/pubmodules/emailNotification/requestNotification.js +184 -26
- package/pubmodules/messageActions/messageActionsInterceptor.js +4 -2
- package/pubmodules/pubModulesManager.js +104 -5
- package/pubmodules/scheduler/tasks/closeAgentUnresponsiveRequestTask.js +3 -1
- package/pubmodules/scheduler/tasks/closeBotUnresponsiveRequestTask.js +3 -1
- package/pubmodules/trigger/default.js +271 -0
- package/pubmodules/trigger/event/actionEventEmitter.js +10 -0
- package/pubmodules/trigger/event/flowEventEmitter.js +10 -0
- package/pubmodules/trigger/event/triggerEventEmitter.js +10 -0
- package/pubmodules/trigger/index.js +3 -0
- package/pubmodules/trigger/models/trigger.js +149 -0
- package/pubmodules/trigger/rulesTrigger.js +1181 -0
- package/pubmodules/trigger/start.js +114 -0
- package/pubmodules/trigger/triggerRoute.js +150 -0
- package/routes/department.js +51 -0
- package/routes/group.js +140 -0
- package/routes/lead.js +24 -1
- package/routes/message.js +6 -3
- package/routes/project.js +52 -0
- package/routes/public-request.js +265 -2
- package/routes/request.js +83 -11
- package/routes/subscription.js +140 -0
- package/routes/tag.js +138 -0
- package/routes/user-request.js +3 -2
- package/routes/widget.js +16 -1
- package/routes/widgetLoader.js +31 -0
- package/services/emailService.js +189 -11
- package/services/faqService.js +1 -1
- package/services/leadService.js +2 -0
- package/services/modulesManager.js +7 -188
- package/services/requestService.js +364 -6
- package/services/subscriptionNotifier.js +485 -0
- package/template/email/assignedEmailMessage.html +1 -1
- package/template/email/assignedRequest.html +1 -1
- package/template/email/newMessage.html +1 -1
- package/template/email/newMessageFollower.html +236 -0
- package/template/email/passwordChanged.html +1 -1
- package/template/email/pooledEmailMessage.html +1 -1
- package/template/email/pooledRequest.html +1 -1
- package/template/email/resetPassword.html +2 -2
- package/template/email/ticket.html +1 -1
- package/test/messageRoute.js +69 -0
- package/test/requestService.js +3 -1
- package/views/messages.jade +2 -2
package/routes/public-request.js
CHANGED
|
@@ -3,10 +3,22 @@ var router = express.Router();
|
|
|
3
3
|
var Message = require("../models/message");
|
|
4
4
|
var Request = require("../models/request");
|
|
5
5
|
var User = require("../models/user");
|
|
6
|
-
var Project = require("../models/project");
|
|
7
|
-
var emailService = require("../services/emailService");
|
|
8
6
|
var winston = require('../config/winston');
|
|
9
7
|
|
|
8
|
+
var fonts = {
|
|
9
|
+
Roboto: {
|
|
10
|
+
normal: 'fonts/Roboto-Regular.ttf',
|
|
11
|
+
bold: 'fonts/Roboto-Medium.ttf',
|
|
12
|
+
italics: 'fonts/Roboto-Italic.ttf',
|
|
13
|
+
bolditalics: 'fonts/Roboto-MediumItalic.ttf'
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
var PdfPrinter = require('pdfmake');
|
|
18
|
+
var printer = new PdfPrinter(fonts);
|
|
19
|
+
// var fs = require('fs');
|
|
20
|
+
|
|
21
|
+
|
|
10
22
|
|
|
11
23
|
|
|
12
24
|
|
|
@@ -49,6 +61,126 @@ var winston = require('../config/winston');
|
|
|
49
61
|
});
|
|
50
62
|
|
|
51
63
|
|
|
64
|
+
router.get('/:requestid/messages.csv', function(req, res) {
|
|
65
|
+
|
|
66
|
+
winston.debug(req.params);
|
|
67
|
+
winston.debug("here");
|
|
68
|
+
return Message.find({"recipient": req.params.requestid}).sort({createdAt: 'asc'}).lean().exec(function(err, messages) {
|
|
69
|
+
if (err) {
|
|
70
|
+
return res.status(500).send({success: false, msg: 'Error getting object.'});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if(!messages){
|
|
74
|
+
return res.status(404).send({success: false, msg: 'Object not found.'});
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
messages.forEach(function(element) {
|
|
78
|
+
|
|
79
|
+
var channel_name = "";
|
|
80
|
+
if (element.channel && element.channel.name) {
|
|
81
|
+
channel_name = element.channel.name;
|
|
82
|
+
}
|
|
83
|
+
delete element.channel;
|
|
84
|
+
element.channel_name = channel_name;
|
|
85
|
+
|
|
86
|
+
delete element.attributes;
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
return res.csv(messages, true);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
router.get('/:requestid/messages.txt', function(req, res) {
|
|
96
|
+
|
|
97
|
+
winston.debug(req.params);
|
|
98
|
+
winston.debug("here");
|
|
99
|
+
return Message.find({"recipient": req.params.requestid}).sort({createdAt: 'asc'}).exec(function(err, messages) {
|
|
100
|
+
if (err) {
|
|
101
|
+
return res.status(500).send({success: false, msg: 'Error getting object.'});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if(!messages){
|
|
105
|
+
return res.status(404).send({success: false, msg: 'Object not found.'});
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
var text = "Chat transcript:\n" //+ req.project.name;
|
|
110
|
+
|
|
111
|
+
messages.forEach(function(element) {
|
|
112
|
+
text = text + "[ " + element.createdAt.toLocaleString('en', { timeZone: 'UTC' })+ "] " + element.senderFullname + ": " + element.text + "\n";
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
res.set({"Content-Disposition":"attachment; filename=\"transcript.txt\""});
|
|
117
|
+
res.send(text);
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
router.get('/:requestid/messages.pdf', function(req, res) {
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
winston.debug(req.params);
|
|
128
|
+
winston.debug("here");
|
|
129
|
+
return Message.find({"recipient": req.params.requestid}).sort({createdAt: 'asc'}).exec(function(err, messages) {
|
|
130
|
+
if (err) {
|
|
131
|
+
return res.status(500).send({success: false, msg: 'Error getting object.'});
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
if(!messages){
|
|
136
|
+
return res.status(404).send({success: false, msg: 'Object not found.'});
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
var docDefinition = {
|
|
141
|
+
content: [
|
|
142
|
+
{ text: 'Chat Transcript', style: 'header' },
|
|
143
|
+
{
|
|
144
|
+
ul: [
|
|
145
|
+
// 'item 1',
|
|
146
|
+
// 'item 2',
|
|
147
|
+
// 'item 3'
|
|
148
|
+
]
|
|
149
|
+
},
|
|
150
|
+
|
|
151
|
+
],
|
|
152
|
+
styles: {
|
|
153
|
+
header: {
|
|
154
|
+
bold: true,
|
|
155
|
+
fontSize: 15
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
defaultStyle: {
|
|
159
|
+
fontSize: 12
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
messages.forEach(function(element) {
|
|
166
|
+
docDefinition.content[1].ul.push("[ " + element.createdAt.toLocaleString('en', { timeZone: 'UTC' })+ "] " + element.senderFullname + ": " + element.text );
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
console.log(docDefinition);
|
|
170
|
+
|
|
171
|
+
var pdfDoc = printer.createPdfKitDocument(docDefinition);
|
|
172
|
+
// pdfDoc.pipe(fs.createWriteStream('lists.pdf'));
|
|
173
|
+
pdfDoc.pipe(res);
|
|
174
|
+
pdfDoc.end();
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
|
|
52
184
|
router.get('/:requestid/messages-user.html', function(req, res) {
|
|
53
185
|
|
|
54
186
|
winston.debug(req.params);
|
|
@@ -60,6 +192,7 @@ var winston = require('../config/winston');
|
|
|
60
192
|
|
|
61
193
|
var messages = messages.filter(m => m.sender != "system" );
|
|
62
194
|
|
|
195
|
+
|
|
63
196
|
//skip info message
|
|
64
197
|
if(!messages){
|
|
65
198
|
return res.status(404).send({success: false, msg: 'Object not found.'});
|
|
@@ -70,4 +203,134 @@ var winston = require('../config/winston');
|
|
|
70
203
|
|
|
71
204
|
});
|
|
72
205
|
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
router.get('/:requestid/messages-user.txt', function(req, res) {
|
|
209
|
+
|
|
210
|
+
winston.debug(req.params);
|
|
211
|
+
winston.debug("here");
|
|
212
|
+
return Message.find({"recipient": req.params.requestid}).sort({createdAt: 'asc'}).exec(function(err, messages) {
|
|
213
|
+
if (err) {
|
|
214
|
+
return res.status(500).send({success: false, msg: 'Error getting object.'});
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
if(!messages){
|
|
218
|
+
return res.status(404).send({success: false, msg: 'Object not found.'});
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
var messages = messages.filter(m => m.sender != "system" );
|
|
223
|
+
|
|
224
|
+
var text = "Chat transcript:\n" //+ req.project.name;
|
|
225
|
+
|
|
226
|
+
messages.forEach(function(element) {
|
|
227
|
+
text = text + "[ " + element.createdAt.toLocaleString('en', { timeZone: 'UTC' })+ "] " + element.senderFullname + ": " + element.text + "\n";
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
res.set({"Content-Disposition":"attachment; filename=\"transcript.txt\""});
|
|
232
|
+
res.send(text);
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
router.get('/:requestid/messages-user.pdf', function(req, res) {
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
winston.debug(req.params);
|
|
242
|
+
winston.debug("here");
|
|
243
|
+
return Message.find({"recipient": req.params.requestid}).sort({createdAt: 'asc'}).exec(function(err, messages) {
|
|
244
|
+
if (err) {
|
|
245
|
+
return res.status(500).send({success: false, msg: 'Error getting object.'});
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
var messages = messages.filter(m => m.sender != "system" );
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
//skip info message
|
|
252
|
+
if(!messages){
|
|
253
|
+
return res.status(404).send({success: false, msg: 'Object not found.'});
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
var docDefinition = {
|
|
258
|
+
content: [
|
|
259
|
+
{ text: 'Chat Transcript', style: 'header' },
|
|
260
|
+
{
|
|
261
|
+
ul: [
|
|
262
|
+
// 'item 1',
|
|
263
|
+
// 'item 2',
|
|
264
|
+
// 'item 3'
|
|
265
|
+
]
|
|
266
|
+
},
|
|
267
|
+
|
|
268
|
+
],
|
|
269
|
+
styles: {
|
|
270
|
+
header: {
|
|
271
|
+
bold: true,
|
|
272
|
+
fontSize: 15
|
|
273
|
+
}
|
|
274
|
+
},
|
|
275
|
+
defaultStyle: {
|
|
276
|
+
fontSize: 12
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
messages.forEach(function(element) {
|
|
283
|
+
docDefinition.content[1].ul.push("[ " + element.createdAt.toLocaleString('en', { timeZone: 'UTC' })+ "] " + element.senderFullname + ": " + element.text );
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
console.log(docDefinition);
|
|
287
|
+
|
|
288
|
+
var pdfDoc = printer.createPdfKitDocument(docDefinition);
|
|
289
|
+
// pdfDoc.pipe(fs.createWriteStream('lists.pdf'));
|
|
290
|
+
pdfDoc.pipe(res);
|
|
291
|
+
pdfDoc.end();
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
router.get('/:requestid/messages-user.csv', function(req, res) {
|
|
301
|
+
|
|
302
|
+
winston.debug(req.params);
|
|
303
|
+
winston.debug("here");
|
|
304
|
+
return Message.find({"recipient": req.params.requestid}).sort({createdAt: 'asc'}).lean().exec(function(err, messages) {
|
|
305
|
+
if (err) {
|
|
306
|
+
return res.status(500).send({success: false, msg: 'Error getting object.'});
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
var messages = messages.filter(m => m.sender != "system" );
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
//skip info message
|
|
313
|
+
if(!messages){
|
|
314
|
+
return res.status(404).send({success: false, msg: 'Object not found.'});
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
messages.forEach(function(element) {
|
|
319
|
+
|
|
320
|
+
var channel_name = "";
|
|
321
|
+
if (element.channel && element.channel.name) {
|
|
322
|
+
channel_name = element.channel.name;
|
|
323
|
+
}
|
|
324
|
+
delete element.channel;
|
|
325
|
+
element.channel_name = channel_name;
|
|
326
|
+
|
|
327
|
+
delete element.attributes;
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
return res.csv(messages, true);
|
|
332
|
+
});
|
|
333
|
+
|
|
334
|
+
});
|
|
335
|
+
|
|
73
336
|
module.exports = router;
|
package/routes/request.js
CHANGED
|
@@ -196,8 +196,9 @@ router.patch('/:requestid', function (req, res) {
|
|
|
196
196
|
router.put('/:requestid/close', function (req, res) {
|
|
197
197
|
winston.debug(req.body);
|
|
198
198
|
|
|
199
|
-
// closeRequestByRequestId(request_id, id_project)
|
|
200
|
-
|
|
199
|
+
// closeRequestByRequestId(request_id, id_project, skipStatsUpdate, notify, closed_by)
|
|
200
|
+
const closed_by = req.user.id;
|
|
201
|
+
return requestService.closeRequestByRequestId(req.params.requestid, req.projectid, false, true, closed_by).then(function(closedRequest) {
|
|
201
202
|
|
|
202
203
|
winston.verbose("request closed", closedRequest);
|
|
203
204
|
|
|
@@ -518,6 +519,72 @@ router.delete('/:requestid/notes/:noteid', function (req, res) {
|
|
|
518
519
|
|
|
519
520
|
});
|
|
520
521
|
|
|
522
|
+
|
|
523
|
+
|
|
524
|
+
|
|
525
|
+
|
|
526
|
+
|
|
527
|
+
router.post('/:requestid/followers',
|
|
528
|
+
[
|
|
529
|
+
check('member').notEmpty(),
|
|
530
|
+
],
|
|
531
|
+
function (req, res) {
|
|
532
|
+
winston.info("followers add", req.body);
|
|
533
|
+
|
|
534
|
+
const errors = validationResult(req);
|
|
535
|
+
if (!errors.isEmpty()) {
|
|
536
|
+
return res.status(422).json({ errors: errors.array() });
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
//addParticipantByRequestId(request_id, id_project, member)
|
|
540
|
+
return requestService.addFollowerByRequestId(req.params.requestid, req.projectid, req.body.member ).then(function(updatedRequest) {
|
|
541
|
+
|
|
542
|
+
winston.verbose("participant added", updatedRequest);
|
|
543
|
+
|
|
544
|
+
return res.json(updatedRequest);
|
|
545
|
+
});
|
|
546
|
+
|
|
547
|
+
});
|
|
548
|
+
|
|
549
|
+
|
|
550
|
+
router.put('/:requestid/followers', function (req, res) {
|
|
551
|
+
winston.debug("req.body", req.body);
|
|
552
|
+
|
|
553
|
+
var followers = [];
|
|
554
|
+
req.body.forEach(function(follower,index) {
|
|
555
|
+
followers.push(follower);
|
|
556
|
+
});
|
|
557
|
+
winston.debug("var followers", followers);
|
|
558
|
+
|
|
559
|
+
// setFollowersByRequestId(request_id, id_project, newfollowers)
|
|
560
|
+
return requestService.setFollowersByRequestId(req.params.requestid, req.projectid, followers ).then(function(updatedRequest) {
|
|
561
|
+
|
|
562
|
+
winston.debug("followers set", updatedRequest);
|
|
563
|
+
|
|
564
|
+
return res.json(updatedRequest);
|
|
565
|
+
});
|
|
566
|
+
|
|
567
|
+
});
|
|
568
|
+
|
|
569
|
+
router.delete('/:requestid/followers/:followerid', function (req, res) {
|
|
570
|
+
winston.debug(req.body);
|
|
571
|
+
|
|
572
|
+
//removeFollowerByRequestId(request_id, id_project, member)
|
|
573
|
+
return requestService.removeFollowerByRequestId(req.params.requestid, req.projectid, req.params.followerid ).then(function(updatedRequest) {
|
|
574
|
+
|
|
575
|
+
winston.verbose("follower removed", updatedRequest);
|
|
576
|
+
|
|
577
|
+
return res.json(updatedRequest);
|
|
578
|
+
});
|
|
579
|
+
|
|
580
|
+
|
|
581
|
+
});
|
|
582
|
+
|
|
583
|
+
|
|
584
|
+
|
|
585
|
+
|
|
586
|
+
|
|
587
|
+
|
|
521
588
|
// TODO make a synchronous chat21 version (with query parameter?) with request.support_group.created
|
|
522
589
|
router.delete('/:requestid', function (req, res) {
|
|
523
590
|
|
|
@@ -709,6 +776,7 @@ router.get('/', function (req, res, next) {
|
|
|
709
776
|
* THE SEARCH FOR DATE INTERVAL OF THE HISTORY OF REQUESTS ARE DISABLED AND
|
|
710
777
|
* ARE DISPLAYED ONLY THE REQUESTS OF THE LAST 14 DAYS
|
|
711
778
|
*/
|
|
779
|
+
//secondo me qui manca un parentesi tonda per gli or
|
|
712
780
|
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)) {
|
|
713
781
|
|
|
714
782
|
|
|
@@ -813,7 +881,14 @@ router.get('/', function (req, res, next) {
|
|
|
813
881
|
}
|
|
814
882
|
|
|
815
883
|
if (req.query.channel) {
|
|
816
|
-
|
|
884
|
+
if (req.query.channel === "offline") {
|
|
885
|
+
query["channel.name"] = {"$in" : ["email", "form"]}
|
|
886
|
+
} else if (req.query.channel === "online") {
|
|
887
|
+
query["channel.name"] = {"$nin" : ["email", "form"]}
|
|
888
|
+
} else {
|
|
889
|
+
query["channel.name"] = req.query.channel
|
|
890
|
+
}
|
|
891
|
+
|
|
817
892
|
winston.debug('REQUEST ROUTE - QUERY channel', query.channel);
|
|
818
893
|
}
|
|
819
894
|
|
|
@@ -901,6 +976,7 @@ router.get('/', function (req, res, next) {
|
|
|
901
976
|
count: results[1],
|
|
902
977
|
requests: results[0]
|
|
903
978
|
};
|
|
979
|
+
winston.debug('REQUEST ROUTE - objectToReturn ');
|
|
904
980
|
winston.debug('REQUEST ROUTE - objectToReturn ', objectToReturn);
|
|
905
981
|
return res.json(objectToReturn);
|
|
906
982
|
|
|
@@ -1025,7 +1101,11 @@ router.get('/csv', function (req, res, next) {
|
|
|
1025
1101
|
winston.debug("sort query", sortQuery);
|
|
1026
1102
|
|
|
1027
1103
|
|
|
1104
|
+
// TODO ORDER BY SCORE
|
|
1105
|
+
// return Faq.find(query, {score: { $meta: "textScore" } })
|
|
1106
|
+
// .sort( { score: { $meta: "textScore" } } ) //https://docs.mongodb.com/manual/reference/operator/query/text/#sort-by-text-search-score
|
|
1028
1107
|
|
|
1108
|
+
// aggiungi filtro per data marco
|
|
1029
1109
|
|
|
1030
1110
|
winston.debug('REQUEST ROUTE - REQUEST FIND ', query)
|
|
1031
1111
|
return Request.find(query, '-transcript -status -__v').
|
|
@@ -1126,14 +1206,6 @@ router.get('/csv', function (req, res, next) {
|
|
|
1126
1206
|
|
|
1127
1207
|
winston.debug('REQUEST ROUTE - REQUEST AS CSV', requests);
|
|
1128
1208
|
|
|
1129
|
-
// return Request.count(query, function(err, totalRowCount) {
|
|
1130
|
-
|
|
1131
|
-
// var objectToReturn = {
|
|
1132
|
-
// perPage: limit,
|
|
1133
|
-
// count: totalRowCount,
|
|
1134
|
-
// requests : requests
|
|
1135
|
-
// };
|
|
1136
|
-
// console.log('REQUEST ROUTE - objectToReturn ', objectToReturn);
|
|
1137
1209
|
return res.csv(requests, true);
|
|
1138
1210
|
});
|
|
1139
1211
|
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
var express = require('express');
|
|
2
|
+
var router = express.Router();
|
|
3
|
+
var Subscription = require("../models/subscription");
|
|
4
|
+
var SubscriptionLog = require("../models/subscriptionLog");
|
|
5
|
+
var subscriptionEvent = require("../event/subscriptionEvent");
|
|
6
|
+
var winston = require('../config/winston');
|
|
7
|
+
|
|
8
|
+
//space
|
|
9
|
+
|
|
10
|
+
router.post('/', function (req, res) {
|
|
11
|
+
|
|
12
|
+
winston.debug(req.body);
|
|
13
|
+
winston.debug("req.user", req.user);
|
|
14
|
+
|
|
15
|
+
var subscription = new Subscription({
|
|
16
|
+
target: req.body.target,
|
|
17
|
+
event: req.body.event,
|
|
18
|
+
id_project: req.projectid,
|
|
19
|
+
createdBy: req.user.id
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
subscription.save(function (err, subscriptionSaved) {
|
|
23
|
+
if (err) {
|
|
24
|
+
if (err.code === 11000) { //error for dupes
|
|
25
|
+
return Subscription.findOne({id_project:req.projectid, event: req.body.event}).select("+secret")
|
|
26
|
+
.exec(function (err, subscriptionSaved) {
|
|
27
|
+
res.setHeader('x-hook-secret', subscriptionSaved.secret);
|
|
28
|
+
res.json(subscriptionSaved);
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
winston.error('--- > ERROR ', err)
|
|
32
|
+
return res.status(500).send({ success: false, msg: 'Error saving object.' });
|
|
33
|
+
}
|
|
34
|
+
// http://resthooks.org/docs/security/
|
|
35
|
+
|
|
36
|
+
res.setHeader('x-hook-secret', subscriptionSaved.secret);
|
|
37
|
+
|
|
38
|
+
subscriptionEvent.emit('subscription.create', subscriptionSaved );
|
|
39
|
+
res.json(subscriptionSaved);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
router.post('/test', function (req, res) {
|
|
45
|
+
|
|
46
|
+
winston.debug("test subscription body", req.body);
|
|
47
|
+
|
|
48
|
+
res.json(req);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
router.put('/:subscriptionid', function (req, res) {
|
|
52
|
+
|
|
53
|
+
winston.debug(req.body);
|
|
54
|
+
|
|
55
|
+
Subscription.findByIdAndUpdate(req.params.subscriptionid, req.body, { new: true, upsert: true }, function (err, subscriptionUpd) {
|
|
56
|
+
if (err) {
|
|
57
|
+
return res.status(500).send({ success: false, msg: 'Error updating object.' });
|
|
58
|
+
}
|
|
59
|
+
subscriptionEvent.emit('subscription.update', subscriptionUpd );
|
|
60
|
+
res.json(subscriptionUpd);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
router.delete('/:subscriptionid', function (req, res) {
|
|
66
|
+
|
|
67
|
+
winston.debug(req.body);
|
|
68
|
+
|
|
69
|
+
Subscription.remove({ _id: req.params.subscriptionid }, function (err, subscriptionUpd) {
|
|
70
|
+
if (err) {
|
|
71
|
+
return res.status(500).send({ success: false, msg: 'Error deleting object.' });
|
|
72
|
+
}
|
|
73
|
+
subscriptionEvent.emit('subscription.delete', subscriptionUpd );
|
|
74
|
+
res.json(subscriptionUpd);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
router.get('/', function (req, res) {
|
|
82
|
+
|
|
83
|
+
return Subscription.find({ "id_project": req.projectid }).
|
|
84
|
+
exec(function (err, subscriptions, next) {
|
|
85
|
+
if (err) {
|
|
86
|
+
winston.error('Subscription ROUTE - REQUEST FIND ERR ', err)
|
|
87
|
+
return next(err);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return res.json(subscriptions);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
router.get('/history', function (req, res) {
|
|
96
|
+
|
|
97
|
+
var limit = 40; // Number of leads per page
|
|
98
|
+
var page = 0;
|
|
99
|
+
|
|
100
|
+
if (req.query.page) {
|
|
101
|
+
page = req.query.page;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
var skip = page * limit;
|
|
105
|
+
winston.debug('Subscription ROUTE - SKIP PAGE ', skip);
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
return SubscriptionLog.find({ "id_project": req.projectid }).
|
|
109
|
+
skip(skip).limit(limit)
|
|
110
|
+
.sort({createdAt: 'desc'}).
|
|
111
|
+
exec(function (err, subscriptions, next) {
|
|
112
|
+
if (err) {
|
|
113
|
+
winston.error('Subscription ROUTE - REQUEST FIND ERR ', err)
|
|
114
|
+
return next(err);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return res.json(subscriptions);
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
router.get('/:subscriptionid', function (req, res) {
|
|
124
|
+
|
|
125
|
+
winston.debug(req.body);
|
|
126
|
+
|
|
127
|
+
Subscription.findById(req.params.subscriptionid, function (err, subscriptionUpd) {
|
|
128
|
+
if (err) {
|
|
129
|
+
return res.status(500).send({ success: false, msg: 'Error getting object.' });
|
|
130
|
+
}
|
|
131
|
+
if (!subscriptionUpd) {
|
|
132
|
+
return res.status(404).send({ success: false, msg: 'Object not found.' });
|
|
133
|
+
}
|
|
134
|
+
res.json(subscriptionUpd);
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
module.exports = router;
|
package/routes/tag.js
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
var express = require('express');
|
|
2
|
+
var router = express.Router();
|
|
3
|
+
var TagLibrary = require("../models/tagLibrary");
|
|
4
|
+
var winston = require('../config/winston');
|
|
5
|
+
|
|
6
|
+
router.post('/', function (req, res) {
|
|
7
|
+
|
|
8
|
+
winston.debug(req.body);
|
|
9
|
+
winston.debug("req.user", req.user);
|
|
10
|
+
|
|
11
|
+
var newTag = new TagLibrary({
|
|
12
|
+
tag: req.body.tag,
|
|
13
|
+
color: req.body.color,
|
|
14
|
+
id_project: req.projectid,
|
|
15
|
+
createdBy: req.user.id,
|
|
16
|
+
updatedBy: req.user.id
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
newTag.save(function (err, savedTag) {
|
|
20
|
+
if (err) {
|
|
21
|
+
// winston.error('--- > ERROR ', err)
|
|
22
|
+
if (err.code === 11000) { //error for dupes
|
|
23
|
+
return TagLibrary.findOne({id_project:req.projectid, tag: req.body.tag },function (err, savedTag) {
|
|
24
|
+
res.json(savedTag);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
winston.error('--- > ERROR ', err)
|
|
28
|
+
return res.status(500).send({ success: false, msg: 'Error saving object.' });
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
res.json(savedTag);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
router.put('/:tagid', function (req, res) {
|
|
36
|
+
winston.debug(req.body);
|
|
37
|
+
var update = {};
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
update.tag = req.body.tag;
|
|
41
|
+
update.color = req.body.color;
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
TagLibrary.findByIdAndUpdate(req.params.tagid, update, { new: true, upsert: true }, function (err, updatedTag) {
|
|
45
|
+
if (err) {
|
|
46
|
+
winston.error('--- > ERROR ', err);
|
|
47
|
+
return res.status(500).send({ success: false, msg: 'Error updating object.' });
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
// TagEvent.emit('Tag.update', updatedTag);
|
|
53
|
+
res.json(updatedTag);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
router.delete('/:tagid', function (req, res) {
|
|
58
|
+
winston.debug(req.body);
|
|
59
|
+
|
|
60
|
+
TagLibrary.remove({ _id: req.params.tagid }, function (err, tag) {
|
|
61
|
+
if (err) {
|
|
62
|
+
winston.error('--- > ERROR ', err);
|
|
63
|
+
return res.status(500).send({ success: false, msg: 'Error deleting object.' });
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
// TagEvent.emit('Tag.delete', Tag);
|
|
68
|
+
|
|
69
|
+
res.json(tag);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
router.get('/:tagid', function (req, res) {
|
|
74
|
+
winston.debug(req.body);
|
|
75
|
+
|
|
76
|
+
TagLibrary.findById(req.params.tagid, function (err, tag) {
|
|
77
|
+
if (err) {
|
|
78
|
+
return res.status(500).send({ success: false, msg: 'Error getting object.' });
|
|
79
|
+
}
|
|
80
|
+
if (!tag) {
|
|
81
|
+
return res.status(404).send({ success: false, msg: 'Object not found.' });
|
|
82
|
+
}
|
|
83
|
+
res.json(tag);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
router.get('/', function (req, res) {
|
|
88
|
+
var limit = 40; // Number of Tags per page
|
|
89
|
+
var page = 0;
|
|
90
|
+
|
|
91
|
+
if (req.query.page) {
|
|
92
|
+
page = req.query.page;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
var skip = page * limit;
|
|
96
|
+
winston.debug('Tag ROUTE - SKIP PAGE ', skip);
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
var query = { "id_project": req.projectid};
|
|
100
|
+
|
|
101
|
+
// if (req.query.full_text) {
|
|
102
|
+
// winston.debug('Tag ROUTE req.query.fulltext', req.query.full_text);
|
|
103
|
+
// query.$text = { "$search": req.query.full_text };
|
|
104
|
+
// }
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
var direction = -1; //-1 descending , 1 ascending
|
|
108
|
+
if (req.query.direction) {
|
|
109
|
+
direction = req.query.direction;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
var sortField = "createdAt";
|
|
113
|
+
if (req.query.sort) {
|
|
114
|
+
sortField = req.query.sort;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
var sortQuery = {};
|
|
118
|
+
sortQuery[sortField] = direction;
|
|
119
|
+
|
|
120
|
+
winston.debug("sort query", sortQuery);
|
|
121
|
+
|
|
122
|
+
return TagLibrary.find(query).
|
|
123
|
+
skip(skip).limit(limit).
|
|
124
|
+
sort(sortQuery).
|
|
125
|
+
exec(function (err, tags) {
|
|
126
|
+
if (err) {
|
|
127
|
+
winston.error('Tag ROUTE - REQUEST FIND ERR ', err)
|
|
128
|
+
return (err);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return res.json(tags);
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
module.exports = router;
|