@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 CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tiledesk/tiledesk-server",
3
3
  "description": "The Tiledesk server module",
4
- "version": "2.4.67",
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.9",
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",
@@ -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
- router.post('/direct', async function (req, res) {
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) {
@@ -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": "#9d0b96b9-e036-4c2d-8504-1181b5c4be75"
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": "9d0b96b9-e036-4c2d-8504-1181b5c4be75",
173
+ "intent_id": custom_intent_id,
172
174
  "attributes": {
173
175
  "position": {
174
176
  "x": 714,