@tiledesk/tiledesk-server 2.2.38 → 2.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/LICENSE +14 -657
  3. package/README.md +36 -21
  4. package/app.js +29 -5
  5. package/channels/chat21/chat21WebHook.js +12 -1
  6. package/config/labels/widget.json +320 -0
  7. package/event/botEvent.js +1 -1
  8. package/event/subscriptionEvent.js +11 -0
  9. package/fonts/Roboto-Italic.ttf +0 -0
  10. package/fonts/Roboto-Medium.ttf +0 -0
  11. package/fonts/Roboto-MediumItalic.ttf +0 -0
  12. package/fonts/Roboto-Regular.ttf +0 -0
  13. package/middleware/passport.js +4 -1
  14. package/models/lead.js +2 -0
  15. package/models/request.js +38 -11
  16. package/models/subscriptionLog.js +34 -0
  17. package/models/tagLibrary.js +42 -0
  18. package/package.json +4 -10
  19. package/pubmodules/activities/activityArchiver.js +295 -0
  20. package/pubmodules/activities/index.js +3 -0
  21. package/pubmodules/activities/models/activity.js +88 -0
  22. package/pubmodules/activities/routes/activity.js +710 -0
  23. package/pubmodules/activities/test/activityRoute.js +85 -0
  24. package/pubmodules/analytics/analytics.js +1719 -0
  25. package/pubmodules/analytics/index.js +3 -0
  26. package/pubmodules/canned/cannedResponse.js +51 -0
  27. package/pubmodules/canned/cannedResponseRoute.js +157 -0
  28. package/pubmodules/canned/index.js +3 -0
  29. package/pubmodules/messageActions/messageActionsInterceptor.js +4 -2
  30. package/pubmodules/pubModulesManager.js +115 -7
  31. package/pubmodules/rasa/index.js +8 -1
  32. package/pubmodules/rasa/listener.js +28 -7
  33. package/pubmodules/scheduler/tasks/closeAgentUnresponsiveRequestTask.js +3 -1
  34. package/pubmodules/scheduler/tasks/closeBotUnresponsiveRequestTask.js +5 -3
  35. package/pubmodules/trigger/default.js +271 -0
  36. package/pubmodules/trigger/event/actionEventEmitter.js +10 -0
  37. package/pubmodules/trigger/event/flowEventEmitter.js +10 -0
  38. package/pubmodules/trigger/event/triggerEventEmitter.js +10 -0
  39. package/pubmodules/trigger/index.js +3 -0
  40. package/pubmodules/trigger/models/trigger.js +149 -0
  41. package/pubmodules/trigger/rulesTrigger.js +1181 -0
  42. package/pubmodules/trigger/start.js +114 -0
  43. package/pubmodules/trigger/triggerRoute.js +150 -0
  44. package/routes/department.js +51 -0
  45. package/routes/group.js +140 -0
  46. package/routes/lead.js +24 -1
  47. package/routes/message.js +6 -3
  48. package/routes/project.js +52 -0
  49. package/routes/public-request.js +265 -2
  50. package/routes/request.js +86 -13
  51. package/routes/subscription.js +140 -0
  52. package/routes/tag.js +138 -0
  53. package/routes/user-request.js +3 -2
  54. package/routes/widget.js +16 -1
  55. package/routes/widgetLoader.js +31 -0
  56. package/services/faqBotHandler.js +2 -2
  57. package/services/faqBotSupport.js +0 -1
  58. package/services/faqService.js +1 -1
  59. package/services/modulesManager.js +16 -182
  60. package/services/requestService.js +364 -6
  61. package/services/subscriptionNotifier.js +485 -0
  62. package/template/email/assignedEmailMessage.html +1 -1
  63. package/template/email/assignedRequest.html +1 -1
  64. package/template/email/newMessage.html +1 -1
  65. package/template/email/passwordChanged.html +1 -1
  66. package/template/email/pooledEmailMessage.html +1 -1
  67. package/template/email/pooledRequest.html +1 -1
  68. package/template/email/resetPassword.html +2 -2
  69. package/template/email/ticket.html +1 -1
  70. package/test/messageRoute.js +69 -0
  71. package/test/requestService.js +3 -1
  72. package/views/messages.jade +1 -1
@@ -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
- return requestService.closeRequestByRequestId(req.params.requestid, req.projectid).then(function(closedRequest) {
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
- query["channel.name"] = req.query.channel
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
 
@@ -840,7 +915,7 @@ router.get('/', function (req, res, next) {
840
915
  var projection = undefined;
841
916
 
842
917
  if (req.query.full_text) {
843
- winston.info('fulltext projection');
918
+ winston.debug('fulltext projection');
844
919
 
845
920
  projection = {score: { $meta: "textScore" } };
846
921
  }
@@ -873,7 +948,7 @@ router.get('/', function (req, res, next) {
873
948
  // }
874
949
 
875
950
  if (req.query.full_text) {
876
- winston.info('fulltext sort');
951
+ winston.debug('fulltext sort');
877
952
  q1.sort( { score: { $meta: "textScore" } } ) //https://docs.mongodb.com/manual/reference/operator/query/text/#sort-by-text-search-score
878
953
  } else {
879
954
  q1.sort(sortQuery);
@@ -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,6 +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
1107
+
1108
+ // aggiungi filtro per data marco
1028
1109
 
1029
1110
  winston.debug('REQUEST ROUTE - REQUEST FIND ', query)
1030
1111
  return Request.find(query, '-transcript -status -__v').
@@ -1125,14 +1206,6 @@ router.get('/csv', function (req, res, next) {
1125
1206
 
1126
1207
  winston.debug('REQUEST ROUTE - REQUEST AS CSV', requests);
1127
1208
 
1128
- // return Request.count(query, function(err, totalRowCount) {
1129
-
1130
- // var objectToReturn = {
1131
- // perPage: limit,
1132
- // count: totalRowCount,
1133
- // requests : requests
1134
- // };
1135
- // console.log('REQUEST ROUTE - objectToReturn ', objectToReturn);
1136
1209
  return res.csv(requests, true);
1137
1210
  });
1138
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;