@tiledesk/tiledesk-server 2.2.39 → 2.3.1
Sign up to get free protection for your applications and to get access to all the features.
- package/LICENSE +14 -657
- package/README.md +2 -0
- package/app.js +12 -0
- package/event/subscriptionEvent.js +11 -0
- package/models/subscriptionEvent.js +11 -0
- package/models/subscriptionLog.js +34 -0
- package/models/tagLibrary.js +42 -0
- package/package.json +2 -10
- package/pubmodules/activities/activityArchiver.js +295 -0
- package/pubmodules/activities/index.js +3 -0
- package/pubmodules/activities/models/activity.js +88 -0
- package/pubmodules/activities/routes/activity.js +710 -0
- package/pubmodules/activities/test/activityRoute.js +85 -0
- package/pubmodules/analytics/analytics.js +1719 -0
- package/pubmodules/analytics/index.js +3 -0
- package/pubmodules/canned/cannedResponse.js +51 -0
- package/pubmodules/canned/cannedResponseRoute.js +157 -0
- package/pubmodules/canned/index.js +3 -0
- package/pubmodules/pubModulesManager.js +104 -5
- package/pubmodules/trigger/default.js +271 -0
- package/pubmodules/trigger/event/actionEventEmitter.js +10 -0
- package/pubmodules/trigger/event/flowEventEmitter.js +10 -0
- package/pubmodules/trigger/event/triggerEventEmitter.js +10 -0
- package/pubmodules/trigger/index.js +3 -0
- package/pubmodules/trigger/models/trigger.js +149 -0
- package/pubmodules/trigger/rulesTrigger.js +1180 -0
- package/pubmodules/trigger/start.js +114 -0
- package/pubmodules/trigger/triggerRoute.js +150 -0
- package/routes/department.js +51 -0
- package/routes/group.js +140 -0
- package/routes/project.js +52 -0
- package/routes/subscription.js +140 -0
- package/routes/tag.js +138 -0
- package/services/faqService.js +1 -1
- package/services/modulesManager.js +7 -188
- package/services/subscriptionNotifier.js +485 -0
- package/template/email/assignedEmailMessage.html +1 -1
- package/template/email/assignedRequest.html +1 -1
- package/template/email/newMessage.html +1 -1
- package/template/email/passwordChanged.html +1 -1
- package/template/email/pooledEmailMessage.html +1 -1
- package/template/email/pooledRequest.html +1 -1
- package/template/email/resetPassword.html +2 -2
- package/template/email/ticket.html +1 -1
- package/views/messages.jade +1 -1
@@ -0,0 +1,51 @@
|
|
1
|
+
var mongoose = require('mongoose');
|
2
|
+
var Schema = mongoose.Schema;
|
3
|
+
var winston = require('../../config/winston');
|
4
|
+
|
5
|
+
|
6
|
+
var CannedResponseSchema = new Schema({
|
7
|
+
|
8
|
+
title: {
|
9
|
+
type: String,
|
10
|
+
required: false,
|
11
|
+
index: true
|
12
|
+
},
|
13
|
+
text: {
|
14
|
+
type: String,
|
15
|
+
required: true,
|
16
|
+
},
|
17
|
+
attributes: {
|
18
|
+
type: Object,
|
19
|
+
},
|
20
|
+
id_project: {
|
21
|
+
type: String,
|
22
|
+
required: true,
|
23
|
+
index: true
|
24
|
+
},
|
25
|
+
createdBy: {
|
26
|
+
type: String,
|
27
|
+
required: true
|
28
|
+
},
|
29
|
+
status: {
|
30
|
+
type: Number,
|
31
|
+
required: false,
|
32
|
+
default: 100,
|
33
|
+
index: true
|
34
|
+
},
|
35
|
+
},{
|
36
|
+
timestamps: true
|
37
|
+
}
|
38
|
+
);
|
39
|
+
|
40
|
+
|
41
|
+
// CannedResponseSchema.index({text: 'text'},
|
42
|
+
// {"name":"cannedresponse_fulltext","default_language": "italian","language_override": "dummy"}); // schema level
|
43
|
+
|
44
|
+
var CannedResponse = mongoose.model('cannedResponse', CannedResponseSchema);
|
45
|
+
|
46
|
+
if (process.env.MONGOOSE_SYNCINDEX) {
|
47
|
+
CannedResponse.syncIndexes();
|
48
|
+
winston.info("CannedResponse syncIndexes")
|
49
|
+
}
|
50
|
+
|
51
|
+
module.exports = CannedResponse;
|
@@ -0,0 +1,157 @@
|
|
1
|
+
var express = require('express');
|
2
|
+
var router = express.Router();
|
3
|
+
var CannedResponse = require("./cannedResponse");
|
4
|
+
var winston = require('../../config/winston');
|
5
|
+
// const CannedResponseEvent = require('../event/CannedResponseEvent');
|
6
|
+
|
7
|
+
|
8
|
+
router.post('/', function (req, res) {
|
9
|
+
|
10
|
+
winston.debug(req.body);
|
11
|
+
winston.debug("req.user", req.user);
|
12
|
+
|
13
|
+
var newCannedResponse = new CannedResponse({
|
14
|
+
title: req.body.title,
|
15
|
+
text: req.body.text,
|
16
|
+
id_project: req.projectid,
|
17
|
+
createdBy: req.user.id,
|
18
|
+
updatedBy: req.user.id
|
19
|
+
});
|
20
|
+
|
21
|
+
newCannedResponse.save(function (err, savedCannedResponse) {
|
22
|
+
if (err) {
|
23
|
+
winston.error('--- > ERROR ', err)
|
24
|
+
|
25
|
+
return res.status(500).send({ success: false, msg: 'Error saving object.' });
|
26
|
+
}
|
27
|
+
|
28
|
+
res.json(savedCannedResponse);
|
29
|
+
});
|
30
|
+
});
|
31
|
+
|
32
|
+
router.put('/:cannedResponseid', function (req, res) {
|
33
|
+
winston.debug(req.body);
|
34
|
+
var update = {};
|
35
|
+
|
36
|
+
if (req.body.title!=undefined) {
|
37
|
+
update.title = req.body.title;
|
38
|
+
}
|
39
|
+
if (req.body.text!=undefined) {
|
40
|
+
update.text = req.body.text;
|
41
|
+
}
|
42
|
+
if (req.body.attributes!=undefined) {
|
43
|
+
update.attributes = req.body.attributes;
|
44
|
+
}
|
45
|
+
|
46
|
+
|
47
|
+
CannedResponse.findByIdAndUpdate(req.params.cannedResponseid, update, { new: true, upsert: true }, function (err, updatedCannedResponse) {
|
48
|
+
if (err) {
|
49
|
+
winston.error('--- > ERROR ', err);
|
50
|
+
return res.status(500).send({ success: false, msg: 'Error updating object.' });
|
51
|
+
}
|
52
|
+
|
53
|
+
|
54
|
+
|
55
|
+
// CannedResponseEvent.emit('CannedResponse.update', updatedCannedResponse);
|
56
|
+
res.json(updatedCannedResponse);
|
57
|
+
});
|
58
|
+
});
|
59
|
+
|
60
|
+
router.delete('/:cannedResponseid', function (req, res) {
|
61
|
+
winston.debug(req.body);
|
62
|
+
|
63
|
+
CannedResponse.findByIdAndUpdate(req.params.cannedResponseid, {status: 1000}, { new: true, upsert: true }, function (err, updatedCannedResponse) {
|
64
|
+
if (err) {
|
65
|
+
winston.error('--- > ERROR ', err);
|
66
|
+
return res.status(500).send({ success: false, msg: 'Error updating object.' });
|
67
|
+
}
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
// CannedResponseEvent.emit('CannedResponse.delete', updatedCannedResponse);
|
72
|
+
res.json(updatedCannedResponse);
|
73
|
+
});
|
74
|
+
});
|
75
|
+
|
76
|
+
router.delete('/:cannedResponseid/physical', function (req, res) {
|
77
|
+
winston.debug(req.body);
|
78
|
+
|
79
|
+
CannedResponse.remove({ _id: req.params.cannedResponseid }, function (err, cannedResponse) {
|
80
|
+
if (err) {
|
81
|
+
winston.error('--- > ERROR ', err);
|
82
|
+
return res.status(500).send({ success: false, msg: 'Error deleting object.' });
|
83
|
+
}
|
84
|
+
|
85
|
+
|
86
|
+
// CannedResponseEvent.emit('CannedResponse.delete', CannedResponse);
|
87
|
+
|
88
|
+
res.json(cannedResponse);
|
89
|
+
});
|
90
|
+
});
|
91
|
+
|
92
|
+
router.get('/:cannedResponseid', function (req, res) {
|
93
|
+
winston.debug(req.body);
|
94
|
+
|
95
|
+
CannedResponse.findById(req.params.cannedResponseid, function (err, cannedResponse) {
|
96
|
+
if (err) {
|
97
|
+
return res.status(500).send({ success: false, msg: 'Error getting object.' });
|
98
|
+
}
|
99
|
+
if (!cannedResponse) {
|
100
|
+
return res.status(404).send({ success: false, msg: 'Object not found.' });
|
101
|
+
}
|
102
|
+
res.json(cannedResponse);
|
103
|
+
});
|
104
|
+
});
|
105
|
+
|
106
|
+
router.get('/', function (req, res) {
|
107
|
+
var limit = 40; // Number of CannedResponses per page
|
108
|
+
var page = 0;
|
109
|
+
|
110
|
+
if (req.query.page) {
|
111
|
+
page = req.query.page;
|
112
|
+
}
|
113
|
+
|
114
|
+
var skip = page * limit;
|
115
|
+
winston.debug('CannedResponse ROUTE - SKIP PAGE ', skip);
|
116
|
+
|
117
|
+
|
118
|
+
var query = { "id_project": req.projectid, "status": {$lt:1000}};
|
119
|
+
|
120
|
+
if (req.query.full_text) {
|
121
|
+
winston.debug('CannedResponse ROUTE req.query.fulltext', req.query.full_text);
|
122
|
+
query.$text = { "$search": req.query.full_text };
|
123
|
+
}
|
124
|
+
|
125
|
+
|
126
|
+
var direction = -1; //-1 descending , 1 ascending
|
127
|
+
if (req.query.direction) {
|
128
|
+
direction = req.query.direction;
|
129
|
+
}
|
130
|
+
|
131
|
+
var sortField = "createdAt";
|
132
|
+
if (req.query.sort) {
|
133
|
+
sortField = req.query.sort;
|
134
|
+
}
|
135
|
+
|
136
|
+
var sortQuery = {};
|
137
|
+
sortQuery[sortField] = direction;
|
138
|
+
|
139
|
+
winston.debug("sort query", sortQuery);
|
140
|
+
|
141
|
+
return CannedResponse.find(query).
|
142
|
+
skip(skip).limit(limit).
|
143
|
+
sort(sortQuery).
|
144
|
+
exec(function (err, cannedResponses) {
|
145
|
+
if (err) {
|
146
|
+
winston.error('CannedResponse ROUTE - REQUEST FIND ERR ', err)
|
147
|
+
return (err);
|
148
|
+
}
|
149
|
+
|
150
|
+
return res.json(cannedResponses);
|
151
|
+
});
|
152
|
+
});
|
153
|
+
|
154
|
+
|
155
|
+
|
156
|
+
|
157
|
+
module.exports = router;
|
@@ -1,10 +1,9 @@
|
|
1
1
|
|
2
2
|
var winston = require('../config/winston');
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
3
|
+
var validtoken = require('../middleware/valid-token');
|
4
|
+
var roleChecker = require('../middleware/has-role');
|
5
|
+
var passport = require('passport');
|
6
|
+
require('../middleware/passport')(passport);
|
8
7
|
|
9
8
|
class PubModulesManager {
|
10
9
|
|
@@ -21,6 +20,17 @@ class PubModulesManager {
|
|
21
20
|
|
22
21
|
this.rasa = undefined;
|
23
22
|
this.rasaRoute = undefined;
|
23
|
+
|
24
|
+
this.activityArchiver = undefined;
|
25
|
+
this.activityRoute = undefined;
|
26
|
+
|
27
|
+
this.analyticsRoute = undefined;
|
28
|
+
|
29
|
+
this.cannedResponseRoute = undefined;
|
30
|
+
|
31
|
+
this.trigger = undefined;
|
32
|
+
this.triggerRoute = undefined;
|
33
|
+
|
24
34
|
}
|
25
35
|
|
26
36
|
|
@@ -45,6 +55,27 @@ class PubModulesManager {
|
|
45
55
|
winston.info("ModulesManager eventsRoute controller loaded");
|
46
56
|
}
|
47
57
|
|
58
|
+
|
59
|
+
if (this.activityRoute) {
|
60
|
+
app.use('/:projectid/activities', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('admin')], this.activityRoute);
|
61
|
+
winston.info("ModulesManager activities controller loaded");
|
62
|
+
}
|
63
|
+
|
64
|
+
if (this.analyticsRoute) {
|
65
|
+
app.use('/:projectid/analytics', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('agent')], this.analyticsRoute);
|
66
|
+
winston.info("ModulesManager analytics controller loaded");
|
67
|
+
}
|
68
|
+
|
69
|
+
if (this.cannedResponseRoute) {
|
70
|
+
app.use('/:projectid/canned', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('agent')], this.cannedResponseRoute);
|
71
|
+
winston.info("ModulesManager canned controller loaded");
|
72
|
+
}
|
73
|
+
|
74
|
+
if (this.triggerRoute) {
|
75
|
+
app.use('/:projectid/modules/triggers', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('admin')], this.triggerRoute);
|
76
|
+
winston.info("ModulesManager trigger controller loaded");
|
77
|
+
}
|
78
|
+
|
48
79
|
}
|
49
80
|
|
50
81
|
|
@@ -166,7 +197,65 @@ class PubModulesManager {
|
|
166
197
|
|
167
198
|
|
168
199
|
|
200
|
+
|
201
|
+
try {
|
202
|
+
this.activityArchiver = require('./activities').activityArchiver;
|
203
|
+
// this.activityArchiver.listen();
|
204
|
+
winston.debug("this.activityArchiver:"+ this.activityArchiver);
|
205
|
+
|
206
|
+
this.activityRoute = require('./activities').activityRoute;
|
207
|
+
winston.debug("this.activityRoute:"+ this.activityRoute);
|
208
|
+
|
209
|
+
winston.info("ModulesManager activities initialized");
|
210
|
+
} catch(err) {
|
211
|
+
if (err.code == 'MODULE_NOT_FOUND') {
|
212
|
+
winston.info("ModulesManager init activities module not found");
|
213
|
+
}else {
|
214
|
+
winston.error("ModulesManager error initializing init activities module", err);
|
215
|
+
}
|
216
|
+
}
|
217
|
+
|
218
|
+
|
219
|
+
try {
|
220
|
+
this.analyticsRoute = require('./analytics').analyticsRoute;
|
221
|
+
winston.debug("this.analyticsRoute:"+ this.analyticsRoute);
|
222
|
+
winston.info("ModulesManager analyticsRoute initialized");
|
223
|
+
} catch(err) {
|
224
|
+
if (err.code == 'MODULE_NOT_FOUND') {
|
225
|
+
winston.info("ModulesManager init analytics module not found");
|
226
|
+
}else {
|
227
|
+
winston.error("ModulesManager error initializing init analytics module", err);
|
228
|
+
}
|
229
|
+
}
|
230
|
+
|
231
|
+
|
232
|
+
|
233
|
+
try {
|
234
|
+
this.cannedResponseRoute = require('./canned').cannedResponseRoute;
|
235
|
+
winston.debug("this.cannedResponseRoute:"+ this.cannedResponseRoute);
|
236
|
+
winston.info("ModulesManager cannedResponseRoute initialized");
|
237
|
+
} catch(err) {
|
238
|
+
if (err.code == 'MODULE_NOT_FOUND') {
|
239
|
+
winston.info("ModulesManager init canned module not found");
|
240
|
+
}else {
|
241
|
+
winston.error("ModulesManager error initializing init canned module", err);
|
242
|
+
}
|
243
|
+
}
|
244
|
+
|
169
245
|
|
246
|
+
try {
|
247
|
+
this.trigger = require('./trigger').start;
|
248
|
+
winston.debug("this.trigger:"+ this.trigger);
|
249
|
+
this.triggerRoute = require('./trigger').triggerRoute;
|
250
|
+
winston.debug("this.triggerRoute:"+ this.triggerRoute);
|
251
|
+
winston.info("ModulesManager trigger initialized");
|
252
|
+
} catch(err) {
|
253
|
+
if (err.code == 'MODULE_NOT_FOUND') {
|
254
|
+
winston.info("ModulesManager init trigger module not found");
|
255
|
+
}else {
|
256
|
+
winston.error("ModulesManager error initializing init trigger module", err);
|
257
|
+
}
|
258
|
+
}
|
170
259
|
|
171
260
|
}
|
172
261
|
|
@@ -221,6 +310,16 @@ class PubModulesManager {
|
|
221
310
|
}
|
222
311
|
|
223
312
|
|
313
|
+
if (this.activityArchiver) {
|
314
|
+
try {
|
315
|
+
this.activityArchiver.listen();
|
316
|
+
winston.info("ModulesManager activityArchiver started");
|
317
|
+
} catch(err) {
|
318
|
+
winston.info("ModulesManager error starting activityArchiver module", err);
|
319
|
+
}
|
320
|
+
}
|
321
|
+
|
322
|
+
|
224
323
|
}
|
225
324
|
|
226
325
|
|
@@ -0,0 +1,271 @@
|
|
1
|
+
var Trigger = require('./models/trigger');
|
2
|
+
|
3
|
+
|
4
|
+
var defTrigger = {};
|
5
|
+
var defTriggerObj = {};
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
var tNewConversationObj = {
|
10
|
+
name: 'New Conversation',
|
11
|
+
description: 'Create a temporary chat when new conversation button is pressed.',
|
12
|
+
trigger: {key:'event.emit',name:'Event emit event', description: 'Standard event emit event'},
|
13
|
+
conditions:{ all: [{key:'event.name',fact: 'json',path: 'name', operator:'equal', value: 'new_conversation'}]},
|
14
|
+
actions: [{key:'request.create', parameters: {departmentid: 'default', text:"welcome:tdk_req_status_hidden"}}],
|
15
|
+
enabled: true,
|
16
|
+
code: 's_new_conversation_01',
|
17
|
+
type: 'internal',
|
18
|
+
version: 1,
|
19
|
+
createdBy: 'system',
|
20
|
+
updatedBy: 'system'
|
21
|
+
};
|
22
|
+
|
23
|
+
var tNewConversation = new Trigger(tNewConversationObj);
|
24
|
+
|
25
|
+
defTrigger['s_new_conversation_01'] = tNewConversation;
|
26
|
+
defTriggerObj['s_new_conversation_01'] = tNewConversationObj;
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
|
32
|
+
var tWelcomeOnlineObj =
|
33
|
+
{
|
34
|
+
name: 'Online Welcome Greeting',
|
35
|
+
description: 'Send a welcome message if there are online agents to the visitor that create a chat.',
|
36
|
+
trigger: {key:'request.create',name:'Request create event', description: 'Standard request create event'},
|
37
|
+
conditions:{ all: [
|
38
|
+
{key:'request.departmentHasBot',fact: 'json',path: 'department.hasBot', operator:'equal', value: false},
|
39
|
+
{key:'request.snapshot.availableAgentsCount',fact: 'json',path: 'snapshot.availableAgentsCount', operator:'greaterThan', value: 0},
|
40
|
+
{key:'request.isOpen',fact: 'json',path: 'isOpen', operator:'equal', value: true},
|
41
|
+
{key:'request.first_text',fact: 'json',path: 'first_text', operator:'equal', value: 'welcome'},
|
42
|
+
{key:'request.statusRequestStatus',fact: 'json',path: 'status', operator:'equal', value: 50}
|
43
|
+
]},
|
44
|
+
actions: [{key:'message.send', parameters: {text:"${LABEL_FIRST_MSG}"}}],
|
45
|
+
enabled:true,
|
46
|
+
code: 's_online_welcome_01',
|
47
|
+
type: 'internal',
|
48
|
+
version: 3,
|
49
|
+
createdBy: 'system',
|
50
|
+
updatedBy: 'system'
|
51
|
+
}
|
52
|
+
|
53
|
+
var tWelcomeOnline = new Trigger(tWelcomeOnlineObj);
|
54
|
+
|
55
|
+
defTrigger['s_online_welcome_01'] = tWelcomeOnline;
|
56
|
+
defTriggerObj['s_online_welcome_01'] = tWelcomeOnlineObj
|
57
|
+
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
var tWelcomeOfflineObj = {
|
62
|
+
name: 'Offline Welcome Greeting',
|
63
|
+
description: 'Send a welcome message if there aren\'t online agents to the visitor that create a chat.',
|
64
|
+
trigger: {key:'request.create',name:'Request create event', description: 'Standard request create event'},
|
65
|
+
conditions:{ all: [
|
66
|
+
{key:'request.departmentHasBot',fact: 'json',path: 'department.hasBot', operator:'equal', value: false},
|
67
|
+
{key:'request.snapshot.availableAgentsCount',fact: 'json',path: 'snapshot.availableAgentsCount', operator:'equal', value: 0},
|
68
|
+
{key:'request.statusRequestStatus',fact: 'json',path: 'status', operator:'equal', value: 50},
|
69
|
+
{key:'request.isOpen',fact: 'json',path: 'isOpen', operator:'equal', value: true},
|
70
|
+
{key:'request.first_text',fact: 'json',path: 'first_text', operator:'equal', value: 'welcome'}
|
71
|
+
]},
|
72
|
+
actions: [{key:'message.send', parameters: {text:"${LABEL_FIRST_MSG_NO_AGENTS}"}}],
|
73
|
+
enabled:true,
|
74
|
+
code: 's_offline_welcome_01',
|
75
|
+
type: 'internal',
|
76
|
+
version: 3,
|
77
|
+
createdBy: 'system',
|
78
|
+
updatedBy: 'system'
|
79
|
+
}
|
80
|
+
var tWelcomeOffline = new Trigger(tWelcomeOfflineObj);
|
81
|
+
|
82
|
+
defTrigger['s_offline_welcome_01'] = tWelcomeOffline;
|
83
|
+
defTriggerObj['s_offline_welcome_01'] = tWelcomeOfflineObj;
|
84
|
+
|
85
|
+
|
86
|
+
|
87
|
+
var tWelcomeClosedOperatingHoursObj = {
|
88
|
+
name: 'Office Closed Notice',
|
89
|
+
description: 'Send an office closed message if a visitor asks for support outside of the operating hours.',
|
90
|
+
trigger: {key:'request.create',name:'Request create event', description: 'Standard request create event'},
|
91
|
+
conditions:{ all: [
|
92
|
+
{key:'request.departmentHasBot',fact: 'json',path: 'department.hasBot', operator:'equal', value: false},
|
93
|
+
{key:'request.statusRequestStatus',fact: 'json',path: 'status', operator:'equal', value: 50},
|
94
|
+
{key:'request.isOpen',fact: 'json',path: 'isOpen', operator:'equal', value: false},
|
95
|
+
{key:'request.first_text',fact: 'json',path: 'first_text', operator:'equal', value: 'welcome'}
|
96
|
+
]},
|
97
|
+
actions: [{key:'message.send', parameters: {text:"${LABEL_FIRST_MSG_OPERATING_HOURS_CLOSED}"}}],
|
98
|
+
enabled:true,
|
99
|
+
code: 's_closed_operating_hours_01',
|
100
|
+
type: 'internal',
|
101
|
+
version: 2,
|
102
|
+
createdBy: 'system',
|
103
|
+
updatedBy: 'system'
|
104
|
+
}
|
105
|
+
var tWelcomeClosedOperatingHours = new Trigger(tWelcomeClosedOperatingHoursObj);
|
106
|
+
|
107
|
+
defTrigger['s_closed_operating_hours_01'] = tWelcomeClosedOperatingHours;
|
108
|
+
defTriggerObj['s_closed_operating_hours_01'] = tWelcomeClosedOperatingHoursObj;
|
109
|
+
|
110
|
+
|
111
|
+
|
112
|
+
|
113
|
+
|
114
|
+
|
115
|
+
var tInviteBotObj = {
|
116
|
+
name: 'Invite Bot',
|
117
|
+
description: 'Invite if available the department bot to the temporary chat and start it.',
|
118
|
+
trigger: {key:'request.create',name:'Request create event', description: 'Standard request create event'},
|
119
|
+
conditions:{ all: [
|
120
|
+
{key:'request.statusRequestStatus',fact: 'json',path: 'status', operator:'equal', value: 50},
|
121
|
+
{key:'request.departmentHasBot',fact: 'json',path: 'department.hasBot', operator:'equal', value: true},
|
122
|
+
{key:'request.first_text',fact: 'json',path: 'first_text', operator:'equal', value: 'welcome'}
|
123
|
+
]},
|
124
|
+
actions: [{key:'request.department.bot.launch'}],
|
125
|
+
enabled:true,
|
126
|
+
code: 's_invite_bot_01',
|
127
|
+
type: 'internal',
|
128
|
+
version: 2,
|
129
|
+
createdBy: 'system',
|
130
|
+
updatedBy: 'system'
|
131
|
+
}
|
132
|
+
|
133
|
+
var tInviteBot = new Trigger(tInviteBotObj);
|
134
|
+
|
135
|
+
defTrigger['s_invite_bot_01'] = tInviteBot;
|
136
|
+
defTriggerObj['s_invite_bot_01'] = tInviteBotObj;
|
137
|
+
|
138
|
+
|
139
|
+
|
140
|
+
|
141
|
+
|
142
|
+
var tCheckoutPageObj = {
|
143
|
+
name: 'Checkout Page',
|
144
|
+
description: 'Reduce cart abandonment by engaging customer that are on the checkout page.',
|
145
|
+
trigger: {key:'request.create',name:'Request create event', description: 'Standard request create event'},
|
146
|
+
conditions:{ all: [
|
147
|
+
{key:"request.sourcePageUrl", fact:"json", path:"sourcePage", operator:"in", value:"/checkout.html"},
|
148
|
+
{key:'request.departmentHasBot',fact: 'json',path: 'department.hasBot', operator:'equal', value: false},
|
149
|
+
{key:'request.statusRequestStatus',fact: 'json',path: 'status', operator:'equal', value: 50}
|
150
|
+
]},
|
151
|
+
actions: [{key:'message.send', parameters: {text:"Hey, do you need help to complete the checkout?"}}],
|
152
|
+
enabled:false,
|
153
|
+
code: 's_checkout_page_01',
|
154
|
+
version: 1,
|
155
|
+
createdBy: 'system',
|
156
|
+
updatedBy: 'system'
|
157
|
+
}
|
158
|
+
|
159
|
+
var tCheckoutPage = new Trigger(tCheckoutPageObj);
|
160
|
+
|
161
|
+
defTrigger['s_checkout_page_01'] = tCheckoutPage;
|
162
|
+
defTriggerObj['s_checkout_page_01'] = tCheckoutPageObj;
|
163
|
+
|
164
|
+
|
165
|
+
var tAuthStateChangeProactiveGreetingObj = {
|
166
|
+
name: 'New visitor login',
|
167
|
+
description: 'Create a temporary chat when a new visitor signin.',
|
168
|
+
trigger: {key:'event.emit',name:'Event emit event', description: 'Standard event emit event'},
|
169
|
+
conditions:{ all: [
|
170
|
+
{key:'event.name',fact: 'json',path: 'name', operator:'equal', value: 'auth_state_changed'},
|
171
|
+
{key: 'event.attributes.code', fact: 'json', path: 'attributes.event', operator:'equal', value : 201}
|
172
|
+
]},
|
173
|
+
|
174
|
+
actions: [{key:'request.create', parameters: {departmentid: 'default', text:"callout:tdk_req_status_hidden"}}],
|
175
|
+
enabled: true,
|
176
|
+
code: 's_new_login_01',
|
177
|
+
type: 'internal',
|
178
|
+
version: 1,
|
179
|
+
createdBy: 'system',
|
180
|
+
updatedBy: 'system'
|
181
|
+
};
|
182
|
+
|
183
|
+
var tAuthStateChangeProactiveGreeting = new Trigger(tAuthStateChangeProactiveGreetingObj);
|
184
|
+
|
185
|
+
defTrigger['s_new_login_01'] = tAuthStateChangeProactiveGreeting;
|
186
|
+
defTriggerObj['s_new_login_01'] = tAuthStateChangeProactiveGreetingObj;
|
187
|
+
|
188
|
+
|
189
|
+
|
190
|
+
var tInviteProactiveGreetingBotObj = {
|
191
|
+
name: 'Invite Proactive Greeting Bot',
|
192
|
+
description: 'Invite if available the department bot to proactively greet the temporary chat and start it.',
|
193
|
+
trigger: {key:'request.create',name:'Request create event', description: 'Standard request create event'},
|
194
|
+
conditions:{ all: [
|
195
|
+
{key:'request.statusRequestStatus',fact: 'json',path: 'status', operator:'equal', value: 50},
|
196
|
+
{key:'request.departmentHasBot',fact: 'json',path: 'department.hasBot', operator:'equal', value: true},
|
197
|
+
{key:'request.first_text',fact: 'json',path: 'first_text', operator:'equal', value: 'callout'}
|
198
|
+
]},
|
199
|
+
actions: [{key:'request.department.bot.launch'}],
|
200
|
+
enabled:true,
|
201
|
+
code: 's_invite_proactive_greeting_bot_01',
|
202
|
+
type: 'internal',
|
203
|
+
version: 2,
|
204
|
+
createdBy: 'system',
|
205
|
+
updatedBy: 'system'
|
206
|
+
}
|
207
|
+
|
208
|
+
var tInviteProactiveGreetingBot = new Trigger(tInviteProactiveGreetingBotObj);
|
209
|
+
|
210
|
+
defTrigger['s_invite_proactive_greeting_bot_01'] = tInviteProactiveGreetingBot;
|
211
|
+
defTriggerObj['s_invite_proactive_greeting_bot_01'] = tInviteProactiveGreetingBotObj;
|
212
|
+
|
213
|
+
|
214
|
+
|
215
|
+
|
216
|
+
|
217
|
+
var tProactiveGreetingMessageObj =
|
218
|
+
{
|
219
|
+
name: 'Proactive Greeting',
|
220
|
+
description: 'Send a proactive message when a new user signin.',
|
221
|
+
trigger: {key:'request.create',name:'Request create event', description: 'Standard request create event'},
|
222
|
+
conditions:{ all: [
|
223
|
+
{key:'request.departmentHasBot',fact: 'json',path: 'department.hasBot', operator:'equal', value: false},
|
224
|
+
{key:'request.first_text',fact: 'json',path: 'first_text', operator:'equal', value: 'callout'},
|
225
|
+
{key:'request.statusRequestStatus',fact: 'json',path: 'status', operator:'equal', value: 50}
|
226
|
+
]},
|
227
|
+
actions: [{key:'message.send', parameters: {text:"${WELLCOME_MSG}"}}],
|
228
|
+
enabled:true,
|
229
|
+
code: 's_proactivegreeting_message_01',
|
230
|
+
type: 'internal',
|
231
|
+
version: 1,
|
232
|
+
createdBy: 'system',
|
233
|
+
updatedBy: 'system'
|
234
|
+
}
|
235
|
+
|
236
|
+
var tProactiveGreetingMessage = new Trigger(tProactiveGreetingMessageObj);
|
237
|
+
|
238
|
+
defTrigger['s_proactivegreeting_message_01'] = tProactiveGreetingMessage;
|
239
|
+
defTriggerObj['s_proactivegreeting_message_01'] = tProactiveGreetingMessageObj
|
240
|
+
|
241
|
+
|
242
|
+
|
243
|
+
|
244
|
+
|
245
|
+
|
246
|
+
|
247
|
+
var tTicketingTakingObj =
|
248
|
+
{
|
249
|
+
name: 'Ticketing Taking',
|
250
|
+
description: 'Send a taking message when a new ticket is created.',
|
251
|
+
trigger: {key:'request.create',name:'Request create event', description: 'Standard request create event'},
|
252
|
+
conditions:{ all: [
|
253
|
+
{key:'request.channel.name',fact: 'json',path: 'channel.name', operator:'equal', value: 'email'},
|
254
|
+
{key:'request.departmentHasBot',fact: 'json',path: 'department.hasBot', operator:'equal', value: false}
|
255
|
+
]},
|
256
|
+
actions: [{key:'message.send', parameters: {text:"${TICKET_TAKING}"}}],
|
257
|
+
enabled:true,
|
258
|
+
code: 's_ticketing_taking_01',
|
259
|
+
type: 'internal',
|
260
|
+
version: 1,
|
261
|
+
createdBy: 'system',
|
262
|
+
updatedBy: 'system'
|
263
|
+
}
|
264
|
+
|
265
|
+
var tTicketingTaking = new Trigger(tTicketingTakingObj);
|
266
|
+
|
267
|
+
defTrigger['s_ticketing_taking_01'] = tTicketingTaking;
|
268
|
+
defTriggerObj['s_ticketing_taking_01'] = tTicketingTakingObj
|
269
|
+
|
270
|
+
|
271
|
+
module.exports = {defTrigger:defTrigger, defTriggerObj: defTriggerObj};
|