@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.
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