@tiledesk/tiledesk-server 2.4.8 → 2.4.10

Sign up to get free protection for your applications and to get access to all the features.
package/event/botEvent.js CHANGED
@@ -3,12 +3,20 @@ const messageEvent = require('../event/messageEvent');
3
3
  const Faq_kb = require('../models/faq_kb');
4
4
  var winston = require('../config/winston');
5
5
 
6
- class BotEvent extends EventEmitter {}
6
+
7
7
  const cacheUtil = require("../utils/cacheUtil");
8
8
  const cacheEnabler = require("../services/cacheEnabler");
9
9
 
10
- const botEvent = new BotEvent();
10
+ // class BotEvent extends EventEmitter {}
11
+ class BotEvent extends EventEmitter {
12
+ constructor() {
13
+ super();
14
+ this.queueEnabled = false;
15
+ this.setMaxListeners(11);
16
+ }
17
+ }
11
18
 
19
+ const botEvent = new BotEvent();
12
20
 
13
21
  //TODO use request. getBotId
14
22
  function getBotFromParticipants(participants) {
@@ -111,8 +119,10 @@ messageEvent.on('message.create', function(message) {
111
119
 
112
120
 
113
121
  let qbot = Faq_kb.findById(botId); //TODO add cache_bot_here
122
+ //TODO unselect secret. secret is unselectable by default in the model
114
123
 
115
124
  if (cacheEnabler.faq_kb) {
125
+ winston.debug('message.id_project+":faq_kbs:id:"+botId: '+ message.id_project+":faq_kbs:id:"+botId);
116
126
  qbot.cache(cacheUtil.defaultTTL, message.id_project+":faq_kbs:id:"+botId)
117
127
  winston.debug('faq_kb cache enabled');
118
128
  }
@@ -50,6 +50,12 @@ class RoleChecker {
50
50
  return true
51
51
  } else {
52
52
  winston.debug("isTypeAsFunction is false");
53
+
54
+ var adminEmail = process.env.ADMIN_EMAIL || "admin@tiledesk.com";
55
+
56
+ if (user && user.email && user.email === adminEmail) { //skip has role check
57
+ return true;
58
+ }
53
59
  return false;
54
60
  }
55
61
  }
package/models/faq_kb.js CHANGED
@@ -105,6 +105,10 @@ var Faq_kbSchema = new Schema({
105
105
  publishedAt: {
106
106
  type: Date
107
107
  },
108
+ trained: {
109
+ type: Boolean,
110
+ default: true
111
+ },
108
112
  },{
109
113
  timestamps: true
110
114
  }
package/models/lead.js CHANGED
@@ -88,6 +88,9 @@ var LeadSchema = new Schema({
88
88
  default: LeadConstants.NORMAL,
89
89
  index: true
90
90
  },
91
+ properties: {
92
+ type: Object,
93
+ },
91
94
  },{
92
95
  timestamps: true
93
96
  }
@@ -102,6 +105,8 @@ LeadSchema.index({fullname: 'text', email: 'text'},
102
105
  // suggested by atlas
103
106
  LeadSchema.index({status: 1, id_project: 1, createdAt: -1});
104
107
 
108
+
109
+
105
110
  var lead = mongoose.model('lead', LeadSchema);
106
111
 
107
112
  if (process.env.MONGOOSE_SYNCINDEX) {
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.8",
4
+ "version": "2.4.10",
5
5
  "scripts": {
6
6
  "start": "node ./bin/www",
7
7
  "pretest": "mongodb-runner start",
@@ -45,7 +45,7 @@
45
45
  "@tiledesk/tiledesk-messenger-connector": "0.1.9",
46
46
  "@tiledesk/tiledesk-rasa-connector": "^1.0.10",
47
47
  "@tiledesk/tiledesk-tybot-connector": "^0.1.78",
48
- "@tiledesk/tiledesk-whatsapp-connector": "^0.1.45",
48
+ "@tiledesk/tiledesk-whatsapp-connector": "^0.1.46",
49
49
  "amqplib": "^0.5.5",
50
50
  "app-root-path": "^3.0.0",
51
51
  "bcrypt-nodejs": "0.0.3",
@@ -5,55 +5,19 @@
5
5
 
6
6
  <!-- <script type="text/javascript" src="./main.js"></script> -->
7
7
 
8
- // var ws = new WebSocket('wss://rtm.tiledesk.com/?token=JWT%20eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1ZWI0NWZiMjFmOWUxZjAwMTJkNjIyMDEiLCJlbWFpbCI6ImExQGExLml0IiwiZmlyc3RuYW1lIjoiYTEiLCJsYXN0bmFtZSI6ImExIiwiZW1haWx2ZXJpZmllZCI6ZmFsc2UsImlhdCI6MTU4ODg3OTI4NCwiYXVkIjoiaHR0cHM6Ly90aWxlZGVzay5jb20iLCJpc3MiOiJodHRwczovL3RpbGVkZXNrLmNvbSIsInN1YiI6InVzZXIiLCJqdGkiOiI5MGIzNTY1NS1jNzY4LTQwMjEtODIyNy1hYWQ1MGU5NWFmYTEifQ.v4RjqtpM-kqa_PGVXmn9eJOeb3IWrcXH0U6V5iJrj7U');
9
-
10
8
  <script>
11
- var ws = new WebSocket('wss://rtm.tiledesk.com/?token=JWT%20eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1ZWI1NmUxYTFmOWUxZjAwMTJkNjIyNzUiLCJlbWFpbCI6ImxvYWRAbG9hZC5pdCIsImZpcnN0bmFtZSI6ImxvYWQiLCJsYXN0bmFtZSI6ImxvYWQiLCJlbWFpbHZlcmlmaWVkIjpmYWxzZSwiaWF0IjoxNTg4OTQ4NTA3LCJhdWQiOiJodHRwczovL3RpbGVkZXNrLmNvbSIsImlzcyI6Imh0dHBzOi8vdGlsZWRlc2suY29tIiwic3ViIjoidXNlciIsImp0aSI6IjU0OWQ3ODI4LWI5ZDAtNDAxNS1iMDQ4LTA0M2IyYzYyZjAxOSJ9.gnGJRtUoRpUA90QWNSp1wmWmlJcu1YwYf_kJ8yUi1_I');
9
+ var ws = new WebSocket('ws://localhost:3000/?token=JWT%20eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1ZWU4OTE5ZDg3MjJiMzAwMzQ3ZWM1NmYiLCJlbWFpbCI6ImFkbWluQHRpbGVkZXNrLmNvbSIsImZpcnN0bmFtZSI6IkFkbWluaXN0cmF0b3IiLCJsYXN0bmFtZSI6IiAiLCJlbWFpbHZlcmlmaWVkIjp0cnVlLCJpYXQiOjE2ODM2NTEyMDYsImF1ZCI6Imh0dHBzOi8vdGlsZWRlc2suY29tIiwiaXNzIjoiaHR0cHM6Ly90aWxlZGVzay5jb20iLCJzdWIiOiJ1c2VyIiwianRpIjoiZDVlY2U3YjctN2U0Zi00NThmLTkxYWMtNGJiMzY3NDdmNmUxIn0.KiPGusVCPR0-IROsoPiH93V_vCKJS3rK_ikjqmngQT7J_s3VHalRvGfuvds-sRg4V8rfZyhlfaR6uWR71TYPhyT7REPYORp-T-6ddb8g7nL4lraHVhzqYYpVPIhXUM81rkyHm1FP2LuIsEe93Ir62AyK0xajoS1wPdjYNBxari0');
10
+ // var ws = new WebSocket('ws://eu.rtmv3.tiledesk.com/mqws/ws/?token=JWT%20eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1ZWI1NmUxYTFmOWUxZjAwMTJkNjIyNzUiLCJlbWFpbCI6ImxvYWRAbG9hZC5pdCIsImZpcnN0bmFtZSI6ImxvYWQiLCJsYXN0bmFtZSI6ImxvYWQiLCJlbWFpbHZlcmlmaWVkIjpmYWxzZSwiaWF0IjoxNTg4OTQ4NTA3LCJhdWQiOiJodHRwczovL3RpbGVkZXNrLmNvbSIsImlzcyI6Imh0dHBzOi8vdGlsZWRlc2suY29tIiwic3ViIjoidXNlciIsImp0aSI6IjU0OWQ3ODI4LWI5ZDAtNDAxNS1iMDQ4LTA0M2IyYzYyZjAxOSJ9.gnGJRtUoRpUA90QWNSp1wmWmlJcu1YwYf_kJ8yUi1_I');
12
11
  ws.onopen = function () {
13
- console.log('websocket is connected2 ...');
14
- ws.send('{ "action": "subscribe", "payload": { "topic": "/5eb56e211f9e1f0012d6227b/requests"}}');
12
+ console.log('websocket is connected ...');
13
+ ws.send('{ "action": "subscribe", "payload": { "topic": "/6453d246f1e784003a97537b/bots/645903253e16b1002cfe4439"}}');
14
+ // ws.send('{ "action": "subscribe", "payload": { "topic": "/5eb56e211f9e1f0012d6227b/requests"}}');
15
15
  }
16
16
  </script>
17
17
 
18
18
 
19
19
 
20
20
 
21
-
22
- <script>
23
- var ws = new WebSocket('wss://tiledesk-server-pre.herokuapp.com/?token=JWT%20eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1YWFhOTkwMjRjM2IxMTAwMTRiNDc4ZjAiLCJlbWFpbCI6ImFuZHJlYS5sZW9AZnJvbnRpZXJlMjEuaXQiLCJmaXJzdG5hbWUiOiJBbmRyZWEiLCJsYXN0bmFtZSI6IkxlbyIsImVtYWlsdmVyaWZpZWQiOnRydWUsImlhdCI6MTU4NzU0NjIyNiwiYXVkIjoiaHR0cHM6Ly90aWxlZGVzay5jb20iLCJpc3MiOiJodHRwczovL3RpbGVkZXNrLmNvbSIsInN1YiI6InVzZXIiLCJqdGkiOiJkNDNhMmIwNi1jZGRkLTRkZDYtYjhiNC02NzdiOGI4MTQyYjIifQ.KZGvjr8oQc2sYeV1bOMvCd0_9XxaLlfIszjT_4-PlQ4');
24
-
25
- ws.onopen = function () {
26
- console.log('websocket is connected2 ...');
27
- ws.send('{ "action": "subscribe", "payload": { "topic": "/5ebae6f21aee9b0034511f65/requests"}}');
28
- }
29
- </script>
30
-
31
-
32
-
33
-
34
-
35
- <script>
36
-
37
-
38
- //var url = 'ws://'+window.location.host+'/?token=JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyIkX18iOnsic3RyaWN0TW9kZSI6dHJ1ZSwic2VsZWN0ZWQiOnsiZW1haWwiOjEsImZpcnN0bmFtZSI6MSwibGFzdG5hbWUiOjEsInBhc3N3b3JkIjoxLCJlbWFpbHZlcmlmaWVkIjoxLCJpZCI6MX0sImdldHRlcnMiOnt9LCJfaWQiOiI1ZGM5Mzg2MmFkZDRmNjljM2Q0NThkOGYiLCJ3YXNQb3B1bGF0ZWQiOmZhbHNlLCJhY3RpdmVQYXRocyI6eyJwYXRocyI6eyJwYXNzd29yZCI6ImluaXQiLCJlbWFpbCI6ImluaXQiLCJlbWFpbHZlcmlmaWVkIjoiaW5pdCIsIl9pZCI6ImluaXQifSwic3RhdGVzIjp7Imlnbm9yZSI6e30sImRlZmF1bHQiOnt9LCJpbml0Ijp7ImVtYWlsdmVyaWZpZWQiOnRydWUsInBhc3N3b3JkIjp0cnVlLCJlbWFpbCI6dHJ1ZSwiX2lkIjp0cnVlfSwibW9kaWZ5Ijp7fSwicmVxdWlyZSI6e319LCJzdGF0ZU5hbWVzIjpbInJlcXVpcmUiLCJtb2RpZnkiLCJpbml0IiwiZGVmYXVsdCIsImlnbm9yZSJdfSwicGF0aHNUb1Njb3BlcyI6e30sImVtaXR0ZXIiOnsiX2V2ZW50cyI6e30sIl9ldmVudHNDb3VudCI6MCwiX21heExpc3RlbmVycyI6MH0sIiRvcHRpb25zIjp0cnVlfSwiaXNOZXciOmZhbHNlLCJfZG9jIjp7ImVtYWlsdmVyaWZpZWQiOmZhbHNlLCJwYXNzd29yZCI6IiQyYSQxMCRJc0hJRm9HTmRvRnVrODVRaDZlbXN1RjFzbkphNC5ELmgud2tuS092RUdlcVJsSlpZOHdjUyIsImVtYWlsIjoiYW5kcmVhLmxlb0BmMjEuaXQiLCJfaWQiOiI1ZGM5Mzg2MmFkZDRmNjljM2Q0NThkOGYifSwiJGluaXQiOnRydWUsImlhdCI6MTU3NDYxNTY2MSwiYXVkIjoiaHR0cHM6Ly90aWxlZGVzay5jb20iLCJpc3MiOiJodHRwczovL3RpbGVkZXNrLmNvbSIsInN1YiI6InVzZXIifQ.6DjvyVO-4zuHH2kdfItWx9eVGZ-HcRcs1jehVRrDWpE';
39
- //var url = 'ws://'+window.location.host+'/?token=JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyIkX18iOnsic3RyaWN0TW9kZSI6dHJ1ZSwic2VsZWN0ZWQiOnsiZW1haWwiOjEsImZpcnN0bmFtZSI6MSwibGFzdG5hbWUiOjEsInBhc3N3b3JkIjoxLCJlbWFpbHZlcmlmaWVkIjoxLCJpZCI6MX0sImdldHRlcnMiOnt9LCJfaWQiOiI1ZGM5Mzg2MmFkZDRmNjljM2Q0NThkOGYiLCJ3YXNQb3B1bGF0ZWQiOmZhbHNlLCJhY3RpdmVQYXRocyI6eyJwYXRocyI6eyJwYXNzd29yZCI6ImluaXQiLCJlbWFpbCI6ImluaXQiLCJlbWFpbHZlcmlmaWVkIjoiaW5pdCIsIl9pZCI6ImluaXQifSwic3RhdGVzIjp7Imlnbm9yZSI6e30sImRlZmF1bHQiOnt9LCJpbml0Ijp7ImVtYWlsdmVyaWZpZWQiOnRydWUsInBhc3N3b3JkIjp0cnVlLCJlbWFpbCI6dHJ1ZSwiX2lkIjp0cnVlfSwibW9kaWZ5Ijp7fSwicmVxdWlyZSI6e319LCJzdGF0ZU5hbWVzIjpbInJlcXVpcmUiLCJtb2RpZnkiLCJpbml0IiwiZGVmYXVsdCIsImlnbm9yZSJdfSwicGF0aHNUb1Njb3BlcyI6e30sImVtaXR0ZXIiOnsiX2V2ZW50cyI6e30sIl9ldmVudHNDb3VudCI6MCwiX21heExpc3RlbmVycyI6MH0sIiRvcHRpb25zIjp0cnVlfSwiaXNOZXciOmZhbHNlLCJfZG9jIjp7ImVtYWlsdmVyaWZpZWQiOmZhbHNlLCJwYXNzd29yZCI6IiQyYSQxMCRJc0hJRm9HTmRvRnVrODVRaDZlbXN1RjFzbkphNC5ELmgud2tuS092RUdlcVJsSlpZOHdjUyIsImVtYWlsIjoiYW5kcmVhLmxlb0BmMjEuaXQiLCJfaWQiOiI1ZGM5Mzg2MmFkZDRmNjljM2Q0NThkOGYifSwiJGluaXQiOnRydWUsImlhdCI6MTU3NDkzNTUxOCwiYXVkIjoiaHR0cHM6Ly90aWxlZGVzay5jb20iLCJpc3MiOiJodHRwczovL3RpbGVkZXNrLmNvbSIsInN1YiI6InVzZXIifQ._fZWRXAG1lBwmEbrqmvQr1ghhbcKAHgs74ki8UtDBZU';
40
- //var url = 'ws://'+window.location.host+'/?token=JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyIkX18iOnsic3RyaWN0TW9kZSI6dHJ1ZSwic2VsZWN0ZWQiOnsiZW1haWwiOjEsImZpcnN0bmFtZSI6MSwibGFzdG5hbWUiOjEsInBhc3N3b3JkIjoxLCJlbWFpbHZlcmlmaWVkIjoxLCJpZCI6MX0sImdldHRlcnMiOnt9LCJfaWQiOiI1YWIxMWM2YjgzZGMyNDAwMTRkNDYwOTUiLCJ3YXNQb3B1bGF0ZWQiOmZhbHNlLCJhY3RpdmVQYXRocyI6eyJwYXRocyI6eyJwYXNzd29yZCI6ImluaXQiLCJlbWFpbCI6ImluaXQiLCJfaWQiOiJpbml0In0sInN0YXRlcyI6eyJpZ25vcmUiOnt9LCJkZWZhdWx0Ijp7fSwiaW5pdCI6eyJwYXNzd29yZCI6dHJ1ZSwiZW1haWwiOnRydWUsIl9pZCI6dHJ1ZX0sIm1vZGlmeSI6e30sInJlcXVpcmUiOnt9fSwic3RhdGVOYW1lcyI6WyJyZXF1aXJlIiwibW9kaWZ5IiwiaW5pdCIsImRlZmF1bHQiLCJpZ25vcmUiXX0sInBhdGhzVG9TY29wZXMiOnt9LCJlbWl0dGVyIjp7Il9ldmVudHMiOnt9LCJfZXZlbnRzQ291bnQiOjAsIl9tYXhMaXN0ZW5lcnMiOjB9LCIkb3B0aW9ucyI6dHJ1ZX0sImlzTmV3IjpmYWxzZSwiX2RvYyI6eyJwYXNzd29yZCI6IiQyYSQxMCQ1eDUvUHJYWTJycVZTdVRQLjV2WlEuQ3JScy5sLjVWS2svNzRIb2haTXFwaEJwWHpNRUZKMiIsImVtYWlsIjoiYW5kcmVhLmxlb0BmMjEuaXQiLCJfaWQiOiI1YWIxMWM2YjgzZGMyNDAwMTRkNDYwOTUifSwiJGluaXQiOnRydWUsImlhdCI6MTU3NTAxODYzNiwiYXVkIjoiaHR0cHM6Ly90aWxlZGVzay5jb20iLCJpc3MiOiJodHRwczovL3RpbGVkZXNrLmNvbSIsInN1YiI6InVzZXIifQ.ZNU49DGQNdWfPMui_J1D9QyMnBgNIiS6q92TVGVW5m4';
41
- var url = 'ws://104.198.139.15'+'/?token=JWT%20eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1ZThkYTJiZTljMWY1MjAwMTdlZGJkZWYiLCJlbWFpbCI6ImFuZHJlYS5sZW9AZnJvbnRpZXJlMjEuaXQiLCJmaXJzdG5hbWUiOiJhbmRyZWEiLCJsYXN0bmFtZSI6ImxlbyIsImVtYWlsdmVyaWZpZWQiOnRydWUsImlhdCI6MTU4NjQxNjM0NSwiYXVkIjoiaHR0cHM6Ly90aWxlZGVzay5jb20iLCJpc3MiOiJodHRwczovL3RpbGVkZXNrLmNvbSIsInN1YiI6InVzZXIiLCJqdGkiOiI1ZDg1M2Q3Ny01YzJjLTQ3ZmQtOWFiMy1lZjJlZDg2ZDQyN2EifQ.s7zqrF7CrfEwlbbkb-cg8lc7VrzXRQsPRv1PVtTVqSM';
42
-
43
-
44
- tilebase = new Tilebase(url
45
-
46
- , function(data, notification) {
47
- $('#messages').append(`<div id="${data._id}">${data.first_text} ${notification.event.method}</div>`);
48
- }
49
- , function(object, notification) {
50
- $('#'+data._id).html(`<div id="${data._id}">${data.first_text} ${notification.event.method}</div>`);
51
- }
52
- );
53
- //tilebase.start('{ "action": "subscribe", "payload": { "topic": "topic1"}}');
54
- tilebase.start();
55
-
56
- </script>
57
21
  </head>
58
22
  <bdoy>
59
23
  <h1>
@@ -2,6 +2,7 @@ var amqp = require('amqplib/callback_api');
2
2
  var winston = require('../../config/winston');
3
3
  const requestEvent = require('../../event/requestEvent');
4
4
  const messageEvent = require('../../event/messageEvent');
5
+ const botEvent = require('../../event/botEvent');
5
6
  const authEvent = require('../../event/authEvent');
6
7
  // https://elements.heroku.com/addons/cloudamqp
7
8
  // https://gist.github.com/carlhoerberg/006b01ac17a0a94859ba#file-reconnect-js
@@ -149,6 +150,13 @@ function startWorker() {
149
150
  winston.info("Queue bind: "+_ok.queue+ " err: "+err3+ " key: project_user_update");
150
151
  winston.info("Data queue", oka)
151
152
  });
153
+
154
+ ch.bindQueue(_ok.queue, exchange, "faqbot_update", {}, function(err3, oka) {
155
+ winston.info("Queue bind: "+_ok.queue+ " err: "+err3+ " key: faqbot_update");
156
+ winston.info("Data queue", oka)
157
+ });
158
+
159
+
152
160
  ch.consume("jobs", processMsg, { noAck: false });
153
161
  winston.info("Worker is started");
154
162
  });
@@ -222,6 +230,12 @@ function work(msg, cb) {
222
230
  // requestEvent.emit('request.create.queue', msg.content);
223
231
  authEvent.emit('project_user.update.queue', JSON.parse(message_string));
224
232
  }
233
+
234
+ if (topic === 'faqbot_update') {
235
+ winston.info("reconnect here topic faqbot_update:" + topic);
236
+ // requestEvent.emit('request.update.queue', msg.content);
237
+ botEvent.emit('faqbot.update.queue', JSON.parse(message_string));
238
+ }
225
239
  cb(true);
226
240
  // WebSocket.cb(true);
227
241
  // requestEvent.on(msg.KEYYYYYYY+'.ws', msg.content);
@@ -318,12 +332,22 @@ function listen() {
318
332
  });
319
333
  });
