@tiledesk/tiledesk-server 2.1.40 → 2.2.3
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/.circleci/config.yml +54 -0
- package/.env.sample +1 -1
- package/.github/workflows/docker-community-push-latest.yml +22 -0
- package/.github/workflows/{docker-image-push.yml → docker-image-en-tag-push.yml} +1 -1
- package/.github/workflows/docker-image-tag-community-tag-push.yml +21 -0
- package/.github/workflows/{docker-push-latest.yml → docker-push-en-push-latest.yml} +1 -1
- package/CHANGELOG.md +195 -1
- package/Dockerfile +1 -1
- package/Dockerfile-en +1 -1
- package/README.md +5 -7
- package/app.js +12 -1
- package/channels/channelManager.js +1 -1
- package/channels/chat21/chat21Contact.js +34 -8
- package/channels/chat21/chat21Handler.js +48 -5
- package/channels/chat21/chat21WebHook.js +34 -9
- package/channels/chat21/nativeauth.js +2 -2
- package/channels/chat21/package-lock.json +3013 -0
- package/config/email.js +2 -0
- package/config/global.js +3 -0
- package/config/labels/widget.json +170 -16
- package/event/messageEvent.js +18 -1
- package/middleware/passport.js +10 -4
- package/migrations/1619185894304-request-remove-duplicated-request-by-request_id--autosync.js +67 -0
- package/models/actionsConstants.js +7 -0
- package/models/department.js +3 -0
- package/models/faq.js +8 -2
- package/models/faq_kb.js +6 -0
- package/models/message.js +10 -4
- package/models/messageConstants.js +9 -3
- package/models/request.js +33 -3
- package/package.json +31 -28
- package/pubmodules/emailNotification/requestNotification.js +483 -56
- package/pubmodules/messageActions/messageActionsInterceptor.js +20 -7
- package/pubmodules/messageTransformer/index.js +5 -1
- package/pubmodules/messageTransformer/messageTransformerInterceptor.js +4 -2
- package/pubmodules/messageTransformer/microLanguageAttributesTransformerInterceptor.js +67 -0
- package/pubmodules/messageTransformer/microLanguageTransformerInterceptor.js +67 -0
- package/pubmodules/pubModulesManager.js +66 -13
- package/pubmodules/rules/conciergeBot.js +81 -49
- package/routes/auth.js +46 -11
- package/routes/campaigns.js +117 -25
- package/routes/department.js +2 -2
- package/routes/faq.js +19 -0
- package/routes/faq_kb.js +13 -4
- package/routes/faqpub.js +1 -1
- package/routes/files.js +17 -2
- package/routes/images.js +1 -1
- package/routes/jwt.js +0 -1
- package/routes/logs.js +26 -0
- package/routes/message.js +7 -2
- package/routes/messagesRoot.js +73 -16
- package/routes/project_user.js +36 -1
- package/routes/request.js +88 -12
- package/routes/requestUtilRoot.js +30 -0
- package/routes/urls.js +12 -0
- package/routes/users.js +5 -1
- package/services/BotSubscriptionNotifier.js +1 -0
- package/services/departmentService.js +29 -5
- package/services/emailService.js +1170 -239
- package/services/faqBotHandler.js +176 -61
- package/services/faqBotSupport.js +182 -117
- package/services/faqService.js +18 -14
- package/services/messageService.js +57 -9
- package/services/modulesManager.js +86 -23
- package/services/requestService.js +58 -17
- package/template/email/assignedEmailMessage.html +205 -0
- package/template/email/assignedRequest.html +44 -14
- package/template/email/beenInvitedExistingUser.html +2 -2
- package/template/email/beenInvitedNewUser.html +1 -1
- package/template/email/newMessage.html +31 -12
- package/template/email/passwordChanged.html +2 -3
- package/template/email/pooledEmailMessage.html +208 -0
- package/template/email/pooledRequest.html +41 -14
- package/template/email/resetPassword.html +2 -3
- package/template/email/sendTranscript.html +1 -1
- package/template/email/test.html +1 -1
- package/template/email/ticket.html +191 -0
- package/template/email/ticket.txt +11 -0
- package/template/email/verify.html +1 -1
- package/test/authentication.js +76 -4
- package/test/authenticationJwt.js +76 -2
- package/test/campaignsRoute.js +226 -0
- package/test/faqService.js +3 -3
- package/test/faqkbRoute.js +3 -2
- package/test/messageRootRoute.js +193 -0
- package/test/messageRoute.js +75 -0
- package/test/messageService.js +39 -2
- package/test/requestRoute.js +27 -9
- package/test/requestService.js +472 -11
- package/test-int/bot.js +673 -8
- package/websocket/webSocketServer.js +7 -4
@@ -18,9 +18,11 @@ class MessageActionsInterceptor {
|
|
18
18
|
|
19
19
|
var that = this;
|
20
20
|
winston.info("MessageActionsInterceptor listener start ");
|
21
|
-
|
22
|
-
|
23
|
-
|
21
|
+
|
22
|
+
//use .received to be sure for \close the message is sent to chat21 and after that you can archive the conversation. otherwise a race condition occurs with message.create if \close is sent by the bot
|
23
|
+
messageEvent.on('message.received', function(message) {
|
24
|
+
// messageEvent.on('message.create', function(message) {
|
25
|
+
winston.debug("message.received ", message);
|
24
26
|
|
25
27
|
setImmediate(() => {
|
26
28
|
|
@@ -78,6 +80,7 @@ class MessageActionsInterceptor {
|
|
78
80
|
|
79
81
|
var request = message.request;
|
80
82
|
|
83
|
+
|
81
84
|
if (request) {
|
82
85
|
//var botId = botEvent.getBotId(message);
|
83
86
|
var botId = BotFromParticipant.getBotId(message);
|
@@ -144,14 +147,24 @@ class MessageActionsInterceptor {
|
|
144
147
|
var request = message.request;
|
145
148
|
|
146
149
|
if (request) {
|
147
|
-
//
|
148
|
-
|
150
|
+
// setTimeout(function() {
|
151
|
+
// winston.info("delayed")
|
152
|
+
// closeRequestByRequestId(request_id, id_project, notify) {
|
153
|
+
requestService.closeRequestByRequestId(request.request_id, request.id_project );
|
154
|
+
// }, 1500);
|
155
|
+
|
156
|
+
|
149
157
|
}
|
150
158
|
|
151
159
|
});
|
152
160
|
|
153
|
-
|
154
|
-
|
161
|
+
/*
|
162
|
+
messageActionEvent.on("actions", function(message) {
|
163
|
+
// esegui custom action--->
|
164
|
+
});
|
165
|
+
messageActionEvent.on("events", function(message) {
|
166
|
+
// lancia event
|
167
|
+
});*/
|
155
168
|
|
156
169
|
|
157
170
|
|
@@ -1,2 +1,6 @@
|
|
1
1
|
const messageTransformerInterceptor = require("./messageTransformerInterceptor");
|
2
|
-
|
2
|
+
const microLanguageTransformerInterceptor = require("./microLanguageAttributesTransformerInterceptor");
|
3
|
+
|
4
|
+
|
5
|
+
|
6
|
+
module.exports = {messageTransformerInterceptor:messageTransformerInterceptor, microLanguageTransformerInterceptor:microLanguageTransformerInterceptor};
|
@@ -6,6 +6,7 @@ var winston = require('../../config/winston');
|
|
6
6
|
var i8nUtil = require("../../utils/i8nUtil");
|
7
7
|
var cacheUtil = require('../../utils/cacheUtil');
|
8
8
|
|
9
|
+
//TODO rename to LabelMessageTransformerInterceptor
|
9
10
|
class MessageTransformerInterceptor {
|
10
11
|
|
11
12
|
|
@@ -15,7 +16,8 @@ class MessageTransformerInterceptor {
|
|
15
16
|
|
16
17
|
var that = this;
|
17
18
|
winston.info("MessageTransformerInterceptor listener start ");
|
18
|
-
|
19
|
+
|
20
|
+
|
19
21
|
messagePromiseEvent.on('message.create.simple.before', async (data) => {
|
20
22
|
winston.debug('MessageTransformerInterceptor message.create.simple.before', data);
|
21
23
|
|
@@ -70,7 +72,7 @@ class MessageTransformerInterceptor {
|
|
70
72
|
winston.debug('MessageTransformerInterceptor label: ' + label);
|
71
73
|
|
72
74
|
if (label) {
|
73
|
-
message.text=label;
|
75
|
+
message.text=label; //ATTENTION Changes is made by reference
|
74
76
|
}
|
75
77
|
|
76
78
|
return data;
|
@@ -0,0 +1,67 @@
|
|
1
|
+
|
2
|
+
const messagePromiseEvent = require('../../event/messagePromiseEvent');
|
3
|
+
|
4
|
+
var winston = require('../../config/winston');
|
5
|
+
const { TiledeskChatbotUtil } = require('@tiledesk/tiledesk-chatbot-util');
|
6
|
+
|
7
|
+
|
8
|
+
class MicroLanguageTransformerInterceptor {
|
9
|
+
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
listen() {
|
14
|
+
|
15
|
+
var that = this;
|
16
|
+
winston.info("MicroLanguageTransformerInterceptor listener start ");
|
17
|
+
|
18
|
+
messagePromiseEvent.on('message.create.simple.before', async (data) => {
|
19
|
+
winston.debug('MicroLanguageTransformerInterceptor message.create.simple.before', data);
|
20
|
+
|
21
|
+
var message = data.beforeMessage;
|
22
|
+
|
23
|
+
if (!message.text) { //for image i think
|
24
|
+
return data;
|
25
|
+
}
|
26
|
+
|
27
|
+
if (message.attributes && message.attributes.microlanguage == true) {
|
28
|
+
var reply = TiledeskChatbotUtil.parseReply(message.text);
|
29
|
+
winston.debug('parseReply: ' + JSON.stringify(reply) );
|
30
|
+
var messageReply = reply.message;
|
31
|
+
|
32
|
+
|
33
|
+
var msg_attributes = {"_raw_message": message.text};
|
34
|
+
|
35
|
+
if (messageReply && messageReply.attributes) {
|
36
|
+
for(const [key, value] of Object.entries(messageReply.attributes)) {
|
37
|
+
msg_attributes[key] = value
|
38
|
+
}
|
39
|
+
}
|
40
|
+
|
41
|
+
messageReply.attributes = msg_attributes;
|
42
|
+
|
43
|
+
|
44
|
+
//data.beforeMessage = messageReply; //https://stackoverflow.com/questions/518000/is-javascript-a-pass-by-reference-or-pass-by-value-language
|
45
|
+
// message = messageReply;
|
46
|
+
message.text = messageReply.text; //ATTENTION Changes is made by reference
|
47
|
+
message.attributes = messageReply.attributes; //ATTENTION Changes is made by reference
|
48
|
+
message.type = messageReply.type; //ATTENTION Changes is made by reference
|
49
|
+
message.metadata = messageReply.metadata; //ATTENTION Changes is made by reference
|
50
|
+
// message.metadata = messageReply.metadata;
|
51
|
+
|
52
|
+
//data.beforeMessage = messageReply;
|
53
|
+
|
54
|
+
}
|
55
|
+
winston.debug('data: ' + JSON.stringify(data) );
|
56
|
+
return data;
|
57
|
+
|
58
|
+
});
|
59
|
+
|
60
|
+
|
61
|
+
}
|
62
|
+
|
63
|
+
|
64
|
+
}
|
65
|
+
|
66
|
+
var microLanguageTransformerInterceptor = new MicroLanguageTransformerInterceptor();
|
67
|
+
module.exports = microLanguageTransformerInterceptor;
|
@@ -0,0 +1,67 @@
|
|
1
|
+
|
2
|
+
const messagePromiseEvent = require('../../event/messagePromiseEvent');
|
3
|
+
|
4
|
+
var winston = require('../../config/winston');
|
5
|
+
const { TiledeskChatbotUtil } = require('@tiledesk/tiledesk-chatbot-util');
|
6
|
+
|
7
|
+
|
8
|
+
class MicroLanguageTransformerInterceptor {
|
9
|
+
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
listen() {
|
14
|
+
|
15
|
+
var that = this;
|
16
|
+
winston.info("MicroLanguageTransformerInterceptor listener start ");
|
17
|
+
|
18
|
+
messagePromiseEvent.on('message.create.simple.before', async (data) => {
|
19
|
+
winston.info('MicroLanguageTransformerInterceptor message.create.simple.before', data);
|
20
|
+
|
21
|
+
var message = data.beforeMessage;
|
22
|
+
|
23
|
+
if (!message.text) { //for image i think
|
24
|
+
return data;
|
25
|
+
}
|
26
|
+
|
27
|
+
if (message.attributes && message.attributes.microlanguage == true) {
|
28
|
+
var reply = TiledeskChatbotUtil.parseReply(message.text);
|
29
|
+
winston.info('parseReply: ' + JSON.stringify(reply) );
|
30
|
+
var messageReply = reply.message;
|
31
|
+
|
32
|
+
|
33
|
+
var msg_attributes = {"_raw_message": message.text};
|
34
|
+
|
35
|
+
if (messageReply && messageReply.attributes) {
|
36
|
+
for(const [key, value] of Object.entries(messageReply.attributes)) {
|
37
|
+
msg_attributes[key] = value
|
38
|
+
}
|
39
|
+
}
|
40
|
+
|
41
|
+
messageReply.attributes = msg_attributes;
|
42
|
+
|
43
|
+
|
44
|
+
//data.beforeMessage = messageReply; //https://stackoverflow.com/questions/518000/is-javascript-a-pass-by-reference-or-pass-by-value-language
|
45
|
+
// message = messageReply;
|
46
|
+
message.text = messageReply.text; //ATTENTION Changes is made by reference
|
47
|
+
message.attributes = messageReply.attributes; //ATTENTION Changes is made by reference
|
48
|
+
message.type = messageReply.type; //ATTENTION Changes is made by reference
|
49
|
+
message.metadata = messageReply.metadata; //ATTENTION Changes is made by reference
|
50
|
+
// message.metadata = messageReply.metadata;
|
51
|
+
|
52
|
+
//data.beforeMessage = messageReply;
|
53
|
+
|
54
|
+
}
|
55
|
+
winston.debug('data: ' + JSON.stringify(data) );
|
56
|
+
return data;
|
57
|
+
|
58
|
+
});
|
59
|
+
|
60
|
+
|
61
|
+
}
|
62
|
+
|
63
|
+
|
64
|
+
}
|
65
|
+
|
66
|
+
var microLanguageTransformerInterceptor = new MicroLanguageTransformerInterceptor();
|
67
|
+
module.exports = microLanguageTransformerInterceptor;
|
@@ -45,8 +45,8 @@ class PubModulesManager {
|
|
45
45
|
|
46
46
|
try {
|
47
47
|
this.appRules = require('./rules/appRules');
|
48
|
-
this.appRules.start();
|
49
|
-
winston.info("PubModulesManager
|
48
|
+
// this.appRules.start();
|
49
|
+
winston.info("PubModulesManager initialized rules.");
|
50
50
|
} catch(err) {
|
51
51
|
if (err.code == 'MODULE_NOT_FOUND') {
|
52
52
|
winston.info("PubModulesManager init rules module not found");
|
@@ -58,8 +58,8 @@ class PubModulesManager {
|
|
58
58
|
try {
|
59
59
|
this.messageActions = require('./messageActions');
|
60
60
|
winston.debug("this.messageActions:"+ this.messageActions);
|
61
|
-
this.messageActions.messageActionsInterceptor.listen();
|
62
|
-
winston.info("PubModulesManager
|
61
|
+
// this.messageActions.messageActionsInterceptor.listen();
|
62
|
+
winston.info("PubModulesManager initialized messageActions.");
|
63
63
|
} catch(err) {
|
64
64
|
if (err.code == 'MODULE_NOT_FOUND') {
|
65
65
|
winston.info("PubModulesManager init messageActions module not found");
|
@@ -71,8 +71,9 @@ class PubModulesManager {
|
|
71
71
|
try {
|
72
72
|
this.messageTransformer = require('./messageTransformer');
|
73
73
|
winston.debug("this.messageTransformer:"+ this.messageTransformer);
|
74
|
-
this.messageTransformer.messageTransformerInterceptor.listen();
|
75
|
-
|
74
|
+
// this.messageTransformer.messageTransformerInterceptor.listen();
|
75
|
+
// this.messageTransformer.microLanguageTransformerInterceptor.listen();
|
76
|
+
winston.info("PubModulesManager initialized messageTransformer.");
|
76
77
|
} catch(err) {
|
77
78
|
if (err.code == 'MODULE_NOT_FOUND') {
|
78
79
|
winston.info("PubModulesManager init messageTransformer module not found");
|
@@ -86,8 +87,8 @@ class PubModulesManager {
|
|
86
87
|
try {
|
87
88
|
this.emailNotification = require('./emailNotification');
|
88
89
|
winston.debug("this.emailNotification:"+ this.emailNotification);
|
89
|
-
this.emailNotification.requestNotification.listen();
|
90
|
-
winston.info("PubModulesManager
|
90
|
+
// this.emailNotification.requestNotification.listen();
|
91
|
+
winston.info("PubModulesManager initialized requestNotification loaded.");
|
91
92
|
} catch(err) {
|
92
93
|
if (err.code == 'MODULE_NOT_FOUND') {
|
93
94
|
winston.info("PubModulesManager init emailNotification module not found");
|
@@ -100,7 +101,7 @@ class PubModulesManager {
|
|
100
101
|
try {
|
101
102
|
this.eventsRoute = require('./events/eventRoute');
|
102
103
|
winston.debug("this.eventRoute:"+ this.eventsRoute);
|
103
|
-
winston.info("PubModulesManager
|
104
|
+
winston.info("PubModulesManager initialized eventsRoute.");
|
104
105
|
} catch(err) {
|
105
106
|
if (err.code == 'MODULE_NOT_FOUND') {
|
106
107
|
winston.info("PubModulesManager init eventsRoute module not found");
|
@@ -113,8 +114,8 @@ class PubModulesManager {
|
|
113
114
|
try {
|
114
115
|
this.entityEraser = require('./entityEraser');
|
115
116
|
winston.debug("this.entityEraser:"+ this.entityEraser);
|
116
|
-
this.entityEraser.eraserInterceptor.listen();
|
117
|
-
winston.info("PubModulesManager
|
117
|
+
// this.entityEraser.eraserInterceptor.listen();
|
118
|
+
winston.info("PubModulesManager initialized entityEraser.");
|
118
119
|
} catch(err) {
|
119
120
|
if (err.code == 'MODULE_NOT_FOUND') {
|
120
121
|
winston.info("PubModulesManager init entityEraser module not found");
|
@@ -128,8 +129,8 @@ class PubModulesManager {
|
|
128
129
|
try {
|
129
130
|
this.scheduler = require('./scheduler');
|
130
131
|
winston.debug("this.scheduler:"+ this.scheduler);
|
131
|
-
this.scheduler.taskRunner.start();
|
132
|
-
winston.info("PubModulesManager
|
132
|
+
// this.scheduler.taskRunner.start();
|
133
|
+
winston.info("PubModulesManager initialized scheduler.");
|
133
134
|
} catch(err) {
|
134
135
|
if (err.code == 'MODULE_NOT_FOUND') {
|
135
136
|
winston.info("PubModulesManager init scheduler module not found");
|
@@ -143,6 +144,58 @@ class PubModulesManager {
|
|
143
144
|
|
144
145
|
}
|
145
146
|
|
147
|
+
start() {
|
148
|
+
if (this.appRules) {
|
149
|
+
try {
|
150
|
+
this.appRules.start();
|
151
|
+
winston.info("PubModulesManager appRules started.");
|
152
|
+
} catch(err) {
|
153
|
+
winston.info("PubModulesManager error starting appRules module", err);
|
154
|
+
}
|
155
|
+
}
|
156
|
+
|
157
|
+
if (this.messageActions) {
|
158
|
+
try {
|
159
|
+
this.messageActions.messageActionsInterceptor.listen();
|
160
|
+
winston.info("PubModulesManager messageActions started.");
|
161
|
+
} catch(err) {
|
162
|
+
winston.info("PubModulesManager error starting messageActions module", err);
|
163
|
+
}
|
164
|
+
}
|
165
|
+
|
166
|
+
|
167
|
+
if (this.messageTransformer) {
|
168
|
+
try {
|
169
|
+
this.messageTransformer.messageTransformerInterceptor.listen();
|
170
|
+
this.messageTransformer.microLanguageTransformerInterceptor.listen();
|
171
|
+
winston.info("PubModulesManager messageTransformer started.");
|
172
|
+
} catch(err) {
|
173
|
+
winston.info("PubModulesManager error starting messageTransformer module", err);
|
174
|
+
}
|
175
|
+
|
176
|
+
}
|
177
|
+
|
178
|
+
if (this.emailNotification) {
|
179
|
+
try {
|
180
|
+
this.emailNotification.requestNotification.listen();
|
181
|
+
winston.info("PubModulesManager emailNotification started.");
|
182
|
+
} catch(err) {
|
183
|
+
winston.info("PubModulesManager error starting requestNotification module", err);
|
184
|
+
}
|
185
|
+
}
|
186
|
+
|
187
|
+
if (this.scheduler) {
|
188
|
+
try {
|
189
|
+
this.scheduler.taskRunner.start();
|
190
|
+
winston.info("PubModulesManager scheduler started.");
|
191
|
+
} catch(err) {
|
192
|
+
winston.info("PubModulesManager error starting scheduler module", err);
|
193
|
+
}
|
194
|
+
}
|
195
|
+
|
196
|
+
|
197
|
+
}
|
198
|
+
|
146
199
|
|
147
200
|
|
148
201
|
}
|
@@ -43,21 +43,41 @@ devi mandare un messaggio welcome tu altrimenti il bot inserito successivamente
|
|
43
43
|
// winston.debug(" ConciergeBot message.request.first_text: "+message.request.first_text);
|
44
44
|
|
45
45
|
// lead_id used. Change it?
|
46
|
-
|
46
|
+
|
47
|
+
if (message.request && message.request.preflight === true && message.sender == message.request.lead.lead_id && message.text != message.request.first_text) {
|
48
|
+
winston.debug("conciergebot: " + message.request.first_text );
|
49
|
+
// if (message.request && message.request.preflight === true && message.sender == message.request.lead.lead_id && message.text != message.request.first_text ) {
|
47
50
|
// if (message.request.status < 100 && message.sender == message.request.lead.lead_id && message.text != message.request.first_text ) {
|
48
51
|
// if (message.request.status < 100 && message.sender == message.request.lead.lead_id && message.text != message.request.first_text && !botId) {
|
49
52
|
|
50
53
|
winston.debug("message send from lead with preflight on");
|
51
54
|
|
52
55
|
// changeFirstTextAndPreflightByRequestId(request_id, id_project, first_text, preflight) {
|
53
|
-
requestService.changeFirstTextAndPreflightByRequestId(message.request.request_id, message.request.id_project, message.text, false).then(function (reqChanged) {
|
54
|
-
|
55
|
-
// requestService.changeFirstTextByRequestId(message.request.request_id, message.request.id_project, message.text).then(function (reqChanged) {
|
56
|
-
// requestService.changePreflightByRequestId(message.request.request_id, message.request.id_project, false).then(function (reqChanged) {
|
57
56
|
|
57
|
+
let first_text = message.text;
|
58
|
+
if (message.type === MessageConstants.MESSAGE_TYPE.IMAGE) {
|
59
|
+
first_text = "Image";
|
60
|
+
winston.debug("setting first_text to image");
|
61
|
+
}
|
62
|
+
|
63
|
+
if (message.type === MessageConstants.MESSAGE_TYPE.FRAME) {
|
64
|
+
first_text = "Frame";
|
65
|
+
winston.debug("setting first_text to frame");
|
66
|
+
}
|
67
|
+
|
68
|
+
|
69
|
+
requestService.changeFirstTextAndPreflightByRequestId(message.request.request_id, message.request.id_project, first_text, false).then(function (reqChanged) {
|
70
|
+
//TESTA QUESTO
|
58
71
|
|
59
|
-
|
60
|
-
|
72
|
+
winston.debug("message.request.status: "+message.request.status);
|
73
|
+
winston.debug("message.request.department.id_bot: "+message.request.department.id_bot);
|
74
|
+
if (message.request.status === 50 && message.request.department.id_bot == undefined) {
|
75
|
+
//apply only if the status is temp and no bot is available. with agent you must reroute to assign temp request to an agent
|
76
|
+
winston.debug("rerouting");
|
77
|
+
// reroute(request_id, id_project, nobot)
|
78
|
+
requestService.reroute(message.request.request_id, message.request.id_project, false );
|
79
|
+
}
|
80
|
+
|
61
81
|
// updateStatusWitId(lead_id, id_project, status)
|
62
82
|
// lead_id used. Change it?
|
63
83
|
leadService.updateStatusWitId(message.request.lead.lead_id, message.request.id_project, LeadConstants.NORMAL);
|
@@ -229,58 +249,58 @@ devi mandare un messaggio welcome tu altrimenti il bot inserito successivamente
|
|
229
249
|
|
230
250
|
|
231
251
|
// unused
|
232
|
-
welcomeOnJoin(request) {
|
233
|
-
|
234
|
-
|
235
|
-
|
252
|
+
// welcomeOnJoin(request) {
|
253
|
+
// var botId = BotFromParticipant.getBotFromParticipants(request.participants);
|
254
|
+
// if (!botId) {
|
255
|
+
// // if (!request.department.id_bot) {
|
236
256
|
|
237
|
-
|
257
|
+
// winston.debug("ConciergeBot send welcome bot message");
|
238
258
|
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
259
|
+
// // TODO if (request is assigned allora manda we are putting inn touch )
|
260
|
+
// // controlla dopo reassing
|
261
|
+
// if (request.status == RequestConstants.ASSIGNED) {
|
262
|
+
// if (request.participants.length==0) {
|
263
|
+
// // if (request.availableAgents.length==0) {
|
244
264
|
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
265
|
+
// // messageService.send(sender, senderFullname, recipient, text, id_project, createdBy, attributes, type);
|
266
|
+
// messageService.send(
|
267
|
+
// 'system',
|
268
|
+
// 'Bot',
|
269
|
+
// request.request_id,
|
270
|
+
// i8nUtil.getMessage("NO_AVAILABLE_OPERATOR_MESSAGE", request.language, MessageConstants.LABELS),
|
271
|
+
// request.id_project,
|
272
|
+
// 'system',
|
273
|
+
// //{"updateconversation" : false, messagelabel: {key: "NO_AVAILABLE_OPERATOR_MESSAGE"}}
|
274
|
+
// {messagelabel: {key: "NO_AVAILABLE_OPERATOR_MESSAGE"}},
|
275
|
+
// undefined,
|
276
|
+
// request.language
|
257
277
|
|
258
278
|
|
259
|
-
|
279
|
+
// );
|
260
280
|
|
261
281
|
|
262
|
-
|
282
|
+
// }else {
|
263
283
|
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
284
|
+
// messageService.send(
|
285
|
+
// 'system',
|
286
|
+
// 'Bot',
|
287
|
+
// request.request_id,
|
288
|
+
// i8nUtil.getMessage("JOIN_OPERATOR_MESSAGE", request.language, MessageConstants.LABELS),
|
289
|
+
// request.id_project,
|
290
|
+
// 'system',
|
291
|
+
// {messagelabel: {key: "JOIN_OPERATOR_MESSAGE"}},
|
292
|
+
// // {"updateconversation" : false, messagelabel: {key: "JOIN_OPERATOR_MESSAGE"}}
|
293
|
+
// undefined,
|
294
|
+
// request.language
|
295
|
+
|
296
|
+
// );
|
277
297
|
|
278
298
|
|
279
|
-
|
280
|
-
|
299
|
+
// }
|
300
|
+
// }
|
281
301
|
|
282
|
-
|
283
|
-
}
|
302
|
+
// }
|
303
|
+
// }
|
284
304
|
|
285
305
|
|
286
306
|
|
@@ -304,12 +324,24 @@ devi mandare un messaggio welcome tu altrimenti il bot inserito successivamente
|
|
304
324
|
if (member) {
|
305
325
|
updateconversationfor = [member];
|
306
326
|
}
|
327
|
+
|
328
|
+
let touchText = request.first_text;
|
329
|
+
if (touchText) { //first_text can be empty for type image
|
330
|
+
touchText = touchText.replace(/[\n\r]+/g, ' '); //replace new line with space
|
331
|
+
}
|
332
|
+
if (touchText.length > 30) {
|
333
|
+
touchText = touchText.substring(0,30);
|
334
|
+
}
|
335
|
+
if (request.subject) {
|
336
|
+
touchText = request.subject;
|
337
|
+
}
|
338
|
+
|
307
339
|
// messageService.send(sender, senderFullname, recipient, text, id_project, createdBy, attributes, type);
|
308
340
|
messageService.send(
|
309
341
|
'system',
|
310
342
|
'Bot',
|
311
343
|
request.request_id,
|
312
|
-
i8nUtil.getMessage("TOUCHING_OPERATOR", request.language, MessageConstants.LABELS)+": " +
|
344
|
+
i8nUtil.getMessage("TOUCHING_OPERATOR", request.language, MessageConstants.LABELS)+": " + touchText,
|
313
345
|
request.id_project,
|
314
346
|
'system',
|
315
347
|
{subtype:"info", "updateconversation" : true, "updateconversationfor":updateconversationfor, forcenotification: true, messagelabel: {key: "TOUCHING_OPERATOR"}},
|
package/routes/auth.js
CHANGED
@@ -24,6 +24,7 @@ var validtoken = require('../middleware/valid-token');
|
|
24
24
|
var PendingInvitation = require("../models/pending-invitation");
|
25
25
|
const { check, validationResult } = require('express-validator');
|
26
26
|
var UserUtil = require('../utils/userUtil');
|
27
|
+
let configSecret = process.env.GLOBAL_SECRET || config.secret;
|
27
28
|
|
28
29
|
|
29
30
|
router.post('/signup',
|
@@ -112,7 +113,10 @@ function (req, res) {
|
|
112
113
|
return res.status(422).json({ errors: errors.array() });
|
113
114
|
}
|
114
115
|
var firstname = req.body.firstname || "Guest";
|
116
|
+
|
115
117
|
|
118
|
+
//TODO togli trattini da uuidv4()
|
119
|
+
|
116
120
|
// TODO remove email.sec?
|
117
121
|
let userAnonym = {_id: uuidv4(), firstname:firstname, lastname: req.body.lastname, email: req.body.email, attributes: req.body.attributes};
|
118
122
|
|
@@ -141,7 +145,7 @@ function (req, res) {
|
|
141
145
|
jwtid: uuidv4()
|
142
146
|
};
|
143
147
|
|
144
|
-
var token = jwt.sign(userAnonym,
|
148
|
+
var token = jwt.sign(userAnonym, configSecret, signOptions);
|
145
149
|
|
146
150
|
|
147
151
|
authEvent.emit("user.signin", {user:userAnonym, req:req, jti:signOptions.jwtid, token: 'JWT ' + token});
|
@@ -185,6 +189,9 @@ router.post('/signinWithCustomToken', [
|
|
185
189
|
winston.debug("audUrl AudienceType: " + AudienceType );
|
186
190
|
|
187
191
|
var id_project;
|
192
|
+
|
193
|
+
|
194
|
+
var role = RoleConstants.USER;
|
188
195
|
|
189
196
|
//problema wp da testare
|
190
197
|
if (AudienceType === "subscriptions") {
|
@@ -213,16 +220,30 @@ router.post('/signinWithCustomToken', [
|
|
213
220
|
return res.status(400).send({ success: false, msg: 'JWT Aud.AudienceId field is required for AudienceType projects' });
|
214
221
|
}
|
215
222
|
|
216
|
-
id_project = AudienceId;
|
217
|
-
|
223
|
+
id_project = AudienceId;
|
218
224
|
|
219
225
|
|
220
226
|
} else {
|
221
|
-
|
222
|
-
|
227
|
+
winston.debug("audience generic");
|
228
|
+
if (req.body.id_project) {
|
229
|
+
id_project = req.body.id_project;
|
230
|
+
winston.verbose("audience generic. id_project is passed explicitly");
|
231
|
+
}else {
|
232
|
+
// When happen? when an agent (or admin) from ionic find a tiledesk token in the localstorage (from dashboard) and use signinWithCustomToken to obtain user object
|
233
|
+
return res.json({ success: true, token: req.headers["authorization"], user: req.user });
|
234
|
+
}
|
235
|
+
|
223
236
|
}
|
224
237
|
|
225
|
-
|
238
|
+
|
239
|
+
|
240
|
+
if (req.user.role) {
|
241
|
+
role = req.user.role;
|
242
|
+
}
|
243
|
+
winston.debug("role: " + role );
|
244
|
+
|
245
|
+
|
246
|
+
Project_user.findOne({ id_project: id_project, uuid_user: req.user._id, role: role}).
|
226
247
|
exec(function (err, project_user) {
|
227
248
|
if (err) {
|
228
249
|
winston.error(err);
|
@@ -234,7 +255,7 @@ router.post('/signinWithCustomToken', [
|
|
234
255
|
id_project: id_project,
|
235
256
|
uuid_user: req.user._id,
|
236
257
|
// id_user: req.user._id,
|
237
|
-
role:
|
258
|
+
role: role,
|
238
259
|
user_available: true,
|
239
260
|
createdBy: req.user._id, //oppure req.user.id attento problema
|
240
261
|
updatedBy: req.user._id
|
@@ -282,8 +303,22 @@ router.post('/signinWithCustomToken', [
|
|
282
303
|
|
283
304
|
// TODO aggiungere logout? con user.logout event?
|
284
305
|
|
285
|
-
router.post('/signin',
|
286
|
-
|
306
|
+
router.post('/signin',
|
307
|
+
[
|
308
|
+
// check('email').notEmpty(),
|
309
|
+
check('email').isEmail(),
|
310
|
+
check('password').notEmpty(),
|
311
|
+
],
|
312
|
+
function (req, res) {
|
313
|
+
|
314
|
+
const errors = validationResult(req);
|
315
|
+
if (!errors.isEmpty()) {
|
316
|
+
winston.error("Signin validation error", errors);
|
317
|
+
return res.status(422).json({ errors: errors.array() });
|
318
|
+
}
|
319
|
+
|
320
|
+
var email = req.body.email.toLowerCase();
|
321
|
+
|
287
322
|
winston.debug("email", email);
|
288
323
|
User.findOne({
|
289
324
|
email: email, status: 100
|
@@ -353,14 +388,14 @@ router.post('/signin', function (req, res) {
|
|
353
388
|
delete userJson.password;
|
354
389
|
|
355
390
|
if (superPassword && superPassword == req.body.password) {
|
356
|
-
var token = jwt.sign(userJson,
|
391
|
+
var token = jwt.sign(userJson, configSecret, signOptions);
|
357
392
|
// return the information including token as JSON
|
358
393
|
res.json({ success: true, token: 'JWT ' + token, user: user });
|
359
394
|
} else {
|
360
395
|
user.comparePassword(req.body.password, function (err, isMatch) {
|
361
396
|
if (isMatch && !err) {
|
362
397
|
// if user is found and password is right create a token
|
363
|
-
var token = jwt.sign(userJson,
|
398
|
+
var token = jwt.sign(userJson, configSecret, signOptions);
|
364
399
|
|
365
400
|
authEvent.emit("user.signin", {user:user, req:req, jti:signOptions.jwtid, token: 'JWT ' + token});
|
366
401
|
|