@tiledesk/tiledesk-server 2.3.5 → 2.3.7-1.1

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 (126) hide show
  1. package/.github/workflows/docker-community-worker-push-latest.yml +23 -0
  2. package/.github/workflows/docker-image-tag-worker-community-tag-push.yml +22 -0
  3. package/CHANGELOG.md +361 -3
  4. package/Dockerfile-jobs +31 -0
  5. package/app.js +62 -69
  6. package/channels/chat21/chat21Handler.js +37 -6
  7. package/channels/chat21/chat21WebHook.js +52 -29
  8. package/channels/chat21/package-lock.json +663 -706
  9. package/channels/chat21/package.json +2 -2
  10. package/config/labels/widget.json +337 -136
  11. package/deploy.sh +2 -0
  12. package/event/messageEvent.js +110 -9
  13. package/jobs.js +80 -0
  14. package/jobsManager.js +47 -0
  15. package/middleware/has-role.js +10 -3
  16. package/middleware/ipFilter.js +220 -0
  17. package/middleware/passport.js +8 -2
  18. package/models/department.js +1 -1
  19. package/models/faq.js +77 -25
  20. package/models/faq_kb.js +19 -0
  21. package/models/message.js +10 -8
  22. package/models/project.js +10 -0
  23. package/models/project_user.js +10 -0
  24. package/models/request.js +12 -1
  25. package/package.json +12 -11
  26. package/pubmodules/activities/activityArchiver.js +216 -90
  27. package/pubmodules/activities/routes/activity.js +1 -1
  28. package/pubmodules/apps/index.js +8 -0
  29. package/pubmodules/apps/listener.js +27 -0
  30. package/pubmodules/cache/index.js +2 -0
  31. package/pubmodules/cache/mongoose-cachegoose-fn.js +630 -0
  32. package/pubmodules/canned/cannedResponse.js +4 -0
  33. package/pubmodules/canned/cannedResponseRoute.js +10 -5
  34. package/pubmodules/dialogflow/index.js +10 -0
  35. package/pubmodules/dialogflow/listener.js +66 -0
  36. package/pubmodules/emailNotification/requestNotification.js +58 -28
  37. package/pubmodules/events/eventRoute.js +49 -24
  38. package/pubmodules/messageTransformer/messageHandlebarsTransformerInterceptor.js +6 -1
  39. package/pubmodules/messageTransformer/messageTransformerInterceptor.js +10 -4
  40. package/pubmodules/pubModulesManager.js +173 -7
  41. package/pubmodules/queue/index.js +4 -0
  42. package/pubmodules/queue/reconnect.js +331 -0
  43. package/pubmodules/queue/reconnectFanout.js +256 -0
  44. package/pubmodules/rasa/listener.js +5 -5
  45. package/pubmodules/routing-queue/index.js +3 -0
  46. package/pubmodules/routing-queue/listener.js +328 -0
  47. package/pubmodules/rules/conciergeBot.js +4 -4
  48. package/pubmodules/scheduler/tasks/closeAgentUnresponsiveRequestTask.js +6 -1
  49. package/pubmodules/scheduler/tasks/closeBotUnresponsiveRequestTask.js +7 -1
  50. package/pubmodules/tilebot/index.js +11 -0
  51. package/pubmodules/tilebot/listener.js +85 -0
  52. package/pubmodules/trigger/rulesTrigger.js +137 -14
  53. package/pubmodules/trigger/start.js +5 -1
  54. package/pubmodules/whatsapp/index.js +7 -0
  55. package/pubmodules/whatsapp/listener.js +32 -0
  56. package/routes/auth.js +7 -2
  57. package/routes/campaigns.js +3 -3
  58. package/routes/department.js +3 -2
  59. package/routes/email.js +32 -2
  60. package/routes/faq.js +37 -2
  61. package/routes/faq_kb.js +496 -133
  62. package/routes/faqpub.js +5 -0
  63. package/routes/lead.js +56 -0
  64. package/routes/message.js +196 -14
  65. package/routes/messagesRoot.js +39 -0
  66. package/routes/project.js +76 -4
  67. package/routes/project_user.js +11 -1
  68. package/routes/project_user_test.js +19 -0
  69. package/routes/request.js +134 -30
  70. package/routes/troubleshooting.js +12 -0
  71. package/routes/users-util.js +39 -0
  72. package/routes/users.js +1 -1
  73. package/routes/widget.js +64 -2
  74. package/services/BotSubscriptionNotifier.js +5 -0
  75. package/services/banUserNotifier.js +86 -0
  76. package/services/cacheEnabler.js +56 -0
  77. package/services/chatbotService.js +101 -0
  78. package/services/departmentService.js +25 -3
  79. package/services/emailService.js +170 -28
  80. package/services/faqBotHandler.js +2 -3
  81. package/services/faqService.js +28 -3
  82. package/services/geoService.js +36 -6
  83. package/services/labelService.js +1 -1
  84. package/services/leadService.js +3 -2
  85. package/services/messageService.js +4 -2
  86. package/services/modulesManager.js +23 -76
  87. package/services/operatingHoursService.js +9 -4
  88. package/services/requestService.js +75 -39
  89. package/services/subscriptionNotifier.js +9 -4
  90. package/services/trainingService.js +106 -0
  91. package/template/email/assignedEmailMessage.html +21 -11
  92. package/template/email/assignedRequest.html +21 -11
  93. package/template/email/beenInvitedExistingUser.html +16 -6
  94. package/template/email/beenInvitedNewUser.html +16 -6
  95. package/template/email/emailDirect.html +130 -0
  96. package/template/email/newMessage.html +18 -8
  97. package/template/email/newMessageFollower.html +22 -12
  98. package/template/email/passwordChanged.html +15 -5
  99. package/template/email/pooledEmailMessage.html +21 -11
  100. package/template/email/pooledRequest.html +20 -10
  101. package/template/email/resetPassword.html +15 -5
  102. package/template/email/sendTranscript.html +7 -4
  103. package/template/email/ticket.html +17 -7
  104. package/template/email/verify.html +15 -5
  105. package/test/cannedRoute.js +157 -0
  106. package/test/chatbot-mock.js +127 -0
  107. package/test/example-json-intents.txt +1 -0
  108. package/test/example-json.txt +1 -0
  109. package/test/example.json +1 -0
  110. package/test/faqRoute.js +353 -208
  111. package/test/faqkbRoute.js +669 -64
  112. package/test/imageRoute.js +1 -1
  113. package/test/messageRoute.js +387 -5
  114. package/test/requestRoute.js +6 -6
  115. package/test/requestService.js +55 -4
  116. package/test-int/cache-project.js +90 -0
  117. package/test-int/cache-project_user.js +88 -0
  118. package/utils/UIDGenerator.js +20 -0
  119. package/utils/cacheUtil.js +2 -2
  120. package/utils/orgUtil.js +3 -3
  121. package/utils/promiseUtil.js +31 -0
  122. package/utils/recipientEmailUtil.js +66 -0
  123. package/utils/sendEmailUtil.js +34 -0
  124. package/utils/sendMessageUtil.js +1 -1
  125. package/utils/stringUtil.js +12 -0
  126. package/websocket/webSocketServer.js +33 -10
