@tiledesk/tiledesk-server 2.3.6 → 2.3.7-1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (126) hide show
  1. package/.github/workflows/docker-community-worker-push-latest.yml +23 -0
  2. package/.github/workflows/docker-image-tag-worker-community-tag-push.yml +22 -0
  3. package/CHANGELOG.md +361 -3
  4. package/Dockerfile-jobs +31 -0
  5. package/app.js +62 -69
  6. package/channels/chat21/chat21Handler.js +37 -6
  7. package/channels/chat21/chat21WebHook.js +62 -34
  8. package/channels/chat21/package-lock.json +663 -706
  9. package/channels/chat21/package.json +2 -2
  10. package/config/labels/widget.json +337 -136
  11. package/deploy.sh +2 -0
  12. package/event/messageEvent.js +110 -9
  13. package/jobs.js +80 -0
  14. package/jobsManager.js +47 -0
  15. package/middleware/has-role.js +10 -3
  16. package/middleware/ipFilter.js +220 -0
  17. package/middleware/passport.js +8 -2
  18. package/models/department.js +1 -1
  19. package/models/faq.js +77 -25
  20. package/models/faq_kb.js +19 -0
  21. package/models/message.js +10 -8
  22. package/models/project.js +10 -0
  23. package/models/project_user.js +10 -0
  24. package/models/request.js +12 -1
  25. package/package.json +12 -11
  26. package/pubmodules/activities/activityArchiver.js +216 -90
  27. package/pubmodules/activities/routes/activity.js +1 -1
  28. package/pubmodules/apps/index.js +8 -0
  29. package/pubmodules/apps/listener.js +27 -0
  30. package/pubmodules/cache/index.js +2 -0
  31. package/pubmodules/cache/mongoose-cachegoose-fn.js +630 -0
  32. package/pubmodules/canned/cannedResponse.js +4 -0
  33. package/pubmodules/canned/cannedResponseRoute.js +10 -5
  34. package/pubmodules/dialogflow/index.js +10 -0
  35. package/pubmodules/dialogflow/listener.js +66 -0
  36. package/pubmodules/emailNotification/requestNotification.js +58 -28
  37. package/pubmodules/events/eventRoute.js +49 -24
  38. package/pubmodules/messageTransformer/messageHandlebarsTransformerInterceptor.js +6 -1
  39. package/pubmodules/messageTransformer/messageTransformerInterceptor.js +10 -4
  40. package/pubmodules/pubModulesManager.js +173 -7
  41. package/pubmodules/queue/index.js +4 -0
  42. package/pubmodules/queue/reconnect.js +331 -0
  43. package/pubmodules/queue/reconnectFanout.js +256 -0
  44. package/pubmodules/rasa/listener.js +5 -5
  45. package/pubmodules/routing-queue/index.js +3 -0
  46. package/pubmodules/routing-queue/listener.js +328 -0
  47. package/pubmodules/rules/conciergeBot.js +2 -2
  48. package/pubmodules/scheduler/tasks/closeAgentUnresponsiveRequestTask.js +6 -1
  49. package/pubmodules/scheduler/tasks/closeBotUnresponsiveRequestTask.js +7 -1
  50. package/pubmodules/tilebot/index.js +11 -0
  51. package/pubmodules/tilebot/listener.js +85 -0
  52. package/pubmodules/trigger/rulesTrigger.js +137 -14
  53. package/pubmodules/trigger/start.js +5 -1
  54. package/pubmodules/whatsapp/index.js +7 -0
  55. package/pubmodules/whatsapp/listener.js +32 -0
  56. package/routes/auth.js +7 -2
  57. package/routes/campaigns.js +3 -3
  58. package/routes/department.js +3 -2
  59. package/routes/email.js +32 -2
  60. package/routes/faq.js +37 -2
  61. package/routes/faq_kb.js +496 -133
  62. package/routes/faqpub.js +5 -0
  63. package/routes/lead.js +56 -0
  64. package/routes/message.js +196 -14
  65. package/routes/messagesRoot.js +39 -0
  66. package/routes/project.js +76 -4
  67. package/routes/project_user.js +11 -1
  68. package/routes/project_user_test.js +19 -0
  69. package/routes/request.js +134 -30
  70. package/routes/troubleshooting.js +12 -0
  71. package/routes/users-util.js +39 -0
  72. package/routes/users.js +1 -1
  73. package/routes/widget.js +64 -2
  74. package/services/BotSubscriptionNotifier.js +5 -0
  75. package/services/banUserNotifier.js +86 -0
  76. package/services/cacheEnabler.js +56 -0
  77. package/services/chatbotService.js +101 -0
  78. package/services/departmentService.js +25 -3
  79. package/services/emailService.js +170 -28
  80. package/services/faqBotHandler.js +2 -3
  81. package/services/faqService.js +28 -3
  82. package/services/geoService.js +36 -6
  83. package/services/labelService.js +1 -1
  84. package/services/leadService.js +3 -2
  85. package/services/messageService.js +4 -2
  86. package/services/modulesManager.js +23 -76
  87. package/services/operatingHoursService.js +9 -4
  88. package/services/requestService.js +75 -39
  89. package/services/subscriptionNotifier.js +9 -4
  90. package/services/trainingService.js +106 -0
  91. package/template/email/assignedEmailMessage.html +21 -11
  92. package/template/email/assignedRequest.html +21 -11
  93. package/template/email/beenInvitedExistingUser.html +16 -6
  94. package/template/email/beenInvitedNewUser.html +16 -6
  95. package/template/email/emailDirect.html +130 -0
  96. package/template/email/newMessage.html +18 -8
  97. package/template/email/newMessageFollower.html +22 -12
  98. package/template/email/passwordChanged.html +15 -5
  99. package/template/email/pooledEmailMessage.html +21 -11
  100. package/template/email/pooledRequest.html +20 -10
  101. package/template/email/resetPassword.html +15 -5
  102. package/template/email/sendTranscript.html +7 -4
  103. package/template/email/ticket.html +17 -7
  104. package/template/email/verify.html +15 -5
  105. package/test/cannedRoute.js +157 -0
  106. package/test/chatbot-mock.js +127 -0
  107. package/test/example-json-intents.txt +1 -0
  108. package/test/example-json.txt +1 -0
  109. package/test/example.json +1 -0
  110. package/test/faqRoute.js +353 -208
  111. package/test/faqkbRoute.js +669 -64
  112. package/test/imageRoute.js +1 -1
  113. package/test/messageRoute.js +387 -5
  114. package/test/requestRoute.js +6 -6
  115. package/test/requestService.js +55 -4
  116. package/test-int/cache-project.js +90 -0
  117. package/test-int/cache-project_user.js +88 -0
  118. package/utils/UIDGenerator.js +20 -0
  119. package/utils/cacheUtil.js +2 -2
  120. package/utils/orgUtil.js +3 -3
  121. package/utils/promiseUtil.js +31 -0
  122. package/utils/recipientEmailUtil.js +66 -0
  123. package/utils/sendEmailUtil.js +34 -0
  124. package/utils/sendMessageUtil.js +1 -1
  125. package/utils/stringUtil.js +12 -0
  126. package/websocket/webSocketServer.js +33 -10
