@tiledesk/tiledesk-server 2.2.37 → 2.3.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.
Files changed (53) hide show
  1. package/CHANGELOG.md +8 -1
  2. package/LICENSE +14 -657
  3. package/README.md +21 -18
  4. package/app.js +27 -3
  5. package/config/labels/widget.json +320 -0
  6. package/event/subscriptionEvent.js +11 -0
  7. package/models/subscriptionEvent.js +11 -0
  8. package/models/subscriptionLog.js +34 -0
  9. package/models/tagLibrary.js +42 -0
  10. package/package.json +5 -11
  11. package/pubmodules/activities/activityArchiver.js +295 -0
  12. package/pubmodules/activities/index.js +3 -0
  13. package/pubmodules/activities/models/activity.js +88 -0
  14. package/pubmodules/activities/routes/activity.js +710 -0
  15. package/pubmodules/activities/test/activityRoute.js +85 -0
  16. package/pubmodules/analytics/analytics.js +1719 -0
  17. package/pubmodules/analytics/index.js +3 -0
  18. package/pubmodules/canned/cannedResponse.js +51 -0
  19. package/pubmodules/canned/cannedResponseRoute.js +157 -0
  20. package/pubmodules/canned/index.js +3 -0
  21. package/pubmodules/pubModulesManager.js +115 -7
  22. package/pubmodules/rasa/index.js +8 -1
  23. package/pubmodules/rasa/listener.js +28 -7
  24. package/pubmodules/scheduler/tasks/closeBotUnresponsiveRequestTask.js +2 -2
  25. package/pubmodules/trigger/default.js +271 -0
  26. package/pubmodules/trigger/event/actionEventEmitter.js +10 -0
  27. package/pubmodules/trigger/event/flowEventEmitter.js +10 -0
  28. package/pubmodules/trigger/event/triggerEventEmitter.js +10 -0
  29. package/pubmodules/trigger/index.js +3 -0
  30. package/pubmodules/trigger/models/trigger.js +149 -0
  31. package/pubmodules/trigger/rulesTrigger.js +1180 -0
  32. package/pubmodules/trigger/start.js +114 -0
  33. package/pubmodules/trigger/triggerRoute.js +150 -0
  34. package/routes/department.js +51 -0
  35. package/routes/group.js +140 -0
  36. package/routes/project.js +52 -0
  37. package/routes/request.js +3 -2
  38. package/routes/subscription.js +140 -0
  39. package/routes/tag.js +138 -0
  40. package/services/faqBotHandler.js +2 -2
  41. package/services/faqBotSupport.js +0 -1
  42. package/services/faqService.js +1 -1
  43. package/services/modulesManager.js +16 -182
  44. package/services/subscriptionNotifier.js +485 -0
  45. package/template/email/assignedEmailMessage.html +1 -1
  46. package/template/email/assignedRequest.html +1 -1
  47. package/template/email/newMessage.html +1 -1
  48. package/template/email/passwordChanged.html +1 -1
  49. package/template/email/pooledEmailMessage.html +1 -1
  50. package/template/email/pooledRequest.html +1 -1
  51. package/template/email/resetPassword.html +2 -2
  52. package/template/email/ticket.html +1 -1
  53. package/views/messages.jade +1 -1