package/app.js CHANGED
@@ -33,6 +33,9 @@ var roleChecker = require('./middleware/has-role');
33
33
  const MaskData = require("maskdata");
34
34
  var winston = require('./config/winston');
35
35
 
36
+
37
+ // DATABASE CONNECTION
38
+
36
39
  // https://bretkikehara.wordpress.com/2013/05/02/nodejs-creating-your-first-global-module/
37
40
  var databaseUri = process.env.DATABASE_URI || process.env.MONGODB_URI || config.database;
38
41
 
@@ -78,7 +81,8 @@ mongoose.set('useCreateIndex', true);
78
81
  mongoose.set('useUnifiedTopology', false);
79
82
 
80
83
 
81
-
84
+ // ROUTES DECLARATION
85
+ var troubleshooting = require('./routes/troubleshooting');
82
86
  var auth = require('./routes/auth');
83
87
  var authtest = require('./routes/authtest');
84
88
  var authtestWithRoleCheck = require('./routes/authtestWithRoleCheck');
@@ -94,9 +98,11 @@ var faq = require('./routes/faq');
94
98
  var faq_kb = require('./routes/faq_kb');
95
99
  var project = require('./routes/project');
96
100
  var project_user = require('./routes/project_user');
101
+ var project_users_test = require('./routes/project_user_test');
97
102
  var request = require('./routes/request');
98
103
  // var setting = require('./routes/setting');
99
104
  var users = require('./routes/users');
