@tiledesk/tiledesk-server 2.2.39 → 2.3.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/LICENSE +14 -657
  3. package/README.md +17 -3
  4. package/app.js +14 -2
  5. package/channels/chat21/chat21WebHook.js +12 -1
  6. package/event/botEvent.js +1 -1
  7. package/event/subscriptionEvent.js +11 -0
  8. package/fonts/Roboto-Italic.ttf +0 -0
  9. package/fonts/Roboto-Medium.ttf +0 -0
  10. package/fonts/Roboto-MediumItalic.ttf +0 -0
  11. package/fonts/Roboto-Regular.ttf +0 -0
  12. package/middleware/passport.js +4 -1
  13. package/models/lead.js +2 -0
  14. package/models/request.js +38 -11
  15. package/models/subscriptionLog.js +34 -0
  16. package/models/tagLibrary.js +42 -0
  17. package/package.json +4 -11
  18. package/pubmodules/activities/activityArchiver.js +295 -0
  19. package/pubmodules/activities/index.js +3 -0
  20. package/pubmodules/activities/models/activity.js +88 -0
  21. package/pubmodules/activities/routes/activity.js +710 -0
  22. package/pubmodules/activities/test/activityRoute.js +85 -0
  23. package/pubmodules/analytics/analytics.js +1719 -0
  24. package/pubmodules/analytics/index.js +3 -0
  25. package/pubmodules/canned/cannedResponse.js +51 -0
  26. package/pubmodules/canned/cannedResponseRoute.js +157 -0
  27. package/pubmodules/canned/index.js +3 -0
  28. package/pubmodules/emailNotification/requestNotification.js +184 -26
  29. package/pubmodules/messageActions/messageActionsInterceptor.js +4 -2
  30. package/pubmodules/pubModulesManager.js +104 -5
  31. package/pubmodules/scheduler/tasks/closeAgentUnresponsiveRequestTask.js +3 -1
  32. package/pubmodules/scheduler/tasks/closeBotUnresponsiveRequestTask.js +3 -1
  33. package/pubmodules/trigger/default.js +271 -0
  34. package/pubmodules/trigger/event/actionEventEmitter.js +10 -0
  35. package/pubmodules/trigger/event/flowEventEmitter.js +10 -0
  36. package/pubmodules/trigger/event/triggerEventEmitter.js +10 -0
  37. package/pubmodules/trigger/index.js +3 -0
  38. package/pubmodules/trigger/models/trigger.js +149 -0
  39. package/pubmodules/trigger/rulesTrigger.js +1181 -0
  40. package/pubmodules/trigger/start.js +114 -0
  41. package/pubmodules/trigger/triggerRoute.js +150 -0
  42. package/routes/department.js +51 -0
  43. package/routes/group.js +140 -0
  44. package/routes/lead.js +24 -1
  45. package/routes/message.js +6 -3
  46. package/routes/project.js +52 -0
  47. package/routes/public-request.js +265 -2
  48. package/routes/request.js +83 -11
  49. package/routes/subscription.js +140 -0
  50. package/routes/tag.js +138 -0
  51. package/routes/user-request.js +3 -2
  52. package/routes/widget.js +16 -1
  53. package/routes/widgetLoader.js +31 -0
  54. package/services/emailService.js +189 -11
  55. package/services/faqService.js +1 -1
  56. package/services/leadService.js +2 -0
  57. package/services/modulesManager.js +7 -188
  58. package/services/requestService.js +364 -6
  59. package/services/subscriptionNotifier.js +485 -0
  60. package/template/email/assignedEmailMessage.html +1 -1
  61. package/template/email/assignedRequest.html +1 -1
  62. package/template/email/newMessage.html +1 -1
  63. package/template/email/newMessageFollower.html +236 -0
  64. package/template/email/passwordChanged.html +1 -1
  65. package/template/email/pooledEmailMessage.html +1 -1
  66. package/template/email/pooledRequest.html +1 -1
  67. package/template/email/resetPassword.html +2 -2
  68. package/template/email/ticket.html +1 -1
  69. package/test/messageRoute.js +69 -0
  70. package/test/requestService.js +3 -1
  71. package/views/messages.jade +2 -2
@@ -1,10 +1,9 @@
1
1
 
2
2
  var winston = require('../config/winston');
3
- // var validtoken = require('../middleware/valid-token');
4
- // var roleChecker = require('../middleware/has-role');
5
- // var passport = require('passport');
6
- // require('../middleware/passport')(passport);
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
 
@@ -84,7 +84,9 @@ findUnresponsiveRequests() {
84
84
  requests.forEach(request => {
85
85
  winston.debug("********unresponsive request ", request);
86
86
 
87
- return requestService.closeRequestByRequestId(request.request_id, request.id_project, false, false).then(function(updatedStatusRequest) {
87
+ // closeRequestByRequestId(request_id, id_project, skipStatsUpdate, notify, closed_by)
88
+ const closed_by = "_bot_unresponsive";
89
+ return requestService.closeRequestByRequestId(request.request_id, request.id_project, false, false, closed_by).then(function(updatedStatusRequest) {
88
90
  winston.verbose("CloseAgentUnresponsiveRequestTask: Request closed with request_id: " + request.request_id);
89
91
  // winston.info("Request closed",updatedStatusRequest);
90
92
  }).catch(function(err) {
@@ -95,7 +95,9 @@ findUnresponsiveRequests() {
95
95
 
96
96
  winston.debug("********unresponsive request ", request);
97
97
 
98
- return requestService.closeRequestByRequestId(request.request_id, request.id_project, false, false).then(function(updatedStatusRequest) {
98
+ // closeRequestByRequestId(request_id, id_project, skipStatsUpdate, notify, closed_by)
99
+ const closed_by = "_bot_unresponsive";
100
+ return requestService.closeRequestByRequestId(request.request_id, request.id_project, false, false, closed_by).then(function(updatedStatusRequest) {
99
101
  winston.info("CloseBotUnresponsiveRequestTask: Request closed with request_id: " + request.request_id);
100
102
  // winston.info("Request closed",updatedStatusRequest);
101
103
  }).catch(function(err) {
@@ -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);