@@ -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};
@@ -0,0 +1,10 @@
1
+ const EventEmitter = require('events');
2
+
3
+ class ActionEventEmitter extends EventEmitter {}
4
+
5
+
6
+ const actionEventEmitter = new ActionEventEmitter();
7
+
8
+
9
+
10
+ module.exports = actionEventEmitter;
@@ -0,0 +1,10 @@
1
+ const EventEmitter = require('events');
2
+
3
+ class FlowEventEmitter extends EventEmitter {}
4
+
5
+
6
+ const flowEventEmitter = new FlowEventEmitter();
7
+
8
+
9
+
10
+ module.exports = flowEventEmitter;
@@ -0,0 +1,10 @@
1
+ const EventEmitter = require('events');
2
+
3
+ class TriggerEventEmitter extends EventEmitter {}
4
+
5
+
6
+ const triggerEventEmitter = new TriggerEventEmitter();
7
+
8
+
9
+
10
+ module.exports = triggerEventEmitter;
@@ -0,0 +1,3 @@
1
+ const start = require("./start");
2
+ const triggerRoute = require("./triggerRoute");
3
+ module.exports = {start:start,triggerRoute:triggerRoute};
@@ -0,0 +1,149 @@
1
+ var mongoose = require('mongoose');
2
+ var Schema = mongoose.Schema;
3
+ // var TriggerEventSchema = require('./triggerEvent').schema;
4
+
5
+ // var ConditionSchema = require('./triggerCondition').schema;
6
+ // var ActionSchema = require('./triggerAction').schema;
7
+
8
+
9
+
10
+ var TriggerConditionSchema = new Schema({
11
+ key: { //ex: request.firsttext
12
+ type: String,
13
+ required: true
14
+ },
15
+ fact: { //ex: request.firsttext
16
+ type: String,
17
+ required: true
18
+ },
19
+ path: {
20
+ type: String,
21
+ required: false
22
+ },
23
+ operator: { //use ref to OperatorSchema
24
+ type: String,
25
+ required: true
26
+ },
27
+ // type: { unused
28
+ // type: String,
29
+ // required: false
30
+ // },
31
+ value: {
32
+ type: Object,
33
+ required: true
34
+ },
35
+ },{ _id : false });
36
+
37
+
38
+ var ConditionsSchema = new Schema({
39
+ all: [TriggerConditionSchema],
40
+ any: [TriggerConditionSchema]
41
+ });
42
+
43
+
44
+
45
+
46
+ var ActionSchema = new Schema({
47
+ key: { //ex: message.send
48
+ type: String,
49
+ required: true,
50
+ index:true
51
+ },
52
+ parameters: {
53
+ type: Object,
54
+ required: false
55
+ },
56
+ // name: {
57
+ // type: String,
58
+ // required: true
59
+ // },
60
+ // description: {
61
+ // type: String,
62
+ // required: false
63
+ // },
64
+
65
+ script: { //use ref
66
+ type: String,
67
+ required: false
68
+ },
69
+ });
70
+
71
+
72
+
73
+
74
+ var TriggerEventSchema = new Schema({
75
+ key: { //ex: request.create
76
+ type: String,
77
+ required: true,
78
+ index:true
79
+ },
80
+ name: {
81
+ type: String,
82
+ required: true
83
+ },
84
+ description: {
85
+ type: String,
86
+ required: false
87
+ },
88
+ });
89
+
90
+
91
+
92
+ var TriggerSchema = new Schema({
93
+ name: {
94
+ type: String,
95
+ required: true
96
+ },
97
+ description: {
98
+ type: String,
99
+ required: false
100
+ },
101
+ delay: {
102
+ type: Number,
103
+ select: true
104
+ },
105
+ // triggers: [TriggerSchema],
106
+ trigger: TriggerEventSchema,
107
+ conditions: ConditionsSchema,
108
+ actions: [ActionSchema],
109
+ enabled: {
110
+ type:Boolean,
111
+ required:true,
112
+ default:false,
113
+ index:true
114
+ },
115
+ id_project: {
116
+ type: String,
117
+ required: true,
118
+ index:true
119
+ },
120
+ code: {
121
+ type: String,
122
+ select: true
123
+ },
124
+ type: {
125
+ type: String, //internal per new_conversation e invite bot
126
+ select: true
127
+ },
128
+ version: {
129
+ type: Number,
130
+ select: true
131
+ },
132
+ createdBy: {
133
+ type: String,
134
+ required: true
135
+ },
136
+ updatedBy: {
137
+ type: String,
138
+ required: true
139
+ }
140
+ }, {
141
+ timestamps: true
142
+ }
143
+ );
144
+
145
+
146
+ // let query = {id_project: event.id_project, enabled:true, 'trigger.key':eventKey};
147
+ TriggerSchema.index({ id_project: 1, "trigger.key":1, enabled:1 });
148
+
149
+ module.exports = mongoose.model('trigger', TriggerSchema);