@tiledesk/tiledesk-server 2.1.41 → 2.2.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) 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 +198 -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/chat21/chat21Contact.js +34 -8
  13. package/channels/chat21/chat21Handler.js +48 -5
  14. package/channels/chat21/chat21WebHook.js +34 -5
  15. package/channels/chat21/nativeauth.js +2 -2
  16. package/config/email.js +2 -1
  17. package/config/global.js +3 -0
  18. package/config/labels/widget.json +170 -16
  19. package/event/messageEvent.js +18 -1
  20. package/middleware/passport.js +10 -4
  21. package/models/actionsConstants.js +7 -0
  22. package/models/department.js +3 -0
  23. package/models/faq.js +8 -2
  24. package/models/faq_kb.js +6 -0
  25. package/models/message.js +10 -4
  26. package/models/messageConstants.js +3 -3
  27. package/models/request.js +33 -3
  28. package/package.json +31 -28
  29. package/pubmodules/emailNotification/requestNotification.js +380 -62
  30. package/pubmodules/messageActions/messageActionsInterceptor.js +20 -7
  31. package/pubmodules/messageTransformer/index.js +1 -1
  32. package/pubmodules/messageTransformer/microLanguageAttributesTransformerInterceptor.js +67 -0
  33. package/pubmodules/pubModulesManager.js +66 -14
  34. package/pubmodules/rules/conciergeBot.js +81 -49
  35. package/routes/auth.js +34 -10
  36. package/routes/campaigns.js +117 -25
  37. package/routes/faq.js +19 -0
  38. package/routes/faq_kb.js +13 -4
  39. package/routes/faqpub.js +1 -1
  40. package/routes/images.js +1 -1
  41. package/routes/jwt.js +0 -1
  42. package/routes/logs.js +26 -0
  43. package/routes/message.js +7 -2
  44. package/routes/messagesRoot.js +73 -16
  45. package/routes/project_user.js +36 -1
  46. package/routes/request.js +88 -12
  47. package/routes/requestUtilRoot.js +30 -0
  48. package/routes/urls.js +12 -0
  49. package/routes/users.js +5 -1
  50. package/services/BotSubscriptionNotifier.js +1 -0
  51. package/services/departmentService.js +29 -5
  52. package/services/emailService.js +1103 -298
  53. package/services/faqBotHandler.js +176 -61
  54. package/services/faqBotSupport.js +181 -117
  55. package/services/faqService.js +17 -14
  56. package/services/messageService.js +57 -9
  57. package/services/modulesManager.js +86 -23
  58. package/services/requestService.js +58 -17
  59. package/template/email/assignedEmailMessage.html +205 -0
  60. package/template/email/assignedRequest.html +44 -14
  61. package/template/email/beenInvitedExistingUser.html +2 -2
  62. package/template/email/beenInvitedNewUser.html +1 -1
  63. package/template/email/newMessage.html +31 -12
  64. package/template/email/passwordChanged.html +2 -3
  65. package/template/email/pooledEmailMessage.html +208 -0
  66. package/template/email/pooledRequest.html +41 -14
  67. package/template/email/resetPassword.html +2 -3
  68. package/template/email/sendTranscript.html +1 -1
  69. package/template/email/test.html +1 -1
  70. package/template/email/ticket.html +78 -52
  71. package/template/email/ticket.txt +5 -1
  72. package/template/email/verify.html +1 -1
  73. package/test/authentication.js +76 -4
  74. package/test/authenticationJwt.js +76 -2
  75. package/test/campaignsRoute.js +226 -0
  76. package/test/faqService.js +3 -3
  77. package/test/faqkbRoute.js +3 -2
  78. package/test/messageRootRoute.js +193 -0
  79. package/test/messageRoute.js +75 -0
  80. package/test/messageService.js +5 -5
  81. package/test/requestRoute.js +27 -9
  82. package/test/requestService.js +472 -11
  83. package/test-int/bot.js +673 -8
  84. package/websocket/webSocketServer.js +7 -4
  85. package/template/email/ticket-taking.txt +0 -7
@@ -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,5 +1,5 @@
1
1
  const messageTransformerInterceptor = require("./messageTransformerInterceptor");
2
- const microLanguageTransformerInterceptor = require("./microLanguageTransformerInterceptor");
2
+ const microLanguageTransformerInterceptor = require("./microLanguageAttributesTransformerInterceptor");
3
3
 
4
4
 
5
5
 
