@tiledesk/tiledesk-server 2.4.67 → 2.4.68
Sign up to get free protection for your applications and to get access to all the features.
- package/package.json +3 -2
- package/routes/campaigns.js +189 -2
- package/routes/faq.js +7 -1
- package/services/faqService.js +4 -2
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.4.
|
4
|
+
"version": "2.4.68",
|
5
5
|
"scripts": {
|
6
6
|
"start": "node ./bin/www",
|
7
7
|
"pretest": "mongodb-runner start",
|
@@ -44,7 +44,7 @@
|
|
44
44
|
"@tiledesk/tiledesk-kaleyra-proxy": "^0.1.7",
|
45
45
|
"@tiledesk/tiledesk-messenger-connector": "0.1.9",
|
46
46
|
"@tiledesk/tiledesk-rasa-connector": "^1.0.10",
|
47
|
-
"@tiledesk/tiledesk-tybot-connector": "^0.2.
|
47
|
+
"@tiledesk/tiledesk-tybot-connector": "^0.2.11",
|
48
48
|
"@tiledesk/tiledesk-whatsapp-connector": "^0.1.52",
|
49
49
|
"@tiledesk/tiledesk-telegram-connector": "^0.1.8",
|
50
50
|
"amqplib": "^0.5.5",
|
@@ -72,6 +72,7 @@
|
|
72
72
|
"http": "0.0.0",
|
73
73
|
"immutable": "^4.1.0",
|
74
74
|
"jade": "~1.11.0",
|
75
|
+
"jobs-worker-queued": "^0.0.5",
|
75
76
|
"jsonwebtoken": "^8.5.1",
|
76
77
|
"lodash": "^4.17.21",
|
77
78
|
"marked": "^3.0.4",
|
package/routes/campaigns.js
CHANGED
@@ -1,14 +1,28 @@
|
|
1
1
|
var express = require('express');
|
2
2
|
var router = express.Router();
|
3
3
|
var Group = require("../models/group");
|
4
|
+
var Segment = require("../models/segment");
|
5
|
+
var Lead = require("../models/lead");
|
4
6
|
var User = require("../models/user");
|
5
7
|
var winston = require('../config/winston');
|
6
8
|
var requestService = require("../services/requestService");
|
7
9
|
var messageService = require("../services/messageService");
|
8
10
|
var MessageConstants = require("../models/messageConstants");
|
9
11
|
var UIDGenerator = require("../utils/UIDGenerator");
|
12
|
+
var LeadConstants = require("../models/leadConstants");
|
13
|
+
var Segment2MongoConverter = require("../utils/segment2mongoConverter");
|
10
14
|
|
15
|
+
var JobManager = require("jobs-worker-queued");
|
11
16
|
|
17
|
+
var JOB_RABBITURI = process.env.JOB_RABBITURI;
|
18
|
+
winston.info("JobWorkerQueued uri: " + JOB_RABBITURI);
|
19
|
+
|
20
|
+
var jobManager = new JobManager(JOB_RABBITURI,
|
21
|
+
{
|
22
|
+
// debug:true,
|
23
|
+
// topic: "test22",
|
24
|
+
// exchange: "test333"
|
25
|
+
});
|
12
26
|
|
13
27
|
|
14
28
|
// this endpoint supports support-group- or groups. this create a conversation for the sender (agent console)
|
@@ -41,7 +55,18 @@ router.post('/', function (req, res) {
|
|
41
55
|
});
|
42
56
|
});
|
43
57
|
|
44
|
-
|
58
|
+
|
59
|
+
|
60
|
+
/*
|
61
|
+
Invio di una campagna (il bot invia a tutti i membri del gruppo News dei messaggi direct)
|
62
|
+
E' l'equivalente del bot "Telegram" che viene usato per aggiornare gli utenti delle ultime funzionalità. E' indicato per inviare news unidirezionali
|
63
|
+
|
64
|
+
curl -v -X POST -H 'Content-Type:application/json' -u XYZ:XYZ -d '{"text":"Tiledesk new feature. See here https://tiledesk.com", "group_id":"XYZ"}' https://api.tiledesk.com/v2/XYZ/campaigns/direct
|
65
|
+
|
66
|
+
Specifica nel campo text il messaggio.
|
67
|
+
*/
|
68
|
+
|
69
|
+
router.post('/directDEPRECATED?', async function (req, res) {
|
45
70
|
|
46
71
|
let messageStatus = req.body.status || MessageConstants.CHAT_MESSAGE_STATUS.SENDING;
|
47
72
|
|
@@ -58,7 +83,22 @@ router.post('/direct', async function (req, res) {
|
|
58
83
|
// TODO cicla su segment
|
59
84
|
var segment_id = req.body.segment_id;
|
60
85
|
if (segment_id) {
|
86
|
+
winston.info("segment_id: "+ segment_id);
|
87
|
+
|
88
|
+
var queryLead = {};
|
89
|
+
|
90
|
+
let segment = await Segment.findOne({id_project: req.projectid, _id: segment_id }).exec();
|
91
|
+
if (!segment) {
|
92
|
+
return res.status(404).send({ success: false, msg: 'Error segment not found' });
|
93
|
+
}
|
94
|
+
Segment2MongoConverter.convert(queryLead, segment);
|
95
|
+
|
96
|
+
queryLead["id_project"] = req.projectid;
|
97
|
+
queryLead["status"] = LeadConstants.NORMAL;
|
98
|
+
winston.info("queryLead", queryLead);
|
61
99
|
|
100
|
+
let leads = await Lead.find(queryLead).exec();
|
101
|
+
var recipients = leads;
|
62
102
|
}
|
63
103
|
|
64
104
|
var group_id = req.body.group_id;
|
@@ -66,13 +106,17 @@ router.post('/direct', async function (req, res) {
|
|
66
106
|
var group = await Group.findOne({ _id: group_id, id_project: req.projectid }).exec();
|
67
107
|
winston.info("group", group);
|
68
108
|
|
109
|
+
if (!group) {
|
110
|
+
return res.status(404).send({ success: false, msg: 'Error group not found' });
|
111
|
+
}
|
112
|
+
|
69
113
|
var recipients = group.members;
|
70
114
|
// winston.info("members", members);
|
71
115
|
|
72
116
|
|
73
117
|
}
|
74
118
|
|
75
|
-
|
119
|
+
|
76
120
|
winston.info("recipients", recipients);
|
77
121
|
winston.info("recipients.length: " + recipients.length);
|
78
122
|
|
@@ -99,6 +143,9 @@ router.post('/direct', async function (req, res) {
|
|
99
143
|
}
|
100
144
|
|
101
145
|
if (recipients.length == 1) {
|
146
|
+
|
147
|
+
// qui manca recipient?
|
148
|
+
message.recipient = recipients[0];
|
102
149
|
return messageService.save(message).then(function(savedMessage){
|
103
150
|
if (req.body.returnobject) {
|
104
151
|
return res.json(savedMessage);
|
@@ -146,6 +193,146 @@ router.post('/direct', async function (req, res) {
|
|
146
193
|
}
|
147
194
|
|
148
195
|
|
196
|
+
});
|
197
|
+
|
198
|
+
|
199
|
+
|
200
|
+
|
201
|
+
|
202
|
+
|
203
|
+
|
204
|
+
|
205
|
+
|
206
|
+
|
207
|
+
|
208
|
+
|
209
|
+
|
210
|
+
|
211
|
+
jobManager.run(async(data) => {
|
212
|
+
winston.info("run job here with payload", data);
|
213
|
+
|
214
|
+
let message = data.payload.message;
|
215
|
+
|
216
|
+
// TODO cicla su segment
|
217
|
+
var segment_id = data.payload.segment_id;
|
218
|
+
if (segment_id) {
|
219
|
+
winston.info("segment_id: "+ segment_id);
|
220
|
+
|
221
|
+
|
222
|
+
|
223
|
+
|
224
|
+
|
225
|
+
var queryLead = {};
|
226
|
+
|
227
|
+
let segment = await Segment.findOne({id_project: data.payload.project_id, _id: segment_id }).exec();
|
228
|
+
if (!segment) {
|
229
|
+
// return res.status(404).send({ success: false, msg: 'Error segment not found' });
|
230
|
+
return winston.error("Error segment not found");
|
231
|
+
}
|
232
|
+
Segment2MongoConverter.convert(queryLead, segment);
|
233
|
+
|
234
|
+
queryLead["id_project"] = data.payload.project_id;
|
235
|
+
queryLead["status"] = LeadConstants.NORMAL;
|
236
|
+
winston.info("queryLead", queryLead);
|
237
|
+
|
238
|
+
|
239
|
+
//const cursor = Lead.find({}).cursor();
|
240
|
+
//TODO RESTORE IT
|
241
|
+
const cursor = Lead.find(queryLead).cursor();
|
242
|
+
|
243
|
+
|
244
|
+
|
245
|
+
// if (doc!= null) {
|
246
|
+
// doc = await cursor.next()
|
247
|
+
// }
|
248
|
+
|
249
|
+
// cursor.next(function(error, doc) {
|
250
|
+
// console.log(doc);
|
251
|
+
|
252
|
+
// setTimout()
|
253
|
+
// });
|
254
|
+
|
255
|
+
|
256
|
+
function sleep(ms) {
|
257
|
+
return new Promise((resolve) => {
|
258
|
+
setTimeout(resolve, ms);
|
259
|
+
});
|
260
|
+
}
|
261
|
+
|
262
|
+
for (let doc = await cursor.next(); doc != null; doc = await cursor.next() ) {
|
263
|
+
winston.debug("doc", doc);
|
264
|
+
|
265
|
+
// if (!message.recipient) {
|
266
|
+
message.recipient = doc.lead_id;
|
267
|
+
// }
|
268
|
+
|
269
|
+
// if (!message.recipientFullname) {
|
270
|
+
message.recipientFullname = doc.fullname;
|
271
|
+
// }
|
272
|
+
|
273
|
+
winston.debug("message to send", message);
|
274
|
+
|
275
|
+
messageService.save(message);
|
276
|
+
|
277
|
+
await sleep(1000);
|
278
|
+
winston.debug("finito 1000 sec");
|
279
|
+
}
|
280
|
+
|
281
|
+
|
282
|
+
// while(await cursor.hasNext()) {
|
283
|
+
// const doc = await cursor.next();
|
284
|
+
// // process doc here
|
285
|
+
// }
|
286
|
+
|
287
|
+
// let leads = await Lead.find(queryLead).exec();
|
288
|
+
// var recipients = leads;
|
289
|
+
// winston.info("recipients", recipients);
|
290
|
+
|
291
|
+
|
292
|
+
}
|
293
|
+
|
294
|
+
|
295
|
+
});
|
296
|
+
|
297
|
+
|
298
|
+
|
299
|
+
router.post('/direct', async function (req, res) {
|
300
|
+
|
301
|
+
|
302
|
+
winston.debug(req.body);
|
303
|
+
winston.debug("req.user", req.user);
|
304
|
+
|
305
|
+
var segment_id = req.body.segment_id;
|
306
|
+
winston.info("segment_id"+ segment_id);
|
307
|
+
|
308
|
+
let messageStatus = req.body.status || MessageConstants.CHAT_MESSAGE_STATUS.SENDING;
|
309
|
+
// winston.info("messageStatus"+ messageStatus);
|
310
|
+
|
311
|
+
|
312
|
+
let message = {
|
313
|
+
sender: req.body.sender || req.user._id,
|
314
|
+
senderFullname: req.body.senderFullname || req.user.fullName,
|
315
|
+
recipient: req.body.recipient,
|
316
|
+
recipientFullname: req.body.recipientFullname,
|
317
|
+
text: req.body.text,
|
318
|
+
id_project: req.projectid, // rendilo opzionale?
|
319
|
+
createdBy: req.user._id,
|
320
|
+
status: messageStatus,
|
321
|
+
attributes: req.body.attributes,
|
322
|
+
type: req.body.type,
|
323
|
+
metadata: req.body.metadata,
|
324
|
+
language: req.body.language,
|
325
|
+
channel_type: MessageConstants.CHANNEL_TYPE.DIRECT,
|
326
|
+
channel: req.body.channel
|
327
|
+
};
|
328
|
+
|
329
|
+
winston.info("message before", message);
|
330
|
+
|
331
|
+
jobManager.publish(
|
332
|
+
{segment_id: segment_id, project_id: req.projectid, message: message}
|
333
|
+
);
|
334
|
+
|
335
|
+
return res.json({ queued: true });
|
149
336
|
|
150
337
|
|
151
338
|
});
|
package/routes/faq.js
CHANGED
@@ -258,6 +258,11 @@ router.put('/:faqid', function (req, res) {
|
|
258
258
|
winston.debug('UPDATE FAQ ', req.body);
|
259
259
|
let faqid = req.params.faqid;
|
260
260
|
|
261
|
+
if (!req.body.id_faq_kb) {
|
262
|
+
return res.status(422).send({ err: "Missing id_faq_kb in Request Body"})
|
263
|
+
}
|
264
|
+
let id_faq_kb = req.body.id_faq_kb;
|
265
|
+
|
261
266
|
var update = {};
|
262
267
|
|
263
268
|
if (req.body.intent != undefined) {
|
@@ -302,7 +307,7 @@ router.put('/:faqid', function (req, res) {
|
|
302
307
|
|
303
308
|
if (faqid.startsWith("intentId")) {
|
304
309
|
let intent_id = faqid.substring(8);
|
305
|
-
Faq.findOneAndUpdate({ intent_id: intent_id }, update, { new: true, upsert: true}, (err, updatedFaq) => {
|
310
|
+
Faq.findOneAndUpdate({ id_faq_kb: id_faq_kb, intent_id: intent_id }, update, { new: true, upsert: true}, (err, updatedFaq) => {
|
306
311
|
if (err) {
|
307
312
|
if (err.code == 11000) {
|
308
313
|
return res.status(409).send({ success: false, msg: 'Duplicate intent_display_name.' });
|
@@ -318,6 +323,7 @@ router.put('/:faqid', function (req, res) {
|
|
318
323
|
})
|
319
324
|
|
320
325
|
} else {
|
326
|
+
|
321
327
|
Faq.findByIdAndUpdate(req.params.faqid, update, { new: true, upsert: true }, function (err, updatedFaq) {
|
322
328
|
if (err) {
|
323
329
|
if (err.code == 11000) {
|
package/services/faqService.js
CHANGED
@@ -3,6 +3,7 @@ var Faq_kb = require("../models/faq_kb");
|
|
3
3
|
var winston = require('../config/winston');
|
4
4
|
const botEvent = require('../event/botEvent');
|
5
5
|
const ActionsConstants = require('../models/actionsConstants');
|
6
|
+
const uuidv4 = require('uuid/v4');
|
6
7
|
|
7
8
|
|
8
9
|
class FaqService {
|
@@ -102,6 +103,7 @@ class FaqService {
|
|
102
103
|
|
103
104
|
if (template === "blank") {
|
104
105
|
|
106
|
+
let custom_intent_id = uuidv4();
|
105
107
|
// faqsArray = [
|
106
108
|
// { 'question': '\\start', 'answer': 'Hello', 'intent_display_name': 'start', 'topic': 'internal' },
|
107
109
|
// { 'question': 'defaultFallback', 'answer': 'I can not provide an adequate answer. Write a new question or talk to a human agent.\n* Back to start tdAction:start\n* See the docs https://docs.tiledesk.com/\n* 👨🏻🦰 I want an agent', 'intent_display_name': 'defaultFallback', 'topic': 'internal' }, //TODO se metto spazio n * nn va
|
@@ -137,7 +139,7 @@ class FaqService {
|
|
137
139
|
"enabled": true,
|
138
140
|
"actions": [{
|
139
141
|
"_tdActionType": "intent",
|
140
|
-
"intentName": "#
|
142
|
+
"intentName": "#" + custom_intent_id
|
141
143
|
}],
|
142
144
|
"question": "\\start",
|
143
145
|
"intent_display_name": "start",
|
@@ -168,7 +170,7 @@ class FaqService {
|
|
168
170
|
"text": "Hi, how can I help you?\r\n"
|
169
171
|
}],
|
170
172
|
"intent_display_name": "welcome",
|
171
|
-
"intent_id":
|
173
|
+
"intent_id": custom_intent_id,
|
172
174
|
"attributes": {
|
173
175
|
"position": {
|
174
176
|
"x": 714,
|