@tiledesk/tiledesk-server 2.3.5 → 2.3.7-1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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);
|