@tiledesk/tiledesk-server 2.1.41 → 2.2.4

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 (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