@tiledesk/tiledesk-server 2.3.1 → 2.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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) {