@tiledesk/tiledesk-server 2.3.6 → 2.3.7-1.2

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 (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.2",
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"