@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.
- package/.github/workflows/docker-community-worker-push-latest.yml +23 -0
- package/.github/workflows/docker-image-tag-worker-community-tag-push.yml +22 -0
- package/CHANGELOG.md +361 -3
- package/Dockerfile-jobs +31 -0
- package/app.js +62 -69
- package/channels/chat21/chat21Handler.js +37 -6
- package/channels/chat21/chat21WebHook.js +52 -29
- package/channels/chat21/package-lock.json +663 -706
- package/channels/chat21/package.json +2 -2
- package/config/labels/widget.json +337 -136
- package/deploy.sh +2 -0
- package/event/messageEvent.js +110 -9
- package/jobs.js +80 -0
- package/jobsManager.js +47 -0
- package/middleware/has-role.js +10 -3
- package/middleware/ipFilter.js +220 -0
- package/middleware/passport.js +8 -2
- package/models/department.js +1 -1
- package/models/faq.js +77 -25
- package/models/faq_kb.js +19 -0
- package/models/message.js +10 -8
- package/models/project.js +10 -0
- package/models/project_user.js +10 -0
- package/models/request.js +12 -1
- package/package.json +12 -11
- package/pubmodules/activities/activityArchiver.js +216 -90
- package/pubmodules/activities/routes/activity.js +1 -1
- package/pubmodules/apps/index.js +8 -0
- package/pubmodules/apps/listener.js +27 -0
- package/pubmodules/cache/index.js +2 -0
- package/pubmodules/cache/mongoose-cachegoose-fn.js +630 -0
- package/pubmodules/canned/cannedResponse.js +4 -0
- package/pubmodules/canned/cannedResponseRoute.js +10 -5
- package/pubmodules/dialogflow/index.js +10 -0
- package/pubmodules/dialogflow/listener.js +66 -0
- package/pubmodules/emailNotification/requestNotification.js +58 -28
- package/pubmodules/events/eventRoute.js +49 -24
- package/pubmodules/messageTransformer/messageHandlebarsTransformerInterceptor.js +6 -1
- package/pubmodules/messageTransformer/messageTransformerInterceptor.js +10 -4
- package/pubmodules/pubModulesManager.js +173 -7
- package/pubmodules/queue/index.js +4 -0
- package/pubmodules/queue/reconnect.js +331 -0
- package/pubmodules/queue/reconnectFanout.js +256 -0
- package/pubmodules/rasa/listener.js +5 -5
- package/pubmodules/routing-queue/index.js +3 -0
- package/pubmodules/routing-queue/listener.js +328 -0
- package/pubmodules/rules/conciergeBot.js +4 -4
- package/pubmodules/scheduler/tasks/closeAgentUnresponsiveRequestTask.js +6 -1
- package/pubmodules/scheduler/tasks/closeBotUnresponsiveRequestTask.js +7 -1
- package/pubmodules/tilebot/index.js +11 -0
- package/pubmodules/tilebot/listener.js +85 -0
- package/pubmodules/trigger/rulesTrigger.js +137 -14
- package/pubmodules/trigger/start.js +5 -1
- package/pubmodules/whatsapp/index.js +7 -0
- package/pubmodules/whatsapp/listener.js +32 -0
- package/routes/auth.js +7 -2
- package/routes/campaigns.js +3 -3
- package/routes/department.js +3 -2
- package/routes/email.js +32 -2
- package/routes/faq.js +37 -2
- package/routes/faq_kb.js +496 -133
- package/routes/faqpub.js +5 -0
- package/routes/lead.js +56 -0
- package/routes/message.js +196 -14
- package/routes/messagesRoot.js +39 -0
- package/routes/project.js +76 -4
- package/routes/project_user.js +11 -1
- package/routes/project_user_test.js +19 -0
- package/routes/request.js +134 -30
- package/routes/troubleshooting.js +12 -0
- package/routes/users-util.js +39 -0
- package/routes/users.js +1 -1
- package/routes/widget.js +64 -2
- package/services/BotSubscriptionNotifier.js +5 -0
- package/services/banUserNotifier.js +86 -0
- package/services/cacheEnabler.js +56 -0
- package/services/chatbotService.js +101 -0
- package/services/departmentService.js +25 -3
- package/services/emailService.js +170 -28
- package/services/faqBotHandler.js +2 -3
- package/services/faqService.js +28 -3
- package/services/geoService.js +36 -6
- package/services/labelService.js +1 -1
- package/services/leadService.js +3 -2
- package/services/messageService.js +4 -2
- package/services/modulesManager.js +23 -76
- package/services/operatingHoursService.js +9 -4
- package/services/requestService.js +75 -39
- package/services/subscriptionNotifier.js +9 -4
- package/services/trainingService.js +106 -0
- package/template/email/assignedEmailMessage.html +21 -11
- package/template/email/assignedRequest.html +21 -11
- package/template/email/beenInvitedExistingUser.html +16 -6
- package/template/email/beenInvitedNewUser.html +16 -6
- package/template/email/emailDirect.html +130 -0
- package/template/email/newMessage.html +18 -8
- package/template/email/newMessageFollower.html +22 -12
- package/template/email/passwordChanged.html +15 -5
- package/template/email/pooledEmailMessage.html +21 -11
- package/template/email/pooledRequest.html +20 -10
- package/template/email/resetPassword.html +15 -5
- package/template/email/sendTranscript.html +7 -4
- package/template/email/ticket.html +17 -7
- package/template/email/verify.html +15 -5
- package/test/cannedRoute.js +157 -0
- package/test/chatbot-mock.js +127 -0
- package/test/example-json-intents.txt +1 -0
- package/test/example-json.txt +1 -0
- package/test/example.json +1 -0
- package/test/faqRoute.js +353 -208
- package/test/faqkbRoute.js +669 -64
- package/test/imageRoute.js +1 -1
- package/test/messageRoute.js +387 -5
- package/test/requestRoute.js +6 -6
- package/test/requestService.js +55 -4
- package/test-int/cache-project.js +90 -0
- package/test-int/cache-project_user.js +88 -0
- package/utils/UIDGenerator.js +20 -0
- package/utils/cacheUtil.js +2 -2
- package/utils/orgUtil.js +3 -3
- package/utils/promiseUtil.js +31 -0
- package/utils/recipientEmailUtil.js +66 -0
- package/utils/sendEmailUtil.js +34 -0
- package/utils/sendMessageUtil.js +1 -1
- package/utils/stringUtil.js +12 -0
- 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
|
-
|
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
|
-
|
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
|
-
|
313
|
-
|
314
|
-
|
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('
|
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.
|
460
|
-
app.use('/:projectid/intents', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.
|
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.
|
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.
|
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 "
|
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 "
|
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
|
-
//
|
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
|
-
|
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
|
-
|
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 (
|
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(
|
316
|
+
return res.json(savedMessage);
|
309
317
|
}
|
310
|
-
});
|
311
|
-
|
312
|
-
|
313
|
-
|
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
|
-
|
387
|
-
|
388
|
-
.
|
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
|
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);
|