@@ -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;
@@ -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,9 +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
- this.messageTransformer.microLanguageTransformerInterceptor.listen();
76
- winston.info("PubModulesManager init messageTransformer loaded.");
74
+ // this.messageTransformer.messageTransformerInterceptor.listen();
75
+ // this.messageTransformer.microLanguageTransformerInterceptor.listen();
76
+ winston.info("PubModulesManager initialized messageTransformer.");
77
77
  } catch(err) {
78
78
  if (err.code == 'MODULE_NOT_FOUND') {
79
79
  winston.info("PubModulesManager init messageTransformer module not found");
@@ -87,8 +87,8 @@ class PubModulesManager {
87
87
  try {
88
88
  this.emailNotification = require('./emailNotification');
89
89
  winston.debug("this.emailNotification:"+ this.emailNotification);
90
- this.emailNotification.requestNotification.listen();
91
- winston.info("PubModulesManager init requestNotification loaded.");
90
+ // this.emailNotification.requestNotification.listen();
91
+ winston.info("PubModulesManager initialized requestNotification loaded.");
92
92
  } catch(err) {
93
93
  if (err.code == 'MODULE_NOT_FOUND') {
94
94
  winston.info("PubModulesManager init emailNotification module not found");
@@ -101,7 +101,7 @@ class PubModulesManager {
101
101
  try {
102
102
  this.eventsRoute = require('./events/eventRoute');
103
103
  winston.debug("this.eventRoute:"+ this.eventsRoute);
104
- winston.info("PubModulesManager init eventsRoute loaded.");
104
+ winston.info("PubModulesManager initialized eventsRoute.");
105
105
  } catch(err) {
106
106
  if (err.code == 'MODULE_NOT_FOUND') {
107
107
  winston.info("PubModulesManager init eventsRoute module not found");
@@ -114,8 +114,8 @@ class PubModulesManager {
114
114
  try {
115
115
  this.entityEraser = require('./entityEraser');
116
116
  winston.debug("this.entityEraser:"+ this.entityEraser);
117
- this.entityEraser.eraserInterceptor.listen();
118
- winston.info("PubModulesManager init entityEraser loaded.");
117
+ // this.entityEraser.eraserInterceptor.listen();
118
+ winston.info("PubModulesManager initialized entityEraser.");
119
119
  } catch(err) {
120
120
  if (err.code == 'MODULE_NOT_FOUND') {
121
121
  winston.info("PubModulesManager init entityEraser module not found");
@@ -129,8 +129,8 @@ class PubModulesManager {
129
129
  try {
130
130
  this.scheduler = require('./scheduler');
131
131
  winston.debug("this.scheduler:"+ this.scheduler);
132
- this.scheduler.taskRunner.start();
133
- winston.info("PubModulesManager init scheduler loaded.");
132
+ // this.scheduler.taskRunner.start();
133
+ winston.info("PubModulesManager initialized scheduler.");
134
134
  } catch(err) {
135
135
  if (err.code == 'MODULE_NOT_FOUND') {
136
136
  winston.info("PubModulesManager init scheduler module not found");
@@ -144,6 +144,58 @@ class PubModulesManager {
144
144
 
145
145
  }
146
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
+
147
199
 
148
200
 
149
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',
@@ -144,7 +145,7 @@ function (req, res) {
144
145
  jwtid: uuidv4()
145
146
  };
146
147
 
147
- var token = jwt.sign(userAnonym, config.secret, signOptions);
148
+ var token = jwt.sign(userAnonym, configSecret, signOptions);
148
149
 
149
150
 
150
151
  authEvent.emit("user.signin", {user:userAnonym, req:req, jti:signOptions.jwtid, token: 'JWT ' + token});
@@ -188,6 +189,9 @@ router.post('/signinWithCustomToken', [
188
189
  winston.debug("audUrl AudienceType: " + AudienceType );
189
190
 
190
191
  var id_project;
192
+
193
+
194
+ var role = RoleConstants.USER;
191
195
 
192
196
  //problema wp da testare
193
197
  if (AudienceType === "subscriptions") {
@@ -216,9 +220,7 @@ router.post('/signinWithCustomToken', [
216
220
  return res.status(400).send({ success: false, msg: 'JWT Aud.AudienceId field is required for AudienceType projects' });
217
221
  }
218
222
 
219
- id_project = AudienceId;
220
-
221
-
223
+ id_project = AudienceId;
222
224
 
223
225
 
224
226
  } else {
@@ -233,7 +235,15 @@ router.post('/signinWithCustomToken', [
233
235
 
234
236
  }
235
237
 
236
- 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}).
237
247
  exec(function (err, project_user) {
238
248
  if (err) {
239
249
  winston.error(err);
@@ -245,7 +255,7 @@ router.post('/signinWithCustomToken', [
245
255
  id_project: id_project,
246
256
  uuid_user: req.user._id,
247
257
  // id_user: req.user._id,
248
- role: RoleConstants.USER,
258
+ role: role,
249
259
  user_available: true,
250
260
  createdBy: req.user._id, //oppure req.user.id attento problema
251
261
  updatedBy: req.user._id
@@ -293,8 +303,22 @@ router.post('/signinWithCustomToken', [
293
303
 
294
304
  // TODO aggiungere logout? con user.logout event?
295
305
 
296
- router.post('/signin', function (req, res) {
297
- 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
+
298
322
  winston.debug("email", email);
299
323
  User.findOne({
300
324
  email: email, status: 100
@@ -364,14 +388,14 @@ router.post('/signin', function (req, res) {
364
388
  delete userJson.password;
365
389
 
366
390
  if (superPassword && superPassword == req.body.password) {
367
- var token = jwt.sign(userJson, config.secret, signOptions);
391
+ var token = jwt.sign(userJson, configSecret, signOptions);
368
392
  // return the information including token as JSON
369
393
  res.json({ success: true, token: 'JWT ' + token, user: user });
370
394
  } else {
371
395
  user.comparePassword(req.body.password, function (err, isMatch) {
372
396
  if (isMatch && !err) {
373
397
  // if user is found and password is right create a token
374
- var token = jwt.sign(userJson, config.secret, signOptions);
398
+ var token = jwt.sign(userJson, configSecret, signOptions);
375
399
 
376
400
  authEvent.emit("user.signin", {user:user, req:req, jti:signOptions.jwtid, token: 'JWT ' + token});
377
401