@tiledesk/tiledesk-server 2.3.28 → 2.3.30
Sign up to get free protection for your applications and to get access to all the features.
- package/CHANGELOG.md +26 -1
- package/app.js +14 -5
- package/event/messageEvent.js +1 -1
- package/middleware/has-role.js +10 -3
- package/models/faq.js +11 -1
- package/models/faq_kb.js +5 -0
- package/models/message.js +1 -1
- package/models/project_user.js +7 -1
- package/package.json +1 -1
- package/pubmodules/cache/mongoose-cachegoose-fn.js +21 -1
- package/routes/department.js +2 -1
- package/routes/faq.js +16 -0
- package/routes/faqpub.js +5 -0
- package/routes/lead.js +52 -0
- package/routes/message.js +158 -1
- package/routes/project.js +2 -2
- package/routes/project_user_test.js +19 -0
- package/routes/request.js +97 -21
- package/services/BotSubscriptionNotifier.js +5 -0
- package/services/cacheEnabler.js +9 -4
- package/services/departmentService.js +3 -3
- package/services/faqBotHandler.js +2 -3
- package/services/faqService.js +8 -1
- package/services/labelService.js +1 -1
- package/services/leadService.js +2 -2
- package/services/messageService.js +2 -1
- package/services/operatingHoursService.js +2 -2
- package/test/faqRoute.js +130 -14
- package/test/imageRoute.js +1 -1
- package/test/messageRoute.js +385 -3
- package/test-int/cache-project.js +90 -0
- package/test-int/cache-project_user.js +88 -0
- package/utils/promiseUtil.js +31 -0
- package/utils/sendMessageUtil.js +1 -1
package/routes/request.js
CHANGED
@@ -17,6 +17,10 @@ var Message = require("../models/message");
|
|
17
17
|
var cacheUtil = require('../utils/cacheUtil');
|
18
18
|
var RequestConstants = require("../models/requestConstants");
|
19
19
|
var cacheEnabler = require("../services/cacheEnabler");
|
20
|
+
var Project_user = require("../models/project_user");
|
21
|
+
var Lead = require("../models/lead");
|
22
|
+
var UIDGenerator = require("../utils/UIDGenerator");
|
23
|
+
|
20
24
|
|
21
25
|
csv = require('csv-express');
|
22
26
|
csv.separator = ';';
|
@@ -32,9 +36,9 @@ const { check, validationResult } = require('express-validator');
|
|
32
36
|
// TODO make a synchronous chat21 version (with query parameter?) with request.support_group.create
|
33
37
|
router.post('/',
|
34
38
|
[
|
35
|
-
check('
|
39
|
+
check('first_text').notEmpty(),
|
36
40
|
],
|
37
|
-
|
41
|
+
async (req, res) => {
|
38
42
|
|
39
43
|
var startTimestamp = new Date();
|
40
44
|
winston.debug("request create timestamp: " + startTimestamp);
|
@@ -54,41 +58,113 @@ function (req, res) {
|
|
54
58
|
winston.debug("req.projectuser", req.projectuser);
|
55
59
|
}
|
56
60
|
|
57
|
-
|
61
|
+
var project_user = req.projectuser;
|
62
|
+
|
63
|
+
var sender = req.body.sender;
|
64
|
+
var fullname = req.body.senderFullname || req.user.fullName;
|
65
|
+
var email = req.body.email || req.user.email;
|
66
|
+
|
58
67
|
let messageStatus = req.body.status || MessageConstants.CHAT_MESSAGE_STATUS.SENDING;
|
59
68
|
winston.debug('messageStatus: ' + messageStatus);
|
60
69
|
|
61
|
-
var request_id = req.params.request_id || 'support-group-' + req.projectid + "-" +
|
70
|
+
var request_id = req.params.request_id || 'support-group-' + req.projectid + "-" + UIDGenerator.generate();
|
71
|
+
winston.debug('request_id: ' + request_id);
|
62
72
|
|
63
|
-
|
64
|
-
return leadService.createIfNotExistsWithLeadId(req.body.sender || req.user._id, req.body.senderFullname || req.user.fullName , req.body.email || req.user.email, req.projectid, null, req.body.attributes || req.user.attributes)
|
65
|
-
.then(function(createdLead) {
|
73
|
+
if (sender) {
|
66
74
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
75
|
+
var isObjectId = mongoose.Types.ObjectId.isValid(sender);
|
76
|
+
winston.debug("isObjectId:"+ isObjectId);
|
77
|
+
|
78
|
+
var queryProjectUser = {id_project:req.projectid, status: "active" };
|
79
|
+
|
80
|
+
if (isObjectId) {
|
81
|
+
queryProjectUser.id_user = sender;
|
82
|
+
} else {
|
83
|
+
queryProjectUser.uuid_user = sender;
|
84
|
+
}
|
85
|
+
|
86
|
+
winston.debug("queryProjectUser", queryProjectUser);
|
87
|
+
|
88
|
+
project_user = await Project_user.findOne(queryProjectUser).populate({path:'id_user', select:{'firstname':1, 'lastname':1, 'email':1}})
|
89
|
+
winston.debug("project_user", project_user);
|
90
|
+
|
91
|
+
if (!project_user) {
|
92
|
+
return res.status(403).send({success: false, msg: 'Unauthorized. Project_user not found with user id : '+ sender });
|
93
|
+
}
|
94
|
+
|
95
|
+
if ( project_user.id_user) {
|
96
|
+
fullname = project_user.id_user.fullName;
|
97
|
+
winston.debug("pu fullname: "+ fullname);
|
98
|
+
email = project_user.id_user.email;
|
99
|
+
winston.debug("pu email: "+ email);
|
100
|
+
} else if (project_user.uuid_user) {
|
101
|
+
var lead = await Lead.findOne({lead_id: project_user.uuid_user, id_project: req.projectid});
|
102
|
+
winston.debug("lead: ",lead);
|
103
|
+
if (lead) {
|
104
|
+
fullname = lead.fullname;
|
105
|
+
winston.debug("lead fullname: "+ fullname);
|
106
|
+
email = lead.email;
|
107
|
+
winston.debug("lead email: "+ email);
|
108
|
+
}else {
|
109
|
+
winston.warn("lead not found: " + JSON.stringify({lead_id: project_user.uuid_user, id_project: req.projectid}));
|
110
|
+
}
|
111
|
+
|
112
|
+
} else {
|
113
|
+
winston.warn("pu fullname and email empty");
|
114
|
+
}
|
115
|
+
|
116
|
+
}
|
72
117
|
|
73
118
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
119
|
+
// createIfNotExistsWithLeadId(lead_id, fullname, email, id_project, createdBy, attributes) {
|
120
|
+
return leadService.createIfNotExistsWithLeadId(sender || req.user._id, fullname, email, req.projectid, null, req.body.attributes || req.user.attributes)
|
121
|
+
.then(function(createdLead) {
|
122
|
+
|
123
|
+
|
124
|
+
|
125
|
+
var new_request = {
|
126
|
+
request_id: request_id,
|
127
|
+
project_user_id: req.projectuser._id,
|
128
|
+
lead_id: createdLead._id,
|
129
|
+
id_project:req.projectid,
|
130
|
+
first_text: req.body.first_text,
|
131
|
+
departmentid: req.body.departmentid,
|
132
|
+
sourcePage:req.body.sourcePage,
|
133
|
+
language: req.body.language,
|
134
|
+
userAgent:req.body.userAgent,
|
135
|
+
status:null,
|
136
|
+
createdBy: req.user._id,
|
137
|
+
attributes: req.body.attributes,
|
138
|
+
subject: req.body.subject,
|
139
|
+
preflight:undefined,
|
140
|
+
channel: req.body.channel,
|
141
|
+
location: req.body.location,
|
142
|
+
participants: req.body.participants,
|
143
|
+
lead: createdLead, requester: project_user,
|
144
|
+
priority: req.body.priority,
|
145
|
+
followers: req.body.followers,
|
146
|
+
};
|
147
|
+
|
148
|
+
return requestService.create(new_request).then(function (savedRequest) {
|
149
|
+
// createWithIdAndRequester(request_id, project_user_id, lead_id, id_project, first_text, departmentid, sourcePage, language, userAgent, status, createdBy, attributes) {
|
150
|
+
// return requestService.createWithIdAndRequester(request_id, req.projectuser._id, createdLead._id, req.projectid,
|
151
|
+
// req.body.text, req.body.departmentid, req.body.sourcePage,
|
152
|
+
// req.body.language, req.body.userAgent, null, req.user._id, req.body.attributes, req.body.subject).then(function (savedRequest) {
|
78
153
|
|
79
154
|
|
155
|
+
// return messageService.create(sender || req.user._id, fullname, request_id, req.body.text,
|
156
|
+
// req.projectid, req.user._id, messageStatus, req.body.attributes, req.body.type, req.body.metadata, req.body.language, undefined, req.body.channel).then(function(savedMessage){
|
157
|
+
|
80
158
|
// create(sender, senderFullname, recipient, text, id_project, createdBy, status, attributes, type, metadata) {
|
81
|
-
return messageService.create(req.body.sender || req.user._id, req.body.senderFullname || req.user.fullName, request_id, req.body.text,
|
82
|
-
|
159
|
+
// return messageService.create(req.body.sender || req.user._id, req.body.senderFullname || req.user.fullName, request_id, req.body.text,
|
160
|
+
// req.projectid, req.user._id, messageStatus, req.body.attributes, req.body.type, req.body.metadata).then(function(savedMessage){
|
83
161
|
|
84
|
-
// return requestService.incrementMessagesCountByRequestId(savedRequest.request_id, savedRequest.id_project).then(function(savedRequestWithIncrement) {
|
85
|
-
|
86
162
|
|
87
163
|
winston.debug('res.json(savedRequest)');
|
88
164
|
var endTimestamp = new Date();
|
89
165
|
winston.verbose("request create end: " + (endTimestamp - startTimestamp));
|
90
166
|
return res.json(savedRequest);
|
91
|
-
});
|
167
|
+
// });
|
92
168
|
// });
|
93
169
|
});
|
94
170
|
|
@@ -20,6 +20,10 @@ class BotSubscriptionNotifier {
|
|
20
20
|
|
21
21
|
var url = bot.url;
|
22
22
|
|
23
|
+
// if (url.startsWith("$ext_url")) {
|
24
|
+
// // url = url.replace ("$res_bot_url", prendi da env)
|
25
|
+
// }
|
26
|
+
|
23
27
|
var json = {timestamp: Date.now(), payload: payload};
|
24
28
|
|
25
29
|
|
@@ -53,6 +57,7 @@ class BotSubscriptionNotifier {
|
|
53
57
|
|
54
58
|
}, function(err, result, json){
|
55
59
|
winston.verbose("SENT notify for bot with url " + url + " with err " + err);
|
60
|
+
winston.debug("SENT notify for bot with url ", result);
|
56
61
|
if (err) {
|
57
62
|
winston.error("Error sending notify for bot with url " + url + " with err " + err);
|
58
63
|
//TODO Reply with error
|
package/services/cacheEnabler.js
CHANGED
@@ -1,21 +1,26 @@
|
|
1
1
|
|
2
2
|
class CacheEnabler {
|
3
3
|
constructor() {
|
4
|
+
|
5
|
+
// long TTL
|
4
6
|
this.trigger = true;
|
5
7
|
if (process.env.CACHE_TRIGGER_ENABLED=="false" || process.env.CACHE_TRIGGER_ENABLED==false) {
|
6
8
|
this.trigger = false;
|
7
9
|
}
|
8
10
|
|
11
|
+
// long TTL
|
9
12
|
this.subscription = true;
|
10
13
|
if (process.env.CACHE_SUBSCRIPTION_ENABLED=="false" || process.env.CACHE_SUBSCRIPTION_ENABLED==false) {
|
11
14
|
this.subscription = false;
|
12
15
|
}
|
13
16
|
|
17
|
+
//default TTL
|
14
18
|
this.project = true;
|
15
19
|
if (process.env.CACHE_PROJECT_ENABLED=="false" || process.env.CACHE_PROJECT_ENABLED==false) {
|
16
20
|
this.project = false;
|
17
21
|
}
|
18
22
|
|
23
|
+
//default TTL
|
19
24
|
this.request = true;
|
20
25
|
if (process.env.CACHE_REQUEST_ENABLED=="false" || process.env.CACHE_REQUEST_ENABLED==false) {
|
21
26
|
this.request = false;
|
@@ -27,10 +32,10 @@ class CacheEnabler {
|
|
27
32
|
}
|
28
33
|
|
29
34
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
35
|
+
this.project_user = true;
|
36
|
+
if (process.env.CACHE_PROJECT_USER_ENABLED=="false" || process.env.CACHE_PROJECT_USER_ENABLED==false) {
|
37
|
+
this.project_user = false;
|
38
|
+
}
|
34
39
|
|
35
40
|
// this.user = true;
|
36
41
|
// if (process.env.CACHE_USER_ENABLED=="false" || process.env.CACHE_USER_ENABLED==false) {
|
@@ -88,7 +88,7 @@ roundRobin(operatorSelectedEvent) {
|
|
88
88
|
|
89
89
|
// let lastRequests = await
|
90
90
|
// requestcachefarequi nocachepopulatereqired
|
91
|
-
Request.find(query).sort({_id:-1}).limit(1).exec(function (err, lastRequests) { // cache_attention
|
91
|
+
Request.find(query).sort({_id:-1}).limit(1).exec(function (err, lastRequests) { // cache_attention use_lean use_select
|
92
92
|
if (err) {
|
93
93
|
winston.error('Error getting request for RoundRobinOperator', err);
|
94
94
|
return reject(err);
|
@@ -193,8 +193,8 @@ getOperators(departmentid, projectid, nobot, disableWebHookCall, context) {
|
|
193
193
|
|
194
194
|
|
195
195
|
let q = Project.findOne({_id: projectid, status: 100})
|
196
|
-
if (cacheEnabler.project) {
|
197
|
-
q.cache(cacheUtil.
|
196
|
+
if (cacheEnabler.project) {
|
197
|
+
q.cache(cacheUtil.longTTL, "projects:id:"+projectid) //project_cache
|
198
198
|
winston.debug('project cache enabled');
|
199
199
|
}
|
200
200
|
return q.exec(function(err, project){
|
@@ -185,7 +185,7 @@ class FaqBotHandler {
|
|
185
185
|
if (clonedfaqs && clonedfaqs.length>0) {
|
186
186
|
clonedfaqs = clonedfaqs.shift()
|
187
187
|
}
|
188
|
-
winston.
|
188
|
+
winston.debug("clonedfaqs", clonedfaqs);
|
189
189
|
|
190
190
|
const intent_info = {
|
191
191
|
intent_name: answerObj.intent_display_name,
|
@@ -389,7 +389,7 @@ class FaqBotHandler {
|
|
389
389
|
if (clonedfaqs && clonedfaqs.length>0) {
|
390
390
|
clonedfaqs = clonedfaqs.shift()
|
391
391
|
}
|
392
|
-
winston.
|
392
|
+
winston.debug("clonedfaqs", clonedfaqs);
|
393
393
|
|
394
394
|
const intent_info = {
|
395
395
|
intent_name: answerObj.intent_display_name,
|
@@ -468,7 +468,6 @@ class FaqBotHandler {
|
|
468
468
|
message.id_project, project_user, "system", undefined);
|
469
469
|
}
|
470
470
|
|
471
|
-
// not sending with ws event with project_user undefined {"_id":"601be8bf5e24bf0012d653be","name":"faqbot.answer_not_found","attributes":{"bot":{"type":"internal","_id":"601baf4d9974d20019469ea8","name":"Bot2","description":"HI,IM","id_project":"60113c4f9974d200191d90d3","trashed":false,"createdBy":"60113ba19974d200191d868a","createdAt":"2021-02-04T08:24:45.137Z","updatedAt":"2021-02-04T08:24:45.137Z","__v":0},"message":{"senderFullname":"IndelishFinal ","type":"text","channel_type":"group","status":0,"_id":"601be8be5e24bf0012d653b7","sender":"acbc3f18-fc6b-41fc-a257-ce68f51f2551","recipient":"support-group-acbc3f18-fc6b-41fc-a257-ce68f51f2551","text":"Chineese","id_project":"60113c4f9974d200191d90d3","createdBy":"acbc3f18-fc6b-41fc-a257-ce68f51f2551","channel":{"name":"chat21"},"createdAt":"2021-02-04T12:29:50.753Z","updatedAt":"2021-02-04T12:29:50.753Z","__v":0,"request":{"_id":"601be8be5e24bf0012d653b4","status":200,"preflight":false,"hasBot":true,"participants":["bot_601baf4d9974d20019469ea8"],"participantsAgents":[],"participantsBots":["601baf4d9974d20019469ea8"],"request_id":"support-group-acbc3f18-fc6b-41fc-a257-ce68f51f2551","requester":{"_id":"601be8945e24bf0012d65311","user_available":true,"number_assigned_requests":0,"last_login_at":"2021-02-04T11:47:39.753Z","status":"active","id_project":"60113c4f9974d200191d90d3","uuid_user":"acbc3f18-fc6b-41fc-a257-ce68f51f2551","role":"guest","createdBy":"acbc3f18-fc6b-41fc-a257-ce68f51f2551","createdAt":"2021-02-04T12:29:08.397Z","updatedAt":"2021-02-04T12:29:08.397Z","__v":0},"lead":{"_id":"601be8be5e24bf0012d653b3","status":100,"lead_id":"acbc3f18-fc6b-41fc-a257-ce68f51f2551","fullname":"IndelishFinal ","id_project":"60113c4f9974d200191d90d3","createdBy":"system","tags":[],"createdAt":"2021-02-04T12:29:50.696Z","updatedAt":"2021-02-04T12:29:50.696Z","__v":0},"first_text":"Chineese","department":{"_id":"60113c4f9974d200191d90d5","routing":"assigned","default":true,"status":1,"name":"Default Department","id_project":"60113c4f9974d200191d90d3","createdBy":"60113ba19974d200191d868a","createdAt":"2021-01-27T10:11:27.117Z","updatedAt":"2021-02-04T08:27:04.354Z","__v":0,"id_bot":"601baf4d9974d20019469ea8","id_group":null,"bot":{"type":"internal","_id":"601baf4d9974d20019469ea8","name":"Bot2","description":"HI,IM","id_project":"60113c4f9974d200191d90d3","trashed":false,"createdBy":"60113ba19974d200191d868a","createdAt":"2021-02-04T08:24:45.137Z","updatedAt":"2021-02-04T08:24:45.137Z","__v":0}},"agents":[{"user_available":false,"number_assigned_requests":4,"last_login_at":"2021-01-21T20:57:22.057Z","status":"active","_id":"601308d89974d2001925e57e","id_project":"60113c4f9974d200191d90d3","id_user":"6012f23e9974d200192594cc","role":"agent","createdBy":"60113ba19974d200191d868a","createdAt":"2021-01-28T18:56:24.213Z","updatedAt":"2021-01-28T18:56:24.213Z","__v":0,"max_assigned_chat":-1},{"user_available":false,"number_assigned_requests":12,"last_login_at":"2021-01-21T20:57:22.057Z","status":"active","_id":"60113c4f9974d200191d90d4","id_project":"60113c4f9974d200191d90d3","id_user":"60113ba19974d200191d868a","role":"owner","createdBy":"60113ba19974d200191d868a","createdAt":"2021-01-27T10:11:27.110Z","updatedAt":"2021-01-27T10:11:27.110Z","__v":0,"presence":{"status":"online","changedAt":"2021-02-04T12:21:50.878Z"},"max_assigned_chat":-1}],"assigned_at":"2021-02-04T12:29:50.732Z","id_project":"60113c4f9974d200191d90d3","createdBy":"acbc3f18-fc6b-41fc-a257-ce68f51f2551","channel":{"name":"chat21"},"tags":[],"notes":[],"channelOutbound":{"name":"chat21"},"createdAt":"2021-02-04T12:29:50.739Z","updatedAt":"2021-02-04T12:29:50.739Z","__v":0,"participatingAgents":[],"participatingBots":[{"_id":"601baf4d9974d20019469ea8","type":"internal","name":"Bot2","description":"HI,IM","id_project":"60113c4f9974d200191d90d3","trashed":false,"createdBy":"60113ba19974d200191d868a","createdAt":"2021-02-04T08:24:45.137Z","updatedAt":"2021-02-04T08:24:45.137Z","__v":0}]}}},"id_project":"60113c4f9974d200191d90d3","createdBy":"system","createdAt":"2021-02-04T12:29:51.074Z","updatedAt":"2021-02-04T12:29:51.074Z","__v":0,"id":"601be8bf5e24bf0012d653be"}
|
472
471
|
|
473
472
|
var attr = botAns.attributes;
|
474
473
|
if (!attr) {
|
package/services/faqService.js
CHANGED
@@ -22,6 +22,7 @@ class FaqService {
|
|
22
22
|
webhook_enabled: webhook_enabled,
|
23
23
|
type: type,
|
24
24
|
language: language,
|
25
|
+
public: false,
|
25
26
|
trashed: false,
|
26
27
|
createdBy: user_id,
|
27
28
|
updatedBy: user_id
|
@@ -42,7 +43,7 @@ class FaqService {
|
|
42
43
|
if (type==="internal" || type==="tilebot") {
|
43
44
|
|
44
45
|
if (!template) {
|
45
|
-
template = "
|
46
|
+
template = "empty";
|
46
47
|
}
|
47
48
|
winston.debug('template '+ template);
|
48
49
|
that.createGreetingsAndOperationalsFaqs(savedFaq_kb._id, savedFaq_kb.createdBy, savedFaq_kb.id_project, template);
|
@@ -63,6 +64,7 @@ class FaqService {
|
|
63
64
|
|
64
65
|
// aggiungi esempio tdAction con intent_id
|
65
66
|
|
67
|
+
// TODO non scatta i trigger sui rest hook. fare?
|
66
68
|
winston.debug('template: '+ template);
|
67
69
|
|
68
70
|
var faqsArray;
|
@@ -113,6 +115,10 @@ class FaqService {
|
|
113
115
|
]
|
114
116
|
|
115
117
|
}
|
118
|
+
|
119
|
+
if (template === "empty") {
|
120
|
+
faqsArray = [];
|
121
|
+
}
|
116
122
|
|
117
123
|
|
118
124
|
faqsArray.forEach(faq => {
|
@@ -121,6 +127,7 @@ class FaqService {
|
|
121
127
|
id_faq_kb: faq_kb_id,
|
122
128
|
question: faq.question,
|
123
129
|
answer: faq.answer,
|
130
|
+
reply: faq.reply,
|
124
131
|
intent_display_name: faq.intent_display_name,
|
125
132
|
language: "en",
|
126
133
|
id_project: projectid,
|
package/services/labelService.js
CHANGED
@@ -74,7 +74,7 @@ getAll(id_project) {
|
|
74
74
|
|
75
75
|
|
76
76
|
return Label.findOne(query).lean()
|
77
|
-
//@DISABLED_CACHE .cache(cacheUtil.longTTL, id_project+":labels:query:all")
|
77
|
+
//@DISABLED_CACHE .cache(cacheUtil.longTTL, id_project+":labels:query:all") //label_cache
|
78
78
|
.exec(function (err, labels) {
|
79
79
|
if (err) {
|
80
80
|
winston.error('Label ROUTE - REQUEST FIND ERR ', err)
|
package/services/leadService.js
CHANGED
@@ -14,7 +14,7 @@ class LeadService {
|
|
14
14
|
var that = this;
|
15
15
|
return new Promise(function (resolve, reject) {
|
16
16
|
return Lead.findOne({email: email, id_project: id_project})
|
17
|
-
//@DISABLED_CACHE .cache(cacheUtil.defaultTTL, id_project+":leads:email:"+email)
|
17
|
+
//@DISABLED_CACHE .cache(cacheUtil.defaultTTL, id_project+":leads:email:"+email) //lead_cache
|
18
18
|
.exec(function(err, lead) {
|
19
19
|
if (err) {
|
20
20
|
return reject(err);
|
@@ -58,7 +58,7 @@ class LeadService {
|
|
58
58
|
var that = this;
|
59
59
|
return new Promise(function (resolve, reject) {
|
60
60
|
return Lead.findOne({lead_id: lead_id, id_project: id_project})
|
61
|
-
//@DISABLED_CACHE .cache(cacheUtil.defaultTTL, id_project+":leads:lead_id:"+lead_id)
|
61
|
+
//@DISABLED_CACHE .cache(cacheUtil.defaultTTL, id_project+":leads:lead_id:"+lead_id) //lead_cache
|
62
62
|
.exec(function(err, lead) {
|
63
63
|
if (err) {
|
64
64
|
winston.error("Error createIfNotExistsWithLeadId", err);
|
@@ -173,6 +173,8 @@ class MessageService {
|
|
173
173
|
}
|
174
174
|
|
175
175
|
// TODO must update also message.attributes from chat21
|
176
|
+
// attento già scatta su chat21handler
|
177
|
+
|
176
178
|
changeStatus(message_id, newstatus) {
|
177
179
|
var that = this;
|
178
180
|
return new Promise(function (resolve, reject) {
|
@@ -188,7 +190,6 @@ class MessageService {
|
|
188
190
|
// winston.debug("updatedMessage", updatedMessage);
|
189
191
|
|
190
192
|
that.emitMessage(updatedMessage);
|
191
|
-
|
192
193
|
return resolve(updatedMessage);
|
193
194
|
});
|
194
195
|
});
|
@@ -12,8 +12,8 @@ class OperatingHoursService {
|
|
12
12
|
|
13
13
|
// winston.debug('O ---> [ OHS ] -> PROJECT ID ', projectId)
|
14
14
|
let q = Project.findOne({_id: projectId, status: 100});
|
15
|
-
if (cacheEnabler.project) {
|
16
|
-
q.cache(cacheUtil.
|
15
|
+
if (cacheEnabler.project) {
|
16
|
+
q.cache(cacheUtil.longTTL, "projects:id:"+projectId) //project_cache
|
17
17
|
winston.debug('project cache enabled');
|
18
18
|
}
|
19
19
|
q.exec(function (err, project) {
|
package/test/faqRoute.js
CHANGED
@@ -23,15 +23,12 @@ describe('FaqKBRoute', () => {
|
|
23
23
|
|
24
24
|
describe('/create', () => {
|
25
25
|
|
26
|
-
|
27
|
-
|
28
26
|
it('create', (done) => {
|
27
|
+
|
28
|
+
// this.timeout();
|
29
29
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
var email = "test-signup-" + Date.now() + "@email.com";
|
34
|
-
var pwd = "pwd";
|
30
|
+
var email = "test-signup-" + Date.now() + "@email.com";
|
31
|
+
var pwd = "pwd";
|
35
32
|
|
36
33
|
userService.signup( email ,pwd, "Test Firstname", "Test lastname").then(function(savedUser) {
|
37
34
|
projectService.create("test-faqkb-create", savedUser._id).then(function(savedProject) {
|
@@ -44,7 +41,9 @@ describe('FaqKBRoute', () => {
|
|
44
41
|
console.log("res.body", res.body);
|
45
42
|
res.should.have.status(200);
|
46
43
|
res.body.should.be.a('object');
|
47
|
-
expect(res.body.name).to.equal("testbot");
|
44
|
+
expect(res.body.name).to.equal("testbot");
|
45
|
+
expect(res.body.public).to.exist;
|
46
|
+
expect(res.body.public).to.equal(false);
|
48
47
|
var id_faq_kb = res.body._id;
|
49
48
|
|
50
49
|
chai.request(server)
|
@@ -73,6 +72,123 @@ describe('FaqKBRoute', () => {
|
|
73
72
|
|
74
73
|
});
|
75
74
|
|
75
|
+
it('create with template example', (done) => {
|
76
|
+
|
77
|
+
var email = "test-signup-" + Date.now() + "@email.com";
|
78
|
+
var pwd = "pwd";
|
79
|
+
|
80
|
+
userService.signup(email, pwd, "Test Firstname", "Test Lastname").then((savedUser) => {
|
81
|
+
projectService.create("test-faqkb-create", savedUser._id).then((savedProject) => {
|
82
|
+
|
83
|
+
chai.request(server)
|
84
|
+
.post('/'+ savedProject._id + '/faq_kb')
|
85
|
+
.auth(email, pwd)
|
86
|
+
.send({"name":"testbot", type: "internal", template: "example" })
|
87
|
+
.end((err, res) => {
|
88
|
+
//console.log("res", res);
|
89
|
+
console.log("res.body", res.body);
|
90
|
+
res.should.have.status(200);
|
91
|
+
res.body.should.be.a('object');
|
92
|
+
expect(res.body.name).to.equal("testbot");
|
93
|
+
var id_faq_kb = res.body._id;
|
94
|
+
|
95
|
+
chai.request(server)
|
96
|
+
.get('/' + savedProject._id + '/faq?id_faq_kb=' + id_faq_kb)
|
97
|
+
.auth(email, pwd)
|
98
|
+
.end((err, res) => {
|
99
|
+
console.log("faq_list: ", res.body);
|
100
|
+
res.should.have.status(200);
|
101
|
+
res.body.should.be.an('array').that.is.not.empty;
|
102
|
+
|
103
|
+
done();
|
104
|
+
|
105
|
+
})
|
106
|
+
|
107
|
+
|
108
|
+
|
109
|
+
});
|
110
|
+
})
|
111
|
+
})
|
112
|
+
})
|
113
|
+
|
114
|
+
|
115
|
+
it('create with template empty', (done) => {
|
116
|
+
|
117
|
+
|
118
|
+
// this.timeout();
|
119
|
+
|
120
|
+
var email = "test-signup-" + Date.now() + "@email.com";
|
121
|
+
var pwd = "pwd";
|
122
|
+
|
123
|
+
userService.signup( email ,pwd, "Test Firstname", "Test lastname").then(function(savedUser) {
|
124
|
+
projectService.create("test-faqkb-create", savedUser._id).then(function(savedProject) {
|
125
|
+
chai.request(server)
|
126
|
+
.post('/'+ savedProject._id + '/faq_kb')
|
127
|
+
.auth(email, pwd)
|
128
|
+
.send({"name":"testbot", type: "tilebot"})
|
129
|
+
.end((err, res) => {
|
130
|
+
//console.log("res", res);
|
131
|
+
console.log("res.body (faqkb)", res.body);
|
132
|
+
res.should.have.status(200);
|
133
|
+
res.body.should.be.a('object');
|
134
|
+
expect(res.body.name).to.equal("testbot");
|
135
|
+
expect(res.body.type).to.equal("tilebot");
|
136
|
+
var id_faq_kb = res.body._id;
|
137
|
+
|
138
|
+
chai.request(server)
|
139
|
+
.get('/' + savedProject._id + '/faq?id_faq_kb=' + id_faq_kb)
|
140
|
+
.auth(email, pwd)
|
141
|
+
.end((err, res) => {
|
142
|
+
console.log("faq_list: ", res.body);
|
143
|
+
res.should.have.status(200);
|
144
|
+
res.body.should.be.an('array').that.is.empty;
|
145
|
+
|
146
|
+
var reply_example = {
|
147
|
+
type: "text",
|
148
|
+
text: "Hello with buttons",
|
149
|
+
attributes: {
|
150
|
+
attachment: {
|
151
|
+
type:"template",
|
152
|
+
buttons: [
|
153
|
+
{
|
154
|
+
type: "text",
|
155
|
+
value: "REPLY ONE"
|
156
|
+
},
|
157
|
+
{
|
158
|
+
type: "text",
|
159
|
+
value: "REPLY TWO"
|
160
|
+
}
|
161
|
+
]
|
162
|
+
}
|
163
|
+
}
|
164
|
+
}
|
165
|
+
|
166
|
+
chai.request(server)
|
167
|
+
.post('/'+ savedProject._id + '/faq')
|
168
|
+
.auth(email, pwd)
|
169
|
+
.send({id_faq_kb: id_faq_kb, question: "question1", reply: reply_example })
|
170
|
+
.end((err, res) => {
|
171
|
+
//console.log("res", res);
|
172
|
+
console.log("res.body (faq reply)", res.body);
|
173
|
+
res.should.have.status(200);
|
174
|
+
res.body.should.be.a('object');
|
175
|
+
res.body.reply.should.be.a('object');
|
176
|
+
expect(res.body.id_faq_kb).to.equal(id_faq_kb);
|
177
|
+
expect(res.body.question).to.equal("question1");
|
178
|
+
expect(res.body.reply.type).to.equal(reply_example.type);
|
179
|
+
expect(res.body.reply.text).to.equal(reply_example.text);
|
180
|
+
expect(res.body.intent_display_name).to.not.equal(undefined);
|
181
|
+
expect(res.body.webhook_enabled).to.equal(false);
|
182
|
+
|
183
|
+
done();
|
184
|
+
});
|
185
|
+
|
186
|
+
})
|
187
|
+
});
|
188
|
+
});
|
189
|
+
});
|
190
|
+
});
|
191
|
+
|
76
192
|
|
77
193
|
|
78
194
|
|
@@ -90,7 +206,7 @@ describe('FaqKBRoute', () => {
|
|
90
206
|
chai.request(server)
|
91
207
|
.post('/'+ savedProject._id + '/faq_kb')
|
92
208
|
.auth(email, pwd)
|
93
|
-
.send({"name":"testbot", type: "internal", language: "it"})
|
209
|
+
.send({"name":"testbot", type: "internal", template: "example", language: "it"})
|
94
210
|
.end((err, res) => {
|
95
211
|
//console.log("res", res);
|
96
212
|
console.log("res.body", res.body);
|
@@ -145,7 +261,7 @@ describe('FaqKBRoute', () => {
|
|
145
261
|
chai.request(server)
|
146
262
|
.post('/'+ savedProject._id + '/faq_kb')
|
147
263
|
.auth(email, pwd)
|
148
|
-
.send({"name":"testbot", type: "internal"})
|
264
|
+
.send({"name":"testbot", type: "internal", template: "example",})
|
149
265
|
.end((err, res) => {
|
150
266
|
//console.log("res", res);
|
151
267
|
console.log("res.body", res.body);
|
@@ -277,7 +393,7 @@ describe('FaqKBRoute', () => {
|
|
277
393
|
.post('/'+ savedProject._id + '/faq/uploadcsv')
|
278
394
|
.auth(email, pwd)
|
279
395
|
.set('Content-Type', 'text/csv')
|
280
|
-
.attach('uploadFile', fs.readFileSync('./
|
396
|
+
.attach('uploadFile', fs.readFileSync('./example-faqs.csv'), 'example-faqs.csv')
|
281
397
|
.field('id_faq_kb', id_faq_kb)
|
282
398
|
.field('delimiter', ';')
|
283
399
|
// .send({id_faq_kb: id_faq_kb})
|
@@ -287,7 +403,7 @@ describe('FaqKBRoute', () => {
|
|
287
403
|
res.should.have.status(200);
|
288
404
|
res.body.should.be.a('object');
|
289
405
|
|
290
|
-
|
406
|
+
done();
|
291
407
|
});
|
292
408
|
|
293
409
|
});
|
@@ -331,7 +447,7 @@ describe('FaqKBRoute', () => {
|
|
331
447
|
.post('/'+ savedProject._id + '/faq/uploadcsv')
|
332
448
|
.auth(email, pwd)
|
333
449
|
.set('Content-Type', 'text/csv')
|
334
|
-
.attach('uploadFile', fs.readFileSync('./
|
450
|
+
.attach('uploadFile', fs.readFileSync('./example-faqs.csv'), 'example-faqs.csv')
|
335
451
|
.field('id_faq_kb', id_faq_kb)
|
336
452
|
.field('delimiter', ';')
|
337
453
|
// .send({id_faq_kb: id_faq_kb})
|
@@ -341,7 +457,7 @@ describe('FaqKBRoute', () => {
|
|
341
457
|
res.should.have.status(200);
|
342
458
|
res.body.should.be.a('object');
|
343
459
|
|
344
|
-
|
460
|
+
done();
|
345
461
|
});
|
346
462
|
|
347
463
|
});
|