@tiledesk/tiledesk-server 2.3.5 → 2.3.7-1.1

Sign up to get free protection for your applications and to get access to all the features.
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);