@tiledesk/tiledesk-server 2.4.8 → 2.4.10

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/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) => {