@tiledesk/tiledesk-server 2.2.39 → 2.3.1-8.1
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 +121 -0
- package/LICENSE +14 -657
- package/README.md +17 -3
- package/app.js +21 -60
- package/channels/chat21/chat21Handler.js +18 -3
- package/channels/chat21/chat21WebHook.js +31 -15
- package/channels/chat21/package-lock.json +663 -706
- package/channels/chat21/package.json +2 -2
- package/deploy.sh +2 -0
- 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/ipFilter.js +220 -0
- package/middleware/passport.js +11 -2
- package/models/lead.js +2 -0
- package/models/project.js +10 -0
- package/models/project_user.js +4 -0
- package/models/request.js +50 -12
- package/models/subscriptionLog.js +34 -0
- package/models/tagLibrary.js +42 -0
- package/package.json +6 -12
- package/pubmodules/activities/activityArchiver.js +314 -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 +55 -0
- package/pubmodules/canned/cannedResponseRoute.js +163 -0
- package/pubmodules/canned/index.js +3 -0
- package/pubmodules/emailNotification/requestNotification.js +215 -28
- package/pubmodules/events/eventRoute.js +37 -7
- package/pubmodules/messageActions/messageActionsInterceptor.js +4 -2
- package/pubmodules/pubModulesManager.js +129 -5
- package/pubmodules/rasa/listener.js +5 -5
- package/pubmodules/rules/conciergeBot.js +4 -4
- package/pubmodules/scheduler/tasks/closeAgentUnresponsiveRequestTask.js +3 -1
- package/pubmodules/scheduler/tasks/closeBotUnresponsiveRequestTask.js +3 -1
- package/pubmodules/tilebot/index.js +11 -0
- package/pubmodules/tilebot/listener.js +69 -0
- 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 +118 -0
- package/pubmodules/trigger/triggerRoute.js +150 -0
- package/routes/auth.js +7 -2
- package/routes/department.js +51 -0
- package/routes/faq.js +7 -0
- package/routes/faq_kb.js +1 -1
- package/routes/group.js +140 -0
- package/routes/lead.js +24 -1
- package/routes/message.js +6 -3
- package/routes/project.js +118 -0
- package/routes/project_user.js +9 -0
- package/routes/public-request.js +280 -2
- package/routes/request.js +122 -16
- package/routes/subscription.js +140 -0
- package/routes/tag.js +138 -0
- package/routes/user-request.js +3 -2
- package/routes/users.js +1 -1
- package/routes/widget.js +80 -3
- package/routes/widgetLoader.js +31 -0
- package/services/banUserNotifier.js +86 -0
- package/services/emailService.js +189 -11
- package/services/faqService.js +2 -2
- package/services/geoService.js +30 -4
- 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/cannedRoute.js +166 -0
- package/test/messageRoute.js +69 -0
- package/test/requestService.js +3 -1
- package/utils/orgUtil.js +3 -3
- package/views/messages.jade +2 -2
- package/websocket/webSocketServer.js +23 -5
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tiledesk/tiledesk-chat21-app",
|
|
3
3
|
"description": "The Tiledesk Chat21 module",
|
|
4
|
-
"version": "1.1.
|
|
4
|
+
"version": "1.1.7",
|
|
5
5
|
"private": false,
|
|
6
6
|
"author": "Andrea Leo - Frontiere21 SRL",
|
|
7
7
|
"license": "AGPL-3.0",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"url": "https://github.com/Tiledesk/tiledesk-server"
|
|
12
12
|
},
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@chat21/chat21-node-sdk": "^1.1.
|
|
14
|
+
"@chat21/chat21-node-sdk": "^1.1.7",
|
|
15
15
|
"winston": "^3.3.3",
|
|
16
16
|
"firebase-admin": "^9.5.0"
|
|
17
17
|
},
|
package/deploy.sh
CHANGED
package/event/botEvent.js
CHANGED
|
@@ -123,7 +123,7 @@ messageEvent.on('message.create', function(message) {
|
|
|
123
123
|
if (bot.type==="internal") {
|
|
124
124
|
botEvent.emit('bot.message.received.notify.internal', message);
|
|
125
125
|
|
|
126
|
-
}else {
|
|
126
|
+
}else { //external
|
|
127
127
|
if (bot.url) {
|
|
128
128
|
var botNotification = {bot: bot, message: message};
|
|
129
129
|
botEvent.emit('bot.message.received.notify.external', botNotification);
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
const ipfilter = require('express-ipfilter').IpFilter
|
|
2
|
+
var winston = require('../config/winston');
|
|
3
|
+
var jwt = require('jsonwebtoken');
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
var customDetection = function (req) {
|
|
7
|
+
// const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
|
|
8
|
+
// const ip = (req.headers['x-forwarded-for'] || '').split(',').pop().trim() || //https://stackoverflow.com/questions/8107856/how-to-determine-a-users-ip-address-in-node
|
|
9
|
+
// req.socket.remoteAddress
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
let ip = req.socket.remoteAddress;
|
|
13
|
+
|
|
14
|
+
const xFor = req.headers['x-forwarded-for'];
|
|
15
|
+
if (xFor ) {
|
|
16
|
+
const xForArr = xFor.split(',');
|
|
17
|
+
if (xForArr && xForArr.length>0) {
|
|
18
|
+
ip = xForArr.shift();
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
// const ip =
|
|
22
|
+
// req.headers['x-forwarded-for']?.split(',').shift()
|
|
23
|
+
// || req.socket?.remoteAddress
|
|
24
|
+
|
|
25
|
+
winston.info("standard ip: "+ip); // ip address of the user
|
|
26
|
+
return ip;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
var getToken = function (headers) {
|
|
30
|
+
winston.debug("getToken",headers);
|
|
31
|
+
if (headers && headers.authorization) {
|
|
32
|
+
var parted = headers.authorization.split(' ');
|
|
33
|
+
if (parted.length === 2) {
|
|
34
|
+
return parted[1];
|
|
35
|
+
} else {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
} else {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class IPFilter {
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
constructor() {
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
projectIpFilter (req, res, next) {
|
|
60
|
+
var that = this;
|
|
61
|
+
// console.log("that", that)
|
|
62
|
+
|
|
63
|
+
const nextIp = function(err) {
|
|
64
|
+
winston.debug("projectIpFilter next",err);
|
|
65
|
+
|
|
66
|
+
if (err && err.name === "IpDeniedError") {
|
|
67
|
+
winston.info("IpDeniedError for projectIpFilter");
|
|
68
|
+
return res.status(401).json({ err: "error project ip filter" });
|
|
69
|
+
// next(err)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
next();
|
|
73
|
+
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
if (!req.project) {
|
|
78
|
+
return next();
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
var projectIpFilterEnabled = req.project.ipFilterEnabled;
|
|
82
|
+
winston.debug("project projectIpFilterEnabled: " +projectIpFilterEnabled)
|
|
83
|
+
|
|
84
|
+
var projectIpFilter = req.project.ipFilter
|
|
85
|
+
winston.debug("project ipFilter: " + projectIpFilter)
|
|
86
|
+
|
|
87
|
+
if (projectIpFilterEnabled === true && projectIpFilter && projectIpFilter.length > 0) {
|
|
88
|
+
winston.debug("filtering project IpFilter with ", projectIpFilter );
|
|
89
|
+
var ip = ipfilter(projectIpFilter, { detectIp: customDetection, mode: 'allow' })
|
|
90
|
+
// var ip = ipfilter(projectIpFilter, { mode: 'allow' })
|
|
91
|
+
ip(req, res, nextIp);
|
|
92
|
+
} else {
|
|
93
|
+
next();
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
projectIpFilterDeny (req, res, next) {
|
|
99
|
+
|
|
100
|
+
const nextIp = function(err) {
|
|
101
|
+
winston.debug("projectIpFilter next",err);
|
|
102
|
+
|
|
103
|
+
if (err && err.name === "IpDeniedError") {
|
|
104
|
+
winston.info("IpDeniedError for projectIpFilterDeny");
|
|
105
|
+
return res.status(401).json({ err: "error project deny ip filter" });
|
|
106
|
+
// next(err)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
next();
|
|
110
|
+
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (!req.project) {
|
|
114
|
+
return next();
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
var projectIpFilterDenyEnabled = req.project.ipFilterDenyEnabled;
|
|
118
|
+
winston.debug("project projectIpFilterDenyEnabled: " +projectIpFilterDenyEnabled)
|
|
119
|
+
|
|
120
|
+
var projectIpFilterDeny = req.project.ipFilterDeny
|
|
121
|
+
winston.debug("project IpFilterDeny: " + projectIpFilterDeny)
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
if (projectIpFilterDenyEnabled === true && projectIpFilterDeny && projectIpFilterDeny.length > 0) {
|
|
125
|
+
winston.debug("filtering project projectIpFilterDeny with ", projectIpFilterDeny );
|
|
126
|
+
var ip = ipfilter(projectIpFilterDeny, { detectIp: customDetection, mode: 'deny' })
|
|
127
|
+
ip(req, res, nextIp);
|
|
128
|
+
} else {
|
|
129
|
+
next();
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
projectBanUserFilter(req, res, next) {
|
|
137
|
+
|
|
138
|
+
winston.debug("projectBanUserFilter hereee*********** ")
|
|
139
|
+
|
|
140
|
+
const nextIp = function(err) {
|
|
141
|
+
winston.debug("projectBanUserFilter next",err);
|
|
142
|
+
|
|
143
|
+
if (err && err.name === "IpDeniedError") {
|
|
144
|
+
winston.info("IpDeniedError for projectBanUserFilter");
|
|
145
|
+
return res.status(401).json({ err: "error projectBanUserFilter" });
|
|
146
|
+
// next(err)
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
next();
|
|
150
|
+
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if (!req.project) {
|
|
154
|
+
return next();
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
var bannedUsers = req.project.bannedUsers
|
|
158
|
+
winston.debug("project bannedUsers: " + bannedUsers)
|
|
159
|
+
|
|
160
|
+
if (bannedUsers && bannedUsers.length > 0) {
|
|
161
|
+
|
|
162
|
+
let bannedUsersArr = [];
|
|
163
|
+
let bannedUsersIdUserArr = [];
|
|
164
|
+
for (var i =0; i < bannedUsers.length; i++) {
|
|
165
|
+
bannedUsersArr.push(bannedUsers[i].ip);
|
|
166
|
+
bannedUsersIdUserArr.push(bannedUsers[i].id);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
winston.debug("project req.preDecodedJwt: ", req.preDecodedJwt)
|
|
170
|
+
// winston.debug("project req.preDecodedJwt._id: "+ req.preDecodedJwt._id)
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
if (req.preDecodedJwt && req.preDecodedJwt._id && bannedUsersIdUserArr.indexOf(req.preDecodedJwt._id) > -1) {
|
|
174
|
+
winston.info("filtering project bannedUsers with id: " + req.preDecodedJwt._id)
|
|
175
|
+
return res.status(401).json({ err: "error projectBanUserFilter by id" });
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
// winston.debug("filtering project bannedUsers with ", bannedUsersArr );
|
|
180
|
+
// var ip = ipfilter(bannedUsersArr, { detectIp: customDetection, mode: 'deny' })
|
|
181
|
+
// ip(req, res, nextIp);
|
|
182
|
+
next();
|
|
183
|
+
} else {
|
|
184
|
+
next();
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
decodeJwt(req, res, next) {
|
|
194
|
+
|
|
195
|
+
let token = getToken(req.headers);
|
|
196
|
+
winston.debug("filtering token " + token);
|
|
197
|
+
|
|
198
|
+
if (token) {
|
|
199
|
+
|
|
200
|
+
try {
|
|
201
|
+
var decoded = jwt.decode(token);
|
|
202
|
+
winston.debug("filtering decoded ", decoded);
|
|
203
|
+
req.preDecodedJwt = decoded;
|
|
204
|
+
}catch(e) {
|
|
205
|
+
winston.debug("Error decoding jwt");
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
next();
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
}
|
|
219
|
+
var iPFilter = new IPFilter();
|
|
220
|
+
module.exports = iPFilter;
|
package/middleware/passport.js
CHANGED
|
@@ -77,15 +77,24 @@ module.exports = function(passport) {
|
|
|
77
77
|
// winston.info("secretOrKeyProvider: "+request.project.name );
|
|
78
78
|
// winston.info("secretOrKeyProvider: "+rawJwtToken );
|
|
79
79
|
|
|
80
|
-
var decoded =
|
|
80
|
+
var decoded = request.preDecodedJwt
|
|
81
81
|
winston.debug("decoded: ", decoded );
|
|
82
|
+
if (!decoded) { //fallback
|
|
83
|
+
winston.debug("load decoded after: ");
|
|
84
|
+
decoded = jwt.decode(rawJwtToken);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
winston.debug("decoded after: ", decoded );
|
|
82
88
|
|
|
83
89
|
// qui arriva questo
|
|
84
90
|
// decoded: {"_id":"5ce3ee855c520200176c189e","updatedAt":"2019-05-31T09:50:22.949Z","createdAt":"2019-05-21T12:26:45.192Z","name":"botext","url":"https://tiledesk-v2-simple--andrealeo83.repl.co","id_project":"5ce3d1ceb25ad30017274bc5","trashed":false,"createdBy":"5ce3d1c7b25ad30017274bc2","__v":0,"external":true,"iat":1559297130,"aud":"https://tiledesk.com","iss":"https://tiledesk.com","sub":"5ce3ee855c520200176c189e@tiledesk.com/bot"}
|
|
85
91
|
|
|
86
|
-
winston.debug("decoded.aud: "+ decoded.aud );
|
|
87
92
|
|
|
88
93
|
if (decoded && decoded.aud) {
|
|
94
|
+
|
|
95
|
+
winston.debug("decoded.aud: "+ decoded.aud );
|
|
96
|
+
|
|
97
|
+
|
|
89
98
|
const audUrl = new URL(decoded.aud);
|
|
90
99
|
winston.debug("audUrl: "+ audUrl );
|
|
91
100
|
const path = audUrl.pathname;
|
package/models/lead.js
CHANGED
|
@@ -96,6 +96,8 @@ var LeadSchema = new Schema({
|
|
|
96
96
|
LeadSchema.index({fullname: 'text', email: 'text'},
|
|
97
97
|
{"name":"lead_fulltext","default_language": defaultFullTextLanguage,"language_override": "dummy"}); // schema level
|
|
98
98
|
|
|
99
|
+
// suggested by atlas
|
|
100
|
+
LeadSchema.index({status: 1, id_project: 1, createdAt: -1});
|
|
99
101
|
|
|
100
102
|
var lead = mongoose.model('lead', LeadSchema);
|
|
101
103
|
|
package/models/project.js
CHANGED
|
@@ -111,6 +111,16 @@ var ProjectSchema = new Schema({
|
|
|
111
111
|
ipFilter: [{
|
|
112
112
|
type: String
|
|
113
113
|
}],
|
|
114
|
+
ipFilterDenyEnabled:{
|
|
115
|
+
type: Boolean,
|
|
116
|
+
default: false
|
|
117
|
+
},
|
|
118
|
+
ipFilterDeny: [{
|
|
119
|
+
type: String
|
|
120
|
+
}],
|
|
121
|
+
bannedUsers: [{
|
|
122
|
+
id: String, ip: String
|
|
123
|
+
}],
|
|
114
124
|
// defaultLanguage: {
|
|
115
125
|
// type: String,
|
|
116
126
|
// required: true,
|
package/models/project_user.js
CHANGED
|
@@ -37,6 +37,9 @@ var TagSchema = require("../models/tag");
|
|
|
37
37
|
index: true
|
|
38
38
|
// required: true
|
|
39
39
|
},
|
|
40
|
+
profileStatus: {
|
|
41
|
+
type: String,
|
|
42
|
+
},
|
|
40
43
|
presence: PresenceSchema,
|
|
41
44
|
attributes: {
|
|
42
45
|
type: Object,
|
|
@@ -108,5 +111,6 @@ Project_userSchema.virtual('isAuthenticated').get(function () {
|
|
|
108
111
|
// Project_user.find({ id_project: projectid, id_user: { $in : group[0].members}, role: { $in : [RoleConstants.OWNER, RoleConstants.ADMIN, RoleConstants.AGENT]} })
|
|
109
112
|
Project_userSchema.index({ id_project: 1, id_user:1, role: 1 });
|
|
110
113
|
|
|
114
|
+
|
|
111
115
|
module.exports = mongoose.model('project_user', Project_userSchema);;
|
|
112
116
|
|
package/models/request.js
CHANGED
|
@@ -58,7 +58,7 @@ var RequestSchema = new Schema({
|
|
|
58
58
|
type: Schema.Types.ObjectId,
|
|
59
59
|
ref: 'project_user',
|
|
60
60
|
required: false, //ENABLEIT,
|
|
61
|
-
index: true
|
|
61
|
+
// index: true //unused
|
|
62
62
|
},
|
|
63
63
|
|
|
64
64
|
|
|
@@ -100,7 +100,7 @@ var RequestSchema = new Schema({
|
|
|
100
100
|
type: Number,
|
|
101
101
|
required: false,
|
|
102
102
|
default: RequestConstants.UNASSIGNED,
|
|
103
|
-
index: true
|
|
103
|
+
// index: true //unused
|
|
104
104
|
},
|
|
105
105
|
|
|
106
106
|
|
|
@@ -134,17 +134,20 @@ var RequestSchema = new Schema({
|
|
|
134
134
|
index: true,
|
|
135
135
|
default: "medium" //translate on client side
|
|
136
136
|
},
|
|
137
|
-
|
|
137
|
+
|
|
138
|
+
followers: [{
|
|
139
|
+
type: Schema.Types.ObjectId,
|
|
140
|
+
ref: 'project_user' }],
|
|
138
141
|
|
|
139
142
|
participantsAgents: {
|
|
140
143
|
type: Array,
|
|
141
144
|
required: false,
|
|
142
|
-
index: true,
|
|
145
|
+
// index: true, //i think unused
|
|
143
146
|
},
|
|
144
147
|
participantsBots: {
|
|
145
148
|
type: Array,
|
|
146
149
|
required: false,
|
|
147
|
-
index: true,
|
|
150
|
+
// index: true, //i think unused
|
|
148
151
|
},
|
|
149
152
|
department: {
|
|
150
153
|
type: Schema.Types.ObjectId,
|
|
@@ -161,20 +164,20 @@ var RequestSchema = new Schema({
|
|
|
161
164
|
// First reply time is the time between ticket creation and the first public comment from an agent, displayed in minutes. Some qualifications include:
|
|
162
165
|
first_response_at: {
|
|
163
166
|
type: Date,
|
|
164
|
-
index: true
|
|
167
|
+
// index: true // unused
|
|
165
168
|
},
|
|
166
169
|
|
|
167
170
|
//timestamp when the agent reply the first time to a visitor
|
|
168
171
|
assigned_at: {
|
|
169
172
|
type: Date,
|
|
170
|
-
index: true
|
|
173
|
+
// index: true //unused
|
|
171
174
|
},
|
|
172
175
|
|
|
173
176
|
// Wait Time (Average and Longest): The average and longest times visitors have been waiting for their chats to be served.
|
|
174
177
|
// Wait time is calculated as duration between the first visitor message in the chat and the first agent message. Wait time will be 0 for agent initiated or trigger initiated chats.
|
|
175
178
|
waiting_time: {
|
|
176
179
|
type: Number,
|
|
177
|
-
index: true
|
|
180
|
+
// index: true // why?
|
|
178
181
|
},
|
|
179
182
|
|
|
180
183
|
|
|
@@ -187,9 +190,12 @@ var RequestSchema = new Schema({
|
|
|
187
190
|
// default: 0
|
|
188
191
|
// },
|
|
189
192
|
|
|
190
|
-
closed_at: {
|
|
193
|
+
closed_at: {
|
|
191
194
|
type: Date
|
|
192
195
|
},
|
|
196
|
+
closed_by: {
|
|
197
|
+
type: String
|
|
198
|
+
},
|
|
193
199
|
|
|
194
200
|
tags: [TagSchema],
|
|
195
201
|
|
|
@@ -205,7 +211,11 @@ var RequestSchema = new Schema({
|
|
|
205
211
|
},
|
|
206
212
|
snapshot: {
|
|
207
213
|
type: RequestSnapshotSchema,
|
|
208
|
-
select: true
|
|
214
|
+
select: true,
|
|
215
|
+
//index: false,
|
|
216
|
+
// includeIndices: false,
|
|
217
|
+
excludeIndexes: true //testa bene
|
|
218
|
+
|
|
209
219
|
// select: false
|
|
210
220
|
},
|
|
211
221
|
|
|
@@ -254,13 +264,25 @@ var RequestSchema = new Schema({
|
|
|
254
264
|
required: false
|
|
255
265
|
},
|
|
256
266
|
location: LocationSchema,
|
|
257
|
-
|
|
267
|
+
auto_close: {
|
|
268
|
+
type: Number,
|
|
269
|
+
index: true
|
|
270
|
+
},
|
|
258
271
|
id_project: {
|
|
259
272
|
type: String,
|
|
260
273
|
required: true,
|
|
261
274
|
index: true
|
|
262
275
|
},
|
|
263
|
-
|
|
276
|
+
smartAssignment: {
|
|
277
|
+
type: Boolean,
|
|
278
|
+
default: true,
|
|
279
|
+
index: true
|
|
280
|
+
},
|
|
281
|
+
workingStatus: { //new, pending
|
|
282
|
+
type: String,
|
|
283
|
+
required: false,
|
|
284
|
+
index: true
|
|
285
|
+
},
|
|
264
286
|
createdBy: {
|
|
265
287
|
type: String,
|
|
266
288
|
required: true
|
|
@@ -434,8 +456,24 @@ RequestSchema.index({ id_project: 1, preflight:1, updatedAt: -1 }); // used quer
|
|
|
434
456
|
|
|
435
457
|
RequestSchema.index({ hasBot: 1, createdAt: 1 }); // suggested by atlas
|
|
436
458
|
|
|
459
|
+
// suggested by atlas
|
|
460
|
+
RequestSchema.index({ lead: 1, id_project: 1, participants: 1, preflight: 1, createdAt: -1 });
|
|
461
|
+
// suggested by atlas
|
|
462
|
+
RequestSchema.index({ lead: 1, id_project: 1, preflight: 1, createdAt: -1 });
|
|
463
|
+
|
|
464
|
+
// suggested by atlas
|
|
465
|
+
RequestSchema.index({ lead: 1, "snapshot.agents.id_user": 1, id_project: 1, preflight: 1, createdAt: -1 });
|
|
466
|
+
|
|
467
|
+
// suggested by atlas
|
|
437
468
|
RequestSchema.index({ id_project: 1, ticket_id: 1 });
|
|
438
469
|
|
|
470
|
+
// suggested by atlas
|
|
471
|
+
RequestSchema.index({ id_project: 1, createdAt: 1, preflight: 1});
|
|
472
|
+
|
|
473
|
+
//suggested by atlas profiler. Used by auto closing requests
|
|
474
|
+
RequestSchema.index({ hasBot: 1, status: 1, createdAt: 1});
|
|
475
|
+
|
|
476
|
+
|
|
439
477
|
|
|
440
478
|
|
|
441
479
|
// cannot index parallel arrays [agents] [participants] {"driv
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
var mongoose = require('mongoose');
|
|
2
|
+
var Schema = mongoose.Schema;
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
var SubscriptionLogSchema = new Schema({
|
|
7
|
+
event: {
|
|
8
|
+
type: String,
|
|
9
|
+
required: true
|
|
10
|
+
},
|
|
11
|
+
target: {
|
|
12
|
+
type: String,
|
|
13
|
+
required: true
|
|
14
|
+
},
|
|
15
|
+
response: {
|
|
16
|
+
type: String,
|
|
17
|
+
},
|
|
18
|
+
body: {
|
|
19
|
+
type: String,
|
|
20
|
+
},
|
|
21
|
+
err: {
|
|
22
|
+
type: String,
|
|
23
|
+
},
|
|
24
|
+
id_project: {
|
|
25
|
+
type: String,
|
|
26
|
+
required: true,
|
|
27
|
+
index:true
|
|
28
|
+
}
|
|
29
|
+
}, {
|
|
30
|
+
timestamps: true
|
|
31
|
+
}
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
module.exports = mongoose.model('subscriptionLog', SubscriptionLogSchema);
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
var mongoose = require('mongoose');
|
|
2
|
+
var Schema = mongoose.Schema;
|
|
3
|
+
var TagSchema = require('./tag');
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
var TagLibrarySchema = new Schema({
|
|
8
|
+
...TagSchema.obj,
|
|
9
|
+
// tag: {
|
|
10
|
+
// type: String,
|
|
11
|
+
// required: true,
|
|
12
|
+
// index: true
|
|
13
|
+
// },
|
|
14
|
+
// color: {
|
|
15
|
+
// type: String,
|
|
16
|
+
// required: false,
|
|
17
|
+
// index: false
|
|
18
|
+
// },
|
|
19
|
+
// attributes: {
|
|
20
|
+
// type: Object,
|
|
21
|
+
// },
|
|
22
|
+
id_project: {
|
|
23
|
+
type: String,
|
|
24
|
+
required: true,
|
|
25
|
+
index: true
|
|
26
|
+
},
|
|
27
|
+
createdBy: {
|
|
28
|
+
type: String,
|
|
29
|
+
required: true
|
|
30
|
+
}
|
|
31
|
+
},{
|
|
32
|
+
timestamps: true
|
|
33
|
+
}
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
TagLibrarySchema.index({ id_project: 1, tag: 1 }, { unique: true });
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
var Tag = mongoose.model('tag', TagLibrarySchema);
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
module.exports = Tag;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tiledesk/tiledesk-server",
|
|
3
3
|
"description": "The Tiledesk server module",
|
|
4
|
-
"version": "2.
|
|
4
|
+
"version": "2.3.18.1",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"start": "node ./bin/www",
|
|
7
7
|
"pretest": "mongodb-runner start",
|
|
@@ -29,29 +29,22 @@
|
|
|
29
29
|
"tiledesk-server": "./bin/www"
|
|
30
30
|
},
|
|
31
31
|
"optionalDependencies": {
|
|
32
|
-
"@tiledesk-ent/tiledesk-server-activities": "^1.1.18",
|
|
33
|
-
"@tiledesk-ent/tiledesk-server-analytics": "^1.1.12",
|
|
34
32
|
"@tiledesk-ent/tiledesk-server-cache": "^1.1.10",
|
|
35
|
-
"@tiledesk-ent/tiledesk-server-canned": "^1.1.2",
|
|
36
|
-
"@tiledesk-ent/tiledesk-server-departments": "^1.1.3",
|
|
37
33
|
"@tiledesk-ent/tiledesk-server-dialogflow": "^1.1.6",
|
|
38
|
-
"@tiledesk-ent/tiledesk-server-groups": "^1.1.3",
|
|
39
34
|
"@tiledesk-ent/tiledesk-server-jwthistory": "^1.1.9",
|
|
40
|
-
"@tiledesk-ent/tiledesk-server-mt": "^1.1.8",
|
|
41
35
|
"@tiledesk-ent/tiledesk-server-payments": "^1.1.6",
|
|
42
36
|
"@tiledesk-ent/tiledesk-server-queue": "^1.1.11",
|
|
43
37
|
"@tiledesk-ent/tiledesk-server-request-history": "^1.1.5",
|
|
44
|
-
"@tiledesk-ent/tiledesk-server-resthook": "^1.1.53",
|
|
45
38
|
"@tiledesk-ent/tiledesk-server-routing-queue": "^1.1.11",
|
|
46
|
-
"@tiledesk-ent/tiledesk-server-tags": "^1.1.2",
|
|
47
|
-
"@tiledesk-ent/tiledesk-server-triggers": "^1.1.82",
|
|
48
39
|
"@tiledesk-ent/tiledesk-server-visitorcounter": "^1.1.1",
|
|
49
40
|
"@tiledesk-ent/tiledesk-server-enterprise": "^1.0.0"
|
|
50
41
|
},
|
|
51
42
|
"dependencies": {
|
|
52
|
-
"@tiledesk/tiledesk-chat21-app": "^1.1.
|
|
43
|
+
"@tiledesk/tiledesk-chat21-app": "^1.1.7",
|
|
53
44
|
"@tiledesk/tiledesk-chatbot-util": "^0.8.33",
|
|
54
|
-
"@tiledesk/tiledesk-
|
|
45
|
+
"@tiledesk/tiledesk-json-rules-engine": "^4.0.3",
|
|
46
|
+
"@tiledesk/tiledesk-rasa-connector": "^1.0.10",
|
|
47
|
+
"@tiledesk/tiledesk-tybot-connector": "^0.1.10",
|
|
55
48
|
"app-root-path": "^3.0.0",
|
|
56
49
|
"bcrypt-nodejs": "0.0.3",
|
|
57
50
|
"body-parser": "^1.20.0",
|
|
@@ -94,6 +87,7 @@
|
|
|
94
87
|
"passport": "^0.4.1",
|
|
95
88
|
"passport-http": "^0.3.0",
|
|
96
89
|
"passport-jwt": "^4.0.0",
|
|
90
|
+
"pdfmake": "^0.2.5",
|
|
97
91
|
"promise-events": "^0.2.4",
|
|
98
92
|
"request": "^2.88.2",
|
|
99
93
|
"request-promise": "^4.2.6",
|