package/models/faq.js CHANGED
@@ -9,27 +9,27 @@ var defaultFullTextLanguage = process.env.DEFAULT_FULLTEXT_INDEX_LANGUAGE || "no
9
9
  var FaqSchema = new Schema({
10
10
  id_faq_kb: {
11
11
  type: String,
12
- index: true
12
+ index: true
13
13
  },
14
- intent_id: {
14
+ intent_id: {
15
15
  type: String,
16
16
  required: false,
17
- index:true,
18
- default: function() {
17
+ index: true,
18
+ default: function () {
19
19
  return uuidv4();
20
- }
20
+ }
21
21
  },
22
22
  intent_display_name: { //documentare
23
23
  type: String,
24
- required: false,
25
- index:true,
26
- default: function() {
24
+ required: false,
25
+ index: true,
26
+ default: function () {
27
27
  return nanoid(6);
28
- }
28
+ }
29
29
  },
30
30
  question: {
31
31
  type: String,
32
- required: true
32
+ required: false
33
33
  },
34
34
 
35
35
  webhook_enabled: { //usa questo
@@ -39,7 +39,17 @@ var FaqSchema = new Schema({
39
39
  },
40
40
  answer: {
41
41
  type: String,
42
- required: true
42
+ //required: true
43
+ required: false
44
+ },
45
+ reply: {
46
+ type: Object,
47
+ required: false,
48
+ },
49
+ enabled: {
50
+ type: Boolean,
51
+ required: false,
52
+ default: true,
43
53
  },
44
54
  id_project: {
45
55
  type: String,
@@ -64,17 +74,25 @@ var FaqSchema = new Schema({
64
74
  index: true
65
75
  },
66
76
 
67
- // "stats":{
68
- // "conversation_count":2,
69
- // "all_done_count":0,
70
- // "wait_for_team_count":2
71
- // }
77
+ // "stats":{
78
+ // "conversation_count":2,
79
+ // "all_done_count":0,
80
+ // "wait_for_team_count":2
81
+ // }
72
82
 
73
83
  createdBy: {
74
84
  type: String,
75
85
  required: true
86
+ },
87
+ form: {
88
+ type: Object,
89
+ required: false
90
+ },
91
+ actions: {
92
+ type: Array,
93
+ required: false
76
94
  }
77
- },{
95
+ }, {
78
96
  timestamps: true,
79
97
  toJSON: { virtuals: true } //used to polulate messages in toJSON// https://mongoosejs.com/docs/populate.html
80
98
  }
@@ -88,26 +106,60 @@ FaqSchema.virtual('faq_kb', {
88
106
  //options: { sort: { name: -1 }, limit: 5 } // Query options, see http://bit.ly/mongoose-query-options
89
107
  });
90
108
 
91
- FaqSchema.index({ id_project: 1, id_faq_kb: 1, question: 1 });
109
+ FaqSchema.index({ id_project: 1, id_faq_kb: 1, question: 1 });
92
110
 
93
111
  // https://docs.mongodb.com/manual/core/index-text/
94
112
  // https://docs.mongodb.com/manual/tutorial/specify-language-for-text-index/
95
113
  // https://docs.mongodb.com/manual/reference/text-search-languages/#text-search-languages
96
114
 
97
-
98
- FaqSchema.index({question: 'text'},
99
- {"name":"faq_fulltext","default_language": defaultFullTextLanguage,"language_override": "language"}); // schema level
115
+ // In testing...
116
+ // FaqSchema.index({ question: "text", answer: "text" }, { weights: { question: 5, answer: 3 } })
117
+
118
+ // FaqSchema.statics = {
119
+ // searchPartial: function (q, callback) {
120
+ // return this.find({
121
+ // $or: [
122
+ // { "question": new RegExp(q, "gi") },
123
+ // { "answer": new RegExp(q, "gi") },
124
+ // ]
125
+ // }, callback)
126
+ // },
127
+
128
+ // searchFull: function (q, callback) {
129
+ // return this.find({
130
+ // $text: { $search: q, $caseSensitive: false }
131
+ // }, callback)
132
+ // },
133
+
134
+ // searchFull: function (q, callback) {
135
+ // return this.find({
136
+ // $text: { $search: q, $caseSensitive: false }
137
+ // }, callback)
138
+ // },
139
+
140
+ // search: function (q, callback) {
141
+ // this.searchFull(q, (err, data) => {
142
+ // if (err) return callback(err, data);
143
+ // if (!err && data.length) return callback(err, data);
144
+ // if (!err && data.length === 0) return this.searchPartial(q, callback);
145
+ // });
146
+ // },
147
+
148
+ // }
149
+
150
+ FaqSchema.index({ question: 'text' },
151
+ { "name": "faq_fulltext", "default_language": defaultFullTextLanguage, "language_override": "language" }); // schema level
100
152
 
101
153
  // FaqSchema.index({question: 'text', answer: 'text'},
102
- // {"name":"faq_fulltext","default_language": defaultFullTextLanguage,"language_override": "language", weights: {question: 10,answer: 1}}); // schema level
154
+ // {"name":"faq_fulltext","default_language": defaultFqullTextLanguage,"language_override": "language", weights: {question: 10,answer: 1}}); // schema level
103
155
 
104
156
 
105
- FaqSchema.index({ id_project: 1, id_faq_kb: 1, intent_display_name: 1 }, { unique: true });
157
+ FaqSchema.index({ id_project: 1, id_faq_kb: 1, intent_display_name: 1 }, { unique: true });
106
158
 
107
159
 
108
- var faq = mongoose.model('faq', FaqSchema);
160
+ var faq = mongoose.model('faq', FaqSchema);
109
161
 
110
- faq.on('index', function(error) {
162
+ faq.on('index', function (error) {
111
163
  // "_id index cannot be sparse"
112
164
  winston.debug('index', error);
113
165
  });
package/models/faq_kb.js CHANGED
@@ -65,6 +65,25 @@ var Faq_kbSchema = new Schema({
65
65
  createdBy: {
66
66
  type: String,
67
67
  required: true
68
+ },
69
+ public: {
70
+ type: Boolean,
71
+ required: false,
72
+ default: false
73
+ },
74
+ certified: {
75
+ type: Boolean,
76
+ required: false,
77
+ default: false
78
+ },
79
+ mainCategory: {
80
+ type: String,
81
+ required: false
82
+ },
83
+ intentsEngine: {
84
+ type: String,
85
+ required: false,
86
+ default: 'none'
68
87
  }
69
88
  },{
70
89
  timestamps: true
package/models/message.js CHANGED
@@ -20,7 +20,7 @@ var MessageSchema = new Schema({
20
20
  senderFullname: {
21
21
  type: String,
22
22
  required: false,
23
- default: "Guest"
23
+ default: "Guest" // guest_here
24
24
  },
25
25
  recipient: {
26
26
  type: String,
@@ -45,13 +45,13 @@ var MessageSchema = new Schema({
45
45
  },
46
46
  text: {
47
47
  type: String,
48
- required: function() {
49
- if (this.type === "text") {
50
- return true;
51
- }else {
52
- return false;
53
- }
54
- }
48
+ // required: function() {
49
+ // if (this.type === "text") {
50
+ // return true;
51
+ // }else {
52
+ // return false;
53
+ // }
54
+ // }
55
55
  },
56
56
  language: { //ISO 639-1 (Two letter codes) https://docs.mongodb.com/manual/reference/text-search-languages/#text-search-languages
57
57
  type: String,
@@ -97,6 +97,8 @@ MessageSchema.index({ recipient: 1, updatedAt:1 });
97
97
  MessageSchema.index({ id_project: 1, recipient:1, updatedAt: 1 });
98
98
  MessageSchema.index({ id_project: 1, "attributes._answerid": 1 });
99
99
 
100
+
101
+
100
102
  // https://docs.mongodb.com/manual/core/index-text/
101
103
  // https://docs.mongodb.com/manual/tutorial/specify-language-for-text-index/
102
104
  // https://docs.mongodb.com/manual/reference/text-search-languages/#text-search-languages
package/models/project.js CHANGED
@@ -111,6 +111,16 @@ var ProjectSchema = new Schema({
111
111
  ipFilter: [{
112
112
  type: String
113
113
  }],
114
+ ipFilterDenyEnabled:{
115
+ type: Boolean,
116
+ default: false
117
+ },
118
+ ipFilterDeny: [{
119
+ type: String
120
+ }],
121
+ bannedUsers: [{
122
+ id: String, ip: String
123
+ }],
114
124
  // defaultLanguage: {
115
125
  // type: String,
116
126
  // required: true,
@@ -37,6 +37,9 @@ var TagSchema = require("../models/tag");
37
37
  index: true
38
38
  // required: true
39
39
  },
40
+ profileStatus: {
41
+ type: String,
42
+ },
40
43
  presence: PresenceSchema,
41
44
  attributes: {
42
45
  type: Object,
@@ -108,5 +111,12 @@ Project_userSchema.virtual('isAuthenticated').get(function () {
108
111
  // Project_user.find({ id_project: projectid, id_user: { $in : group[0].members}, role: { $in : [RoleConstants.OWNER, RoleConstants.ADMIN, RoleConstants.AGENT]} })
109
112
  Project_userSchema.index({ id_project: 1, id_user:1, role: 1 });
110
113
 
114
+ // suggested by atlas
115
+ Project_userSchema.index({ id_project: 1, role: 1, status: 1, createdAt: 1 });
116
+
117
+
118
+
119
+
120
+
111
121
  module.exports = mongoose.model('project_user', Project_userSchema);;
112
122
 
package/models/request.js CHANGED
@@ -273,7 +273,16 @@ var RequestSchema = new Schema({
273
273
  required: true,
274
274
  index: true
275
275
  },
276
-
276
+ smartAssignment: {
277
+ type: Boolean,
278
+ default: true,
279
+ index: true
280
+ },
281
+ workingStatus: { //new, pending
282
+ type: String,
283
+ required: false,
284
+ index: true
285
+ },
277
286
  createdBy: {
278
287
  type: String,
279
288
  required: true
@@ -465,6 +474,8 @@ RequestSchema.index({ id_project: 1, createdAt: 1, preflight: 1});
465
474
  RequestSchema.index({ hasBot: 1, status: 1, createdAt: 1});
466
475
 
467
476
 
477
+
478
+
468
479
  // cannot index parallel arrays [agents] [participants] {"driv
469
480
  // RequestSchema.index({ id_project: 1, status: 1, preflight:1, participants:1, "agents.id_user":1, updatedAt: -1 }); //NN LO APPLICA
470
481
 
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.3.6",
4
+ "version": "2.3.71.1",
5
5
  "scripts": {
6
6
  "start": "node ./bin/www",
7
7
  "pretest": "mongodb-runner start",
@@ -14,7 +14,7 @@
14
14
  "enable-ent": "echo //registry.npmjs.org/:_authToken=${NPM_TOKEN} > .npmrc"
15
15
  },
16
16
  "private": false,
17
- "author": "Andrea Leo - Frontiere21 SRL",
17
+ "author": "Andrea Leo - Tiledesk SRL",
18
18
  "license": "AGPL-3.0",
19
19
  "homepage": "https://www.tiledesk.com",
20
20
  "repository": {
@@ -29,29 +29,31 @@
29
29
  "tiledesk-server": "./bin/www"
30
30
  },
31
31
  "optionalDependencies": {
32
- "@tiledesk-ent/tiledesk-server-cache": "^1.1.10",
33
- "@tiledesk-ent/tiledesk-server-dialogflow": "^1.1.6",
34
32
  "@tiledesk-ent/tiledesk-server-jwthistory": "^1.1.9",
35
33
  "@tiledesk-ent/tiledesk-server-payments": "^1.1.6",
36
- "@tiledesk-ent/tiledesk-server-queue": "^1.1.11",
37
34
  "@tiledesk-ent/tiledesk-server-request-history": "^1.1.5",
38
- "@tiledesk-ent/tiledesk-server-routing-queue": "^1.1.11",
39
35
  "@tiledesk-ent/tiledesk-server-visitorcounter": "^1.1.1",
40
36
  "@tiledesk-ent/tiledesk-server-enterprise": "^1.0.0"
41
37
  },
42
38
  "dependencies": {
43
- "@tiledesk/tiledesk-chat21-app": "^1.1.4",
39
+ "@tiledesk/tiledesk-apps": "^1.0.9",
40
+ "@tiledesk/tiledesk-whatsapp-connector": "^0.1.19",
41
+ "@tiledesk/tiledesk-chat21-app": "^1.1.7",
44
42
  "@tiledesk/tiledesk-chatbot-util": "^0.8.33",
45
43
  "@tiledesk/tiledesk-json-rules-engine": "^4.0.3",
46
- "@tiledesk/tiledesk-rasa-connector": "^1.0.7",
44
+ "@tiledesk/tiledesk-rasa-connector": "^1.0.10",
45
+ "@tiledesk/tiledesk-tybot-connector": "^0.1.42",
46
+ "@tiledesk/tiledesk-dialogflow-connector": "^1.8.3",
47
47
  "app-root-path": "^3.0.0",
48
48
  "bcrypt-nodejs": "0.0.3",
49
49
  "body-parser": "^1.20.0",
50
+ "cachegoose": "^8.0.0",
50
51
  "cookie-parser": "^1.4.6",
51
52
  "cors": "^2.8.5",
52
53
  "csv-express": "^1.2.2",
53
54
  "debug": "^4.3.4",
54
55
  "dotenv": "^8.6.0",
56
+ "amqplib": "^0.5.5",
55
57
  "email-templates": "^8.1.0",
56
58
  "eventemitter2": "^6.4.4",
57
59
  "express": "^4.17.3",
@@ -61,6 +63,7 @@
61
63
  "fast-csv": "^4.3.6",
62
64
  "geoip-lite": "^1.4.5",
63
65
  "handlebars": "^4.7.7",
66
+ "handlebars-dateformat": "^1.1.3",
64
67
  "html-entities": "^2.3.3",
65
68
  "http": "0.0.0",
66
69
  "immutable": "^4.1.0",
@@ -106,9 +109,7 @@
106
109
  "loadtest": "^5.2.0",
107
110
  "mocha": "^8.4.0",
108
111
  "mongodb-runner": "4.8.3",
109
- "nodemon": "^2.0.16",
110
- "sinon": "^9.2.4",
111
- "sinon-mongoose": "^2.3.0"
112
+ "nodemon": "^2.0.16"
112
113
  },
113
114
  "bugs": {
114
115
  "url": "https://github.com/Tiledesk/tiledesk-server/issues"