@tiledesk/tiledesk-server 2.4.67 → 2.4.69
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.
- package/CHANGELOG.md +6 -0
- package/package.json +3 -2
- package/routes/campaigns.js +189 -2
- package/routes/faq.js +7 -1
- package/services/faqService.js +4 -2
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,12 @@
|
|
|
5
5
|
🚀 IN PRODUCTION 🚀
|
|
6
6
|
(https://www.npmjs.com/package/@tiledesk/tiledesk-server/v/2.3.77)
|
|
7
7
|
|
|
8
|
+
# 2.4.69
|
|
9
|
+
- update tiledesk-tybot-connector to 0.2.15
|
|
10
|
+
|
|
11
|
+
# 2.4.68
|
|
12
|
+
- update tiledesk-tybot-connector to 0.2.11
|
|
13
|
+
|
|
8
14
|
# 2.4.67
|
|
9
15
|
- update tiledesk-tybot-connector to 0.2.9
|
|
10
16
|
|
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.69",
|
|
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.15",
|
|
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,
|