@tiledesk/tiledesk-server 2.4.47 → 2.4.49

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/app.js CHANGED
@@ -112,6 +112,7 @@ var jwtroute = require('./routes/jwt');
112
112
  var key = require('./routes/key');
113
113
  var widgets = require('./routes/widget');
114
114
  var widgetsLoader = require('./routes/widgetLoader');
115
+ var openai_kbs = require('./routes/openai_kbs');
115
116
 
116
117
  // var admin = require('./routes/admin');
117
118
  var faqpub = require('./routes/faqpub');
@@ -549,6 +550,8 @@ app.use('/:projectid/emails',[passport.authenticate(['basic', 'jwt'], { session:
549
550
 
550
551
  app.use('/:projectid/properties',[passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('agent', ['bot','subscription'])], property);
551
552
 
553
+ app.use('/:projectid/openai_kbs', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('agent')], openai_kbs);
554
+
552
555
 
553
556
 
554
557
  if (pubModulesManager) {
@@ -0,0 +1,30 @@
1
+ var mongoose = require('mongoose');
2
+ var Schema = mongoose.Schema;
3
+ var winston = require('../config/winston');
4
+
5
+ var OpenaiKbsSchema = new Schema({
6
+ name: {
7
+ type: String,
8
+ required: true
9
+ },
10
+ url: {
11
+ type: String,
12
+ required: true
13
+ },
14
+ id_project: {
15
+ type: String,
16
+ required: true,
17
+ index: true
18
+ },
19
+ gptkey: {
20
+ type: String,
21
+ required: true
22
+ },
23
+ createdAt: {
24
+ type: Date,
25
+ default: Date.now,
26
+ }
27
+ });
28
+
29
+
30
+ module.exports = mongoose.model('OpenaiKbs', OpenaiKbsSchema);
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.47",
4
+ "version": "2.4.49",
5
5
  "scripts": {
6
6
  "start": "node ./bin/www",
7
7
  "pretest": "mongodb-runner start",
package/routes/email.js CHANGED
@@ -303,7 +303,7 @@ if (process.env.ENABLE_TEST_EMAIL_ENDPOINT==true || process.env.ENABLE_TEST_EMAI
303
303
 
304
304
 
305
305
  //TODO add cc
306
- router.post('/send',
306
+ router.post('/internal/send',
307
307
  async (req, res) => {
308
308
  let to = req.body.to;
309
309
  winston.debug("to: " + to);
@@ -325,6 +325,8 @@ router.post('/send',
325
325
  let replyto = req.body.replyto;
326
326
  winston.debug("replyto: " + replyto);
327
327
 
328
+ winston.info("Sending an email with text : " + text + " to " + to);
329
+
328
330
  //sendEmailDirect(to, text, project, request_id, subject, tokenQueryString, sourcePage, payload)
329
331
  emailService.sendEmailDirect(newto, text, req.project, request_id, subject, undefined, undefined, undefined, replyto);
330
332
 
@@ -332,4 +334,7 @@ router.post('/send',
332
334
 
333
335
  });
334
336
 
337
+
338
+
339
+
335
340
  module.exports = router;
package/routes/faq.js CHANGED
@@ -168,10 +168,12 @@ router.post('/', function (req, res) {
168
168
  if (req.body.actions) {
169
169
  newFaq.actions = req.body.actions
170
170
  }
171
-
172
171
  if (req.body.attributes) {
173
172
  newFaq.attributes = req.body.attributes
174
173
  }
174
+ if (req.body.intent_id) {
175
+ newFaq.intent_id = req.body.intent_id;
176
+ }
175
177
 
176
178
  newFaq.save(function (err, savedFaq) {
177
179
  if (err) {
@@ -0,0 +1,58 @@
1
+ var express = require('express');
2
+ var OpenaiKbs = require('../models/openai_kbs');
3
+ var router = express.Router();
4
+
5
+
6
+ router.get('/', async (req, res) => {
7
+
8
+ let project_id = req.projectid;
9
+
10
+ OpenaiKbs.find({ id_project: project_id }, (err, kbs) => {
11
+ if (err) {
12
+ console.error("find all kbs error: ", err);
13
+ return res.status(500).send({ success: false, error: err });
14
+ } else {
15
+ return res.status(200).send(kbs);
16
+ }
17
+ })
18
+ })
19
+
20
+ router.post('/', async (req, res) => {
21
+
22
+ let body = req.body;
23
+
24
+ let new_kbs = new OpenaiKbs({
25
+ name: body.name,
26
+ url: body.url,
27
+ id_project: req.projectid,
28
+ gptkey: req.body.gptkey
29
+ })
30
+
31
+ new_kbs.save(function (err, savedKbs) {
32
+ if (err) {
33
+ console.error("save new kbs error: ", err);
34
+ return res.status(500).send({ success: false, error: err});
35
+ } else {
36
+ return res.status(200).send(savedKbs);
37
+ }
38
+ })
39
+ })
40
+
41
+ router.put('/', async (req, res) => {
42
+ // to be implemented
43
+ })
44
+
45
+ router.delete('/:kbs_id', async (req, res) => {
46
+ let kbs_id = req.params.kbs_id;
47
+
48
+ OpenaiKbs.findOneAndDelete( { _id: kbs_id }, (err, kbDeleted) => {
49
+ if (err) {
50
+ console.error("find one and delete kbs error: ", err);
51
+ return res.status(500).send({ success: false, error: err});
52
+ } else {
53
+ return res.status(200).send({ success: true, message: 'Knowledge Base deleted successfully', openai_kb: kbDeleted });
54
+ }
55
+ })
56
+ })
57
+
58
+ module.exports = router;
package/routes/request.js CHANGED
@@ -6,6 +6,8 @@ var Schema = mongoose.Schema,
6
6
  ObjectId = Schema.ObjectId;
7
7
  var moment = require('moment');
8
8
  var requestService = require('../services/requestService');
9
+ var emailService = require('../services/emailService');
10
+
9
11
  var departmentService = require('../services/departmentService');
10
12
  var winston = require('../config/winston');
11
13
  const requestEvent = require('../event/requestEvent');
@@ -646,6 +648,62 @@ router.delete('/:requestid/notes/:noteid', function (req, res) {
646
648
 
647
649
 
648
650
 
651
+ //TODO add cc
652
+ router.post('/:requestid/email/send',
653
+ async (req, res) => {
654
+
655
+
656
+ let text = req.body.text;
657
+ winston.debug("text: " + text);
658
+
659
+ let request_id = req.params.requestid;
660
+ winston.debug("request_id: " + request_id);
661
+
662
+ let subject = req.body.subject;
663
+ winston.info("subject: " + subject);
664
+
665
+ winston.debug("req.project", req.project);
666
+
667
+ let replyto = req.body.replyto;
668
+ winston.debug("replyto: " + replyto);
669
+
670
+
671
+ let q = Request.findOne({request_id: request_id, id_project: req.projectid})
672
+ // .select("+snapshot.agents")
673
+ .populate('lead')
674
+ q.exec(function(err, request) {
675
+ if (err) {
676
+ winston.error("error getting request by id ", err);
677
+ return res.status(500).send({ success: false, msg: 'Error getting object.' });
678
+ }
679
+ if (!request) {
680
+ return res.status(404).send({ success: false, msg: 'Object not found.' });
681
+ }
682
+
683
+
684
+
685
+ winston.info("Sending an email with text : " + text + " to request_id " + request_id);
686
+
687
+ if (!request.lead.email) {
688
+ res.json({"no queued": true});
689
+ }
690
+
691
+ let newto = request.lead.email
692
+ winston.info("Sending an email newto " + newto);
693
+
694
+ //sendEmailDirect(to, text, project, request_id, subject, tokenQueryString, sourcePage, payload)
695
+ emailService.sendEmailDirect(newto, text, req.project, request_id, subject, undefined, undefined, undefined, replyto);
696
+
697
+ res.json({"queued": true});
698
+
699
+
700
+ });
701
+
702
+
703
+
704
+
705
+ });
706
+
649
707
 
650
708
 
651
709
 
@@ -1029,7 +1087,9 @@ router.get('/', function (req, res, next) {
1029
1087
  winston.debug('REQUEST ROUTE - QUERY channel', query.channel);
1030
1088
  }
1031
1089
 
1032
-
1090
+ if (req.query.priority) {
1091
+ query.priority = req.query.priority;
1092
+ }
1033
1093
 
1034
1094
 
1035
1095
  var direction = -1; //-1 descending , 1 ascending
@@ -12,53 +12,53 @@ class FaqService {
12
12
  var that = this;
13
13
  return new Promise(function (resolve, reject) {
14
14
 
15
- //winston.debug('FAQ-KB POST REQUEST BODY ', req.body);
16
- var newFaq_kb = new Faq_kb({
17
- name: name,
18
- description: description,
19
- url: url,
20
- id_project: projectid,
21
- webhook_url: webhook_url,
22
- webhook_enabled: webhook_enabled,
23
- type: type,
24
- language: language,
25
- public: false,
26
- certified: false,
27
- mainCategory: mainCategory,
28
- intentsEngine: intentsEngine,
29
- trashed: false,
30
- createdBy: user_id,
31
- updatedBy: user_id,
32
- attributes: attributes
33
- });
34
-
15
+ //winston.debug('FAQ-KB POST REQUEST BODY ', req.body);
16
+ var newFaq_kb = new Faq_kb({
17
+ name: name,
18
+ description: description,
19
+ url: url,
20
+ id_project: projectid,
21
+ webhook_url: webhook_url,
22
+ webhook_enabled: webhook_enabled,
23
+ type: type,
24
+ language: language,
25
+ public: false,
26
+ certified: false,
27
+ mainCategory: mainCategory,
28
+ intentsEngine: intentsEngine,
29
+ trashed: false,
30
+ createdBy: user_id,
31
+ updatedBy: user_id,
32
+ attributes: attributes
33
+ });
35
34
 
36
- newFaq_kb.save(function (err, savedFaq_kb) {
37
- if (err) {
38
- winston.error('--- > ERROR ', err)
39
- return reject('Error saving object.' );
35
+
36
+ newFaq_kb.save(function (err, savedFaq_kb) {
37
+ if (err) {
38
+ winston.error('--- > ERROR ', err)
39
+ return reject('Error saving object.');
40
+ }
41
+ winston.debug('-> -> SAVED FAQFAQ KB ', savedFaq_kb.toObject())
42
+
43
+ botEvent.emit('faqbot.create', savedFaq_kb);
44
+
45
+ winston.debug('type ' + type)
46
+
47
+ if (type === "internal" || type === "tilebot") {
48
+
49
+ if (!template) {
50
+ template = "empty";
40
51
  }
41
- winston.debug('-> -> SAVED FAQFAQ KB ', savedFaq_kb.toObject())
42
-
43
- botEvent.emit('faqbot.create', savedFaq_kb);
44
-
45
- winston.debug('type '+ type)
46
-
47
- if (type==="internal" || type==="tilebot") {
48
-
49
- if (!template) {
50
- template = "empty";
51
- }
52
- winston.debug('template '+ template);
53
- that.createGreetingsAndOperationalsFaqs(savedFaq_kb._id, savedFaq_kb.createdBy, savedFaq_kb.id_project, template);
54
- } else {
55
- winston.debug('external bot: ', savedFaq_kb);
56
- }
52
+ winston.debug('template ' + template);
53
+ that.createGreetingsAndOperationalsFaqs(savedFaq_kb._id, savedFaq_kb.createdBy, savedFaq_kb.id_project, template);
54
+ } else {
55
+ winston.debug('external bot: ', savedFaq_kb);
56
+ }
57
57
 
58
-
59
58
 
60
- return resolve(savedFaq_kb);
61
- });
59
+
60
+ return resolve(savedFaq_kb);
61
+ });
62
62
  });
63
63
  }
64
64
 
@@ -69,98 +69,122 @@ class FaqService {
69
69
  // aggiungi esempio tdAction con intent_id
70
70
 
71
71
  // TODO non scatta i trigger sui rest hook. fare?
72
- winston.debug('template: '+ template);
72
+ winston.debug('template: ' + template);
73
73
 
74
74
  var faqsArray;
75
75
 
76
- if (template==="example") {
76
+ if (template === "example") {
77
77
 
78
78
  faqsArray = [
79
79
  { 'question': 'Hi', 'answer': 'Hi', 'topic': 'greetings' },
80
80
  { 'question': 'Hello', 'answer': 'Hello', 'topic': 'greetings' },
81
- { 'question': 'Who are you?', 'answer': 'Hi, I\'m a bot 🤖. You can find more about me [here](https://tiledesk.com/chatbot-for-customer-service).\ntdImage:https://console.tiledesk.com/assets/images/tily-welcomebot.gif\n* See the website https://tiledesk.com/\n* Back to start tdAction:start', 'topic': 'greetings' },
82
- { 'question': '👨🏻‍🦰 I want an agent', 'answer': 'We are looking for an operator.. '+ActionsConstants.CHAT_ACTION_MESSAGE.AGENT, 'intent_display_name': 'agent_handoff', 'topic': 'internal' },
83
- { 'question': 'Close\nResolved', 'answer': ActionsConstants.CHAT_ACTION_MESSAGE.CLOSE, 'topic': 'internal' },
84
- { 'question': '\\start', 'answer': 'Hello 👋. I\'m a bot 🤖.\n\nChoose one of the options below or write a message to reach our staff.\n* Who are you?\n* Where are you?\n* What can you do?\n* 👨🏻‍🦰 I want an agent', 'intent_display_name': 'start', 'topic': 'internal' },
81
+ { 'question': 'Who are you?', 'answer': 'Hi, I\'m a bot 🤖. You can find more about me [here](https://tiledesk.com/chatbot-for-customer-service).\ntdImage:https://console.tiledesk.com/assets/images/tily-welcomebot.gif\n* See the website https://tiledesk.com/\n* Back to start tdAction:start', 'topic': 'greetings' },
82
+ { 'question': '👨🏻‍🦰 I want an agent', 'answer': 'We are looking for an operator.. ' + ActionsConstants.CHAT_ACTION_MESSAGE.AGENT, 'intent_display_name': 'agent_handoff', 'topic': 'internal' },
83
+ { 'question': 'Close\nResolved', 'answer': ActionsConstants.CHAT_ACTION_MESSAGE.CLOSE, 'topic': 'internal' },
84
+ { 'question': '\\start', 'answer': 'Hello 👋. I\'m a bot 🤖.\n\nChoose one of the options below or write a message to reach our staff.\n* Who are you?\n* Where are you?\n* What can you do?\n* 👨🏻‍🦰 I want an agent', 'intent_display_name': 'start', 'topic': 'internal' },
85
85
  { '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
86
- { 'question': 'What can you do?', 'answer': 'Using natural language processing, I\'m able to find the best answer for your users. I also support images, videos etc.. Let\'s try:\n* Sample Image\n* Sample Video\n* Sample Action tdAction:action1\n* Sample Frame\n* Back to start tdAction:start', 'topic': 'sample' },
87
- { 'question': 'Sample Image', 'answer': 'tdImage:https://tiledesk.com/wp-content/uploads/2022/07/tiledesk_v2.png\n* What can you do?\n* Back to start tdAction:start', 'topic': 'sample' },
88
- { 'question': 'Sample Frame', 'answer': 'tdFrame:https://www.emanueleferonato.com/wp-content/uploads/2019/02/runner/\n* What can you do?\n* Back to start tdAction:start', 'topic': 'sample' },
89
- { 'question': 'Sample Video', 'answer': 'tdVideo:https://www.youtube.com/embed/EngW7tLk6R8\n* What can you do?\n* Back to start tdAction:start', 'topic': 'sample' },
90
- { 'question': 'Where are you?', 'answer': 'We are here ❤️\ntdFrame:https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d6087916.923447935!2d8.234804542117423!3d41.836572992140624!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x12d4fe82448dd203%3A0xe22cf55c24635e6f!2sItaly!5e0!3m2!1sen!2sit!4v1613657475377!5m2!1sen!2sit\n* Back to start tdAction:start', 'topic': 'sample' },
91
-
86
+ { 'question': 'What can you do?', 'answer': 'Using natural language processing, I\'m able to find the best answer for your users. I also support images, videos etc.. Let\'s try:\n* Sample Image\n* Sample Video\n* Sample Action tdAction:action1\n* Sample Frame\n* Back to start tdAction:start', 'topic': 'sample' },
87
+ { 'question': 'Sample Image', 'answer': 'tdImage:https://tiledesk.com/wp-content/uploads/2022/07/tiledesk_v2.png\n* What can you do?\n* Back to start tdAction:start', 'topic': 'sample' },
88
+ { 'question': 'Sample Frame', 'answer': 'tdFrame:https://www.emanueleferonato.com/wp-content/uploads/2019/02/runner/\n* What can you do?\n* Back to start tdAction:start', 'topic': 'sample' },
89
+ { 'question': 'Sample Video', 'answer': 'tdVideo:https://www.youtube.com/embed/EngW7tLk6R8\n* What can you do?\n* Back to start tdAction:start', 'topic': 'sample' },
90
+ { 'question': 'Where are you?', 'answer': 'We are here ❤️\ntdFrame:https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d6087916.923447935!2d8.234804542117423!3d41.836572992140624!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x12d4fe82448dd203%3A0xe22cf55c24635e6f!2sItaly!5e0!3m2!1sen!2sit!4v1613657475377!5m2!1sen!2sit\n* Back to start tdAction:start', 'topic': 'sample' },
91
+
92
92
  // { 'question': 'Sample Webhook', 'answer': 'tdWebhook:https://tiledesk-bot-webhook.tiledesk.repl.co', 'topic': 'sample' },
93
- { 'question': 'Sample Action', 'answer': 'Hello 👋 Would you like to take a closer look at our offer?\n* Yes, please tdAction:yes_action\n* No tdAction:no_action','intent_display_name': 'action1', 'topic': 'sample' },
94
- { 'question': 'Yes Action', 'answer': 'Great! Take a look here:\n* Tiledesk Pricing https://tiledesk.com/pricing-cloud/', 'intent_display_name': 'yes_action','topic': 'sample' },
95
- { 'question': 'No Action', 'answer': 'All right! If you need anything, let us know.', 'intent_display_name': 'no_action','topic': 'sample' },
96
-
97
-
93
+ { 'question': 'Sample Action', 'answer': 'Hello 👋 Would you like to take a closer look at our offer?\n* Yes, please tdAction:yes_action\n* No tdAction:no_action', 'intent_display_name': 'action1', 'topic': 'sample' },
94
+ { 'question': 'Yes Action', 'answer': 'Great! Take a look here:\n* Tiledesk Pricing https://tiledesk.com/pricing-cloud/', 'intent_display_name': 'yes_action', 'topic': 'sample' },
95
+ { 'question': 'No Action', 'answer': 'All right! If you need anything, let us know.', 'intent_display_name': 'no_action', 'topic': 'sample' },
96
+
97
+
98
98
  // action button nn si può fare perche gli id cambiano
99
99
  ]
100
100
 
101
101
  }
102
102
 
103
- if (template==="blank") {
103
+ if (template === "blank") {
104
104
 
105
105
  // faqsArray = [
106
106
  // { 'question': '\\start', 'answer': 'Hello', 'intent_display_name': 'start', 'topic': 'internal' },
107
107
  // { '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
108
108
  // ]
109
- faqsArray = [
110
- {
111
- 'question': '\\start',
112
- "actions" : [
113
- {
114
- "_tdActionType" : "reply",
115
- "text" : "Hi, how can I help you?",
116
- "attributes" : {
117
- "commands" : [
118
- {
119
- "type" : "message",
120
- "message" : {
121
- "type" : "text",
122
- "text" : "Hi, how can I help you?"
123
- }
124
- }
125
- ]
126
- }
127
- }
128
- ],
129
- 'intent_display_name': 'start',
130
- 'topic': 'internal'
131
- },
132
- {
133
- 'question': 'defaultFallback',
134
- "actions" : [
135
- {
136
- "_tdActionType" : "reply",
137
- "text" : "I didn't understand. Can you rephrase your question?",
138
- "attributes" : {
139
- "commands" : [
140
- {
141
- "type" : "message",
142
- "message" : {
143
- "type" : "text",
144
- "text" : "I didn't understand. Can you rephrase your question?"
145
- }
146
- }
147
- ]
148
- }
149
- }
150
- ],
151
- 'intent_display_name': 'defaultFallback',
152
- 'topic': 'internal'
153
- }, //TODO se metto spazio n * nn va
154
- ]
109
+ faqsArray = [{
110
+ "webhook_enabled": false,
111
+ "enabled": true,
112
+ "actions": [{
113
+ "_tdActionType": "reply",
114
+ "text": "I didn't understand. Can you rephrase your question?",
115
+ "attributes": {
116
+ "commands": [{
117
+ "type": "wait",
118
+ "time": 500
119
+ },{
120
+ "type": "message",
121
+ "message": {
122
+ "type": "text",
123
+ "text": "I didn't understand. Can you rephrase your question?"
124
+ }
125
+ }]
126
+ }
127
+ }],
128
+ "intent_display_name": "defaultFallback",
129
+ "attributes": {
130
+ "position": {
131
+ "x": 714,
132
+ "y": 528
133
+ }
134
+ }
135
+ }, {
136
+ "webhook_enabled": false,
137
+ "enabled": true,
138
+ "actions": [{
139
+ "_tdActionType": "intent",
140
+ "intentName": "#9d0b96b9-e036-4c2d-8504-1181b5c4be75"
141
+ }],
142
+ "question": "\\start",
143
+ "intent_display_name": "start",
144
+ "attributes": {
145
+ "position": {
146
+ "x": 172,
147
+ "y": 384
148
+ }
149
+ }
150
+ }, {
151
+ "webhook_enabled": false,
152
+ "enabled": true,
153
+ "actions": [{
154
+ "_tdActionType": "reply",
155
+ "attributes": {
156
+ "disableInputMessage": false,
157
+ "commands": [{
158
+ "type": "wait",
159
+ "time": 500
160
+ }, {
161
+ "type": "message",
162
+ "message": {
163
+ "type": "text",
164
+ "text": "Hi, how can I help you?"
165
+ }
166
+ }]
167
+ },
168
+ "text": "Hi, how can I help you?\r\n"
169
+ }],
170
+ "intent_display_name": "welcome",
171
+ "intent_id": "9d0b96b9-e036-4c2d-8504-1181b5c4be75",
172
+ "attributes": {
173
+ "position": {
174
+ "x": 714,
175
+ "y": 113
176
+ }
177
+ }
178
+ }]
155
179
 
156
180
  }
157
181
 
158
182
 
159
- if (template==="handoff") {
183
+ if (template === "handoff") {
160
184
 
161
- faqsArray = [
162
- { 'question': '\\start', 'answer': 'Hello', 'intent_display_name': 'start', 'topic': 'internal' },
163
- { 'question': '👨🏻‍🦰 I want an agent', 'answer': 'We are looking for an operator.. '+ActionsConstants.CHAT_ACTION_MESSAGE.AGENT, 'intent_display_name': 'agent_handoff', 'topic': 'internal' },
185
+ faqsArray = [
186
+ { 'question': '\\start', 'answer': 'Hello', 'intent_display_name': 'start', 'topic': 'internal' },
187
+ { 'question': '👨🏻‍🦰 I want an agent', 'answer': 'We are looking for an operator.. ' + ActionsConstants.CHAT_ACTION_MESSAGE.AGENT, 'intent_display_name': 'agent_handoff', 'topic': 'internal' },
164
188
  { '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
165
189
  ]
166
190
 
@@ -169,18 +193,20 @@ class FaqService {
169
193
  if (template === "empty") {
170
194
  faqsArray = [];
171
195
  }
172
-
173
-
196
+
197
+
174
198
  faqsArray.forEach(faq => {
175
199
 
176
200
  var newFaq = new Faq({
177
201
  id_faq_kb: faq_kb_id,
202
+ intent_id: faq.intent_id,
178
203
  question: faq.question,
179
204
  answer: faq.answer,
180
205
  actions: faq.actions,
181
206
  reply: faq.reply,
182
207
  intent_display_name: faq.intent_display_name,
183
208
  language: "en",
209
+ attributes: faq.attributes,
184
210
  id_project: projectid,
185
211
  topic: faq.topic,
186
212
  createdBy: created_by,
@@ -207,8 +233,8 @@ class FaqService {
207
233
  winston.debug("(Service) GET ALL FAQ OF THE BOT ID (req.query): ", faq_kb_id);
208
234
 
209
235
  return new Promise((resolve, reject) => {
210
-
211
- Faq.find({ id_faq_kb: faq_kb_id}, (err, faqs) => {
236
+
237
+ Faq.find({ id_faq_kb: faq_kb_id }, (err, faqs) => {
212
238
  if (err) {
213
239
  reject(err);
214
240
  }
package/test/faqRoute.js CHANGED
@@ -53,7 +53,7 @@ describe('FaqKBRoute', () => {
53
53
  chai.request(server)
54
54
  .post('/' + savedProject._id + '/faq')
55
55
  .auth(email, pwd)
56
- .send({ id_faq_kb: id_faq_kb, question: "question1", answer: "answer1", attributes: { attr1: { one: "one", two: "two"}, attr2: {three: "three"}} })
56
+ .send({ id_faq_kb: id_faq_kb, question: "question1", answer: "answer1", attributes: { attr1: { one: "one", two: "two"}, attr2: {three: "three"}}, intent_id: 'custom-intent-id' }) // if intent_id is null the value will be the default one
57
57
  .end((err, res) => {
58
58
  //console.log("res", res);
59
59
  console.log("res.body", res.body);
@@ -111,6 +111,48 @@ describe('FaqKBRoute', () => {
111
111
 
112
112
 
113
113
 
114
+ });
115
+ })
116
+ })
117
+ })
118
+
119
+ it('create with template blank', (done) => {
120
+
121
+ var email = "test-signup-" + Date.now() + "@email.com";
122
+ var pwd = "pwd";
123
+
124
+ userService.signup(email, pwd, "Test Firstname", "Test Lastname").then((savedUser) => {
125
+ projectService.create("test-faqkb-create", savedUser._id).then((savedProject) => {
126
+
127
+ chai.request(server)
128
+ .post('/' + savedProject._id + '/faq_kb')
129
+ .auth(email, pwd)
130
+ .send({ "name": "testbot", type: "internal", template: "blank" })
131
+ .end((err, res) => {
132
+ if (log) {
133
+ }
134
+ console.log("res.body", res.body);
135
+ res.should.have.status(200);
136
+ res.body.should.be.a('object');
137
+ expect(res.body.name).to.equal("testbot");
138
+ var id_faq_kb = res.body._id;
139
+
140
+ chai.request(server)
141
+ .get('/' + savedProject._id + '/faq?id_faq_kb=' + id_faq_kb)
142
+ .auth(email, pwd)
143
+ .end((err, res) => {
144
+ if (log) {
145
+ }
146
+ console.log("faq_list: ", JSON.stringify(res.body, null, 2));
147
+ res.should.have.status(200);
148
+ res.body.should.be.an('array').that.is.not.empty;
149
+
150
+ done();
151
+
152
+ })
153
+
154
+
155
+
114
156
  });
115
157
  })
116
158
  })
@@ -0,0 +1,75 @@
1
+ //During the test the env variable is set to test
2
+ process.env.NODE_ENV = 'test';
3
+
4
+ let log = false;
5
+
6
+ //Require the dev-dependencies
7
+ let chai = require('chai');
8
+ let chaiHttp = require('chai-http');
9
+ let server = require('../app');
10
+ let should = chai.should();
11
+ var fs = require('fs');
12
+ const path = require('path');
13
+
14
+ // chai.config.includeStack = true;
15
+
16
+ var expect = chai.expect;
17
+ var assert = chai.assert;
18
+
19
+ chai.use(chaiHttp);
20
+
21
+ describe('FaqKBRoute', () => {
22
+
23
+ describe('/create', () => {
24
+
25
+ it('home', (done) => {
26
+
27
+ })
28
+
29
+ it('create', (done) => {
30
+
31
+ var email = "test-signup-" + Date.now() + "@email.com";
32
+ var pwd = "pwd";
33
+
34
+ userService.signup(email, pwd, "Test Firstname", "Test lastname").then(function (savedUser) {
35
+ projectService.create("test-faqkb-create", savedUser._id).then(function (savedProject) {
36
+ chai.request(server)
37
+ .post('/' + savedProject._id + '/faq_kb')
38
+ .auth(email, pwd)
39
+ .send({ "name": "testbot", type: "external", language: 'fr' })
40
+ .end((err, res) => {
41
+ if (log) {
42
+ console.log("res.body", res.body);
43
+ }
44
+ res.should.have.status(200);
45
+ res.body.should.be.a('object');
46
+ expect(res.body.name).to.equal("testbot");
47
+ expect(res.body.language).to.equal("fr");
48
+
49
+ chai.request(server)
50
+ .get('/' + savedProject._id + '/faq_kb/' + res.body._id)
51
+ .auth(email, pwd)
52
+ .end((err, res) => {
53
+ if (log) {
54
+ console.log("res.body", res.body);
55
+ }
56
+ res.should.have.status(200);
57
+
58
+ done();
59
+ });
60
+ });
61
+
62
+
63
+ });
64
+ });
65
+
66
+ }).timeout(20000);
67
+
68
+
69
+
70
+
71
+ });
72
+
73
+ });
74
+
75
+