@tiledesk/tiledesk-server 2.2.39 → 2.3.1-8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. package/CHANGELOG.md +121 -0
  2. package/LICENSE +14 -657
  3. package/README.md +17 -3
  4. package/app.js +21 -60
  5. package/channels/chat21/chat21Handler.js +18 -3
  6. package/channels/chat21/chat21WebHook.js +31 -15
  7. package/channels/chat21/package-lock.json +663 -706
  8. package/channels/chat21/package.json +2 -2
  9. package/deploy.sh +2 -0
  10. package/event/botEvent.js +1 -1
  11. package/event/subscriptionEvent.js +11 -0
  12. package/fonts/Roboto-Italic.ttf +0 -0
  13. package/fonts/Roboto-Medium.ttf +0 -0
  14. package/fonts/Roboto-MediumItalic.ttf +0 -0
  15. package/fonts/Roboto-Regular.ttf +0 -0
  16. package/middleware/ipFilter.js +220 -0
  17. package/middleware/passport.js +11 -2
  18. package/models/lead.js +2 -0
  19. package/models/project.js +10 -0
  20. package/models/project_user.js +4 -0
  21. package/models/request.js +50 -12
  22. package/models/subscriptionLog.js +34 -0
  23. package/models/tagLibrary.js +42 -0
  24. package/package.json +6 -12
  25. package/pubmodules/activities/activityArchiver.js +314 -0
  26. package/pubmodules/activities/index.js +3 -0
  27. package/pubmodules/activities/models/activity.js +88 -0
  28. package/pubmodules/activities/routes/activity.js +710 -0
  29. package/pubmodules/activities/test/activityRoute.js +85 -0
  30. package/pubmodules/analytics/analytics.js +1719 -0
  31. package/pubmodules/analytics/index.js +3 -0
  32. package/pubmodules/canned/cannedResponse.js +55 -0
  33. package/pubmodules/canned/cannedResponseRoute.js +163 -0
  34. package/pubmodules/canned/index.js +3 -0
  35. package/pubmodules/emailNotification/requestNotification.js +215 -28
  36. package/pubmodules/events/eventRoute.js +37 -7
  37. package/pubmodules/messageActions/messageActionsInterceptor.js +4 -2
  38. package/pubmodules/pubModulesManager.js +129 -5
  39. package/pubmodules/rasa/listener.js +5 -5
  40. package/pubmodules/rules/conciergeBot.js +4 -4
  41. package/pubmodules/scheduler/tasks/closeAgentUnresponsiveRequestTask.js +3 -1
  42. package/pubmodules/scheduler/tasks/closeBotUnresponsiveRequestTask.js +3 -1
  43. package/pubmodules/tilebot/index.js +11 -0
  44. package/pubmodules/tilebot/listener.js +69 -0
  45. package/pubmodules/trigger/default.js +271 -0
  46. package/pubmodules/trigger/event/actionEventEmitter.js +10 -0
  47. package/pubmodules/trigger/event/flowEventEmitter.js +10 -0
  48. package/pubmodules/trigger/event/triggerEventEmitter.js +10 -0
  49. package/pubmodules/trigger/index.js +3 -0
  50. package/pubmodules/trigger/models/trigger.js +149 -0
  51. package/pubmodules/trigger/rulesTrigger.js +1181 -0
  52. package/pubmodules/trigger/start.js +118 -0
  53. package/pubmodules/trigger/triggerRoute.js +150 -0
  54. package/routes/auth.js +7 -2
  55. package/routes/department.js +51 -0
  56. package/routes/faq.js +7 -0
  57. package/routes/faq_kb.js +1 -1
  58. package/routes/group.js +140 -0
  59. package/routes/lead.js +24 -1
  60. package/routes/message.js +6 -3
  61. package/routes/project.js +118 -0
  62. package/routes/project_user.js +9 -0
  63. package/routes/public-request.js +280 -2
  64. package/routes/request.js +122 -16
  65. package/routes/subscription.js +140 -0
  66. package/routes/tag.js +138 -0
  67. package/routes/user-request.js +3 -2
  68. package/routes/users.js +1 -1
  69. package/routes/widget.js +80 -3
  70. package/routes/widgetLoader.js +31 -0
  71. package/services/banUserNotifier.js +86 -0
  72. package/services/emailService.js +189 -11
  73. package/services/faqService.js +2 -2
  74. package/services/geoService.js +30 -4
  75. package/services/leadService.js +2 -0
  76. package/services/modulesManager.js +7 -188
  77. package/services/requestService.js +364 -6
  78. package/services/subscriptionNotifier.js +485 -0
  79. package/template/email/assignedEmailMessage.html +1 -1
  80. package/template/email/assignedRequest.html +1 -1
  81. package/template/email/newMessage.html +1 -1
  82. package/template/email/newMessageFollower.html +236 -0
  83. package/template/email/passwordChanged.html +1 -1
  84. package/template/email/pooledEmailMessage.html +1 -1
  85. package/template/email/pooledRequest.html +1 -1
  86. package/template/email/resetPassword.html +2 -2
  87. package/template/email/ticket.html +1 -1
  88. package/test/cannedRoute.js +166 -0
  89. package/test/messageRoute.js +69 -0
  90. package/test/requestService.js +3 -1
  91. package/utils/orgUtil.js +3 -3
  92. package/views/messages.jade +2 -2
  93. package/websocket/webSocketServer.js +23 -5
