@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 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.67",
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.9",
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",
@@ -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,