@tiledesk/tiledesk-server 2.3.6 → 2.3.7-1.2

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 +62 -34
  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 +2 -2
  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});
@@ -202,14 +210,20 @@ router.post('/', function (req, res) {
202
210
  }
203
211
 
204
212
 
205
-
213
+ // var auto_close;
214
+
215
+ // // qui projecy nn c'è devi leggerlo
216
+ // // if (req.project.attributes.auto_close === false) {
217
+ // // auto_close = 10;
218
+ // // }
219
+
206
220
 
207
221
  var new_request = {
208
222
  request_id: message.recipient, project_user_id:project_user_id, lead_id:createdLead._id, id_project:projectid, first_text:message.text,
209
223
  departmentid:departmentid, sourcePage:sourcePage, language:language, userAgent:client, status:requestStatus, createdBy: undefined,
210
224
  attributes:rAttributes, subject:undefined, preflight:false, channel:undefined, location:undefined,
211
225
  lead:createdLead, requester:project_user
212
-
226
+ // , auto_close: auto_close
213
227
  };
214
228
 
215
229
  winston.debug("new_request", new_request);
@@ -229,10 +243,10 @@ router.post('/', function (req, res) {
229
243
  // upsert(id, sender, senderFullname, recipient, text, id_project, createdBy, status, attributes, type, metadata, language)
230
244
  return messageService.upsert(messageId, message.sender, message.sender_fullname, message.recipient, message.text,
231
245
  projectid, null, MessageConstants.CHAT_MESSAGE_STATUS.RECEIVED, message.attributes, message.type, message.metadata, language).then(function(savedMessage){
232
-
233
- return requestService.incrementMessagesCountByRequestId(savedRequest.request_id, savedRequest.id_project).then(function(savedRequestWithIncrement) {
234
- return res.json(savedRequestWithIncrement);
235
- });
246
+ return res.json(savedRequest);
247
+ // return requestService.incrementMessagesCountByRequestId(savedRequest.request_id, savedRequest.id_project).then(function(savedRequestWithIncrement) {
248
+ // return res.json(savedRequestWithIncrement);
249
+ // });
236
250
 
237
251
 
238
252
  }).catch(function (err) {
@@ -289,23 +303,23 @@ router.post('/', function (req, res) {
289
303
 
290
304
  // TOOD update also request attributes and sourcePage
291
305
 
292
- 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) {
293
307
  // winston.debug("savedRequest.participants.indexOf(message.sender)", savedRequest.participants.indexOf(message.sender));
294
308
 
295
309
  // TODO it doesn't work for internal requests bacause participanets == message.sender⁄
296
- if (savedRequest.participants && savedRequest.participants.indexOf(message.sender) > -1) { //update waiitng time if write an agent (member of participants)
297
- winston.debug("updateWaitingTimeByRequestId");
298
- 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) {
299
313
  return res.json(upRequest);
300
314
  });
301
315
  }else {
302
- return res.json(savedRequest);
316
+ return res.json(savedMessage);
303
317
  }
304
- });
305
- }).catch(function(err){
306
- winston.error("Error creating message", {err: err, message: message});
307
- return res.status(500).send({success: false, msg: 'Error creating message', err:err });
308
- });
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
+ });
309
323
 
310
324
 
311
325
 
