@tiledesk/tiledesk-server 2.9.26 → 2.9.27
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
}
|