@tiledesk/tiledesk-server 2.2.15 → 2.2.18
Sign up to get free protection for your applications and to get access to all the features.
- package/CHANGELOG.md +17 -2
- package/README.md +1 -1
- package/app.js +46 -4
- package/config/labels/widget.json +14 -14
- package/models/request.js +1 -1
- package/models/routerLogger.js +57 -0
- package/package.json +3 -3
- package/pubmodules/events/eventRoute.js +2 -2
- package/pubmodules/messageTransformer/index.js +4 -1
- package/pubmodules/messageTransformer/messageHandlebarsTransformerInterceptor.js +83 -0
- package/pubmodules/pubModulesManager.js +1 -0
- package/routes/email.js +32 -0
- package/routes/project.js +108 -1
- package/routes/request.js +10 -4
- package/routes/user-request.js +3 -1
- package/services/emailService.js +14 -12
- package/services/faqBotHandler.js +6 -6
- package/services/{faqBotSupport copy.js → faqBotSupport copy.js_consplit} +0 -0
- package/services/faqBotSupport.js +6 -5
- package/services/requestService.js +36 -19
- package/test/departmentService.js +10 -9
- package/test/messageRoute.js +4 -4
- package/test/requestRoute.js +26 -16
- package/test/requestService.js +90 -74
- package/test-int/bot copy.js +0 -2074
package/CHANGELOG.md
CHANGED
@@ -1,10 +1,25 @@
|
|
1
|
-
# 2.2.
|
1
|
+
# 2.2.18
|
2
|
+
- Router logger module enable with ROUTELOGGER_ENABLED=true
|
3
|
+
|
4
|
+
|
5
|
+
# 2.2.17 -> PROD
|
6
|
+
- Removed default fallback limit on parse reply
|
2
7
|
|
8
|
+
# 2.2.16
|
9
|
+
- Email templates endpoint
|
10
|
+
- Created request.updated event for request event and deprecated request.update.comment
|
11
|
+
- Added Handlebars template processor for the message transformer module only if message.attributes.templateProcessor=true
|
12
|
+
- Email test send endpoint
|
13
|
+
- Bugfix widget label
|
14
|
+
- Added /intents alias for /faq endpoint
|
15
|
+
- The request_id field of the request model has now a unique index
|
16
|
+
|
17
|
+
# 2.2.15
|
3
18
|
- Added catch messageService.send for bot
|
4
19
|
- Added external searcher for bot( ex. Rasa proxy)
|
5
20
|
- Faq language fix taken from bot language for create single and import from csv
|
6
21
|
- Lower case reset password fix
|
7
|
-
- Added alias /bots for /faq_kb
|
22
|
+
- Added alias /bots for /faq_kb
|
8
23
|
|
9
24
|
# 2.2.14
|
10
25
|
- Fix Tiledesk Queue 1.1.11 with authEvent.queueEnabled = true
|
package/README.md
CHANGED
@@ -15,7 +15,7 @@ You can find more info here: https://developer.tiledesk.com
|
|
15
15
|
|
16
16
|
# Prerequisites
|
17
17
|
|
18
|
-
* [Nodejs](https://www.npmjs.com/) and npm installed
|
18
|
+
* [Nodejs](https://www.npmjs.com/) and npm installed. Suggested versions are NodeJS 12.20.2 and NPM 6.14.11
|
19
19
|
* [MongoDb](https://www.mongodb.com) installed
|
20
20
|
|
21
21
|
# Running Tiledesk Server
|
package/app.js
CHANGED
@@ -102,11 +102,12 @@ var campaigns = require('./routes/campaigns');
|
|
102
102
|
var logs = require('./routes/logs');
|
103
103
|
var requestUtilRoot = require('./routes/requestUtilRoot');
|
104
104
|
var urls = require('./routes/urls');
|
105
|
+
var email = require('./routes/email');
|
105
106
|
|
106
107
|
var bootDataLoader = require('./services/bootDataLoader');
|
107
108
|
var settingDataLoader = require('./services/settingDataLoader');
|
108
109
|
var schemaMigrationService = require('./services/schemaMigrationService');
|
109
|
-
|
110
|
+
var RouterLogger = require('./models/routerLogger');
|
110
111
|
|
111
112
|
require('./services/mongoose-cache-fn')(mongoose);
|
112
113
|
|
@@ -221,7 +222,42 @@ app.options('*', cors());
|
|
221
222
|
// const customRedisRateLimiter = require("./rateLimiter").customRedisRateLimiter;
|
222
223
|
// app.use(customRedisRateLimiter);
|
223
224
|
|
225
|
+
if (process.env.ROUTELOGGER_ENABLED==="true") {
|
226
|
+
winston.info("RouterLogger enabled ");
|
227
|
+
app.use(function (req, res, next) {
|
228
|
+
// winston.error("log ", req);
|
229
|
+
|
230
|
+
try {
|
231
|
+
var projectid = req.projectid;
|
232
|
+
winston.debug("RouterLogger projectIdSetter projectid:" + projectid);
|
233
|
+
|
234
|
+
var fullUrl = req.protocol + '://' + req.get('host') + req.originalUrl;
|
235
|
+
winston.debug("fullUrl:"+ fullUrl);
|
236
|
+
winston.debug("req.get('origin'):" + req.get('origin'));
|
237
|
+
|
238
|
+
var routerLogger = new RouterLogger({
|
239
|
+
origin: req.get('origin'),
|
240
|
+
fullurl: fullUrl,
|
241
|
+
url: req.originalUrl.split("?").shift(),
|
242
|
+
id_project: projectid,
|
243
|
+
});
|
244
|
+
|
245
|
+
routerLogger.save(function (err, savedRouterLogger) {
|
246
|
+
if (err) {
|
247
|
+
winston.error('Error saving RouterLogger ', err)
|
248
|
+
}
|
249
|
+
winston.debug("RouterLogger saved "+ savedRouterLogger);
|
250
|
+
next();
|
251
|
+
});
|
252
|
+
}catch(e) {
|
253
|
+
winston.error('Error saving RouterLogger ', e)
|
254
|
+
next();
|
255
|
+
}
|
256
|
+
});
|
224
257
|
|
258
|
+
} else {
|
259
|
+
winston.info("RouterLogger disabled ");
|
260
|
+
}
|
225
261
|
|
226
262
|
app.get('/', function (req, res) {
|
227
263
|
res.send('Hello from Tiledesk server. It\'s UP. See the documentation here http://developer.tiledesk.com');
|
@@ -275,6 +311,9 @@ var projectSetter = function (req, res, next) {
|
|
275
311
|
}
|
276
312
|
|
277
313
|
|
314
|
+
|
315
|
+
|
316
|
+
|
278
317
|
// app.use('/admin', admin);
|
279
318
|
|
280
319
|
//oauth2
|
@@ -283,6 +322,7 @@ var projectSetter = function (req, res, next) {
|
|
283
322
|
// app.post('/oauth/token', oauth2.token);
|
284
323
|
|
285
324
|
|
325
|
+
|
286
326
|
app.use('/auth', auth);
|
287
327
|
app.use('/testauth', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken], authtest);
|
288
328
|
|
@@ -294,7 +334,6 @@ app.use('/users', [passport.authenticate(['basic', 'jwt'], { session: false }),
|
|
294
334
|
app.use('/logs', logs);
|
295
335
|
app.use('/requests_util', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken], requestUtilRoot);
|
296
336
|
|
297
|
-
|
298
337
|
// TODO security issues
|
299
338
|
if (process.env.DISABLE_TRANSCRIPT_VIEW_PAGE ) {
|
300
339
|
winston.info(" Transcript view page is disabled");
|
@@ -333,15 +372,15 @@ app.use('/:projectid/departments', department);
|
|
333
372
|
|
334
373
|
channelManager.useUnderProjects(app);
|
335
374
|
|
336
|
-
|
375
|
+
//deprecated
|
337
376
|
app.use('/:projectid/faq', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('agent')], faq);
|
377
|
+
app.use('/:projectid/intents', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('agent')], faq);
|
338
378
|
|
339
379
|
//Deprecated??
|
340
380
|
app.use('/:projectid/faqpub', faqpub);
|
341
381
|
|
342
382
|
//deprecated
|
343
383
|
app.use('/:projectid/faq_kb', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('agent', ['bot','subscription'])], faq_kb);
|
344
|
-
// aggiorna doc
|
345
384
|
app.use('/:projectid/bots', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('agent', ['bot','subscription'])], faq_kb);
|
346
385
|
|
347
386
|
|
@@ -375,6 +414,8 @@ app.use('/:projectid/labels', [fetchLabels],labels);
|
|
375
414
|
|
376
415
|
app.use('/:projectid/campaigns',[passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('agent')], campaigns);
|
377
416
|
|
417
|
+
app.use('/:projectid/emails',[passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('owner')], email);
|
418
|
+
|
378
419
|
|
379
420
|
|
380
421
|
if (pubModulesManager) {
|
@@ -405,6 +446,7 @@ app.use(function (err, req, res, next) {
|
|
405
446
|
res.render('error');
|
406
447
|
});*/
|
407
448
|
|
449
|
+
|
408
450
|
// error handler
|
409
451
|
app.use((err, req, res, next) => {
|
410
452
|
winston.error("General error", err);
|
@@ -5,8 +5,8 @@
|
|
5
5
|
"LABEL_PLACEHOLDER": "type your message..",
|
6
6
|
"LABEL_START_NW_CONV": "New conversation",
|
7
7
|
"LABEL_FIRST_MSG": "Describe shortly your problem, you will be contacted by an agent.",
|
8
|
-
"LABEL_FIRST_MSG_NO_AGENTS": "🤔 All operators are offline at the moment. You can anyway describe your problem. It will be assigned to the support team who will
|
9
|
-
"LABEL_FIRST_MSG_OPERATING_HOURS_CLOSED": "🤔 Our offices are closed. You can anyway describe your problem. It will be assigned to the support team who will
|
8
|
+
"LABEL_FIRST_MSG_NO_AGENTS": "🤔 All operators are offline at the moment. You can anyway describe your problem. It will be assigned to the support team who will get back to you as soon as possible.",
|
9
|
+
"LABEL_FIRST_MSG_OPERATING_HOURS_CLOSED": "🤔 Our offices are closed. You can anyway describe your problem. It will be assigned to the support team who will get back to you as soon as possible.",
|
10
10
|
"LABEL_SELECT_TOPIC": "Select a topic",
|
11
11
|
"LABEL_COMPLETE_FORM": "Complete the form to start a conversation with the next available agent.",
|
12
12
|
"LABEL_FIELD_NAME": "Name",
|
@@ -63,8 +63,8 @@
|
|
63
63
|
|
64
64
|
"INFO_SUPPORT_USER_ADDED_SUBJECT":"you",
|
65
65
|
"INFO_SUPPORT_USER_ADDED_YOU_VERB":"you have been added ",
|
66
|
-
"INFO_SUPPORT_USER_ADDED_COMPLEMENT":"
|
67
|
-
"INFO_SUPPORT_USER_ADDED_VERB":"
|
66
|
+
"INFO_SUPPORT_USER_ADDED_COMPLEMENT":"the chat",
|
67
|
+
"INFO_SUPPORT_USER_ADDED_VERB":"joined",
|
68
68
|
"INFO_SUPPORT_CHAT_REOPENED":"Chat reopened",
|
69
69
|
"INFO_SUPPORT_CHAT_CLOSED":"Chat closed",
|
70
70
|
|
@@ -141,8 +141,8 @@
|
|
141
141
|
|
142
142
|
"INFO_SUPPORT_USER_ADDED_SUBJECT":"tu",
|
143
143
|
"INFO_SUPPORT_USER_ADDED_YOU_VERB":"sei stato aggiunto ",
|
144
|
-
"INFO_SUPPORT_USER_ADDED_COMPLEMENT":"
|
145
|
-
"INFO_SUPPORT_USER_ADDED_VERB":"
|
144
|
+
"INFO_SUPPORT_USER_ADDED_COMPLEMENT":"alla chat",
|
145
|
+
"INFO_SUPPORT_USER_ADDED_VERB":"si è unito",
|
146
146
|
"INFO_SUPPORT_CHAT_REOPENED":"Chat riaperta",
|
147
147
|
"INFO_SUPPORT_CHAT_CLOSED":"Chat chiusa",
|
148
148
|
|
@@ -217,8 +217,8 @@
|
|
217
217
|
|
218
218
|
"INFO_SUPPORT_USER_ADDED_SUBJECT":"toi",
|
219
219
|
"INFO_SUPPORT_USER_ADDED_YOU_VERB":"tu as été ajouté ",
|
220
|
-
"INFO_SUPPORT_USER_ADDED_COMPLEMENT":"
|
221
|
-
"INFO_SUPPORT_USER_ADDED_VERB":"
|
220
|
+
"INFO_SUPPORT_USER_ADDED_COMPLEMENT":"discuter",
|
221
|
+
"INFO_SUPPORT_USER_ADDED_VERB":"rejoint",
|
222
222
|
"INFO_SUPPORT_CHAT_REOPENED":"Chat rouvert",
|
223
223
|
"INFO_SUPPORT_CHAT_CLOSED":"Chat fermé",
|
224
224
|
|
@@ -293,8 +293,8 @@
|
|
293
293
|
|
294
294
|
"INFO_SUPPORT_USER_ADDED_SUBJECT":"usted",
|
295
295
|
"INFO_SUPPORT_USER_ADDED_YOU_VERB":"usted ha sido agregado ",
|
296
|
-
"INFO_SUPPORT_USER_ADDED_COMPLEMENT":"
|
297
|
-
"INFO_SUPPORT_USER_ADDED_VERB":"
|
296
|
+
"INFO_SUPPORT_USER_ADDED_COMPLEMENT":"para charlar",
|
297
|
+
"INFO_SUPPORT_USER_ADDED_VERB":"unido",
|
298
298
|
"INFO_SUPPORT_CHAT_REOPENED":"Chat reabierto",
|
299
299
|
"INFO_SUPPORT_CHAT_CLOSED":"Chat cerrado",
|
300
300
|
|
@@ -370,8 +370,8 @@
|
|
370
370
|
|
371
371
|
"INFO_SUPPORT_USER_ADDED_SUBJECT": "Sie",
|
372
372
|
"INFO_SUPPORT_USER_ADDED_YOU_VERB": "Sie wurden hinzugefügt ",
|
373
|
-
"INFO_SUPPORT_USER_ADDED_COMPLEMENT": "
|
374
|
-
"INFO_SUPPORT_USER_ADDED_VERB": "
|
373
|
+
"INFO_SUPPORT_USER_ADDED_COMPLEMENT": "zum Chatten",
|
374
|
+
"INFO_SUPPORT_USER_ADDED_VERB": "beigetreten",
|
375
375
|
"INFO_SUPPORT_CHAT_REOPENED": "Chat wieder geöffnet",
|
376
376
|
"INFO_SUPPORT_CHAT_CLOSED": "Chat geschlossen",
|
377
377
|
|
@@ -446,8 +446,8 @@
|
|
446
446
|
|
447
447
|
"INFO_SUPPORT_USER_ADDED_SUBJECT": "você",
|
448
448
|
"INFO_SUPPORT_USER_ADDED_YOU_VERB": "você foi adicionado ",
|
449
|
-
"INFO_SUPPORT_USER_ADDED_COMPLEMENT": "
|
450
|
-
"INFO_SUPPORT_USER_ADDED_VERB": "
|
449
|
+
"INFO_SUPPORT_USER_ADDED_COMPLEMENT": "para conversar",
|
450
|
+
"INFO_SUPPORT_USER_ADDED_VERB": "aderiu",
|
451
451
|
"INFO_SUPPORT_CHAT_REOPENED": "Chat reaberto",
|
452
452
|
"INFO_SUPPORT_CHAT_CLOSED": "Bate-papo fechado",
|
453
453
|
|
package/models/request.js
CHANGED
@@ -0,0 +1,57 @@
|
|
1
|
+
var mongoose = require('mongoose');
|
2
|
+
var Schema = mongoose.Schema;
|
3
|
+
var config = require('../config/database');
|
4
|
+
|
5
|
+
|
6
|
+
var winston = require('../config/winston');
|
7
|
+
|
8
|
+
var dbUrl = process.env.MONGODB_LOGS_URI || config.databaselogs || process.env.MONGODB_URI;
|
9
|
+
winston.info('VisitorCounterSchema dbUrl: '+dbUrl);
|
10
|
+
|
11
|
+
// mongoose.set('useFindAndModify', false); //??
|
12
|
+
// mongoose.set('useCreateIndex', true);
|
13
|
+
// mongoose.set('useUnifiedTopology', true);
|
14
|
+
|
15
|
+
var conn = mongoose.createConnection(dbUrl, { "autoIndex": true });
|
16
|
+
// var conn = mongoose.connect(dbUrl, { "useNewUrlParser": true, "autoIndex": true });
|
17
|
+
|
18
|
+
// db.getCollection('reqlogs').aggregate([ {$group:{_id:{id_project:"$id_project"}, "count":{$sum:1}}},{$sort:{"count":-1}}])
|
19
|
+
// db.getCollection('projects').find({"_id":ObjectId("5afeaf94404bff0014098f54")})
|
20
|
+
|
21
|
+
var RouterLoggerSchema = new Schema({
|
22
|
+
url: {
|
23
|
+
type: String,
|
24
|
+
index: true
|
25
|
+
},
|
26
|
+
fullurl: {
|
27
|
+
type: String,
|
28
|
+
index: true
|
29
|
+
},
|
30
|
+
|
31
|
+
// ip: {
|
32
|
+
// type: String,
|
33
|
+
// index: true
|
34
|
+
// },
|
35
|
+
// host: {
|
36
|
+
// type: String,
|
37
|
+
// index: true
|
38
|
+
// },
|
39
|
+
origin: {
|
40
|
+
type: String,
|
41
|
+
index: true
|
42
|
+
},
|
43
|
+
id_project: {
|
44
|
+
type: String,
|
45
|
+
index: true
|
46
|
+
//required: true
|
47
|
+
}
|
48
|
+
}, {
|
49
|
+
timestamps: true
|
50
|
+
}
|
51
|
+
);
|
52
|
+
|
53
|
+
var routerLogger = conn.model('router_logger', RouterLoggerSchema);
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
module.exports = routerLogger;
|
package/package.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"name": "@tiledesk/tiledesk-server",
|
3
3
|
"description": "The Tiledesk server module",
|
4
|
-
"version": "2.2.
|
4
|
+
"version": "2.2.18",
|
5
5
|
"scripts": {
|
6
6
|
"start": "node ./bin/www",
|
7
7
|
"pretest": "mongodb-runner start",
|
@@ -41,10 +41,10 @@
|
|
41
41
|
"@tiledesk-ent/tiledesk-server-payments": "^1.1.5",
|
42
42
|
"@tiledesk-ent/tiledesk-server-queue": "^1.1.11",
|
43
43
|
"@tiledesk-ent/tiledesk-server-request-history": "^1.1.5",
|
44
|
-
"@tiledesk-ent/tiledesk-server-resthook": "^1.1.
|
44
|
+
"@tiledesk-ent/tiledesk-server-resthook": "^1.1.53",
|
45
45
|
"@tiledesk-ent/tiledesk-server-routing-queue": "^1.1.11",
|
46
46
|
"@tiledesk-ent/tiledesk-server-tags": "^1.1.1",
|
47
|
-
"@tiledesk-ent/tiledesk-server-triggers": "^1.1.
|
47
|
+
"@tiledesk-ent/tiledesk-server-triggers": "^1.1.82",
|
48
48
|
"@tiledesk-ent/tiledesk-server-visitorcounter": "^1.1.1"
|
49
49
|
},
|
50
50
|
"dependencies": {
|
@@ -41,8 +41,8 @@ router.post('/', [
|
|
41
41
|
eventService.emit(req.body.name, req.body.attributes, req.projectid, pu, req.user.id, undefined, req.user).then(function(event) {
|
42
42
|
res.json(event);
|
43
43
|
}).catch(function(err) {
|
44
|
-
winston.error('Error saving the event '+ JSON.stringify(
|
45
|
-
return res.status(500).send({success: false, msg: 'Error saving the event '+ JSON.stringify(
|
44
|
+
winston.error('Error saving the event '+ JSON.stringify(event), err)
|
45
|
+
return res.status(500).send({success: false, msg: 'Error saving the event '+ JSON.stringify(event)});
|
46
46
|
});
|
47
47
|
|
48
48
|
// var newEvent = new Event({
|
@@ -1,6 +1,9 @@
|
|
1
1
|
const messageTransformerInterceptor = require("./messageTransformerInterceptor");
|
2
2
|
const microLanguageTransformerInterceptor = require("./microLanguageAttributesTransformerInterceptor");
|
3
|
+
const messageHandlebarsTransformerInterceptor = require("./messageHandlebarsTransformerInterceptor");
|
3
4
|
|
4
5
|
|
5
6
|
|
6
|
-
module.exports = {messageTransformerInterceptor:messageTransformerInterceptor,
|
7
|
+
module.exports = {messageTransformerInterceptor:messageTransformerInterceptor,
|
8
|
+
microLanguageTransformerInterceptor:microLanguageTransformerInterceptor,
|
9
|
+
messageHandlebarsTransformerInterceptor: messageHandlebarsTransformerInterceptor};
|
@@ -0,0 +1,83 @@
|
|
1
|
+
|
2
|
+
const messagePromiseEvent = require('../../event/messagePromiseEvent');
|
3
|
+
const Request = require('../../models/request');
|
4
|
+
var winston = require('../../config/winston');
|
5
|
+
var cacheUtil = require('../../utils/cacheUtil');
|
6
|
+
var handlebars = require('handlebars');
|
7
|
+
|
8
|
+
class MessageHandlebarsTransformerInterceptor {
|
9
|
+
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
listen() {
|
14
|
+
|
15
|
+
var that = this;
|
16
|
+
winston.info("MessageHandlebarsTransformerInterceptor listener start ");
|
17
|
+
|
18
|
+
|
19
|
+
messagePromiseEvent.on('message.create.simple.before', async (data) => {
|
20
|
+
winston.debug('MessageHandlebarsTransformerInterceptor message.create.simple.before', data);
|
21
|
+
|
22
|
+
var message = data.beforeMessage;
|
23
|
+
|
24
|
+
if (!message.text) { //for image i think
|
25
|
+
return data;
|
26
|
+
}
|
27
|
+
if (message.attributes && message.attributes.templateProcessor == true) {
|
28
|
+
|
29
|
+
// TODO if variables are presents
|
30
|
+
|
31
|
+
var q1 = Request.findOne({request_id: message.recipient, id_project: message.id_project});
|
32
|
+
|
33
|
+
// if (message.attributes && message.attributes.populateTemplate == true) {
|
34
|
+
q1.populate('lead').
|
35
|
+
populate('department').
|
36
|
+
populate('participatingBots').
|
37
|
+
populate('participatingAgents').
|
38
|
+
populate({path:'requester',populate:{path:'id_user'}});
|
39
|
+
// }
|
40
|
+
|
41
|
+
var request = await q1.
|
42
|
+
cache(cacheUtil.defaultTTL, message.id_project+":requests:request_id:"+message.recipient).
|
43
|
+
exec();
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
var requestJSON = request.toJSON();
|
48
|
+
|
49
|
+
winston.debug('request mti: ', requestJSON);
|
50
|
+
|
51
|
+
|
52
|
+
var template = handlebars.compile(message.text);
|
53
|
+
winston.debug('template: '+ template);
|
54
|
+
|
55
|
+
// var templateSpec = handlebars.precompile(message.text);
|
56
|
+
// winston.info('templateSpec: ', templateSpec);
|
57
|
+
|
58
|
+
|
59
|
+
var replacements = {
|
60
|
+
request: requestJSON,
|
61
|
+
};
|
62
|
+
|
63
|
+
// {{request.first_text}}
|
64
|
+
// {{request.participatingAgents.0.firstname}}
|
65
|
+
|
66
|
+
|
67
|
+
|
68
|
+
|
69
|
+
var text = template(replacements);
|
70
|
+
winston.debug('text: '+ text);
|
71
|
+
message.text=text;
|
72
|
+
|
73
|
+
}
|
74
|
+
winston.debug('data: ' + JSON.stringify(data) );
|
75
|
+
return data;
|
76
|
+
});
|
77
|
+
|
78
|
+
}
|
79
|
+
|
80
|
+
}
|
81
|
+
|
82
|
+
var messageHandlebarsTransformerInterceptor = new MessageHandlebarsTransformerInterceptor();
|
83
|
+
module.exports = messageHandlebarsTransformerInterceptor;
|
@@ -168,6 +168,7 @@ class PubModulesManager {
|
|
168
168
|
try {
|
169
169
|
this.messageTransformer.messageTransformerInterceptor.listen();
|
170
170
|
this.messageTransformer.microLanguageTransformerInterceptor.listen();
|
171
|
+
this.messageTransformer.messageHandlebarsTransformerInterceptor.listen();
|
171
172
|
winston.info("PubModulesManager messageTransformer started.");
|
172
173
|
} catch(err) {
|
173
174
|
winston.info("PubModulesManager error starting messageTransformer module", err);
|
package/routes/email.js
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
var express = require('express');
|
2
|
+
|
3
|
+
var router = express.Router();
|
4
|
+
|
5
|
+
var emailService = require("../services/emailService");
|
6
|
+
var winston = require('../config/winston');
|
7
|
+
|
8
|
+
router.get('/templates/:templateid',
|
9
|
+
async (req, res) => {
|
10
|
+
let templateid = req.params.templateid+".html";
|
11
|
+
winston.debug("templateid",templateid);
|
12
|
+
|
13
|
+
var html = await emailService.readTemplateFile(templateid);
|
14
|
+
res.json({template:html});
|
15
|
+
});
|
16
|
+
|
17
|
+
router.post('/test/send',
|
18
|
+
async (req, res) => {
|
19
|
+
let to = req.body.to;
|
20
|
+
winston.info("to",to);
|
21
|
+
|
22
|
+
let configEmail = req.body.config;
|
23
|
+
winston.info("configEmail", configEmail);
|
24
|
+
|
25
|
+
emailService.sendTest(to, configEmail, function(err,obj) {
|
26
|
+
// winston.info("sendTest rest", err, obj);
|
27
|
+
res.json({error: err, response:obj});
|
28
|
+
});
|
29
|
+
|
30
|
+
});
|
31
|
+
|
32
|
+
module.exports = router;
|
package/routes/project.js
CHANGED
@@ -50,6 +50,69 @@ router.put('/:projectid', [passport.authenticate(['basic', 'jwt'], { session: fa
|
|
50
50
|
update["settings.email.notification.conversation.pooled"] = req.body["settings.email.notification.conversation.pooled"];
|
51
51
|
}
|
52
52
|
|
53
|
+
|
54
|
+
|
55
|
+
|
56
|
+
if (req.body["settings.email.templates.assignedRequest"]!=undefined) {
|
57
|
+
update["settings.email.templates.assignedRequest"] = req.body["settings.email.templates.assignedRequest"];
|
58
|
+
}
|
59
|
+
if (req.body["settings.email.templates.assignedEmailMessage"]!=undefined) {
|
60
|
+
update["settings.email.templates.assignedEmailMessage"] = req.body["settings.email.templates.assignedEmailMessage"];
|
61
|
+
}
|
62
|
+
if (req.body["settings.email.templates.pooledRequest"]!=undefined) {
|
63
|
+
update["settings.email.templates.pooledRequest"] = req.body["settings.email.templates.pooledRequest"];
|
64
|
+
}
|
65
|
+
if (req.body["settings.email.templates.pooledEmailMessage"]!=undefined) {
|
66
|
+
update["settings.email.templates.pooledEmailMessage"] = req.body["settings.email.templates.pooledEmailMessage"];
|
67
|
+
}
|
68
|
+
if (req.body["settings.email.templates.newMessage"]!=undefined) {
|
69
|
+
update["settings.email.templates.newMessage"] = req.body["settings.email.templates.newMessage"];
|
70
|
+
}
|
71
|
+
if (req.body["settings.email.templates.ticket"]!=undefined) {
|
72
|
+
update["settings.email.templates.ticket"] = req.body["settings.email.templates.ticket"];
|
73
|
+
}
|
74
|
+
if (req.body["settings.email.templates.sendTranscript"]!=undefined) {
|
75
|
+
update["settings.email.templates.sendTranscript"] = req.body["settings.email.templates.sendTranscript"];
|
76
|
+
}
|
77
|
+
|
78
|
+
|
79
|
+
if (req.body["settings.email.from"]!=undefined) {
|
80
|
+
update["settings.email.from"] = req.body["settings.email.from"];
|
81
|
+
}
|
82
|
+
if (req.body["settings.email.config.host"]!=undefined) {
|
83
|
+
update["settings.email.config.host"] = req.body["settings.email.config.host"];
|
84
|
+
}
|
85
|
+
if (req.body["settings.email.config.port"]!=undefined) {
|
86
|
+
update["settings.email.config.port"] = req.body["settings.email.config.port"];
|
87
|
+
}
|
88
|
+
if (req.body["settings.email.config.secure"]!=undefined) {
|
89
|
+
update["settings.email.config.secure"] = req.body["settings.email.config.secure"];
|
90
|
+
}
|
91
|
+
if (req.body["settings.email.config.user"]!=undefined) {
|
92
|
+
update["settings.email.config.user"] = req.body["settings.email.config.user"];
|
93
|
+
}
|
94
|
+
if (req.body["settings.email.config.pass"]!=undefined) {
|
95
|
+
update["settings.email.config.pass"] = req.body["settings.email.config.pass"];
|
96
|
+
}
|
97
|
+
|
98
|
+
|
99
|
+
|
100
|
+
/*
|
101
|
+
|
102
|
+
if (req.body.settings.email.templates.assignedRequest!=undefined) {
|
103
|
+
// if (req.body["settings.email.templates.assignedRequest.html"]!=undefined) {
|
104
|
+
console.log("assignedRequest");
|
105
|
+
update["settings.email.templates.assignedRequest"] = req.body.settings.email.templates.assignedRequest;
|
106
|
+
}
|
107
|
+
if (req.body["settings.email.templates.assignedEmailMessage.html"]!=undefined) {
|
108
|
+
update["settings.email.templates.assignedEmailMessage.html"] = req.body["settings.email.templates.assignedEmailMessage.html"];
|
109
|
+
}
|
110
|
+
if (req.body.settings.email.templates.pooledRequest!=undefined) {
|
111
|
+
console.log("pooledRequest");
|
112
|
+
update["settings.email.templates.pooledRequest"] = req.body.settings.email.templates.pooledRequest;
|
113
|
+
}
|
114
|
+
*/
|
115
|
+
|
53
116
|
if (req.body["settings.chat_limit_on"]!=undefined) {
|
54
117
|
update["settings.chat_limit_on"] = req.body["settings.chat_limit_on"];
|
55
118
|
}
|
@@ -96,7 +159,7 @@ router.put('/:projectid', [passport.authenticate(['basic', 'jwt'], { session: fa
|
|
96
159
|
|
97
160
|
winston.debug('UPDATE PROJECT REQ BODY ', update);
|
98
161
|
|
99
|
-
|
162
|
+
// console.log("update",JSON.stringify(update));
|
100
163
|
|
101
164
|
Project.findByIdAndUpdate(req.params.projectid, update, { new: true, upsert: true }, function (err, updatedProject) {
|
102
165
|
if (err) {
|
@@ -143,6 +206,50 @@ router.patch('/:projectid', [passport.authenticate(['basic', 'jwt'], { session:
|
|
143
206
|
}
|
144
207
|
|
145
208
|
|
209
|
+
|
210
|
+
if (req.body["settings.email.templates.assignedRequest"]!=undefined) {
|
211
|
+
update["settings.email.templates.assignedRequest"] = req.body["settings.email.templates.assignedRequest"];
|
212
|
+
}
|
213
|
+
if (req.body["settings.email.templates.assignedEmailMessage"]!=undefined) {
|
214
|
+
update["settings.email.templates.assignedEmailMessage"] = req.body["settings.email.templates.assignedEmailMessage"];
|
215
|
+
}
|
216
|
+
if (req.body["settings.email.templates.pooledRequest"]!=undefined) {
|
217
|
+
update["settings.email.templates.pooledRequest"] = req.body["settings.email.templates.pooledRequest"];
|
218
|
+
}
|
219
|
+
if (req.body["settings.email.templates.pooledEmailMessage"]!=undefined) {
|
220
|
+
update["settings.email.templates.pooledEmailMessage"] = req.body["settings.email.templates.pooledEmailMessage"];
|
221
|
+
}
|
222
|
+
if (req.body["settings.email.templates.newMessage"]!=undefined) {
|
223
|
+
update["settings.email.templates.newMessage"] = req.body["settings.email.templates.newMessage"];
|
224
|
+
}
|
225
|
+
if (req.body["settings.email.templates.ticket"]!=undefined) {
|
226
|
+
update["settings.email.templates.ticket"] = req.body["settings.email.templates.ticket"];
|
227
|
+
}
|
228
|
+
if (req.body["settings.email.templates.sendTranscript"]!=undefined) {
|
229
|
+
update["settings.email.templates.sendTranscript"] = req.body["settings.email.templates.sendTranscript"];
|
230
|
+
}
|
231
|
+
|
232
|
+
|
233
|
+
if (req.body["settings.email.from"]!=undefined) {
|
234
|
+
update["settings.email.from"] = req.body["settings.email.from"];
|
235
|
+
}
|
236
|
+
if (req.body["settings.email.config.host"]!=undefined) {
|
237
|
+
update["settings.email.config.host"] = req.body["settings.email.config.host"];
|
238
|
+
}
|
239
|
+
if (req.body["settings.email.config.port"]!=undefined) {
|
240
|
+
update["settings.email.config.port"] = req.body["settings.email.config.port"];
|
241
|
+
}
|
242
|
+
if (req.body["settings.email.config.secure"]!=undefined) {
|
243
|
+
update["settings.email.config.secure"] = req.body["settings.email.config.secure"];
|
244
|
+
}
|
245
|
+
if (req.body["settings.email.config.user"]!=undefined) {
|
246
|
+
update["settings.email.config.user"] = req.body["settings.email.config.user"];
|
247
|
+
}
|
248
|
+
if (req.body["settings.email.config.pass"]!=undefined) {
|
249
|
+
update["settings.email.config.pass"] = req.body["settings.email.config.pass"];
|
250
|
+
}
|
251
|
+
|
252
|
+
|
146
253
|
if (req.body["settings.chat_limit_on"]!=undefined) {
|
147
254
|
update["settings.chat_limit_on"] = req.body["settings.chat_limit_on"];
|
148
255
|
}
|
package/routes/request.js
CHANGED
@@ -184,7 +184,8 @@ router.patch('/:requestid', function (req, res) {
|
|
184
184
|
}
|
185
185
|
|
186
186
|
requestEvent.emit("request.update", request);
|
187
|
-
requestEvent.emit("request.update.comment", {comment:"PATCH",request:request});
|
187
|
+
requestEvent.emit("request.update.comment", {comment:"PATCH",request:request}); //Deprecated
|
188
|
+
requestEvent.emit("request.updated", {comment:"PATCH",request:request, patch: update});
|
188
189
|
return res.json(request);
|
189
190
|
});
|
190
191
|
|
@@ -455,7 +456,8 @@ router.patch('/:requestid/attributes', function (req, res) {
|
|
455
456
|
}
|
456
457
|
winston.verbose(" saved request attributes",savedRequest.toObject())
|
457
458
|
requestEvent.emit("request.update", savedRequest);
|
458
|
-
requestEvent.emit("request.update.comment", {comment:"ATTRIBUTES_PATCH",request:savedRequest})
|
459
|
+
requestEvent.emit("request.update.comment", {comment:"ATTRIBUTES_PATCH",request:savedRequest});//Deprecated
|
460
|
+
requestEvent.emit("request.updated", {comment:"ATTRIBUTES_PATCH",request:savedRequest, patch: {attributes:data}});
|
459
461
|
requestEvent.emit("request.attributes.update", savedRequest);
|
460
462
|
res.json(savedRequest);
|
461
463
|
});
|
@@ -483,7 +485,9 @@ router.post('/:requestid/notes', function (req, res) {
|
|
483
485
|
return res.status(500).send({ success: false, msg: 'Error adding request object.' });
|
484
486
|
}
|
485
487
|
requestEvent.emit("request.update", updatedRequest);
|
486
|
-
requestEvent.emit("request.update.comment", {comment:"NOTE_ADD",request:updatedRequest})
|
488
|
+
requestEvent.emit("request.update.comment", {comment:"NOTE_ADD",request:updatedRequest});//Deprecated
|
489
|
+
requestEvent.emit("request.updated", {comment:"NOTE_ADD",request:updatedRequest, patch: {notes:note}});
|
490
|
+
|
487
491
|
return res.json(updatedRequest);
|
488
492
|
});
|
489
493
|
|
@@ -506,7 +510,9 @@ router.delete('/:requestid/notes/:noteid', function (req, res) {
|
|
506
510
|
return res.status(500).send({ success: false, msg: 'Error adding request object.' });
|
507
511
|
}
|
508
512
|
requestEvent.emit("request.update", updatedRequest);
|
509
|
-
requestEvent.emit("request.update.comment", {comment:"NOTE_DELETE",request:updatedRequest})
|
513
|
+
requestEvent.emit("request.update.comment", {comment:"NOTE_DELETE",request:updatedRequest});//Deprecated
|
514
|
+
// requestEvent.emit("request.updated", {comment:"NOTE_DELETE",request:updatedRequest, patch: {notes:req.params.noteid}});
|
515
|
+
|
510
516
|
return res.json(updatedRequest);
|
511
517
|
});
|
512
518
|
|
package/routes/user-request.js
CHANGED
@@ -45,7 +45,9 @@ router.patch('/:requestid/rating', function (req, res) {
|
|
45
45
|
}
|
46
46
|
|
47
47
|
requestEvent.emit("request.update", request);
|
48
|
-
requestEvent.emit("request.update.comment", {comment:"PATCH",request:request})
|
48
|
+
requestEvent.emit("request.update.comment", {comment:"PATCH",request:request});//Deprecated
|
49
|
+
requestEvent.emit("request.updated", {comment:"PATCH",request:request, patch: update});
|
50
|
+
|
49
51
|
return res.json(request);
|
50
52
|
});
|
51
53
|
|