@tiledesk/tiledesk-server 2.9.26 → 2.9.27
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 +6 -0
- package/package.json +2 -2
- package/pubmodules/pubModulesManager.js +41 -41
- package/routes/faq_kb.js +1 -1
- package/routes/kb.js +2 -1
- package/routes/message.js +55 -50
- package/routes/request.js +581 -47
- package/routes/users.js +4 -7
- package/services/QuoteManager.js +104 -16
- package/services/emailService.js +11 -2
- package/services/operatingHoursService.js +1 -0
- package/services/projectService.js +21 -0
- package/services/requestService.js +344 -9
- package/template/email/redirectToDesktopEmail.html +2 -2
- package/test/mock/projectMock.js +29 -1
- package/test/projectRoute.js +86 -3
- package/test/quoteManager.js +77 -5
- package/test/requestRoute.js +42 -0
- package/websocket/webSocketServer.js +21 -0
package/routes/users.js
CHANGED
|
@@ -193,17 +193,14 @@ router.post('/loginemail', function (req, res) {
|
|
|
193
193
|
|
|
194
194
|
let project_id = req.body.id_project;
|
|
195
195
|
let chatbot_id = req.body.bot_id;
|
|
196
|
+
let namespace_id = req.body.namespace_id;
|
|
196
197
|
|
|
197
198
|
if (!project_id) {
|
|
198
199
|
res.status(500).send({ success: false, error: "missing 'id_project' field" });
|
|
199
200
|
}
|
|
200
201
|
|
|
201
|
-
if (!chatbot_id) {
|
|
202
|
-
res.status(500).send({ success: false, error: "missing 'bot_id' field" });
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
if (!chatbot_id) {
|
|
206
|
-
res.status(500).send({ success: false, error: "missing 'bot_id' field" });
|
|
202
|
+
if (!chatbot_id && !namespace_id) {
|
|
203
|
+
res.status(500).send({ success: false, error: "missing 'bot_id' or 'namespace_id' field" });
|
|
207
204
|
}
|
|
208
205
|
|
|
209
206
|
User.findById(user_id, (err, user) => {
|
|
@@ -212,7 +209,7 @@ router.post('/loginemail', function (req, res) {
|
|
|
212
209
|
}
|
|
213
210
|
winston.debug("user found: ", user);
|
|
214
211
|
|
|
215
|
-
emailService.sendEmailRedirectOnDesktop(user.email, token, project_id, chatbot_id)
|
|
212
|
+
emailService.sendEmailRedirectOnDesktop(user.email, token, project_id, chatbot_id, namespace_id)
|
|
216
213
|
return res.status(200).send({ success: true, message: "Sending email..."})
|
|
217
214
|
})
|
|
218
215
|
|
package/services/QuoteManager.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
const { ceil, floor } = require('lodash');
|
|
2
|
+
const moment = require('moment');
|
|
2
3
|
let winston = require('../config/winston');
|
|
3
4
|
const requestEvent = require('../event/requestEvent');
|
|
4
5
|
const messageEvent = require('../event/messageEvent');
|
|
@@ -99,40 +100,82 @@ class QuoteManager {
|
|
|
99
100
|
|
|
100
101
|
async generateKey(object, type) {
|
|
101
102
|
|
|
102
|
-
|
|
103
|
-
winston.debug("generateKey type " + type)
|
|
103
|
+
let objectDate = moment(object.createdAt);
|
|
104
104
|
let subscriptionDate;
|
|
105
105
|
|
|
106
106
|
if (this.project.isActiveSubscription === true) {
|
|
107
107
|
if (this.project.profile.subStart) {
|
|
108
|
-
subscriptionDate = this.project.profile.subStart;
|
|
108
|
+
subscriptionDate = moment(this.project.profile.subStart);
|
|
109
|
+
winston.debug("Subscription date from subStart: " + subscriptionDate.toISOString());
|
|
109
110
|
} else {
|
|
110
111
|
// it should never happen
|
|
111
112
|
winston.error("Error: quote manager - isActiveSubscription is true but subStart does not exists.")
|
|
112
113
|
}
|
|
113
114
|
} else {
|
|
114
115
|
if (this.project.profile.subEnd) {
|
|
115
|
-
subscriptionDate = this.project.profile.subEnd;
|
|
116
|
+
subscriptionDate = moment(this.project.profile.subEnd);
|
|
117
|
+
winston.debug("Subscription date from subEnd: " + subscriptionDate.toISOString());
|
|
116
118
|
} else {
|
|
117
|
-
subscriptionDate = this.project.createdAt;
|
|
119
|
+
subscriptionDate = moment(this.project.createdAt);
|
|
120
|
+
winston.debug("Subscription date from project createdAt: " + subscriptionDate.toISOString());
|
|
118
121
|
}
|
|
119
122
|
}
|
|
120
123
|
|
|
121
|
-
|
|
122
|
-
|
|
124
|
+
// Calculate the difference in months between the object date and the subscription date
|
|
125
|
+
let diffInMonths = objectDate.diff(subscriptionDate, 'months');
|
|
126
|
+
winston.debug("diffInMonths: ", diffInMonths)
|
|
127
|
+
|
|
128
|
+
// Make a clone of the subscription date --> this operation could be avoided
|
|
129
|
+
// Get the renewal date adding diffInMonths. Moment.js manage automatically the less longer month.
|
|
130
|
+
// E.g. if subscription date is 31 jan the renewals will be, 28/29 feb, 31 mar, 30 apr, etc.
|
|
131
|
+
let renewalDate = subscriptionDate.clone().add(diffInMonths, 'months');
|
|
132
|
+
// Force the renewal date equal to the last day of the month --> this operation could be avoided
|
|
133
|
+
if (renewalDate.date() !== subscriptionDate.date()) {
|
|
134
|
+
renewalDate = renewalDate.endOf('month');
|
|
135
|
+
}
|
|
136
|
+
winston.debug("renewalDate: ", renewalDate)
|
|
123
137
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
138
|
+
return "quotes:" + type + ":" + this.project._id + ":" + renewalDate.format('M/D/YYYY');
|
|
139
|
+
// return "quotes:" + type + ":" + this.project._id + ":" + renewalDate.format('MM/DD/YYYY');
|
|
140
|
+
// return "quotes:" + type + ":" + this.project._id + ":" + renewalDate.toLocaleString();
|
|
141
|
+
}
|
|
127
142
|
|
|
128
|
-
|
|
129
|
-
let nmonths = floor(ndays / 30); // number of month to add to the initial subscription date;
|
|
143
|
+
// async _generateKey(object, type) {
|
|
130
144
|
|
|
131
|
-
|
|
132
|
-
|
|
145
|
+
// winston.debug("generateKey object ", object)
|
|
146
|
+
// winston.debug("generateKey type " + type)
|
|
147
|
+
// let subscriptionDate;
|
|
133
148
|
|
|
134
|
-
|
|
135
|
-
|
|
149
|
+
// if (this.project.isActiveSubscription === true) {
|
|
150
|
+
// if (this.project.profile.subStart) {
|
|
151
|
+
// subscriptionDate = this.project.profile.subStart;
|
|
152
|
+
// } else {
|
|
153
|
+
// // it should never happen
|
|
154
|
+
// winston.error("Error: quote manager - isActiveSubscription is true but subStart does not exists.")
|
|
155
|
+
// }
|
|
156
|
+
// } else {
|
|
157
|
+
// if (this.project.profile.subEnd) {
|
|
158
|
+
// subscriptionDate = this.project.profile.subEnd;
|
|
159
|
+
// } else {
|
|
160
|
+
// subscriptionDate = this.project.createdAt;
|
|
161
|
+
// }
|
|
162
|
+
// }
|
|
163
|
+
|
|
164
|
+
// let objectDate = object.createdAt;
|
|
165
|
+
// winston.debug("objectDate " + objectDate);
|
|
166
|
+
|
|
167
|
+
// // converts date in timestamps and transform from ms to s
|
|
168
|
+
// const objectDateTimestamp = ceil(objectDate.getTime() / 1000);
|
|
169
|
+
// const subscriptionDateTimestamp = ceil(subscriptionDate.getTime() / 1000);
|
|
170
|
+
|
|
171
|
+
// let ndays = (objectDateTimestamp - subscriptionDateTimestamp) / 86400; // 86400 is the number of seconds in 1 day
|
|
172
|
+
// let nmonths = floor(ndays / 30); // number of month to add to the initial subscription date;
|
|
173
|
+
|
|
174
|
+
// let date = new Date(subscriptionDate);
|
|
175
|
+
// date.setMonth(date.getMonth() + nmonths);
|
|
176
|
+
|
|
177
|
+
// return "quotes:" + type + ":" + this.project._id + ":" + date.toLocaleDateString();
|
|
178
|
+
// }
|
|
136
179
|
|
|
137
180
|
/**
|
|
138
181
|
* Get current quote for a single type (tokens or request or ...)
|
|
@@ -373,6 +416,51 @@ class QuoteManager {
|
|
|
373
416
|
}
|
|
374
417
|
}
|
|
375
418
|
|
|
419
|
+
async getCurrentSlot(project) {
|
|
420
|
+
let subscriptionDate;
|
|
421
|
+
if (project.isActiveSubscription === true) {
|
|
422
|
+
if (project.profile.subStart) {
|
|
423
|
+
subscriptionDate = moment(project.profile.subStart);
|
|
424
|
+
winston.debug("Subscription date from subStart: " + subscriptionDate.toISOString());
|
|
425
|
+
} else {
|
|
426
|
+
// it should never happen
|
|
427
|
+
winston.error("Error: quote manager - isActiveSubscription is true but subStart does not exists.")
|
|
428
|
+
}
|
|
429
|
+
} else {
|
|
430
|
+
if (project.profile.subEnd) {
|
|
431
|
+
subscriptionDate = moment(project.profile.subEnd);
|
|
432
|
+
winston.debug("Subscription date from subEnd: " + subscriptionDate.toISOString());
|
|
433
|
+
} else {
|
|
434
|
+
subscriptionDate = moment(project.createdAt);
|
|
435
|
+
winston.debug("Subscription date from project createdAt: " + subscriptionDate.toISOString());
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
let now = moment();
|
|
440
|
+
winston.debug("now: ", now);
|
|
441
|
+
|
|
442
|
+
let diffInMonths = now.diff(subscriptionDate, 'months');
|
|
443
|
+
winston.debug("diffInMonths: ", diffInMonths)
|
|
444
|
+
|
|
445
|
+
let renewalDate = subscriptionDate.clone().add(diffInMonths, 'months').startOf('day');
|
|
446
|
+
winston.debug("renewalDate: ", renewalDate)
|
|
447
|
+
|
|
448
|
+
let slotEnd = subscriptionDate.clone().add(diffInMonths + 1, 'month');
|
|
449
|
+
slotEnd.subtract(1, 'day').endOf('day')
|
|
450
|
+
winston.debug("slotEnd: ", slotEnd)
|
|
451
|
+
|
|
452
|
+
// let slot = {
|
|
453
|
+
// startDate: renewalDate.format('DD/MM/YYYY'),
|
|
454
|
+
// endDate: slotEnd.format('DD/MM/YYYY')
|
|
455
|
+
// }
|
|
456
|
+
let slot = {
|
|
457
|
+
startDate: renewalDate,
|
|
458
|
+
endDate: slotEnd
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
return slot;
|
|
462
|
+
}
|
|
463
|
+
|
|
376
464
|
|
|
377
465
|
|
|
378
466
|
start() {
|
package/services/emailService.js
CHANGED
|
@@ -324,7 +324,8 @@ class EmailService {
|
|
|
324
324
|
winston.debug(' mail.config', mail.config);
|
|
325
325
|
|
|
326
326
|
if (!mail.to) {
|
|
327
|
-
return winston.warn("EmailService send method. to field is not defined", mailOptions);
|
|
327
|
+
// return winston.warn("EmailService send method. to field is not defined", mailOptions);
|
|
328
|
+
return winston.warn("EmailService send method. to field is not defined");
|
|
328
329
|
}
|
|
329
330
|
|
|
330
331
|
// send mail with defined transport object
|
|
@@ -1802,7 +1803,7 @@ class EmailService {
|
|
|
1802
1803
|
|
|
1803
1804
|
}
|
|
1804
1805
|
|
|
1805
|
-
async sendEmailRedirectOnDesktop(to, token, project_id, chatbot_id) {
|
|
1806
|
+
async sendEmailRedirectOnDesktop(to, token, project_id, chatbot_id, namespace_id) {
|
|
1806
1807
|
winston.debug("sendEmailRedirectOnDesktop: " + to);
|
|
1807
1808
|
|
|
1808
1809
|
var that = this;
|
|
@@ -1817,8 +1818,16 @@ class EmailService {
|
|
|
1817
1818
|
let baseScope = JSON.parse(JSON.stringify(that));
|
|
1818
1819
|
delete baseScope.pass;
|
|
1819
1820
|
|
|
1821
|
+
let redirect_url;
|
|
1822
|
+
if (chatbot_id) {
|
|
1823
|
+
redirect_url = `https://panel.tiledesk.com/v3/cds/#/project/${project_id}/chatbot/${chatbot_id}/intent/0?jwt=${token}`;
|
|
1824
|
+
} else {
|
|
1825
|
+
redirect_url = `${baseScope.baseUrl}/#/project/${project_id}/knowledge-bases/${namespace_id}?token=${token}`;
|
|
1826
|
+
}
|
|
1827
|
+
|
|
1820
1828
|
let replacements = {
|
|
1821
1829
|
baseScope: baseScope,
|
|
1830
|
+
redirect_url: redirect_url,
|
|
1822
1831
|
token: token,
|
|
1823
1832
|
project_id: project_id,
|
|
1824
1833
|
chatbot_id: chatbot_id
|
|
@@ -355,6 +355,7 @@ function checkDay(operatingHoursPars, dayNowAtPrjctTz) {
|
|
|
355
355
|
}
|
|
356
356
|
|
|
357
357
|
function checkTimes(operatingHoursPars, dayNowAtPrjctTz, timeNowAtPrjctTz) {
|
|
358
|
+
|
|
358
359
|
for (var operatingHoursweekDay in operatingHoursPars) {
|
|
359
360
|
if (operatingHoursweekDay != 'tzname') {
|
|
360
361
|
if (dayNowAtPrjctTz == operatingHoursweekDay) {
|
|
@@ -6,6 +6,8 @@ var mongoose = require('mongoose');
|
|
|
6
6
|
var departmentService = require('../services/departmentService');
|
|
7
7
|
var projectEvent = require("../event/projectEvent");
|
|
8
8
|
var winston = require('../config/winston');
|
|
9
|
+
const cacheEnabler = require("./cacheEnabler");
|
|
10
|
+
const cacheUtil = require("../utils/cacheUtil");
|
|
9
11
|
|
|
10
12
|
class ProjectService {
|
|
11
13
|
|
|
@@ -71,6 +73,25 @@ class ProjectService {
|
|
|
71
73
|
});
|
|
72
74
|
}
|
|
73
75
|
|
|
76
|
+
async getCachedProject(id_project) {
|
|
77
|
+
return new Promise((resolve, reject) => {
|
|
78
|
+
let q = Project.findOne({ _id: id_project, status: 100 });
|
|
79
|
+
if (cacheEnabler.project) {
|
|
80
|
+
q.cache(cacheUtil.longTTL, "projects:id:" + id_project) //project_cache
|
|
81
|
+
winston.debug('project cache enabled for /project detail');
|
|
82
|
+
}
|
|
83
|
+
q.exec( async (err, p) => {
|
|
84
|
+
if (err) {
|
|
85
|
+
reject(err);
|
|
86
|
+
}
|
|
87
|
+
if (!p) {
|
|
88
|
+
reject('Project not found')
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
resolve(p);
|
|
92
|
+
})
|
|
93
|
+
})
|
|
94
|
+
}
|
|
74
95
|
|
|
75
96
|
|
|
76
97
|
}
|