package/routes/request.js CHANGED
@@ -162,6 +162,20 @@ router.patch('/:requestid', function (req, res) {
162
162
  update.priority = req.body.priority;
163
163
  }
164
164
 
165
+ if (req.body.smartAssignment!=undefined) {
166
+ update.smartAssignment = req.body.smartAssignment;
167
+ }
168
+
169
+ if (req.body.workingStatus!=undefined) {
170
+ update.workingStatus = req.body.workingStatus;
171
+ }
172
+
173
+
174
+ if (req.body.channelName) {
175
+ update["channel.name"] = req.body.channelName;
176
+ }
177
+
178
+
165
179
 
166
180
  winston.verbose("Request patch update",update);
167
181
 
@@ -196,8 +210,9 @@ router.patch('/:requestid', function (req, res) {
196
210
  router.put('/:requestid/close', function (req, res) {
197
211
  winston.debug(req.body);
198
212
 
199
- // closeRequestByRequestId(request_id, id_project)
200
- return requestService.closeRequestByRequestId(req.params.requestid, req.projectid).then(function(closedRequest) {
213
+ // closeRequestByRequestId(request_id, id_project, skipStatsUpdate, notify, closed_by)
214
+ const closed_by = req.user.id;
215
+ return requestService.closeRequestByRequestId(req.params.requestid, req.projectid, false, true, closed_by).then(function(closedRequest) {
201
216
 
202
217
  winston.verbose("request closed", closedRequest);
203
218
 
@@ -518,6 +533,72 @@ router.delete('/:requestid/notes/:noteid', function (req, res) {
518
533
 
519
534
  });
520
535
 
536
+
537
+
538
+
539
+
540
+
541
+ router.post('/:requestid/followers',
542
+ [
543
+ check('member').notEmpty(),
544
+ ],
545
+ function (req, res) {
546
+ winston.info("followers add", req.body);
547
+
548
+ const errors = validationResult(req);
549
+ if (!errors.isEmpty()) {
550
+ return res.status(422).json({ errors: errors.array() });
551
+ }
552
+
553
+ //addParticipantByRequestId(request_id, id_project, member)
554
+ return requestService.addFollowerByRequestId(req.params.requestid, req.projectid, req.body.member ).then(function(updatedRequest) {
555
+
556
+ winston.verbose("participant added", updatedRequest);
557
+
558
+ return res.json(updatedRequest);
559
+ });
560
+
561
+ });
562
+
563
+
564
+ router.put('/:requestid/followers', function (req, res) {
565
+ winston.debug("req.body", req.body);
566
+
567
+ var followers = [];
568
+ req.body.forEach(function(follower,index) {
569
+ followers.push(follower);
570
+ });
571
+ winston.debug("var followers", followers);
572
+
573
+ // setFollowersByRequestId(request_id, id_project, newfollowers)
574
+ return requestService.setFollowersByRequestId(req.params.requestid, req.projectid, followers ).then(function(updatedRequest) {
575
+
576
+ winston.debug("followers set", updatedRequest);
577
+
578
+ return res.json(updatedRequest);
579
+ });
580
+
581
+ });
582
+
583
+ router.delete('/:requestid/followers/:followerid', function (req, res) {
584
+ winston.debug(req.body);
585
+
586
+ //removeFollowerByRequestId(request_id, id_project, member)
587
+ return requestService.removeFollowerByRequestId(req.params.requestid, req.projectid, req.params.followerid ).then(function(updatedRequest) {
588
+
589
+ winston.verbose("follower removed", updatedRequest);
590
+
591
+ return res.json(updatedRequest);
592
+ });
593
+
594
+
595
+ });
596
+
597
+
598
+
599
+
600
+
601
+
521
602
  // TODO make a synchronous chat21 version (with query parameter?) with request.support_group.created
522
603
  router.delete('/:requestid', function (req, res) {
523
604
 
@@ -589,6 +670,8 @@ router.delete('/id/:id', function (req, res) {
589
670
 
590
671
  router.get('/', function (req, res, next) {
591
672
 
673
+ const startExecTime = new Date();
674
+
592
675
  winston.debug("req projectid", req.projectid);
593
676
  winston.debug("req.query.sort", req.query.sort);
594
677
  winston.debug('REQUEST ROUTE - QUERY ', req.query)
@@ -641,6 +724,10 @@ router.get('/', function (req, res, next) {
641
724
  winston.debug('REQUEST ROUTE - QUERY DEPT ID', query.department);
642
725
  }
643
726
 
727
+ if (req.query.requester_email) {
728
+ query["snapshot.lead.email"] = req.query.requester_email;
729
+ }
730
+
644
731
  if (req.query.full_text) {
645
732
  winston.debug('req.query.fulltext', req.query.full_text);
646
733
  query.$text = { "$search": req.query.full_text };
@@ -709,7 +796,8 @@ router.get('/', function (req, res, next) {
709
796
  * THE SEARCH FOR DATE INTERVAL OF THE HISTORY OF REQUESTS ARE DISABLED AND
710
797
  * ARE DISPLAYED ONLY THE REQUESTS OF THE LAST 14 DAYS
711
798
  */
712
- 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)) {
799
+ //fixato. secondo me qui manca un parentesi tonda per gli or
800
+ 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
801
 
714
802
 
715
803
  var startdate = moment().subtract(14, "days").format("YYYY-MM-DD");
@@ -813,7 +901,14 @@ router.get('/', function (req, res, next) {
813
901
  }
814
902
 
815
903
  if (req.query.channel) {
816
- query["channel.name"] = req.query.channel
904
+ if (req.query.channel === "offline") {
905
+ query["channel.name"] = {"$in" : ["email", "form"]}
906
+ } else if (req.query.channel === "online") {
907
+ query["channel.name"] = {"$nin" : ["email", "form"]}
908
+ } else {
909
+ query["channel.name"] = req.query.channel
910
+ }
911
+
817
912
  winston.debug('REQUEST ROUTE - QUERY channel', query.channel);
818
913
  }
819
914
 
@@ -835,14 +930,17 @@ router.get('/', function (req, res, next) {
835
930
 
836
931
  winston.debug("sort query", sortQuery);
837
932
 
838
- winston.verbose('REQUEST ROUTE - REQUEST FIND ', query);
933
+ winston.debug('REQUEST ROUTE - REQUEST FIND ', query);
839
934
 
840
935
  var projection = undefined;
841
936
 
842
937
  if (req.query.full_text) {
843
- winston.debug('fulltext projection');
844
938
 
845
- projection = {score: { $meta: "textScore" } };
939
+ if (req.query.no_textscore!= "true" && req.query.no_textscore!= true) {
940
+ winston.info('fulltext projection on');
941
+ projection = {score: { $meta: "textScore" } };
942
+ }
943
+
846
944
  }
847
945
  // requestcachefarequi populaterequired
848
946
  var q1 = Request.find(query, projection).
@@ -874,7 +972,9 @@ router.get('/', function (req, res, next) {
874
972
 
875
973
  if (req.query.full_text) {
876
974
  winston.debug('fulltext sort');
877
- q1.sort( { score: { $meta: "textScore" } } ) //https://docs.mongodb.com/manual/reference/operator/query/text/#sort-by-text-search-score
975
+ if (req.query.no_textscore!= "true" && req.query.no_textscore!= true) {
976
+ q1.sort( { score: { $meta: "textScore" } } ) //https://docs.mongodb.com/manual/reference/operator/query/text/#sort-by-text-search-score
977
+ }
878
978
  } else {
879
979
  q1.sort(sortQuery);
880
980
  }
@@ -890,6 +990,11 @@ router.get('/', function (req, res, next) {
890
990
 
891
991
  var q2 = Request.countDocuments(query).exec();
892
992
 
993
+ if (req.query.no_count && req.query.no_count =="true") {
994
+ winston.info('REQUEST ROUTE - no_count ');
995
+ q2 = 0;
996
+ }
997
+
893
998
  var promises = [
894
999
  q1,
895
1000
  q2
@@ -901,7 +1006,12 @@ router.get('/', function (req, res, next) {
901
1006
  count: results[1],
902
1007
  requests: results[0]
903
1008
  };
1009
+ winston.debug('REQUEST ROUTE - objectToReturn ');
904
1010
  winston.debug('REQUEST ROUTE - objectToReturn ', objectToReturn);
1011
+
1012
+ const endExecTime = new Date();
1013
+ winston.verbose('REQUEST ROUTE - exec time: ' + (endExecTime-startExecTime));
1014
+
905
1015
  return res.json(objectToReturn);
906
1016
 
907
1017
  }).catch(function(err){
@@ -1025,7 +1135,11 @@ router.get('/csv', function (req, res, next) {
1025
1135
  winston.debug("sort query", sortQuery);
1026
1136
 
1027
1137
 
1138
+ // TODO ORDER BY SCORE
1139
+ // return Faq.find(query, {score: { $meta: "textScore" } })
1140
+ // .sort( { score: { $meta: "textScore" } } ) //https://docs.mongodb.com/manual/reference/operator/query/text/#sort-by-text-search-score
1028
1141
 
1142
+ // aggiungi filtro per data marco
1029
1143
 
1030
1144
  winston.debug('REQUEST ROUTE - REQUEST FIND ', query)
1031
1145
  return Request.find(query, '-transcript -status -__v').
@@ -1126,14 +1240,6 @@ router.get('/csv', function (req, res, next) {
1126
1240
 
1127
1241
  winston.debug('REQUEST ROUTE - REQUEST AS CSV', requests);
1128
1242
 
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
1243
  return res.csv(requests, true);
1138
1244
  });
1139
1245
 
@@ -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;
@@ -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/users.js CHANGED
@@ -25,7 +25,7 @@ router.put('/', function (req, res) {
25
25
 
26
26
  User.findByIdAndUpdate(req.user.id, update, { new: true, upsert: true }, function (err, updatedUser) {
27
27
  if (err) {
28
- winston.error(err);
28
+ winston.error("Error putting user",err);
29
29
  return res.status(500).send({ success: false, msg: err });
30
30
  }
31
31
 
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,10 +130,28 @@ 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
- project.widget.poweredBy = undefined;
135
- project.widget.baloonImage = undefined;
149
+
150
+ if (project.widget) {
151
+ project.widget.poweredBy = undefined;
152
+ project.widget.baloonImage = undefined;
153
+ }
154
+
136
155
  }
137
156
 
138
157
  return resolve(project);
@@ -175,7 +194,65 @@ router.get('/', function(req, res, next) {
175
194
 
176
195
 
177
196
 
197
+ router.get('/ip', function(req, res, next) {
178
198
 
199
+ var xforwarded = req.headers['x-forwarded-for'];
200
+ winston.info('xforwarded'+ xforwarded);
201
+
202
+ var connectionRemoteAddress = req.connection.remoteAddress;
203
+ winston.info('connectionRemoteAddress'+ connectionRemoteAddress);
204
+
205
+ var socketRemoteAddress = req.socket.remoteAddress;
206
+ winston.info('socketRemoteAddress'+ socketRemoteAddress);
207
+
208
+ if (req.connection.socket ) {
209
+ var connectionSocketRemoteAddress = req.connection.socket.remoteAddress;
210
+ winston.info('connectionSocketRemoteAddress'+ connectionSocketRemoteAddress);
211
+
212
+ }
213
+
214
+
215
+ var ip = req.headers['x-forwarded-for'] ||
216
+ req.connection.remoteAddress ||
217
+ req.socket.remoteAddress ||
218
+ (req.connection.socket ? req.connection.socket.remoteAddress : null);
219
+ winston.info("ip:"+ ip);
220
+
221
+
222
+
223
+
224
+ const ipStandard = (req.headers['x-forwarded-for'] || '').split(',').shift().trim() || //https://stackoverflow.com/questions/8107856/how-to-determine-a-users-ip-address-in-node
225
+ req.socket.remoteAddress
226
+
227
+ winston.info("standard ip: "+ipStandard); // ip address of the user
228
+
229
+
230
+
231
+ // const parseIp = (req) =>
232
+ // req.headers['x-forwarded-for']?.split(',').shift()
233
+ // || req.socket?.remoteAddress
234
+
235
+
236
+
237
+ let parseIp = req.socket.remoteAddress;
238
+
239
+ const xFor = req.headers['x-forwarded-for'];
240
+ winston.info("parseIp xFor: "+xFor);
241
+
242
+ if (xFor ) {
243
+ const xForArr = xFor.split(',');
244
+ if (xForArr && xForArr.length>0) {
245
+ parseIp = xForArr.shift();
246
+ winston.info("parseIp xFor parseIp: "+parseIp);
247
+ }
248
+ }
249
+ winston.info("parseIp: "+parseIp); // ip address of the user
250
+
251
+
252
+ res.json( {ip:ip, ipStandard:ipStandard, parseIp: parseIp} );
253
+
254
+
255
+ });
179
256
 
180
257
 
181
258
 
@@ -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) {