@@ -377,9 +391,12 @@ router.post('/', function (req, res) {
377
391
  var query = {request_id: recipient_id, id_project: projectId};
378
392
  winston.debug('query:'+ projectId);
379
393
 
380
- return Request.findOne(query)
381
- //@DISABLED_CACHE cacheUtil.defaultTTL, projectId+":requests:request_id:"+recipient_id)
382
- .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) {
383
400
 
384
401
  if (err) {
385
402
  winston.error("Error finding request with query ", query);
@@ -461,7 +478,7 @@ router.post('/', function (req, res) {
461
478
 
462
479
  // requestcachefarequi populaterequired
463
480
  return Request.findOne({request_id: request_id, id_project: id_project})
464
- .populate('lead') //TODO posso prenderlo da snapshot senza populate
481
+ .populate('lead') //TODO posso prenderlo da snapshot senza populate cache_attention
465
482
  .exec(function(err, request) {
466
483
  if (err){
467
484
  winston.error(err);
@@ -474,6 +491,10 @@ router.post('/', function (req, res) {
474
491
 
475
492
  winston.debug("request",request.toObject());
476
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
+
477
498
  if (request.lead && request.lead.lead_id==new_member) {
478
499
  winston.debug("don't joining request.lead or a lead");
479
500
  return res.status(400).send({success: false, msg: "don't joining request.lead or a lead" });
@@ -539,7 +560,7 @@ router.post('/', function (req, res) {
539
560
 
540
561
  else if (req.body.event_type == "deleted-archivedconversation" || req.body.event_type == "conversation-unarchived") {
541
562
 
542
- winston.info("event_type","deleted-archivedconversation");
563
+ winston.debug("event_type","deleted-archivedconversation");
543
564
 
544
565
  winston.debug("req.body",req.body);
545
566
 
@@ -549,37 +570,44 @@ router.post('/', function (req, res) {
549
570
  }
550
571
 
551
572
 
552
- var conversation = req.body.data;
573
+ var conversation = req.body.data;
553
574
  // winston.debug("conversation",conversation);
554
575
 
555
576
  var user_id = req.body.user_id;
556
- winston.info("user_id",user_id);
577
+ winston.debug("user_id",user_id);
557
578
 
558
579
  var recipient_id = req.body.recipient_id;
559
- winston.info("recipient_id",recipient_id);
580
+ winston.debug("recipient_id",recipient_id);
560
581
 
561
582
 
562
583
  // TODO leggi projectid from support-group
563
584
 
564
585
  if (!recipient_id.startsWith("support-group")){
565
- winston.info("not a support conversation");
586
+ winston.debug("not a support conversation");
566
587
  return res.status(400).send({success: false, msg: "not a support conversation" });
567
588
  }
568
589
 
590
+
591
+
569
592
  if (user_id!="system"){
570
- winston.info("not a system conversation");
593
+ winston.debug("not a system conversation");
571
594
  return res.status(400).send({success: false, msg: "not a system conversation" });
572
595
  }
573
596
 
574
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
+
575
603
  var id_project;
576
604
  if (conversation && conversation.attributes) {
577
605
  id_project = conversation.attributes.projectId;
578
606
  }else {
579
- winston.info( "not a support deleting archived conversation" );
607
+ winston.debug( "not a support deleting archived conversation" );
580
608
  return res.status(400).send({success: false, msg: "not a support deleting archived conversation" });
581
609
  }
582
- winston.info("id_project", id_project);
610
+ winston.debug("id_project", id_project);
583
611
 
584
612
 
585
613
  return requestService.reopenRequestByRequestId(recipient_id, id_project).then(function(updatedRequest) {
@@ -593,7 +621,7 @@ router.post('/', function (req, res) {
593
621
  }
594
622
  else if (req.body.event_type == "typing-start") {
595
623
 
596
- winston.debug("event_type","typing-start");
624
+ winston.debug("event_type typing-start");
597
625
 
598
626
  winston.debug("typing-start req.body",req.body);
599
627
 
@@ -621,7 +649,7 @@ else if (req.body.event_type == "typing-start") {
621
649
  // requestcachefarequi nocachepopulatereqired
622
650
  return Request.findOne({request_id: recipient_id})
623
651
  //TOD errore cache sistemare e riabbilitare->
624
- // .cache(cacheUtil.defaultTTL, req.projectid+":requests:request_id:"+recipient_id)
652
+ // .cache(cacheUtil.defaultTTL, req.projectid+":requests:request_id:"+recipient_id) cache_attention
625
653
  .exec(function(err, request) {
626
654
  if (err){
627
655
  winston.error(err);