@tiledesk/tiledesk-server 2.3.1 → 2.3.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
 
@@ -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
 
@@ -59,8 +59,9 @@ router.patch('/:requestid/rating', function (req, res) {
59
59
  router.put('/:requestid/closeg', function (req, res) {
60
60
  winston.debug(req.body);
61
61
 
62
- // closeRequestByRequestId(request_id, id_project)
63
- return requestService.closeRequestByRequestId(req.params.requestid, req.projectid).then(function(closedRequest) {
62
+ // closeRequestByRequestId(request_id, id_project, skipStatsUpdate, notify, closed_by)
63
+ const closed_by = req.user.id;
64
+ return requestService.closeRequestByRequestId(req.params.requestid, req.projectid, false, true, closed_by).then(function(closedRequest) {
64
65
 
65
66
  winston.verbose("request closed", closedRequest);
66
67
 
package/routes/widget.js CHANGED
@@ -96,6 +96,7 @@ router.get('/', function(req, res, next) {
96
96
  winston.debug("req.project:" + JSON.stringify(req.project));
97
97
 
98
98
  if (req.project) {
99
+ //secondo me qui manca un parentesi tonda per gli or
99
100
  if (req.project.profile && (req.project.profile.type === 'free' && req.project.trialExpired === true) || (req.project.profile.type === 'payment' && req.project.isActiveSubscription === false)) {
100
101
  query.default = true;
101
102
  }
@@ -129,7 +130,21 @@ router.get('/', function(req, res, next) {
129
130
  return reject({err: "Project Not Found"});
130
131
  }
131
132
 
132
- if (project && project.profile && (project.profile.type === 'free' && project.trialExpired === true) || (project.profile.type === 'payment' && project.isActiveSubscription === false)) {
133
+
134
+ winston.debug("project", project);
135
+
136
+ // ProjectSetter project not found with id: 62d8cf8b2b10b30013bb9b99
137
+ // Informazioni
138
+ // 2022-07-27 14:32:14.772 CESTerror: Error getting widget. {"err":"Project Not Found"}
139
+ // Informazioni
140
+ // 2022-07-27 14:32:14.778 CESTerror: uncaughtException: Cannot read property 'profile' of null
141
+ // Informazioni
142
+ // 2022-07-27 14:32:14.778 CESTTypeError: Cannot read property 'profile' of null at /usr/src/app/routes/widget.js:132:124 at /usr/src/app/node_modules/mongoose/lib/model.js:5074:18 at processTicksAndRejections (internal/process/task_queues.js:79:11) {"date":"Wed Jul 27 2022 12:32:14 GMT+0000 (Coordinated Universal Time)","error":{},"exception":true,"os":{"loadavg":[0.26,0.51,0.58],"uptime":1028128},"process":{"argv":["/usr/local/bin/node","/usr/src/app/bin/www"],"cwd":"/usr/src/app","execPath":"/usr/local/bin/node","gid":0,"memoryUsage":{"arrayBuffers":128833077,"external":130521753,"heapTotal":110641152,"heapUsed":85605912,"rss":310054912},"pid":26,"uid":0,"version":"v12.22.12"},"stack":"TypeError: Cannot read property 'profile' of null\n at /usr/src/app/routes/widget.js:132:124\n at /usr/src/app/node_modules/mongoose/lib/model.js:5074:18\n at processTicksAndRejections (internal/process/task_queues.js:79:11)","trace":[{"column":124,"file":"/usr/src/app/routes/widget.js","function":null,"line":132,"method":null,"native":false},{"column":18,"file":"/usr/src/app/node_modules/mongoose/lib/model.js","function":null,"line":5074,"method":null,"native":false},{"column":11,"file":"internal/process/task_queues.js","function":"processTicksAndRejections","line":79,"method":null,"native":false}]}
143
+
144
+ // console.log("project!=null",project!=null);
145
+ // console.log("project.profile",project.profile);
146
+ //secondo me qui manca un parentesi tonda per gli or
147
+ if (project && project.profile && ((project.profile.type === 'free' && project.trialExpired === true) || (project.profile.type === 'payment' && project.isActiveSubscription === false))) {
133
148
  winston.debug('getProject remove poweredBy tag', project);
134
149
  project.widget.poweredBy = undefined;
135
150
  project.widget.baloonImage = undefined;
@@ -12,9 +12,40 @@ router.get('/load', function(req, res) {
12
12
  winston.debug(query);
13
13
  // TODO chech if query is null
14
14
  res.redirect(widgetLocation+'?'+query);
15
+
15
16
  });
16
17
 
17
18
 
19
+ router.get('/v5/:project_id', function(req, res) {
20
+
21
+ var project_id = req.params.project_id;
22
+ winston.debug("project_id: " + project_id);
23
+
24
+ res.type('.js');
25
+
26
+ var js = `
27
+ window.tiledeskSettings=
28
+ {
29
+ projectid: "${project_id}"
30
+ };
31
+ (function(d, s, id) {
32
+ var w=window; var d=document; var i=function(){i.c(arguments);};
33
+ i.q=[]; i.c=function(args){i.q.push(args);}; w.Tiledesk=i;
34
+ var js, fjs=d.getElementsByTagName(s)[0];
35
+ if (d.getElementById(id)) return;
36
+ js=d.createElement(s);
37
+ js.id=id; js.async=true; js.src="${widgetLocation}/launch.js";
38
+ fjs.parentNode.insertBefore(js, fjs);
39
+ }(document,'script','tiledesk-jssdk'));
40
+ `;
41
+
42
+ winston.debug("js: " + js);
43
+
44
+ res.send(js);
45
+
46
+ });
47
+
48
+
18
49
  var widgetTestLocation = process.env.WIDGET_TEST_LOCATION || widgetConfig.testLocation;
19
50
 
20
51
  router.get('/test/load', function(req, res) {