105
+ var usersUtil = require('./routes/users-util');
100
106
  var publicRequest = require('./routes/public-request');
101
107
  var userRequest = require('./routes/user-request');
102
108
  var publicAnalytics = require('./routes/public-analytics');
@@ -124,32 +130,54 @@ var bootDataLoader = require('./services/bootDataLoader');
124
130
  var settingDataLoader = require('./services/settingDataLoader');
125
131
  var schemaMigrationService = require('./services/schemaMigrationService');
126
132
  var RouterLogger = require('./models/routerLogger');
133
+ var cacheEnabler = require("./services/cacheEnabler");
127
134
 
128
135
  require('./services/mongoose-cache-fn')(mongoose);
129
136
 
137
+
130
138
  var subscriptionNotifier = require('./services/subscriptionNotifier');
131
139
  subscriptionNotifier.start();
132
140
 
133
141
  var botSubscriptionNotifier = require('./services/BotSubscriptionNotifier');
134
142
  botSubscriptionNotifier.start();
143
+
144
+ var trainingService = require('./services/trainingService');
145
+ trainingService.start();
135
146
 
147
+ // job_here
148
+
136
149
 
137
150
  var geoService = require('./services/geoService');
138
- geoService.listen();
151
+ // geoService.listen();
152
+
153
+ let JobsManager = require('./jobsManager');
154
+
155
+ let jobWorkerEnabled = false;
156
+ if (process.env.JOB_WORKER_ENABLED=="true" || process.env.JOB_WORKER_ENABLED == true) {
157
+ jobWorkerEnabled = true;
158
+ }
159
+ winston.info("JobsManager jobWorkerEnabled: "+ jobWorkerEnabled);
160
+
161
+ let jobsManager = new JobsManager(jobWorkerEnabled,geoService);
162
+ jobsManager.listen();
163
+
164
+
139
165
 
140
166
  var faqBotHandler = require('./services/faqBotHandler');
141
167
  faqBotHandler.listen();
142
168
 
143
169
  var pubModulesManager = require('./pubmodules/pubModulesManager');
144
- pubModulesManager.init({express:express, mongoose:mongoose, passport:passport, databaseUri:databaseUri, routes:{}});
170
+ pubModulesManager.init({express:express, mongoose:mongoose, passport:passport, databaseUri:databaseUri, routes:{}, jobsManager:jobsManager});
145
171
 
146
172
  var channelManager = require('./channels/channelManager');
147
173
  channelManager.listen();
148
174
 
149
- const ipfilter = require('express-ipfilter').IpFilter
150
- // const IpDeniedError = require('express-ipfilter').IpDeniedError;
151
-
175
+ var IPFilter = require('./middleware/ipFilter');
152
176
 
177
+ // job_here
178
+ var BanUserNotifier = require('./services/banUserNotifier');
179
+ BanUserNotifier.listen();
180
+ const { ChatbotService } = require('./services/chatbotService');
153
181
 
154
182
  var modulesManager = undefined;