320
334
 
335
+
336
+ botEvent.on('faqbot.update', function(bot) {
337
+ setImmediate(() => {
338
+ winston.debug("reconnect faqbot.update")
339
+ publish(exchange, "faqbot_update", Buffer.from(JSON.stringify(bot)));
340
+ winston.info("reconnect: "+ Buffer.from(JSON.stringify(bot)))
341
+ });
342
+ });
343
+
321
344
  }
322
345
 
323
346
  if (process.env.QUEUE_ENABLED === "true") {
324
347
  requestEvent.queueEnabled = true;
325
348
  messageEvent.queueEnabled = true;
326
349
  authEvent.queueEnabled = true;
350
+ botEvent.queueEnabled = true;
327
351
  listen();
328
352
  start();
329
353
  winston.info("Queue enabled. endpint: " + url );
@@ -2,6 +2,7 @@ var amqp = require('amqplib/callback_api');
2
2
  var winston = require('../../config/winston');
3
3
  const requestEvent = require('../../event/requestEvent');
4
4
  const messageEvent = require('../../event/messageEvent');
5
+ const botEvent = require('../../event/botEvent');
5
6
  const authEvent = require('../../event/authEvent');
6
7
  // https://elements.heroku.com/addons/cloudamqp
7
8
  // https://gist.github.com/carlhoerberg/006b01ac17a0a94859ba#file-reconnect-js
@@ -179,6 +180,10 @@ function work(msg, cb) {
179
180
  winston.debug("reconnectfanout here topic:" + topic);
180
181
  authEvent.emit('project_user.update.queue.pubsub', JSON.parse(message_string));
181
182
  }
183
+ if (topic === 'faqbot_update') {
184
+ winston.info("reconnectfanout here topic faqbot_update:" + topic);
185
+ botEvent.emit('faqbot.update.queue.pubsub', JSON.parse(message_string));
186
+ }
182
187
  cb(true);
183
188
  // WebSocket.cb(true);
184
189
  // requestEvent.on(msg.KEYYYYYYY+'.ws', msg.content);
@@ -243,12 +248,24 @@ function listen() {
243
248
  publish(exchange, "project_user_update", Buffer.from(JSON.stringify(dat)));
244
249
  });
