@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.
- 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 +62 -34
- 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 +2 -2
- 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});
|
|
@@ -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 (
|
|
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(
|
|
316
|
+
return res.json(savedMessage);
|
|
303
317
|
}
|
|
304
|
-
});
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
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
|
-
|
|
381
|
-
|
|
382
|
-
.
|
|
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.
|
|
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.
|
|
577
|
+
winston.debug("user_id",user_id);
|
|
557
578
|
|
|
558
579
|
var recipient_id = req.body.recipient_id;
|
|
559
|
-
winston.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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);
|