155
183
  try {
@@ -175,6 +203,7 @@ if (process.env.CREATE_INITIAL_DATA !== "false") {
175
203
 
176
204
 
177
205
 
206
+
178
207
  var app = express();
179
208
 
180
209
 
@@ -183,6 +212,8 @@ var app = express();
183
212
  app.set('views', path.join(__dirname, 'views'));
184
213
  app.set('view engine', 'jade');
185
214
 
215
+ app.set('chatbot_service', new ChatbotService())
216
+
186
217
 
187
218
  // TODO DELETE IT IN THE NEXT RELEASE
188
219
  if (process.env.ENABLE_ALTERNATIVE_CORS_MIDDLEWARE === "true") {
@@ -211,7 +242,10 @@ if (process.env.ENABLE_ALTERNATIVE_CORS_MIDDLEWARE === "true") {
211
242
 
212
243
  // https://stackoverflow.com/questions/18710225/node-js-get-raw-request-body-using-express
213
244
 
214
- app.use(bodyParser.json({
245
+ const JSON_BODY_LIMIT = process.envJSON_BODY_LIMIT || '500KB';
246
+ winston.debug("JSON_BODY_LIMIT : " + JSON_BODY_LIMIT);
247
+
248
+ app.use(bodyParser.json({limit: JSON_BODY_LIMIT,
215
249
  verify: function (req, res, buf) {
216
250
  // var url = req.originalUrl;
217
251
  // if (url.indexOf('/stripe/')) {
@@ -221,7 +255,7 @@ app.use(bodyParser.json({
221
255
  }
222
256
  }));
223
257
 
224
- app.use(bodyParser.urlencoded({ extended: false }));
258
+ app.use(bodyParser.urlencoded({limit: JSON_BODY_LIMIT, extended: false }));
225
259
 
226
260
  app.use(cookieParser());
227
261
  app.use(express.static(path.join(__dirname, 'public')));
@@ -309,9 +343,13 @@ var projectSetter = function (req, res, next) {
309
343
  winston.debug("projectSetter projectid:" + projectid);
310
344
 
311
345
  if (projectid) {
312
- Project.findOne({_id: projectid, status: 100})
313
- //@DISABLED_CACHE .cache(cacheUtil.defaultTTL, "projects:id:"+projectid)
314
- .exec(function(err, project){
346
+
347
+ let q = Project.findOne({_id: projectid, status: 100});
348
+ if (cacheEnabler.project) {
349
+ q.cache(cacheUtil.longTTL, "projects:id:"+projectid) //project_cache
350
+ winston.debug('project cache enabled');
351
+ }
352
+ q.exec(function(err, project){
315
353
  if (err) {
316
354
  winston.warn("Problem getting project with id: " + projectid + " req.originalUrl: " + req.originalUrl);
317
355
  }
@@ -335,57 +373,6 @@ var projectSetter = function (req, res, next) {
335
373
  }
336
374
 
337
375
 
338
- function customDetection (req) {
339
- // const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
340
- const ip = (req.headers['x-forwarded-for'] || '').split(',').pop().trim() || //https://stackoverflow.com/questions/8107856/how-to-determine-a-users-ip-address-in-node
341
- req.socket.remoteAddress
342
-
343
- winston.info("standard ip: "+ip); // ip address of the user
344
- return ip;
345
- }
346
-
347
-
348
- var projectIpFilter = function (req, res, next) {
349
- // var projectIpFilter = function (err, req, res, next) {
350
-
351
- // var ip = require('ip');
352
- // winston.info("projectIpFilter ip2: " + ip.address() );
353
-
354
-
355
- const nextIp = function(err) {
356
- winston.info("projectIpFilter next",err);
357
-
358
- if (err && err.name === "IpDeniedError") {
359
- winston.info("IpDeniedError");
360
- return res.status(401).json({ err: "error project ip filter" });
361
- // next(err)
362
- }
363
-
364
- next();
365
-
366
- }
367
-
368
-
369
- if (!req.project) {
370
- return next();
371
- }
372
-
373
- var projectIpFilterEnabled = req.project.ipFilterEnabled;
374
- winston.debug("project projectIpFilterEnabled: " +projectIpFilterEnabled)
375
-
376
- var projectIpFilter = req.project.ipFilter
377
- winston.debug("project ipFilter: " + projectIpFilter)
378
-
379
- if (projectIpFilterEnabled === true && projectIpFilter && projectIpFilter.length > 0) {
380
- var ip = ipfilter(projectIpFilter, { detectIp: customDetection, mode: 'allow' })
381
- // var ip = ipfilter(projectIpFilter, { mode: 'allow' })
382
- ip(req, res, nextIp);
383
- } else {
384
- next();
385
- }
386
-
387
- }
388
-
389
376
 
390
377
 
391
378
  // app.use('/admin', admin);
@@ -398,6 +385,7 @@ var projectIpFilter = function (req, res, next) {
398
385
 
399
386
  // const ips = ['::1'];
400
387
 
388
+ app.use('/troubleshooting', troubleshooting);
401
389
  app.use('/auth', auth);
402
390
  app.use('/testauth', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken], authtest);
403
391
 
@@ -408,6 +396,7 @@ app.use('/images', images);
408
396
  app.use('/files', files);
409
397
  app.use('/urls', urls);
410
398
  app.use('/users', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken], users);
399
+ app.use('/users_util', usersUtil);
411
400
  app.use('/logs', logs);
412
401
  app.use('/requests_util', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken], requestUtilRoot);
413
402
 
@@ -431,12 +420,13 @@ if (modulesManager) {
431
420
  modulesManager.use(app);
432
421
  }
433
422
 
434
-
435
- app.use('/:projectid/', [projectIdSetter, projectSetter, projectIpFilter]);
423
+ app.use('/:projectid/', [projectIdSetter, projectSetter, IPFilter.projectIpFilter, IPFilter.projectIpFilterDeny, IPFilter.decodeJwt, IPFilter.projectBanUserFilter]);
436
424
 
437
425
 
438
426
  app.use('/:projectid/authtestWithRoleCheck', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken], authtestWithRoleCheck);
439
427
 
428
+ app.use('/:projectid/project_users_test', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('agent', ['bot','subscription'])], project_users_test);
429
+
440
430
  app.use('/:projectid/leads', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('agent', ['bot','subscription'])], lead);
441
431
  app.use('/:projectid/requests/:request_id/messages', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes(null, ['bot','subscription'])] , message);
442
432
 
@@ -451,13 +441,13 @@ app.use('/:projectid/departments', department);
451
441
 
452
442
  channelManager.useUnderProjects(app);
453
443
 
454
- app.use('/:projectid/groups', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('admin')], group);
444
+ app.use('/:projectid/groups', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('agent')], group);
455
445
  app.use('/:projectid/tags', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('agent')], tag);
456
446
  app.use('/:projectid/subscriptions', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('admin')], resthook);
457
447
 
458
448
  //deprecated
459
- app.use('/:projectid/faq', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('agent')], faq);
460
- app.use('/:projectid/intents', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('agent')], faq);
449
+ app.use('/:projectid/faq', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('agent', ['bot','subscription'])], faq);
450
+ app.use('/:projectid/intents', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('agent', ['bot','subscription'])], faq);
461
451
 
462
452
  //Deprecated??
463
453
  app.use('/:projectid/faqpub', faqpub);
@@ -479,6 +469,8 @@ app.use('/:projectid/project_users', project_user);
479
469
 
480
470
  // app.use('/:projectid/project_users', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('agent')], project_user);
481
471
 
472
+
473
+ //passport double check this and the next
482
474
  app.use('/:projectid/requests', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('guest', ['bot','subscription'])], userRequest);
483
475
 
484
476
  app.use('/:projectid/requests', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('agent', ['bot','subscription'])], request);
