@tiledesk/tiledesk-server 2.4.100 → 2.4.101
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 +4 -0
- package/app.js +45 -9
- package/event/emailEvent.js +13 -0
- package/event/integrationEvent.js +13 -0
- package/models/integrations.js +23 -0
- package/package.json +1 -1
- package/pubmodules/cache/mongoose-cachegoose-fn.js +12 -0
- package/pubmodules/emailNotification/requestNotification.js +1 -0
- package/routes/auth.js +14 -5
- package/routes/email.js +4 -2
- package/routes/faq.js +1 -0
- package/routes/integration.js +199 -0
- package/routes/kbsettings.js +8 -76
- package/routes/openai.js +52 -14
- package/routes/project.js +3 -4
- package/routes/quotes.js +52 -0
- package/routes/request.js +515 -499
- package/routes/users.js +5 -1
- package/services/QuoteManager.js +317 -0
- package/services/cacheEnabler.js +5 -0
- package/services/emailService.js +610 -586
- package/services/messageService.js +283 -202
- package/services/openaiService.js +12 -12
- package/services/requestService.js +1764 -1421
- package/services/trainingService.js +6 -2
- package/test/messageService.js +154 -92
- package/test/mock/MockTdCache.js +46 -0
- package/test/mock/emailMock.js +9 -0
- package/test/mock/messageMock.js +46 -0
- package/test/mock/projectMock.js +171 -0
- package/test/mock/requestMock.js +127 -0
- package/test/quoteManager.js +282 -0
- package/test/requestRoute.js +1 -1
- package/test/requestService.js +1196 -1079
- package/utils/TdCache.js +253 -0
@@ -0,0 +1,127 @@
|
|
1
|
+
const requestMock = {
|
2
|
+
"_id": "652e46f283a36264e8e8b331",
|
3
|
+
"status": 200,
|
4
|
+
"preflight": false,
|
5
|
+
"hasBot": false,
|
6
|
+
"participants": [
|
7
|
+
"652e46f183a36264e8e8b256"
|
8
|
+
],
|
9
|
+
"priority": "medium",
|
10
|
+
"followers": [],
|
11
|
+
"participantsAgents": [
|
12
|
+
"652e46f183a36264e8e8b256"
|
13
|
+
],
|
14
|
+
"participantsBots": [],
|
15
|
+
"request_id": "support-group-652e46f183a36264e8e8b27b-16c334bd0d214579a4c98f2f0e7794ad",
|
16
|
+
"requester": "652e46f183a36264e8e8b299",
|
17
|
+
"lead": "652e46f283a36264e8e8b323",
|
18
|
+
"first_text": "first_text",
|
19
|
+
"department": "652e46f183a36264e8e8b2a7",
|
20
|
+
"assigned_at": new Date('2023-10-17T08:45:54.058Z'),
|
21
|
+
"id_project": "652e46f183a36264e8e8b27b",
|
22
|
+
"createdBy": "652e46f183a36264e8e8b256",
|
23
|
+
"channel": {
|
24
|
+
"name": "chat21"
|
25
|
+
},
|
26
|
+
"createdAt": new Date('2023-10-19T08:45:54.058Z')
|
27
|
+
}
|
28
|
+
|
29
|
+
// const requestMock = {
|
30
|
+
// "_id": "652e46f283a36264e8e8b331",
|
31
|
+
// "status": 200,
|
32
|
+
// "preflight": false,
|
33
|
+
// "hasBot": false,
|
34
|
+
// "participants": [
|
35
|
+
// "652e46f183a36264e8e8b256"
|
36
|
+
// ],
|
37
|
+
// "priority": "medium",
|
38
|
+
// "followers": [],
|
39
|
+
// "participantsAgents": [
|
40
|
+
// "652e46f183a36264e8e8b256"
|
41
|
+
// ],
|
42
|
+
// "participantsBots": [],
|
43
|
+
// "request_id": "support-group-652e46f183a36264e8e8b27b-16c334bd0d214579a4c98f2f0e7794ad",
|
44
|
+
// "requester": "652e46f183a36264e8e8b299",
|
45
|
+
// "lead": "652e46f283a36264e8e8b323",
|
46
|
+
// "first_text": "first_text",
|
47
|
+
// "department": "652e46f183a36264e8e8b2a7",
|
48
|
+
// "assigned_at": new Date('2023-10-17T08:45:54.058Z'),
|
49
|
+
// "id_project": "652e46f183a36264e8e8b27b",
|
50
|
+
// "createdBy": "652e46f183a36264e8e8b256",
|
51
|
+
// "channel": {
|
52
|
+
// "name": "chat21"
|
53
|
+
// },
|
54
|
+
// "snapshot": {
|
55
|
+
// "department": {
|
56
|
+
// "routing": "assigned",
|
57
|
+
// "default": true,
|
58
|
+
// "status": 1,
|
59
|
+
// "_id": "652e46f183a36264e8e8b2a7",
|
60
|
+
// "name": "Default Department",
|
61
|
+
// "id_project": "652e46f183a36264e8e8b27b",
|
62
|
+
// "createdBy": "652e46f183a36264e8e8b256",
|
63
|
+
// "tags": [],
|
64
|
+
// "createdAt": new Date('2023-10-17T08:41:48.140Z'),
|
65
|
+
// "updatedAt": new Date('2023-10-17T08:41:48.140Z'),
|
66
|
+
// "__v": 0
|
67
|
+
// },
|
68
|
+
// "agents": [
|
69
|
+
// {
|
70
|
+
// "user_available": true,
|
71
|
+
// "number_assigned_requests": 0,
|
72
|
+
// "last_login_at": new Date('2023-10-17T08:33:51.266Z'),
|
73
|
+
// "status": "active",
|
74
|
+
// "_id": "652e46f183a36264e8e8b299",
|
75
|
+
// "id_project": "652e46f183a36264e8e8b27b",
|
76
|
+
// "id_user": "652e46f183a36264e8e8b256",
|
77
|
+
// "role": "owner",
|
78
|
+
// "createdBy": "652e46f183a36264e8e8b256",
|
79
|
+
// "tags": [],
|
80
|
+
// "createdAt": new Date('2023-10-17T08:33:53.484Z'),
|
81
|
+
// "updatedAt": new Date('2023-10-17T08:33:53.484Z'),
|
82
|
+
// "__v": 0
|
83
|
+
// }
|
84
|
+
// ],
|
85
|
+
// "availableAgentsCount": 1,
|
86
|
+
// "requester": {
|
87
|
+
// "user_available": true,
|
88
|
+
// "number_assigned_requests": 0,
|
89
|
+
// "last_login_at": new Date('2023-10-17T08:33:51.266Z'),
|
90
|
+
// "status": "active",
|
91
|
+
// "_id": "652e46f183a36264e8e8b299",
|
92
|
+
// "id_project": "652e46f183a36264e8e8b27b",
|
93
|
+
// "id_user": "652e46f183a36264e8e8b256",
|
94
|
+
// "role": "owner",
|
95
|
+
// "createdBy": "652e46f183a36264e8e8b256",
|
96
|
+
// "tags": [],
|
97
|
+
// "createdAt": new Date('2023-10-17T08:33:53.484Z'),
|
98
|
+
// "updatedAt": new Date('2023-10-17T08:33:53.484Z'),
|
99
|
+
// "__v": 0
|
100
|
+
// },
|
101
|
+
// "lead": {
|
102
|
+
// "tags": [],
|
103
|
+
// "status": 100,
|
104
|
+
// "_id": "652e46f283a36264e8e8b323",
|
105
|
+
// "lead_id": "652e46f183a36264e8e8b256",
|
106
|
+
// "fullname": "Test Firstname Test lastname",
|
107
|
+
// "email": "test-request-create-1697531633210@email.com",
|
108
|
+
// "id_project": "652e46f183a36264e8e8b27b",
|
109
|
+
// "createdBy": "system",
|
110
|
+
// "createdAt": new Date('2023-10-17T08:33:54.035Z'),
|
111
|
+
// "updatedAt": new Date('2023-10-17T08:33:54.035Z'),
|
112
|
+
// "__v": 0
|
113
|
+
// }
|
114
|
+
// },
|
115
|
+
// "tags": [],
|
116
|
+
// "notes": [],
|
117
|
+
// "channelOutbound": {
|
118
|
+
// "name": "chat21"
|
119
|
+
// },
|
120
|
+
// "smartAssignment": true,
|
121
|
+
// "createdAt": new Date('2023-10-19T08:45:54.058Z'),
|
122
|
+
// "updatedAt": new Date('2023-10-19T08:45:54.058Z'),
|
123
|
+
// "ticket_id": 1,
|
124
|
+
// "__v": 0
|
125
|
+
// }
|
126
|
+
|
127
|
+
module.exports = { requestMock }
|
@@ -0,0 +1,282 @@
|
|
1
|
+
const { QuoteManager } = require('../services/QuoteManager');
|
2
|
+
const pubModulesManager = require('../pubmodules/pubModulesManager'); // on constructor init is undefined beacusae pub module is loaded after
|
3
|
+
var projectService = require('../services/projectService');
|
4
|
+
var userService = require('../services/userService');
|
5
|
+
|
6
|
+
|
7
|
+
let chai = require('chai');
|
8
|
+
let chaiHttp = require('chai-http');
|
9
|
+
let server = require('../app');
|
10
|
+
let should = chai.should();
|
11
|
+
|
12
|
+
let expect = require('chai').expect;
|
13
|
+
let assert = require('chai').assert;
|
14
|
+
|
15
|
+
chai.use(chaiHttp);
|
16
|
+
|
17
|
+
// MOCK
|
18
|
+
const projectMock = require('./mock/projectMock');
|
19
|
+
const requestMock = require('./mock/requestMock');
|
20
|
+
const messageMock = require('./mock/messageMock');
|
21
|
+
const emailMock = require('./mock/emailMock');
|
22
|
+
const { MockTdCache } = require('./mock/MockTdCache');
|
23
|
+
const mockTdCache = new MockTdCache();
|
24
|
+
|
25
|
+
let log = true;
|
26
|
+
|
27
|
+
// CONNECT REDIS - CHECK IT
|
28
|
+
const { TdCache } = require('../utils/TdCache');
|
29
|
+
tdCache = new TdCache({
|
30
|
+
host: '127.0.0.1',
|
31
|
+
port: '6379'
|
32
|
+
});
|
33
|
+
|
34
|
+
tdCache.connect();
|
35
|
+
// var redis = require('redis')
|
36
|
+
// var redis_client;
|
37
|
+
|
38
|
+
// const dateList = [
|
39
|
+
// "2023-10-17T08:45:54.058Z",
|
40
|
+
// "2023-10-20T08:45:54.058Z",
|
41
|
+
// "2023-10-28T08:45:54.058Z",
|
42
|
+
// "2023-10-31T08:45:54.058Z",
|
43
|
+
// "2023-11-19T08:45:54.058Z",
|
44
|
+
// "2023-11-22T08:45:54.058Z",
|
45
|
+
// "2023-11-27T08:45:54.058Z",
|
46
|
+
// "2023-12-01T08:45:54.058Z",
|
47
|
+
// "2023-12-20T08:45:54.058Z",
|
48
|
+
// "2023-12-21T08:45:54.058Z"
|
49
|
+
// ]
|
50
|
+
|
51
|
+
const dateList = [
|
52
|
+
"2023-10-24T08:45:54.058Z",
|
53
|
+
"2023-10-25T08:45:54.058Z",
|
54
|
+
"2023-10-26T08:45:54.058Z",
|
55
|
+
"2023-10-27T08:45:54.058Z",
|
56
|
+
"2023-10-28T08:45:54.058Z",
|
57
|
+
"2023-10-29T08:45:54.058Z"
|
58
|
+
]
|
59
|
+
|
60
|
+
// connectRedis();
|
61
|
+
|
62
|
+
// function connectRedis() {
|
63
|
+
// console.log(">>> connectRedis")
|
64
|
+
// redis_client = redis.createClient({
|
65
|
+
// host: "127.0.0.1",
|
66
|
+
// port: 6379,
|
67
|
+
// });
|
68
|
+
|
69
|
+
// redis_client.on('error', err => {
|
70
|
+
// console.log('(quoteManager TEST) Connect Redis Error ' + err);
|
71
|
+
// })
|
72
|
+
|
73
|
+
// redis_client.on('ready', () => {
|
74
|
+
// console.log("(quoteManager TEST) Redis ready!")
|
75
|
+
// })
|
76
|
+
// }
|
77
|
+
|
78
|
+
|
79
|
+
|
80
|
+
// let cacheClient = undefined;
|
81
|
+
// if (pubModulesManager.cache) {
|
82
|
+
// cacheClient = pubModulesManager.cache._cache._cache; //_cache._cache to jump directly to redis modules without cacheoose wrapper (don't support await)
|
83
|
+
// }
|
84
|
+
|
85
|
+
// let tdCache = undefined;
|
86
|
+
// if (cacheClient) {
|
87
|
+
// tdCache = cacheClient;
|
88
|
+
// console.log("using 'cacheClient' for the test")
|
89
|
+
// } else if (redis_client) {
|
90
|
+
// tdCache = redis_client
|
91
|
+
// console.log("using 'redis_client' for the test")
|
92
|
+
// } else {
|
93
|
+
// tdCache = mockTdCache;
|
94
|
+
// console.log("using 'mockTdCache' for the test")
|
95
|
+
// }
|
96
|
+
|
97
|
+
let quoteManager = new QuoteManager({ tdCache: tdCache });
|
98
|
+
quoteManager.start();
|
99
|
+
|
100
|
+
|
101
|
+
describe('QuoteManager', function () {
|
102
|
+
|
103
|
+
|
104
|
+
|
105
|
+
it('incrementRequestsCount', async function () {
|
106
|
+
let mockProject = projectMock.mockProjectSandboxPlan;
|
107
|
+
let mockRequest = requestMock.requestMock;
|
108
|
+
|
109
|
+
|
110
|
+
mockRequest.createdAt = new Date(dateList[0]);
|
111
|
+
|
112
|
+
let initial_quote = await quoteManager.getCurrentQuote(mockProject, mockRequest, 'requests');
|
113
|
+
if (log) { console.log("[Quote Test] initial_quote: ", initial_quote); }
|
114
|
+
|
115
|
+
let key_incremented = await quoteManager.incrementRequestsCount(mockProject, mockRequest);
|
116
|
+
if (log) { console.log("[Quote Test] key_incremented: ", key_incremented); }
|
117
|
+
|
118
|
+
let final_quote = await quoteManager.getCurrentQuote(mockProject, mockRequest, 'requests');
|
119
|
+
if (log) { console.log("[Quote Test] final_quote: ", final_quote); }
|
120
|
+
|
121
|
+
expect(key_incremented).to.equal("quotes:requests:64e36f5dbf72263f7c059999:20/10/2023");
|
122
|
+
expect(final_quote).to.equal(initial_quote + 1);
|
123
|
+
})
|
124
|
+
|
125
|
+
it('incrementMessagesCount', async function () {
|
126
|
+
let mockProject = projectMock.mockProjectSandboxPlan;
|
127
|
+
let mockMessage = messageMock.messageMock;
|
128
|
+
|
129
|
+
mockMessage.createdAt = new Date();
|
130
|
+
|
131
|
+
let initial_quote = await quoteManager.getCurrentQuote(mockProject, mockMessage, 'messages');
|
132
|
+
if (log) { console.log("[Quote Test] initial_quote: ", initial_quote); }
|
133
|
+
|
134
|
+
let key_incremented = await quoteManager.incrementMessagesCount(mockProject, mockMessage);
|
135
|
+
if (log) { console.log("[Quote Test] key_incremented: ", key_incremented); }
|
136
|
+
|
137
|
+
let final_quote = await quoteManager.getCurrentQuote(mockProject, mockMessage, 'messages');
|
138
|
+
if (log) { console.log("[Quote Test] current quote: ", final_quote); }
|
139
|
+
|
140
|
+
//expect(key_incremented).to.equal("quotes:messages:64e36f5dbf72263f7c059999:20/10/2023");
|
141
|
+
expect(final_quote).to.equal(initial_quote + 1);
|
142
|
+
|
143
|
+
})
|
144
|
+
|
145
|
+
it('incrementEmailCount', async function () {
|
146
|
+
let mockProject = projectMock.mockProjectSandboxPlan;
|
147
|
+
let mockEmail = emailMock.emailMock;
|
148
|
+
|
149
|
+
let result = await quoteManager.checkQuote(mockProject, mockEmail, 'email');
|
150
|
+
console.log("checkQuote result: ", result)
|
151
|
+
|
152
|
+
let initial_quote = await quoteManager.getCurrentQuote(mockProject, mockEmail, 'email');
|
153
|
+
if (log) { console.log("[Quote Test] initial_quote: ", initial_quote); }
|
154
|
+
|
155
|
+
let key_incremented = await quoteManager.incrementEmailCount(mockProject, mockEmail);
|
156
|
+
if (log) { console.log("[Quote Test] key_incremented: ", key_incremented); }
|
157
|
+
|
158
|
+
let final_quote = await quoteManager.getCurrentQuote(mockProject, mockEmail, 'email');
|
159
|
+
if (log) { console.log("[Quote Test] current quote: ", final_quote); }
|
160
|
+
|
161
|
+
expect(key_incremented).to.equal("quotes:email:64e36f5dbf72263f7c059999:20/10/2023");
|
162
|
+
expect(final_quote).to.equal(initial_quote + 1);
|
163
|
+
|
164
|
+
})
|
165
|
+
|
166
|
+
it('sendEmailDirect', (done) => {
|
167
|
+
|
168
|
+
var email = "test-signup-" + Date.now() + "@email.com";
|
169
|
+
var pwd = "pwd";
|
170
|
+
|
171
|
+
userService.signup(email, pwd, "Test Firstname", "Test lastname").then(function (savedUser) {
|
172
|
+
projectService.create("test-send-email-direct", savedUser._id).then(function (savedProject) {
|
173
|
+
chai.request(server)
|
174
|
+
.post('/' + savedProject._id + '/emails/internal/send')
|
175
|
+
.auth(email, pwd)
|
176
|
+
.send({ to: "giovanni.troisiub@gmail.com", text: "Hello", subject: "HelloSub", replyto: "giovanni.troisiub@gmail.com" })
|
177
|
+
.end((err, res) => {
|
178
|
+
console.log("email internal send err", err);
|
179
|
+
console.log("email internal send res.body", res.body);
|
180
|
+
done();
|
181
|
+
});
|
182
|
+
});
|
183
|
+
});
|
184
|
+
|
185
|
+
})
|
186
|
+
|
187
|
+
it('incrementTokensCount', (done) => {
|
188
|
+
|
189
|
+
var email = "test-quote-" + Date.now() + "@email.com";
|
190
|
+
var pwd = "pwd";
|
191
|
+
|
192
|
+
userService.signup(email, pwd, "Test Firstname", "Test Lastname").then((savedUser) => {
|
193
|
+
projectService.create("quote-project", savedUser._id).then((savedProject) => {
|
194
|
+
|
195
|
+
let createdAt = new Date();
|
196
|
+
createdAt.setDate(createdAt.getDate() + 1)
|
197
|
+
|
198
|
+
chai.request(server)
|
199
|
+
.post('/' + savedProject._id + "/openai/quotes")
|
200
|
+
.auth(email, pwd)
|
201
|
+
.send({ createdAt: createdAt , tokens: 128 })
|
202
|
+
.end((err, res) => {
|
203
|
+
if (log) { console.log("res.body", res.body )};
|
204
|
+
res.should.have.status(200);
|
205
|
+
res.body.should.be.a('object');
|
206
|
+
|
207
|
+
let date = new Date().toLocaleDateString();
|
208
|
+
|
209
|
+
let key = "quotes:tokens:" + savedProject._id + ":" + date;
|
210
|
+
let message_resp = "value incremented for key " + key;
|
211
|
+
expect(res.body.message).to.equal(message_resp);
|
212
|
+
expect(res.body.key).to.equal(key);
|
213
|
+
expect(res.body.currentQuote).to.equal(128);
|
214
|
+
|
215
|
+
|
216
|
+
done();
|
217
|
+
})
|
218
|
+
})
|
219
|
+
})
|
220
|
+
|
221
|
+
|
222
|
+
})
|
223
|
+
|
224
|
+
|
225
|
+
|
226
|
+
|
227
|
+
// it('incrementRequestCountMulti', async function () {
|
228
|
+
// let mockProject = projectMock.mockProjectSandboxPlan;
|
229
|
+
// let mockRequest = requestMock.requestMock;
|
230
|
+
|
231
|
+
// let quoteManager = new QuoteManager({ project: mockProject, tdCache: tdCache });
|
232
|
+
|
233
|
+
// for (let date of dateList) {
|
234
|
+
// mockRequest.createdAt = new Date(date);
|
235
|
+
// let result = await quoteManager.incrementRequestsCount(mockRequest);
|
236
|
+
// console.log("result: ", result);
|
237
|
+
// console.log("\n\n");
|
238
|
+
// }
|
239
|
+
|
240
|
+
// })
|
241
|
+
|
242
|
+
// it('incrementRequestCountLimitReached', async function () {
|
243
|
+
|
244
|
+
// let mockProject = projectMock.mockProjectSandboxPlan;
|
245
|
+
// let mockRequest = requestMock.requestMock;
|
246
|
+
|
247
|
+
// // for the test the limit is fixed to 5
|
248
|
+
|
249
|
+
// let i;
|
250
|
+
// let quoteManager = new QuoteManager({ project: mockProject, tdCache: tdCache });
|
251
|
+
|
252
|
+
// for (i = 0; i < 5; i++) {
|
253
|
+
// mockRequest.createdAt = new Date(dateList[i]);
|
254
|
+
// await quoteManager.incrementRequestsCount(mockRequest);
|
255
|
+
// }
|
256
|
+
|
257
|
+
// mockRequest.createdAt = new Date(dateList[i]);
|
258
|
+
// let result = await quoteManager.incrementRequestsCount(mockRequest);
|
259
|
+
// console.log("result: ", result);
|
260
|
+
|
261
|
+
|
262
|
+
// })
|
263
|
+
|
264
|
+
// it('getCurrentCount', async function() {
|
265
|
+
// let mockProject = projectMock.mockProjectSandboxPlan;
|
266
|
+
// let mockRequest = requestMock.requestMock;
|
267
|
+
|
268
|
+
// let quoteManager = new QuoteManager({ project: mockProject, tdCache: mockTdCache } );
|
269
|
+
|
270
|
+
// for (let date of dateList) {
|
271
|
+
// mockRequest.createdAt = new Date(date);
|
272
|
+
// let result = await quoteManager.incrementRequestCount(mockRequest);
|
273
|
+
// console.log("result: ", result);
|
274
|
+
// }
|
275
|
+
|
276
|
+
// let today = new Date('2023-12-22T08:45:54.058Z');
|
277
|
+
// let quote = await quoteManager.getCurrentQuote(today, 'requests');
|
278
|
+
// console.log("request quote: ", quote)
|
279
|
+
|
280
|
+
|
281
|
+
// })
|
282
|
+
})
|
package/test/requestRoute.js
CHANGED
@@ -50,7 +50,7 @@ describe('RequestRoute', () => {
|
|
50
50
|
.send({"first_text":"first_text"})
|
51
51
|
.end(function(err, res) {
|
52
52
|
//console.log("res", res);
|
53
|
-
console.log("res.body", res.body);
|
53
|
+
//console.log("res.body", res.body);
|
54
54
|
res.should.have.status(200);
|
55
55
|
res.body.should.be.a('object');
|
56
56
|
|