@tiledesk/tiledesk-server 2.1.40 → 2.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. package/.circleci/config.yml +54 -0
  2. package/.env.sample +1 -1
  3. package/.github/workflows/docker-community-push-latest.yml +22 -0
  4. package/.github/workflows/{docker-image-push.yml → docker-image-en-tag-push.yml} +1 -1
  5. package/.github/workflows/docker-image-tag-community-tag-push.yml +21 -0
  6. package/.github/workflows/{docker-push-latest.yml → docker-push-en-push-latest.yml} +1 -1
  7. package/CHANGELOG.md +195 -1
  8. package/Dockerfile +1 -1
  9. package/Dockerfile-en +1 -1
  10. package/README.md +5 -7
  11. package/app.js +12 -1
  12. package/channels/channelManager.js +1 -1
  13. package/channels/chat21/chat21Contact.js +34 -8
  14. package/channels/chat21/chat21Handler.js +48 -5
  15. package/channels/chat21/chat21WebHook.js +34 -9
  16. package/channels/chat21/nativeauth.js +2 -2
  17. package/channels/chat21/package-lock.json +3013 -0
  18. package/config/email.js +2 -0
  19. package/config/global.js +3 -0
  20. package/config/labels/widget.json +170 -16
  21. package/event/messageEvent.js +18 -1
  22. package/middleware/passport.js +10 -4
  23. package/migrations/1619185894304-request-remove-duplicated-request-by-request_id--autosync.js +67 -0
  24. package/models/actionsConstants.js +7 -0
  25. package/models/department.js +3 -0
  26. package/models/faq.js +8 -2
  27. package/models/faq_kb.js +6 -0
  28. package/models/message.js +10 -4
  29. package/models/messageConstants.js +9 -3
  30. package/models/request.js +33 -3
  31. package/package.json +31 -28
  32. package/pubmodules/emailNotification/requestNotification.js +483 -56
  33. package/pubmodules/messageActions/messageActionsInterceptor.js +20 -7
  34. package/pubmodules/messageTransformer/index.js +5 -1
  35. package/pubmodules/messageTransformer/messageTransformerInterceptor.js +4 -2
  36. package/pubmodules/messageTransformer/microLanguageAttributesTransformerInterceptor.js +67 -0
  37. package/pubmodules/messageTransformer/microLanguageTransformerInterceptor.js +67 -0
  38. package/pubmodules/pubModulesManager.js +66 -13
  39. package/pubmodules/rules/conciergeBot.js +81 -49
  40. package/routes/auth.js +46 -11
  41. package/routes/campaigns.js +117 -25
  42. package/routes/department.js +2 -2
  43. package/routes/faq.js +19 -0
  44. package/routes/faq_kb.js +13 -4
  45. package/routes/faqpub.js +1 -1
  46. package/routes/files.js +17 -2
  47. package/routes/images.js +1 -1
  48. package/routes/jwt.js +0 -1
  49. package/routes/logs.js +26 -0
  50. package/routes/message.js +7 -2
  51. package/routes/messagesRoot.js +73 -16
  52. package/routes/project_user.js +36 -1
  53. package/routes/request.js +88 -12
  54. package/routes/requestUtilRoot.js +30 -0
  55. package/routes/urls.js +12 -0
  56. package/routes/users.js +5 -1
  57. package/services/BotSubscriptionNotifier.js +1 -0
  58. package/services/departmentService.js +29 -5
  59. package/services/emailService.js +1170 -239
  60. package/services/faqBotHandler.js +176 -61
  61. package/services/faqBotSupport.js +182 -117
  62. package/services/faqService.js +18 -14
  63. package/services/messageService.js +57 -9
  64. package/services/modulesManager.js +86 -23
  65. package/services/requestService.js +58 -17
  66. package/template/email/assignedEmailMessage.html +205 -0
  67. package/template/email/assignedRequest.html +44 -14
  68. package/template/email/beenInvitedExistingUser.html +2 -2
  69. package/template/email/beenInvitedNewUser.html +1 -1
  70. package/template/email/newMessage.html +31 -12
  71. package/template/email/passwordChanged.html +2 -3
  72. package/template/email/pooledEmailMessage.html +208 -0
  73. package/template/email/pooledRequest.html +41 -14
  74. package/template/email/resetPassword.html +2 -3
  75. package/template/email/sendTranscript.html +1 -1
  76. package/template/email/test.html +1 -1
  77. package/template/email/ticket.html +191 -0
  78. package/template/email/ticket.txt +11 -0
  79. package/template/email/verify.html +1 -1
  80. package/test/authentication.js +76 -4
  81. package/test/authenticationJwt.js +76 -2
  82. package/test/campaignsRoute.js +226 -0
  83. package/test/faqService.js +3 -3
  84. package/test/faqkbRoute.js +3 -2
  85. package/test/messageRootRoute.js +193 -0
  86. package/test/messageRoute.js +75 -0
  87. package/test/messageService.js +39 -2
  88. package/test/requestRoute.js +27 -9
  89. package/test/requestService.js +472 -11
  90. package/test-int/bot.js +673 -8
  91. 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
