@tiledesk/tiledesk-server 2.7.22 → 2.7.24
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 +7 -0
- package/app.js +6 -4
- package/jobs.js +3 -3
- package/jobsManager.js +7 -7
- package/package.json +4 -4
- package/routes/kb.js +70 -19
- package/routes/webhook.js +55 -0
- package/services/emailService.js +30 -25
- package/test/kbRoute.js +64 -8
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,13 @@
|
|
|
5
5
|
🚀 IN PRODUCTION 🚀
|
|
6
6
|
(https://www.npmjs.com/package/@tiledesk/tiledesk-server/v/2.3.77)
|
|
7
7
|
|
|
8
|
+
# 2.7.24
|
|
9
|
+
- Updated whatsapp-jobworker to 0.0.8
|
|
10
|
+
- Updated knowledge base route
|
|
11
|
+
|
|
12
|
+
# 2.7.23
|
|
13
|
+
- Updated tybot-connector to 0.2.69
|
|
14
|
+
|
|
8
15
|
# 2.7.22
|
|
9
16
|
- Updated whatsapp-connector to 0.1.72
|
|
10
17
|
|
package/app.js
CHANGED
|
@@ -142,7 +142,7 @@ var urls = require('./routes/urls');
|
|
|
142
142
|
var email = require('./routes/email');
|
|
143
143
|
var property = require('./routes/property');
|
|
144
144
|
var segment = require('./routes/segment');
|
|
145
|
-
|
|
145
|
+
var webhook = require('./routes/webhook');
|
|
146
146
|
|
|
147
147
|
var bootDataLoader = require('./services/bootDataLoader');
|
|
148
148
|
var settingDataLoader = require('./services/settingDataLoader');
|
|
@@ -199,9 +199,9 @@ let whatsappQueue = require('@tiledesk/tiledesk-whatsapp-jobworker');
|
|
|
199
199
|
winston.info("whatsappQueue");
|
|
200
200
|
jobsManager.listenWhatsappQueue(whatsappQueue);
|
|
201
201
|
|
|
202
|
-
let trainingQueue = require('@tiledesk/tiledesk-train-jobworker');
|
|
203
|
-
winston.info("trainingQueue");
|
|
204
|
-
jobsManager.listenTrainingQueue(trainingQueue);
|
|
202
|
+
// let trainingQueue = require('@tiledesk/tiledesk-train-jobworker');
|
|
203
|
+
// winston.info("trainingQueue");
|
|
204
|
+
// jobsManager.listenTrainingQueue(trainingQueue);
|
|
205
205
|
|
|
206
206
|
|
|
207
207
|
var channelManager = require('./channels/channelManager');
|
|
@@ -503,6 +503,8 @@ app.use('/users_util', usersUtil);
|
|
|
503
503
|
// app.use('/logs', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken], logs);
|
|
504
504
|
app.use('/requests_util', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken], requestUtilRoot);
|
|
505
505
|
|
|
506
|
+
app.use('/webhook', webhook);
|
|
507
|
+
|
|
506
508
|
// TODO security issues
|
|
507
509
|
if (process.env.DISABLE_TRANSCRIPT_VIEW_PAGE ) {
|
|
508
510
|
winston.info(" Transcript view page is disabled");
|
package/jobs.js
CHANGED
|
@@ -104,9 +104,9 @@ async function main()
|
|
|
104
104
|
winston.info("whatsappQueue");
|
|
105
105
|
jobsManager.listenWhatsappQueue(whatsappQueue);
|
|
106
106
|
|
|
107
|
-
let trainingQueue = require('@tiledesk/tiledesk-train-jobworker');
|
|
108
|
-
winston.info("trainingQueue");
|
|
109
|
-
jobsManager.listenTrainingQueue(trainingQueue);
|
|
107
|
+
// let trainingQueue = require('@tiledesk/tiledesk-train-jobworker');
|
|
108
|
+
// winston.info("trainingQueue");
|
|
109
|
+
// jobsManager.listenTrainingQueue(trainingQueue);
|
|
110
110
|
|
|
111
111
|
|
|
112
112
|
let scheduler = require('./pubmodules/scheduler');
|
package/jobsManager.js
CHANGED
|
@@ -87,13 +87,13 @@ class JobsManager {
|
|
|
87
87
|
// this.whatsappQueue.listen(); // oppure codice
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
-
listenTrainingQueue(trainingQueue) {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
}
|
|
90
|
+
// listenTrainingQueue(trainingQueue) {
|
|
91
|
+
// console.log("JobsManager listenTrainingQueue started");
|
|
92
|
+
// console.log("trainingQueue is: ", trainingQueue)
|
|
93
|
+
// if (this.jobWorkerEnabled == true) {
|
|
94
|
+
// return winston.info("JobsManager jobWorkerEnabled is enabled. Skipping listener for Training Queue");
|
|
95
|
+
// }
|
|
96
|
+
// }
|
|
97
97
|
}
|
|
98
98
|
|
|
99
99
|
|
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.7.
|
|
4
|
+
"version": "2.7.24",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"start": "node ./bin/www",
|
|
7
7
|
"pretest": "mongodb-runner start",
|
|
@@ -46,11 +46,11 @@
|
|
|
46
46
|
"@tiledesk/tiledesk-kaleyra-proxy": "^0.1.7",
|
|
47
47
|
"@tiledesk/tiledesk-messenger-connector": "^0.1.21",
|
|
48
48
|
"@tiledesk/tiledesk-rasa-connector": "^1.0.10",
|
|
49
|
+
"@tiledesk/tiledesk-train-jobworker": "^0.0.11",
|
|
49
50
|
"@tiledesk/tiledesk-telegram-connector": "^0.1.14",
|
|
50
|
-
"@tiledesk/tiledesk-
|
|
51
|
-
"@tiledesk/tiledesk-tybot-connector": "^0.2.67",
|
|
51
|
+
"@tiledesk/tiledesk-tybot-connector": "^0.2.69",
|
|
52
52
|
"@tiledesk/tiledesk-whatsapp-connector": "^0.1.72",
|
|
53
|
-
"@tiledesk/tiledesk-whatsapp-jobworker": "^0.0.
|
|
53
|
+
"@tiledesk/tiledesk-whatsapp-jobworker": "^0.0.8",
|
|
54
54
|
"amqplib": "^0.5.5",
|
|
55
55
|
"app-root-path": "^3.0.0",
|
|
56
56
|
"bcrypt-nodejs": "0.0.3",
|
package/routes/kb.js
CHANGED
|
@@ -7,11 +7,13 @@ var upload = multer()
|
|
|
7
7
|
const openaiService = require('../services/openaiService');
|
|
8
8
|
const JobManager = require('../utils/jobs-worker-queue-manager/JobManagerV2');
|
|
9
9
|
const { Scheduler } = require('../services/Scheduler');
|
|
10
|
-
|
|
10
|
+
var configGlobal = require('../config/global');
|
|
11
11
|
const Sitemapper = require('sitemapper');
|
|
12
12
|
|
|
13
13
|
const AMQP_MANAGER_URL = process.env.AMQP_MANAGER_URL;
|
|
14
14
|
const JOB_TOPIC_EXCHANGE = process.env.JOB_TOPIC_EXCHANGE_TRAIN || 'tiledesk-trainer';
|
|
15
|
+
const KB_WEBHOOK_TOKEN = process.env.KB_WEBHOOK_TOKEN || 'kbcustomtoken';
|
|
16
|
+
const apiUrl = process.env.API_URL || configGlobal.apiUrl;
|
|
15
17
|
|
|
16
18
|
let jobManager = new JobManager(AMQP_MANAGER_URL, {
|
|
17
19
|
debug: false,
|
|
@@ -27,6 +29,7 @@ router.get('/', async (req, res) => {
|
|
|
27
29
|
|
|
28
30
|
let project_id = req.projectid;
|
|
29
31
|
let status;
|
|
32
|
+
let type;
|
|
30
33
|
let limit = 200;
|
|
31
34
|
let page = 0;
|
|
32
35
|
let direction = -1;
|
|
@@ -41,6 +44,13 @@ router.get('/', async (req, res) => {
|
|
|
41
44
|
query["status"] = status;
|
|
42
45
|
winston.debug("Get kb status: " + status)
|
|
43
46
|
}
|
|
47
|
+
|
|
48
|
+
if (req.query.type) {
|
|
49
|
+
type = req.query.type;
|
|
50
|
+
query["type"] = type;
|
|
51
|
+
winston.debug("Get kb type: " + type);
|
|
52
|
+
}
|
|
53
|
+
|
|
44
54
|
if (req.query.limit) {
|
|
45
55
|
limit = parseInt(req.query.limit);
|
|
46
56
|
winston.debug("Get kb limit: " + limit)
|
|
@@ -193,13 +203,17 @@ router.post('/', async (req, res) => {
|
|
|
193
203
|
|
|
194
204
|
res.status(200).send(raw);
|
|
195
205
|
|
|
206
|
+
let webhook = apiUrl + '/webhook/kb/status?token=' + KB_WEBHOOK_TOKEN;
|
|
207
|
+
|
|
196
208
|
let json = {
|
|
197
209
|
id: raw.value._id,
|
|
198
210
|
type: raw.value.type,
|
|
199
211
|
source: raw.value.source,
|
|
200
212
|
content: "",
|
|
201
|
-
namespace: raw.value.namespace
|
|
213
|
+
namespace: raw.value.namespace,
|
|
214
|
+
webhook: webhook
|
|
202
215
|
}
|
|
216
|
+
winston.debug("json: ", json);
|
|
203
217
|
|
|
204
218
|
if (raw.value.content) {
|
|
205
219
|
json.content = raw.value.content;
|
|
@@ -221,7 +235,6 @@ router.post('/', async (req, res) => {
|
|
|
221
235
|
|
|
222
236
|
})
|
|
223
237
|
|
|
224
|
-
|
|
225
238
|
router.post('/multi', upload.single('uploadFile'), async (req, res) => {
|
|
226
239
|
|
|
227
240
|
let list;
|
|
@@ -256,6 +269,8 @@ router.post('/multi', upload.single('uploadFile'), async (req, res) => {
|
|
|
256
269
|
return res.status(403).send({ success: false, error: "Too many urls. Can't index more than 300 urls at a time."})
|
|
257
270
|
}
|
|
258
271
|
|
|
272
|
+
let webhook = apiUrl + '/webhook/kb/status?token=' + KB_WEBHOOK_TOKEN;
|
|
273
|
+
|
|
259
274
|
let kbs = [];
|
|
260
275
|
list.forEach(url => {
|
|
261
276
|
kbs.push({
|
|
@@ -284,9 +299,9 @@ router.post('/multi', upload.single('uploadFile'), async (req, res) => {
|
|
|
284
299
|
|
|
285
300
|
let resources = result.map(({ name, status, __v, createdAt, updatedAt, id_project, ...keepAttrs }) => keepAttrs)
|
|
286
301
|
resources = resources.map(({ _id, ...rest }) => {
|
|
287
|
-
return { id: _id, ...rest };
|
|
302
|
+
return { id: _id, webhook: webhook, ...rest };
|
|
288
303
|
});
|
|
289
|
-
winston.verbose("resources to be sent to worker: ", resources)
|
|
304
|
+
winston.verbose("resources to be sent to worker: ", resources);
|
|
290
305
|
scheduleScrape(resources);
|
|
291
306
|
res.status(200).send(result);
|
|
292
307
|
|
|
@@ -316,7 +331,6 @@ router.post('/sitemap', async (req, res) => {
|
|
|
316
331
|
|
|
317
332
|
})
|
|
318
333
|
|
|
319
|
-
|
|
320
334
|
router.put('/:kb_id', async (req, res) => {
|
|
321
335
|
|
|
322
336
|
let kb_id = req.params.kb_id;
|
|
@@ -351,7 +365,6 @@ router.put('/:kb_id', async (req, res) => {
|
|
|
351
365
|
|
|
352
366
|
})
|
|
353
367
|
|
|
354
|
-
|
|
355
368
|
// PROXY PUGLIA AI V2 - START
|
|
356
369
|
router.post('/scrape/single', async (req, res) => {
|
|
357
370
|
|
|
@@ -560,7 +573,7 @@ router.delete('/:kb_id', async (req, res) => {
|
|
|
560
573
|
} else {
|
|
561
574
|
winston.verbose("resp.data: ", resp.data);
|
|
562
575
|
|
|
563
|
-
KB.findOneAndDelete({ _id: kb_id, status: { $in: [-1, 3, 4] } }, (err, deletedKb) => {
|
|
576
|
+
KB.findOneAndDelete({ _id: kb_id, status: { $in: [-1, 3, 4, 100, 300, 400] } }, (err, deletedKb) => {
|
|
564
577
|
if (err) {
|
|
565
578
|
winston.error("findOneAndDelete err: ", err);
|
|
566
579
|
return res.status(500).send({ success: false, error: "Unable to delete the content due to an error" })
|
|
@@ -581,6 +594,33 @@ router.delete('/:kb_id', async (req, res) => {
|
|
|
581
594
|
|
|
582
595
|
})
|
|
583
596
|
|
|
597
|
+
router.delete('/namespace/:namespace_id', async (req, res) => {
|
|
598
|
+
|
|
599
|
+
let id_project = req.projectid;
|
|
600
|
+
let namespace_id = req.params.namespace_id;
|
|
601
|
+
|
|
602
|
+
let data = {
|
|
603
|
+
namespace: namespace_id
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
openaiService.deleteNamespace(data).then((resp) => {
|
|
607
|
+
winston.debug("delete namespace resp: ", resp.data);
|
|
608
|
+
|
|
609
|
+
KB.deleteMany({ id_project: id_project, namespace: namespace_id }, (err, deleteResponse) => {
|
|
610
|
+
if (err) {
|
|
611
|
+
winston.error("deleteMany error: ", err);
|
|
612
|
+
return res.status(500).send({ success: false, error: "Unable to delete namespace due to an error" })
|
|
613
|
+
}
|
|
614
|
+
winston.debug("deleteResponse: ", deleteResponse);
|
|
615
|
+
res.status(200).send({ success: true, message: "Namespace deleted succesfully" })
|
|
616
|
+
})
|
|
617
|
+
|
|
618
|
+
}).catch((err) => {
|
|
619
|
+
let status = err.response.status;
|
|
620
|
+
res.status(status).send({ success: false, error: "Unable to delete namespace"})
|
|
621
|
+
})
|
|
622
|
+
})
|
|
623
|
+
|
|
584
624
|
async function saveBulk(operations, kbs, project_id) {
|
|
585
625
|
|
|
586
626
|
return new Promise((resolve, reject) => {
|
|
@@ -629,9 +669,12 @@ async function statusConverter(status) {
|
|
|
629
669
|
async function updateStatus(id, status) {
|
|
630
670
|
return new Promise((resolve) => {
|
|
631
671
|
|
|
632
|
-
KB.findByIdAndUpdate(id, { status: status }, (err, updatedKb) => {
|
|
672
|
+
KB.findByIdAndUpdate(id, { status: status }, { new: true }, (err, updatedKb) => {
|
|
633
673
|
if (err) {
|
|
634
674
|
resolve(false)
|
|
675
|
+
} else if (!updatedKb) {
|
|
676
|
+
winston.verbose("Unable to update status. Data source not found.")
|
|
677
|
+
resolve(false)
|
|
635
678
|
} else {
|
|
636
679
|
winston.debug("updatedKb: ", updatedKb)
|
|
637
680
|
resolve(true);
|
|
@@ -642,17 +685,25 @@ async function updateStatus(id, status) {
|
|
|
642
685
|
|
|
643
686
|
async function scheduleScrape(resources) {
|
|
644
687
|
|
|
645
|
-
let data = {
|
|
646
|
-
|
|
647
|
-
}
|
|
648
|
-
winston.info("Schedule job with following data: ", data);
|
|
688
|
+
// let data = {
|
|
689
|
+
// resources: resources
|
|
690
|
+
// }
|
|
649
691
|
let scheduler = new Scheduler({ jobManager: jobManager });
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
692
|
+
|
|
693
|
+
resources.forEach(r => {
|
|
694
|
+
winston.debug("Schedule job with following data: ", r);
|
|
695
|
+
scheduler.trainSchedule(r, async (err, result) => {
|
|
696
|
+
let error_code = 100;
|
|
697
|
+
if (err) {
|
|
698
|
+
winston.error("Scheduling error: ", err);
|
|
699
|
+
error_code = 400;
|
|
700
|
+
} else {
|
|
701
|
+
winston.info("Scheduling result: ", result);
|
|
702
|
+
}
|
|
703
|
+
await updateStatus(r.id, error_code);
|
|
704
|
+
});
|
|
705
|
+
})
|
|
706
|
+
|
|
656
707
|
|
|
657
708
|
return true;
|
|
658
709
|
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
var express = require('express');
|
|
2
|
+
var router = express.Router();
|
|
3
|
+
var { KB } = require('../models/kb_setting');
|
|
4
|
+
var winston = require('../config/winston');
|
|
5
|
+
|
|
6
|
+
const KB_WEBHOOK_TOKEN = process.env.KB_WEBHOOK_TOKEN || 'kbcustomtoken';
|
|
7
|
+
|
|
8
|
+
router.post('/kb/status', async (req, res) => {
|
|
9
|
+
|
|
10
|
+
winston.info("(webhook) kb status called");
|
|
11
|
+
winston.info("(webhook) req.body: ", req.body);
|
|
12
|
+
|
|
13
|
+
winston.info("(webhook) x-auth-token: " + req.headers['x-auth-token']);
|
|
14
|
+
winston.info("(webhook) KB_WEBHOOK_TOKEN: " + KB_WEBHOOK_TOKEN);
|
|
15
|
+
|
|
16
|
+
if (!req.headers['x-auth-token']) {
|
|
17
|
+
winston.error("Unauthorized: A x-auth-token must be provided")
|
|
18
|
+
return res.status(401).send({ success: false, error: "Unauthorized", message: "A x-auth-token must be provided" })
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (req.headers['x-auth-token'] != KB_WEBHOOK_TOKEN) {
|
|
22
|
+
winston.error("Unauthorized: You don't have the authorization to accomplish this operation")
|
|
23
|
+
return res.status(401).send({ success: false, error: "Unauthorized", message: "You don't have the authorization to accomplish this operation" });
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
let body = req.body;
|
|
27
|
+
winston.verbose('/webhook kb status body: ', body);
|
|
28
|
+
|
|
29
|
+
let kb_id = body.id;
|
|
30
|
+
winston.verbose('/webhook kb status body: ' + kb_id);
|
|
31
|
+
|
|
32
|
+
let update = {};
|
|
33
|
+
|
|
34
|
+
if (body.status) {
|
|
35
|
+
update.status = body.status;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
KB.findByIdAndUpdate(kb_id, update, { new: true }, (err, kb) => {
|
|
39
|
+
if (err) {
|
|
40
|
+
winston.error(err);
|
|
41
|
+
return res.status(500).send({ success: false, error: err });
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
if (!kb) {
|
|
45
|
+
winston.info("Knwoledge Base content to be updated not found")
|
|
46
|
+
return res.status(404).send({ success: false, messages: "Knwoledge Base content not found with id " + kb_id });
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
winston.info("kb updated succesfully: ", kb);
|
|
50
|
+
res.status(200).send(kb);
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
module.exports = router;
|
package/services/emailService.js
CHANGED
|
@@ -137,6 +137,11 @@ class EmailService {
|
|
|
137
137
|
}
|
|
138
138
|
winston.info('EmailService ccEnabled: ' + this.ccEnabled);
|
|
139
139
|
|
|
140
|
+
this.brand_name = "Tiledesk"
|
|
141
|
+
if (process.env.BRAND_NAME) {
|
|
142
|
+
this.brand_name = process.env.BRAND_NAME;
|
|
143
|
+
}
|
|
144
|
+
|
|
140
145
|
}
|
|
141
146
|
|
|
142
147
|
readTemplate(templateName, settings, environmentVariableKey) {
|
|
@@ -351,7 +356,7 @@ class EmailService {
|
|
|
351
356
|
|
|
352
357
|
var html = template(replacements);
|
|
353
358
|
|
|
354
|
-
return that.send({ to: to, subject:
|
|
359
|
+
return that.send({ to: to, subject: `${this.brand_name} test email`, config: configEmail, html: html, callback: callback });
|
|
355
360
|
|
|
356
361
|
}
|
|
357
362
|
|
|
@@ -465,10 +470,10 @@ class EmailService {
|
|
|
465
470
|
// cambiare in [Nicky:Dashboard Support] Assigned Chat
|
|
466
471
|
// serve per aggiornare native... fai aggiornamento
|
|
467
472
|
|
|
468
|
-
let subjectDef = `[
|
|
473
|
+
let subjectDef = `[${this.brand_name} ${project ? project.name : '-'}] New Assigned Chat`;
|
|
469
474
|
|
|
470
475
|
if (request.subject) {
|
|
471
|
-
subjectDef = `[
|
|
476
|
+
subjectDef = `[${this.brand_name} ${project ? project.name : '-'}] ${request.subject}`;
|
|
472
477
|
}
|
|
473
478
|
|
|
474
479
|
let subject = that.formatText("assignedRequestSubject", subjectDef, request, project.settings);
|
|
@@ -607,13 +612,13 @@ class EmailService {
|
|
|
607
612
|
}
|
|
608
613
|
|
|
609
614
|
|
|
610
|
-
let subjectDef = `[
|
|
615
|
+
let subjectDef = `[${this.brand_name} ${project ? project.name : '-'}] New message`;
|
|
611
616
|
|
|
612
617
|
if (request.subject) {
|
|
613
|
-
subjectDef = `[
|
|
618
|
+
subjectDef = `[${this.brand_name} ${project ? project.name : '-'}] ${request.subject}`;
|
|
614
619
|
}
|
|
615
620
|
if (request.ticket_id) {
|
|
616
|
-
subjectDef = `[
|
|
621
|
+
subjectDef = `[${this.brand_name} #${request.ticket_id}] New message`;
|
|
617
622
|
}
|
|
618
623
|
|
|
619
624
|
if (request.ticket_id && request.subject) {
|
|
@@ -746,10 +751,10 @@ class EmailService {
|
|
|
746
751
|
}
|
|
747
752
|
}
|
|
748
753
|
|
|
749
|
-
let subjectDef = `[
|
|
754
|
+
let subjectDef = `[${this.brand_name} ${project ? project.name : '-'}] New Pooled Chat`;
|
|
750
755
|
|
|
751
756
|
if (request.subject) {
|
|
752
|
-
subjectDef = `[
|
|
757
|
+
subjectDef = `[${this.brand_name} ${project ? project.name : '-'}] ${request.subject}`;
|
|
753
758
|
}
|
|
754
759
|
|
|
755
760
|
let subject = that.formatText("pooledRequestSubject", subjectDef, request, project.settings);
|
|
@@ -882,10 +887,10 @@ class EmailService {
|
|
|
882
887
|
}
|
|
883
888
|
|
|
884
889
|
|
|
885
|
-
let subjectDef = `[
|
|
890
|
+
let subjectDef = `[${this.brand_name} ${project ? project.name : '-'}] New Message`;
|
|
886
891
|
|
|
887
892
|
if (request.subject) {
|
|
888
|
-
subjectDef = `[
|
|
893
|
+
subjectDef = `[${this.brand_name} ${project ? project.name : '-'}] ${request.subject}`;
|
|
889
894
|
}
|
|
890
895
|
if (request.ticket_id) {
|
|
891
896
|
subjectDef = `[Ticket #${request.ticket_id}] New Message`;
|
|
@@ -1019,7 +1024,7 @@ class EmailService {
|
|
|
1019
1024
|
}
|
|
1020
1025
|
|
|
1021
1026
|
|
|
1022
|
-
let subject = that.formatText("newMessageSubject", `[
|
|
1027
|
+
let subject = that.formatText("newMessageSubject", `[${this.brand_name} ${project ? project.name : '-'}] New Offline Message`, message, project.settings);
|
|
1023
1028
|
|
|
1024
1029
|
that.send({
|
|
1025
1030
|
messageId: messageId,
|
|
@@ -1044,7 +1049,7 @@ class EmailService {
|
|
|
1044
1049
|
replyTo: replyTo,
|
|
1045
1050
|
inReplyTo: inReplyTo,
|
|
1046
1051
|
references: references,
|
|
1047
|
-
subject: `[
|
|
1052
|
+
subject: `[${this.brand_name} ${project ? project.name : '-'}] New Offline Message - notification`,
|
|
1048
1053
|
html: html,
|
|
1049
1054
|
headers: headers
|
|
1050
1055
|
});
|
|
@@ -1552,8 +1557,8 @@ class EmailService {
|
|
|
1552
1557
|
var html = template(replacements);
|
|
1553
1558
|
|
|
1554
1559
|
|
|
1555
|
-
that.send({ to: to, subject:
|
|
1556
|
-
that.send({ to: that.bcc, subject:
|
|
1560
|
+
that.send({ to: to, subject: `[${this.brand_name}] Password reset request`, html: html });
|
|
1561
|
+
that.send({ to: that.bcc, subject: `[${this.brand_name}] Password reset request - notification`, html: html });
|
|
1557
1562
|
|
|
1558
1563
|
}
|
|
1559
1564
|
|
|
@@ -1582,8 +1587,8 @@ class EmailService {
|
|
|
1582
1587
|
var html = template(replacements);
|
|
1583
1588
|
|
|
1584
1589
|
|
|
1585
|
-
that.send({ to: to, subject:
|
|
1586
|
-
that.send({ to: that.bcc, subject:
|
|
1590
|
+
that.send({ to: to, subject: `[${this.brand_name}] Your password has been changed`, html: html });
|
|
1591
|
+
that.send({ to: that.bcc, subject: `[${this.brand_name}] Your password has been changed - notification`, html: html });
|
|
1587
1592
|
|
|
1588
1593
|
}
|
|
1589
1594
|
|
|
@@ -1622,8 +1627,8 @@ class EmailService {
|
|
|
1622
1627
|
var html = template(replacements);
|
|
1623
1628
|
|
|
1624
1629
|
|
|
1625
|
-
that.send({ to: to, subject: `[
|
|
1626
|
-
that.send({ to: that.bcc, subject: `[
|
|
1630
|
+
that.send({ to: to, subject: `[${this.brand_name}] You have been invited to the '${projectName}' project`, html: html });
|
|
1631
|
+
that.send({ to: that.bcc, subject: `[${this.brand_name}] You have been invited to the '${projectName}' project - notification`, html: html });
|
|
1627
1632
|
}
|
|
1628
1633
|
|
|
1629
1634
|
// ok
|
|
@@ -1659,8 +1664,8 @@ class EmailService {
|
|
|
1659
1664
|
|
|
1660
1665
|
var html = template(replacements);
|
|
1661
1666
|
|
|
1662
|
-
that.send({ to: to, subject: `[
|
|
1663
|
-
that.send({ to: that.bcc, subject: `[
|
|
1667
|
+
that.send({ to: to, subject: `[${this.brand_name}] You have been invited to the '${projectName}' project`, html: html });
|
|
1668
|
+
that.send({ to: that.bcc, subject: `[${this.brand_name}] You have been invited to the '${projectName}' project - notification`, html: html });
|
|
1664
1669
|
|
|
1665
1670
|
}
|
|
1666
1671
|
|
|
@@ -1691,8 +1696,8 @@ class EmailService {
|
|
|
1691
1696
|
var html = template(replacements);
|
|
1692
1697
|
|
|
1693
1698
|
|
|
1694
|
-
that.send({ to: to, subject: `[
|
|
1695
|
-
that.send({ to: that.bcc, subject: `[
|
|
1699
|
+
that.send({ to: to, subject: `[${this.brand_name}] Verify your email address`, html: html });
|
|
1700
|
+
that.send({ to: that.bcc, subject: `[${this.brand_name}] Verify your email address ` + to + " - notification", html: html });
|
|
1696
1701
|
|
|
1697
1702
|
}
|
|
1698
1703
|
|
|
@@ -1765,7 +1770,7 @@ class EmailService {
|
|
|
1765
1770
|
|
|
1766
1771
|
//custom ocf here
|
|
1767
1772
|
// console.log("ocf",project._id);
|
|
1768
|
-
let subject = that.formatText("sendTranscriptSubject",
|
|
1773
|
+
let subject = that.formatText("sendTranscriptSubject", `[${this.brand_name}] Transcript`, request, project.settings);
|
|
1769
1774
|
|
|
1770
1775
|
//prod //pre
|
|
1771
1776
|
// if (project._id =="6406e34727b57500120b1bd6" || project._id == "642c609f179910002cc56b3e") {
|
|
@@ -1779,7 +1784,7 @@ class EmailService {
|
|
|
1779
1784
|
// hcustomization.emailTranscript(to, subject, html, configEmail)
|
|
1780
1785
|
|
|
1781
1786
|
that.send({ from: from, to: to, subject: subject, html: html, config: configEmail });
|
|
1782
|
-
that.send({ to: that.bcc, subject:
|
|
1787
|
+
that.send({ to: that.bcc, subject: `[${this.brand_name}] Transcript - notification`, html: html });
|
|
1783
1788
|
|
|
1784
1789
|
}
|
|
1785
1790
|
|
|
@@ -1807,7 +1812,7 @@ class EmailService {
|
|
|
1807
1812
|
|
|
1808
1813
|
html = template(replacements);
|
|
1809
1814
|
|
|
1810
|
-
that.send({ to: to, subject:
|
|
1815
|
+
that.send({ to: to, subject: `Join ${this.brand_name} from Desktop`, html: html });
|
|
1811
1816
|
|
|
1812
1817
|
}
|
|
1813
1818
|
|
package/test/kbRoute.js
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
//During the test the env variable is set to test
|
|
2
2
|
process.env.NODE_ENV = 'test';
|
|
3
3
|
process.env.GPTKEY = "fakegptkey";
|
|
4
|
+
process.env.KB_WEBHOOK_TOKEN = "testtoken"
|
|
4
5
|
|
|
5
6
|
var userService = require('../services/userService');
|
|
6
7
|
var projectService = require('../services/projectService');
|
|
7
8
|
|
|
8
9
|
let log = false;
|
|
9
10
|
|
|
11
|
+
var config = require('../config/global');
|
|
12
|
+
|
|
10
13
|
//Require the dev-dependencies
|
|
11
14
|
let chai = require('chai');
|
|
12
15
|
let chaiHttp = require('chai-http');
|
|
@@ -14,12 +17,15 @@ let server = require('../app');
|
|
|
14
17
|
let should = chai.should();
|
|
15
18
|
var fs = require('fs');
|
|
16
19
|
const path = require('path');
|
|
20
|
+
const mongoose = require('mongoose');
|
|
17
21
|
|
|
18
22
|
// chai.config.includeStack = true;
|
|
19
23
|
|
|
20
24
|
var expect = chai.expect;
|
|
21
25
|
var assert = chai.assert;
|
|
22
26
|
|
|
27
|
+
mongoose.connect(config.databasetest);
|
|
28
|
+
|
|
23
29
|
chai.use(chaiHttp);
|
|
24
30
|
|
|
25
31
|
describe('KbRoute', () => {
|
|
@@ -199,7 +205,7 @@ describe('KbRoute', () => {
|
|
|
199
205
|
if (log) { console.log("create kb res.body: ", res.body); }
|
|
200
206
|
res.should.have.status(200);
|
|
201
207
|
|
|
202
|
-
let query = "?status=-1&limit=5&page=0&direction=-1&sortField=updatedAt&search=example";
|
|
208
|
+
let query = "?status=-1&type=url&limit=5&page=0&direction=-1&sortField=updatedAt&search=example";
|
|
203
209
|
//let query = "";
|
|
204
210
|
console.log("query: ", query);
|
|
205
211
|
|
|
@@ -208,11 +214,12 @@ describe('KbRoute', () => {
|
|
|
208
214
|
.auth(email, pwd)
|
|
209
215
|
.end((err, res) => {
|
|
210
216
|
if (log) { console.log("getall res.body: ", res.body); }
|
|
217
|
+
console.log("getall res.body: ", res.body);
|
|
211
218
|
res.should.have.status(200);
|
|
212
219
|
res.body.should.be.a('object');
|
|
213
220
|
res.body.kbs.should.be.a('array');
|
|
214
|
-
expect(res.body.kbs.length).to.equal(
|
|
215
|
-
expect(res.body.count).to.equal(
|
|
221
|
+
expect(res.body.kbs.length).to.equal(2);
|
|
222
|
+
expect(res.body.count).to.equal(2);
|
|
216
223
|
res.body.query.should.be.a('object');
|
|
217
224
|
expect(res.body.query.status).to.equal(-1);
|
|
218
225
|
expect(res.body.query.limit).to.equal(5);
|
|
@@ -389,7 +396,7 @@ describe('KbRoute', () => {
|
|
|
389
396
|
|
|
390
397
|
}).timeout(10000)
|
|
391
398
|
|
|
392
|
-
it('
|
|
399
|
+
it('multiaddFail', (done) => {
|
|
393
400
|
|
|
394
401
|
var email = "test-signup-" + Date.now() + "@email.com";
|
|
395
402
|
var pwd = "pwd";
|
|
@@ -514,10 +521,6 @@ describe('KbRoute', () => {
|
|
|
514
521
|
if (err) { console.log("error: ", err) };
|
|
515
522
|
if (log) { console.log("res.body: ", res.body) }
|
|
516
523
|
|
|
517
|
-
console.log("error: ", err)
|
|
518
|
-
console.log("res.body: ", res.body)
|
|
519
|
-
|
|
520
|
-
console.log("sites length: ", res.body.sites.length)
|
|
521
524
|
res.should.have.status(200);
|
|
522
525
|
res.body.should.be.a('object');
|
|
523
526
|
res.body.sites.should.be.a('array');
|
|
@@ -531,6 +534,59 @@ describe('KbRoute', () => {
|
|
|
531
534
|
|
|
532
535
|
}).timeout(10000)
|
|
533
536
|
|
|
537
|
+
it('webhook', (done) => {
|
|
538
|
+
|
|
539
|
+
var email = "test-signup-" + Date.now() + "@email.com";
|
|
540
|
+
var pwd = "pwd";
|
|
541
|
+
|
|
542
|
+
userService.signup(email, pwd, "Test Firstname", "Test lastname").then(function (savedUser) {
|
|
543
|
+
projectService.create("test-kb-webhook", savedUser._id).then(function (savedProject) {
|
|
544
|
+
|
|
545
|
+
let kb = {
|
|
546
|
+
name: "example_name6",
|
|
547
|
+
type: "url",
|
|
548
|
+
source: "https://www.exampleurl6.com",
|
|
549
|
+
content: "",
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
chai.request(server)
|
|
553
|
+
.post('/' + savedProject._id + '/kb/')
|
|
554
|
+
.auth(email, pwd)
|
|
555
|
+
.send(kb)
|
|
556
|
+
.end((err, res) => {
|
|
557
|
+
|
|
558
|
+
if (err) { console.log("error: ", err) };
|
|
559
|
+
if (log) { console.log("res.body: ", res.body) };
|
|
560
|
+
|
|
561
|
+
res.should.have.status(200);
|
|
562
|
+
res.body.should.be.a('object');
|
|
563
|
+
|
|
564
|
+
let kb_id = res.body.value._id;
|
|
565
|
+
|
|
566
|
+
chai.request(server)
|
|
567
|
+
.post('/webhook/kb/status')
|
|
568
|
+
.set("x-auth-token", "testtoken")
|
|
569
|
+
.send({ id: kb_id, status: 300 })
|
|
570
|
+
.end((err, res) => {
|
|
571
|
+
|
|
572
|
+
if (err) { console.error("err: ", err) };
|
|
573
|
+
if (log) { console.log("res.body: ", res.body) };
|
|
574
|
+
|
|
575
|
+
res.should.have.status(200);
|
|
576
|
+
res.body.should.be.a('object');
|
|
577
|
+
expect(res.body.status).to.equal(300);
|
|
578
|
+
|
|
579
|
+
done();
|
|
580
|
+
|
|
581
|
+
})
|
|
582
|
+
|
|
583
|
+
|
|
584
|
+
})
|
|
585
|
+
|
|
586
|
+
});
|
|
587
|
+
});
|
|
588
|
+
}).timeout(10000)
|
|
589
|
+
|
|
534
590
|
})
|
|
535
591
|
});
|
|
536
592
|
|