@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 CHANGED
@@ -1,10 +1,25 @@
1
- # 2.2.15
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 AGGIORNA DOC
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 answer 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 answer you as soon as possible.",
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":"joined",
67
- "INFO_SUPPORT_USER_ADDED_VERB":"to chat",
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":"si è unito",
145
- "INFO_SUPPORT_USER_ADDED_VERB":"alla chat",
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":"rejoint",
221
- "INFO_SUPPORT_USER_ADDED_VERB":"discuter",
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":"unido",
297
- "INFO_SUPPORT_USER_ADDED_VERB":"para charlar",
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": "beigetreten",
374
- "INFO_SUPPORT_USER_ADDED_VERB": "zum Chatten",
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": "aderiu",
450
- "INFO_SUPPORT_USER_ADDED_VERB": "para conversar",
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
@@ -43,7 +43,7 @@ var RequestSchema = new Schema({
43
43
  type: String,
44
44
  required: true,
45
45
  index: true,
46
- // unique: true
46
+ unique: true
47
47
 
48
48
  },
49
49
 
@@ -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.15",
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.51",
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.79",
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(savedEvent), err)
45
- return res.status(500).send({success: false, msg: 'Error saving the event '+ JSON.stringify(savedEvent)});
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, microLanguageTransformerInterceptor:microLanguageTransformerInterceptor};
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);
@@ -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
 
@@ -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