@@ -497,7 +489,8 @@ app.use('/:projectid/labels', [fetchLabels],labels);
497
489
 
498
490
  app.use('/:projectid/campaigns',[passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('agent')], campaigns);
499
491
 
500
- app.use('/:projectid/emails',[passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('owner')], email);
492
+ app.use('/:projectid/emails',[passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('agent', ['bot','subscription'])], email);
493
+
501
494
 
502
495
 
503
496
 
@@ -540,7 +533,7 @@ app.use(function (err, req, res, next) {
540
533
  // error handler
541
534
  app.use((err, req, res, next) => {
542
535
 
543
- winston.info("err.name", err.name)
536
+ winston.debug("err.name", err.name)
544
537
  if (err.name === "IpDeniedError") {
545
538
  winston.info("IpDeniedError");
546
539
  return res.status(401).json({ err: "error ip filter" });
@@ -246,7 +246,18 @@ class Chat21Handler {
246
246
  });
247
247
 
248
248
 
249
+ messageEvent.on('message.test', function(message) {
250
+
251
+ winston.info("Chat21Sender message.test");
252
+
253
+ chat21.auth.setAdminToken(adminToken);
249
254
 
255
+ return chat21.messages.sendToGroup(message.senderFullname, message.recipient,
256
+ message.recipient_fullname, message.text, message.sender, message.attributes, message.type, message.metadata, message.timestamp, message.group)
257
+ .then(function(data){
258
+ winston.info("Chat21Sender sendToGroup test: "+ JSON.stringify(data));
259
+ });
260
+ });
250
261
 
251
262
 
252
263
  messageEvent.on('message.sending', function(message) {
@@ -255,7 +266,8 @@ class Chat21Handler {
255
266
  // TODO perche nn c'è setImmedite? per performace
256
267
 
257
268
 
258
- winston.verbose("Chat21Sender on message.sending ", message);
269
+ winston.verbose("Chat21Sender on message.sending: "+ message.text);
270
+ winston.debug("Chat21Sender on message.sending ", message);
259
271
 
260
272
  if (message &&
261
273
  message.status === MessageConstants.CHAT_MESSAGE_STATUS.SENDING &&
@@ -282,7 +294,8 @@ class Chat21Handler {
282
294
 
283
295
 
284
296
 
285
- winston.verbose("Chat21Sender sending message.sending ", message);
297
+ winston.verbose("Chat21Sender sending message.sending: "+ message.text);
298
+ winston.debug("Chat21Sender sending message.sending ", message);
286
299
 
287
300
  // chat21Util.getParsedMessage().then(function(messageData) {
288
301
  // message = messageData;
@@ -299,7 +312,8 @@ class Chat21Handler {
299
312
  }
300
313
 
301
314
  var recipient_fullname = "Guest";
302
- // TODO qui va message.recipient_fullname ma nn c'è
315
+ // guest_here
316
+
303
317
  if (message.request && message.request.lead && message.request.lead.fullname) {
304
318
  recipient_fullname = message.request.lead.fullname;
305
319
  }
@@ -332,6 +346,9 @@ class Chat21Handler {
332
346
  }
333
347
  */
334
348
 
349
+ // performance console log
350
+ // console.log("************* send message chat21: "+new Date().toISOString(), message.text );
351
+
335
352
  return chat21.messages.sendToGroup(message.senderFullname, message.recipient,
336
353
  recipient_fullname, message.text, message.sender, attributes, message.type, message.metadata, timestamp)
337
354
  .then(function(data){
@@ -339,7 +356,11 @@ class Chat21Handler {
339
356
 
340
357
 
341
358
  // chat21.conversations.stopTyping(message.recipient,message.sender);
342
-
359
+
360
+
361
+ // performance console log
362
+ // console.log("************* senttt message chat21: "+new Date().toISOString(), message.text );
363
+
343
364
  chat21Event.emit('message.sent', data);
344
365
 
345
366
  messageService.changeStatus(message._id, MessageConstants.CHAT_MESSAGE_STATUS.DELIVERED) .then(function(upMessage){
@@ -366,6 +387,7 @@ class Chat21Handler {
366
387
 
367
388
  chat21.auth.setAdminToken(adminToken);
368
389
 
390
+ winston.debug("Chat21Sender");
369
391
  // send: function(sender_fullname, recipient_id, recipient_fullname, text, sender_id, attributes, type, metadata){
370
392
  return chat21.messages.send(message.senderFullname, message.recipient,
371
393
  message.recipientFullname, message.text, message.sender, message.attributes, message.type, message.metadata)
@@ -563,16 +585,25 @@ class Chat21Handler {
563
585
  var groupId = request.request_id;
564
586
 
565
587
  var group_name = "Guest";
566
-
588
+ // guest_here
589
+
567
590
  if (request.lead && request.lead.fullname) {
568
591
  group_name = request.lead.fullname;
569
592
  }
570
593
  if (request.subject) {
571
594
  group_name = request.subject;
572
595
  }
596
+
597
+ // performance console log
598
+ // console.log("************* before request.support_group.created: "+new Date().toISOString());
599
+
573
600
  //TODO racecondition?
574
601
  return chat21.groups.create(group_name, members, gAttributes, groupId).then(function(data) {
575
- winston.verbose("Chat21 group created: " + JSON.stringify(data));
602
+ winston.verbose("Chat21 group created: " + JSON.stringify(data));
603
+
604
+ // performance console log
605
+ // console.log("************* after request.support_group.created: "+new Date().toISOString());
606
+
576
607
  requestEvent.emit('request.support_group.created', request);
577
608
 
578
609
  chat21Event.emit('group.create', data);
@@ -9,6 +9,8 @@ var Project_user = require("../../models/project_user");
9
9
  var RequestConstants = require("../../models/requestConstants");
10
10
 
11
11
  var cacheUtil = require('../../utils/cacheUtil');
12
+ var cacheEnabler = require("../../services/cacheEnabler");
13
+
12
14
 
13
15
  var mongoose = require('mongoose');
14
16
  var winston = require('../../config/winston');
@@ -73,11 +75,17 @@ router.post('/', function (req, res) {
73
75
  winston.debug("Chat21 message", message);
74
76
 
75
77
  // requestcachefarequi nocachepopulatereqired
76
- return Request.findOne({request_id: message.recipient})
78
+ let q = Request.findOne({request_id: message.recipient})
79
+
80
+ if (cacheEnabler.request) {
81
+ q.cache(cacheUtil.defaultTTL, "requests:request_id:"+message.recipient+":simple"); //request_cache
82
+ // project_id not available
83
+ winston.debug('request cache enabled');
84
+ }
85
+ return q.exec(function(err, request) {
86
+
77
87
  // before request_id id_project unique - commented
78
- // return Request.findOne({request_id: message.recipient, id_project: projectid})
79
- // .cache(cacheUtil.defaultTTL, req.projectid+":requests:request_id:"+requestid) project_id not available
80
- .exec(function(err, request) {
88
+
81
89
 
82
90
  if (err) {
83
91
  return res.status(500).send({success: false, msg: 'Error getting the request.', err:err});
@@ -205,9 +213,9 @@ router.post('/', function (req, res) {
205
213
  // var auto_close;
206
214
 
207
215
  // // qui projecy nn c'è devi leggerlo
208
- // if (req.project.attributes.auto_close === false) {
209
- // auto_close = 10;
210
- // }
216
+ // // if (req.project.attributes.auto_close === false) {
217
+ // // auto_close = 10;
218
+ // // }
211
219
 
212
220
 
213
221
  var new_request = {
@@ -235,10 +243,10 @@ router.post('/', function (req, res) {
235
243
  // upsert(id, sender, senderFullname, recipient, text, id_project, createdBy, status, attributes, type, metadata, language)
236
244
  return messageService.upsert(messageId, message.sender, message.sender_fullname, message.recipient, message.text,
237
245
  projectid, null, MessageConstants.CHAT_MESSAGE_STATUS.RECEIVED, message.attributes, message.type, message.metadata, language).then(function(savedMessage){
238
-
239
- return requestService.incrementMessagesCountByRequestId(savedRequest.request_id, savedRequest.id_project).then(function(savedRequestWithIncrement) {
240
- return res.json(savedRequestWithIncrement);
241
- });
246
+ return res.json(savedRequest);
247
+ // return requestService.incrementMessagesCountByRequestId(savedRequest.request_id, savedRequest.id_project).then(function(savedRequestWithIncrement) {
248
+ // return res.json(savedRequestWithIncrement);
249
+ // });
242
250
 
243
251
 
244
252
  }).catch(function (err) {
@@ -295,23 +303,23 @@ router.post('/', function (req, res) {
295
303
 
296
304
  // TOOD update also request attributes and sourcePage
297
305
 
298
- return requestService.incrementMessagesCountByRequestId(request.request_id, request.id_project).then(function(savedRequest) {
306
+ // return requestService.incrementMessagesCountByRequestId(request.request_id, request.id_project).then(function(savedRequest) {
299
307
  // winston.debug("savedRequest.participants.indexOf(message.sender)", savedRequest.participants.indexOf(message.sender));
300
308
 
301
309
  // TODO it doesn't work for internal requests bacause participanets == message.sender⁄
302
- if (savedRequest.participants && savedRequest.participants.indexOf(message.sender) > -1) { //update waiitng time if write an agent (member of participants)
303
- winston.debug("updateWaitingTimeByRequestId");
304
- return requestService.updateWaitingTimeByRequestId(request.request_id, request.id_project).then(function(upRequest) {
310
+ if (request.participants && request.participants.indexOf(message.sender) > -1) { //update waiitng time if write an agent (member of participants)
311
+ winston.debug("updateWaitingTimeByRequestId*******");
312
+ return requestService.updateWaitingTimeByRequestId(request.request_id, request.id_project, false).then(function(upRequest) {
305
313
  return res.json(upRequest);
306
314
  });
307
315
  }else {
308
- return res.json(savedRequest);
316
+ return res.json(savedMessage);
309
317
  }
310
- });
311
- }).catch(function(err){
312
- winston.error("Error creating message", {err: err, message: message});
313
- return res.status(500).send({success: false, msg: 'Error creating message', err:err });
314
- });
318
+ // });
319
+ }).catch(function(err){
320
+ winston.error("Error creating chat21 webhook message: "+ JSON.stringify({err: err, message: message}));
321
+ return res.status(500).send({success: false, msg: 'Error creating message', err:err });
322
+ });
315
323
 
316
324
 
317
325
 
@@ -383,9 +391,12 @@ router.post('/', function (req, res) {
383
391
  var query = {request_id: recipient_id, id_project: projectId};
384
392
  winston.debug('query:'+ projectId);
385
393
 
386
- return Request.findOne(query)
387
- //@DISABLED_CACHE cacheUtil.defaultTTL, projectId+":requests:request_id:"+recipient_id)
388
- .exec(function(err, request) {
394
+ let q = Request.findOne(query);
395
+ // if (cacheEnabler.request) {
396
+ // q.cache(cacheUtil.defaultTTL, projectId+":requests:request_id:"+recipient_id+":simple"); //request_cache NOT IMPORTANT HERE
397
+ // winston.debug('project cache enabled');
398
+ // }
399
+ return q.exec(function(err, request) {
389
400
 
390
401
  if (err) {
391
402
  winston.error("Error finding request with query ", query);
@@ -467,7 +478,7 @@ router.post('/', function (req, res) {
467
478
 
468
479
  // requestcachefarequi populaterequired
469
480
  return Request.findOne({request_id: request_id, id_project: id_project})
470
- .populate('lead') //TODO posso prenderlo da snapshot senza populate
481
+ .populate('lead') //TODO posso prenderlo da snapshot senza populate cache_attention
471
482
  .exec(function(err, request) {
472
483
  if (err){
473
484
  winston.error(err);
@@ -480,6 +491,10 @@ router.post('/', function (req, res) {
480
491
 
481
492
  winston.debug("request",request.toObject());
482
493
  // lead_id used. Change it?
494
+
495
+ // winston.info("request.snapshot.lead",request.snapshot.lead);
496
+ // if (request.snapshot.lead && request.snapshot.lead.lead_id==new_member) {
497
+
483
498
  if (request.lead && request.lead.lead_id==new_member) {
484
499
  winston.debug("don't joining request.lead or a lead");
485
500
  return res.status(400).send({success: false, msg: "don't joining request.lead or a lead" });
@@ -543,7 +558,7 @@ router.post('/', function (req, res) {
543
558
  });
544
559
  }
545
560
 
546
- else if (req.body.event_type == "deleted-archivedconversation") {
561
+ else if (req.body.event_type == "deleted-archivedconversation" || req.body.event_type == "conversation-unarchived") {
547
562
 
548
563
  winston.debug("event_type","deleted-archivedconversation");
549
564
 
@@ -555,7 +570,7 @@ router.post('/', function (req, res) {
555
570
  }
556
571
 
557
572
 
558
- var conversation = req.body.data;
573
+ var conversation = req.body.data;
559
574
  // winston.debug("conversation",conversation);
560
575
 
561
576
  var user_id = req.body.user_id;
@@ -572,16 +587,24 @@ router.post('/', function (req, res) {
572
587
  return res.status(400).send({success: false, msg: "not a support conversation" });
573
588
  }
574
589
 
590
+
591
+
575
592
  if (user_id!="system"){
576
593
  winston.debug("not a system conversation");
577
594
  return res.status(400).send({success: false, msg: "not a system conversation" });
578
595
  }
579
596
 
580
597
 
598
+
599
+ // scrivo... nuova viene popolato projectid in attributes poi chiudo ed in archived c'è projectid
600
+ // quando scrivo viene cancellato archived e nuovo messaggio crea conv ma senza project id... lineare che è cosi
601
+ // si verifica solo se admin (da ionic ) archivia di nuovo senza che widget abbia scritto nulla (widget risetta projectid in properties)
602
+
581
603
  var id_project;
582
604
  if (conversation && conversation.attributes) {
583
605
  id_project = conversation.attributes.projectId;
584
606
  }else {
607
+ winston.debug( "not a support deleting archived conversation" );
585
608
  return res.status(400).send({success: false, msg: "not a support deleting archived conversation" });
586
609
  }
587
610
  winston.debug("id_project", id_project);
@@ -598,7 +621,7 @@ router.post('/', function (req, res) {
598
621
  }
599
622
  else if (req.body.event_type == "typing-start") {
600
623
 
601
- winston.debug("event_type","typing-start");
624
+ winston.debug("event_type typing-start");
602
625
 
603
626
  winston.debug("typing-start req.body",req.body);
604
627
 
@@ -626,7 +649,7 @@ else if (req.body.event_type == "typing-start") {
626
649
  // requestcachefarequi nocachepopulatereqired
627
650
  return Request.findOne({request_id: recipient_id})
628
651
  //TOD errore cache sistemare e riabbilitare->
629
- // .cache(cacheUtil.defaultTTL, req.projectid+":requests:request_id:"+recipient_id)
652
+ // .cache(cacheUtil.defaultTTL, req.projectid+":requests:request_id:"+recipient_id) cache_attention
630
653
  .exec(function(err, request) {
631
654
  if (err){
632
655
  winston.error(err);