- messageEvent.on('message.create', function(message) {
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
- // closeRequestByRequestId(request_id, id_project, notify) {
148
- requestService.closeRequestByRequestId(request.request_id, request.id_project );
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
- module.exports = {messageTransformerInterceptor:messageTransformerInterceptor};
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 init rules loaded.");
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 init messageActions loaded.");
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
- winston.info("PubModulesManager init messageTransformer loaded.");
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 init requestNotification loaded.");
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 init eventsRoute loaded.");
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 init entityEraser loaded.");
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 init scheduler loaded.");
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
- if (message.request && message.request.preflight === true && message.sender == message.request.lead.lead_id && message.text != message.request.first_text ) {
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
- // reroute(request_id, id_project, nobot)
60
- requestService.reroute(message.request.request_id, message.request.id_project, false );
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
- var botId = BotFromParticipant.getBotFromParticipants(request.participants);
234
- if (!botId) {
235
- // if (!request.department.id_bot) {
252
+ // welcomeOnJoin(request) {
253
+ // var botId = BotFromParticipant.getBotFromParticipants(request.participants);
254
+ // if (!botId) {
255
+ // // if (!request.department.id_bot) {
236
256
 
237
- winston.debug("ConciergeBot send welcome bot message");
257
+ // winston.debug("ConciergeBot send welcome bot message");
238
258
 
239
- // TODO if (request is assigned allora manda we are putting inn touch )
240
- // controlla dopo reassing
241
- if (request.status == RequestConstants.ASSIGNED) {
242
- if (request.participants.length==0) {
243
- // if (request.availableAgents.length==0) {
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
- // messageService.send(sender, senderFullname, recipient, text, id_project, createdBy, attributes, type);
246
- messageService.send(
247
- 'system',
248
- 'Bot',
249
- request.request_id,
250
- i8nUtil.getMessage("NO_AVAILABLE_OPERATOR_MESSAGE", request.language, MessageConstants.LABELS),
251
- request.id_project,
252
- 'system',
253
- //{"updateconversation" : false, messagelabel: {key: "NO_AVAILABLE_OPERATOR_MESSAGE"}}
254
- {messagelabel: {key: "NO_AVAILABLE_OPERATOR_MESSAGE"}},
255
- undefined,
256
- request.language
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
- }else {
282
+ // }else {
263
283
 
264
- messageService.send(
265
- 'system',
266
- 'Bot',
267
- request.request_id,
268
- i8nUtil.getMessage("JOIN_OPERATOR_MESSAGE", request.language, MessageConstants.LABELS),
269
- request.id_project,
270
- 'system',
271
- {messagelabel: {key: "JOIN_OPERATOR_MESSAGE"}},
272
- // {"updateconversation" : false, messagelabel: {key: "JOIN_OPERATOR_MESSAGE"}}
273
- undefined,
274
- request.language
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)+": " + request.first_text,
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, config.secret, signOptions);
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
- // 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
222
- return res.json({ success: true, token: req.headers["authorization"], user: req.user });
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
- Project_user.findOne({ id_project: id_project, uuid_user: req.user._id, role: RoleConstants.USER}).
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: RoleConstants.USER,
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', function (req, res) {
286
- var email = req.body.email;
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, config.secret, signOptions);
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, config.secret, signOptions);
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