245
250
  });
251
+
252
+
253
+ botEvent.on('faqbot.update', function(bot) {
254
+ setImmediate(() => {
255
+ winston.debug("reconnect faqbot.update")
256
+ publish(exchange, "faqbot_update", Buffer.from(JSON.stringify(bot)));
257
+ winston.info("reconnect fan: "+ Buffer.from(JSON.stringify(bot)))
258
+ });
259
+ });
260
+
261
+
246
262
  }
247
263
 
248
264
  if (process.env.QUEUE_ENABLED === "true") {
249
265
  requestEvent.queueEnabled = true;
250
266
  messageEvent.queueEnabled = true;
251
267
  authEvent.queueEnabled = true;
268
+ botEvent.queueEnabled = true;
252
269
  listen();
253
270
  start();
254
271
  winston.info("Queue Fanout enabled. endpint: " + url );
package/routes/faq_kb.js CHANGED
@@ -15,6 +15,7 @@ var configGlobal = require('../config/global');
15
15
  const faq = require('../models/faq');
16
16
  var jwt = require('jsonwebtoken');
17
17
  const uuidv4 = require('uuid/v4');
18
+ var ObjectId = require('mongoose').Types.ObjectId;
18
19
 
19
20
  let chatbot_templates_api_url = process.env.CHATBOT_TEMPLATES_API_URL
20
21
 
@@ -312,6 +313,13 @@ router.put('/:faq_kbid', function (req, res) {
312
313
  update.tags = req.body.tags;
313
314
  }
314
315
 
316
+ if (req.body.trained != undefined) {
317
+ update.trained = req.body.trained;
318
+ }
319
+ // update._id = req.params.faq_kbid;
320
+
321
+ winston.debug("update", update);
322
+ // "$set": req.params.faq_kbid
315
323
 
316
324
  Faq_kb.findByIdAndUpdate(req.params.faq_kbid, update, { new: true, upsert: true }, function (err, updatedFaq_kb) { //TODO add cache_bot_here
317
325
  if (err) {
@@ -324,6 +332,14 @@ router.put('/:faq_kbid', function (req, res) {
324
332
  });
325
333
 
326
334
 
335
+
336
+
337
+
338
+
339
+
340
+
341
+
342
+
327
343
  router.patch('/:faq_kbid/attributes', function (req, res) { //TODO add cache_bot_here
328
344
  var data = req.body;
329
345
 
@@ -927,4 +943,30 @@ router.get('/exportjson/:id_faq_kb', (req, res) => {
927
943
  })
928
944
 
929
945
 
946
+
947
+
948
+ router.post('/:faq_kbid/training', function (req, res) {
949
+
950
+ winston.debug(req.body);
951
+
952
+ var update = {};
953
+ update.trained = true;
954
+ // update._id = req.params.faq_kbid;
955
+
956
+ winston.debug("update", update);
957
+ // "$set": req.params.faq_kbid
958
+
959
+ Faq_kb.findByIdAndUpdate(req.params.faq_kbid, update, { new: true, upsert: true }, function (err, updatedFaq_kb) { //TODO add cache_bot_here
960
+ if (err) {
961
+ return res.status(500).send({ success: false, msg: 'Error updating object.' });
962
+ }
963
+
964
+ botEvent.emit('faqbot.update', updatedFaq_kb);
965
+ res.json(updatedFaq_kb);
966
+ });
967
+ });
968
+
969
+
970
+
971
+
930
972
  module.exports = router;
package/routes/lead.js CHANGED
@@ -149,6 +149,56 @@ router.patch('/:leadid/attributes', function (req, res) {
149
149
 
150
150
 
151
151
 
152
+ router.patch('/:leadid/properties', function (req, res) {
153
+ var data = req.body;
154
+
155
+ // TODO use service method
156
+
157
+ Lead.findById(req.params.leadid, function (err, lead) {
158
+ if (err) {
159
+ winston.error('--- > ERROR ', err);
160
+ return res.status(500).send({ success: false, msg: 'Error updating object.' });
161
+ }
162
+
163
+ if (!lead) {
164
+ return res.status(404).send({ success: false, msg: 'Object not found.' });
165
+ }
166
+
167
+ if (!lead.properties) {
168
+ winston.debug("empty properties")
169
+ lead.properties = {};
170
+ }
171
+
172
+ winston.debug(" lead properties", lead.properties)
173
+
174
+ Object.keys(data).forEach(function(key) {
175
+ var val = data[key];
176
+ winston.debug("data attributes "+key+" " +val)
177
+ lead.properties[key] = val;
178
+ });
179
+
180
+ winston.debug(" lead properties", lead.properties)
181
+
182
+ // https://stackoverflow.com/questions/24054552/mongoose-not-saving-nested-object
183
+ lead.markModified('properties');
184
+
185
+ //cacheinvalidation
186
+ lead.save(function (err, savedLead) {
187
+ if (err) {
188
+ winston.error("error saving lead properties",err)
189
+ return res.status(500).send({ success: false, msg: 'Error getting object.' });
190
+ }
191
+ winston.verbose(" saved lead properties",savedLead.toObject())
192
+ leadEvent.emit('lead.update', savedLead);
193
+
194
+ res.json(savedLead);
195
+ });
196
+ });
197
+
198
+ });
199
+
200
+
201
+
152
202
  // router.put('/:leadid', function (req, res) {
153
203
  // winston.debug(req.body);
154
204
  // var update = {};
@@ -199,6 +249,7 @@ router.delete('/:leadid/physical', function (req, res) {
199
249
  return res.status(403).send({ success: false, msg: 'Unauthorized.' });
200
250
  }
201
251
 
252
+ // TODO use findByIdAndRemove otherwise lead don't contains label object
202
253
  Lead.remove({ _id: req.params.leadid }, function (err, lead) {
203
254
  if (err) {
204
255
  winston.error('--- > ERROR ', err);
@@ -3,6 +3,7 @@ const Faq_kb = require('../models/faq_kb');
3
3
  const Faq = require('../models/faq');
4
4
  var winston = require('../config/winston');
5
5
  const axios = require("axios").default;
6
+ var configGlobal = require('../config/global');
6
7
 
7
8
 
8
9
  let chatbot_training_api_url = "http://34.65.210.38/model/train"
@@ -35,14 +36,18 @@ class TrainingService {
35
36
  if (err) {
36
37
  winston.error("[Training] find all error: ", err);
37
38
  } else {
38
-
39
+
39
40
  let json = {
40
41
  "configuration": {
41
42
  "language": faq_kb.language,
42
43
  "pipeline":["lstm"]
43
44
  },
44
45
  "model": faq_kb._id,
45
- "nlu": []
46
+ "nlu": [],
47
+
48
+ // curl -v -X PUT -H 'Content-Type:application/json' -u admin@tiledesk.com:adminadmin -d '{"trained":false}' http://localhost:3000/63ed15febb8a5eb3b247fdfd/bots/64551b3422cdfb93ddb1b784
49
+ "webhook_url": process.env.API_URL || configGlobal.apiUrl + "/" + faq_kb.id_project + "/bots/" + faq_kb._id+"/training",
50
+ "token" : process.env.TRAINING_BOT_JWT_TOKEN
46
51
  }
47
52
 
48
53
  faqs.forEach((f) => {