@app-connect/core 1.7.5 → 1.7.10

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/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  const express = require('express');
2
2
  const cors = require('cors')
3
3
  const bodyParser = require('body-parser');
4
+ require('body-parser-xml')(bodyParser);
4
5
  const dynamoose = require('dynamoose');
5
6
  const axios = require('axios');
6
7
  const { UserModel } = require('./models/userModel');
@@ -10,6 +11,7 @@ const { CallLogModel } = require('./models/callLogModel');
10
11
  const { MessageLogModel } = require('./models/messageLogModel');
11
12
  const { AdminConfigModel } = require('./models/adminConfigModel');
12
13
  const { CacheModel } = require('./models/cacheModel');
14
+ const { AccountDataModel } = require('./models/accountDataModel');
13
15
  const jwt = require('./lib/jwt');
14
16
  const logCore = require('./handlers/log');
15
17
  const contactCore = require('./handlers/contact');
@@ -24,6 +26,8 @@ const analytics = require('./lib/analytics');
24
26
  const util = require('./lib/util');
25
27
  const connectorRegistry = require('./connector/registry');
26
28
  const calldown = require('./handlers/calldown');
29
+ const { DebugTracer } = require('./lib/debugTracer');
30
+ const s3ErrorLogReport = require('./lib/s3ErrorLogReport');
27
31
 
28
32
  let packageJson = null;
29
33
  try {
@@ -37,7 +41,13 @@ catch (e) {
37
41
  if (process.env.DYNAMODB_LOCALHOST) {
38
42
  dynamoose.aws.ddb.local(process.env.DYNAMODB_LOCALHOST);
39
43
  }
40
-
44
+ // log axios requests
45
+ if (process.env.IS_PROD === 'false') {
46
+ axios.interceptors.request.use(request => {
47
+ console.log('Request:', `[${request.method}]`, request.url);
48
+ return request;
49
+ });
50
+ }
41
51
  axios.defaults.headers.common['Unified-CRM-Extension-Version'] = packageJson.version;
42
52
 
43
53
  async function initDB() {
@@ -49,6 +59,7 @@ async function initDB() {
49
59
  await AdminConfigModel.sync();
50
60
  await CacheModel.sync();
51
61
  await CallDownListModel.sync();
62
+ await AccountDataModel.sync();
52
63
  }
53
64
  }
54
65
 
@@ -75,6 +86,8 @@ function createCoreRouter() {
75
86
 
76
87
  // Move all app.get, app.post, etc. to router.get, router.post, etc.
77
88
  router.get('/releaseNotes', async function (req, res) {
89
+ const tracer = req.headers['is-debug'] === 'true' ? DebugTracer.fromRequest(req) : null;
90
+ tracer?.trace('releaseNotes:start', { query: req.query });
78
91
  const globalReleaseNotes = releaseNotes;
79
92
  const connectorReleaseNotes = connectorRegistry.getReleaseNotes();
80
93
  const mergedReleaseNotes = {};
@@ -85,9 +98,8 @@ function createCoreRouter() {
85
98
  ...connectorReleaseNotes[version] ?? {}
86
99
  };
87
100
  }
88
- res.json(mergedReleaseNotes);
101
+ res.json(tracer ? tracer.wrapResponse(mergedReleaseNotes ?? {}) : (mergedReleaseNotes ?? {}));
89
102
  });
90
-
91
103
  // Obsolete
92
104
  router.get('/crmManifest', (req, res) => {
93
105
  try {
@@ -120,12 +132,12 @@ function createCoreRouter() {
120
132
  res.status(400).send('Platform not found');
121
133
  }
122
134
  });
123
-
124
135
  router.get('/isAlive', (req, res) => {
125
136
  res.send(`OK`);
126
137
  });
127
-
128
138
  router.get('/implementedInterfaces', (req, res) => {
139
+ const tracer = req.headers['is-debug'] === 'true' ? DebugTracer.fromRequest(req) : null;
140
+ tracer?.trace('implementedInterfaces:start', { query: req.query });
129
141
  try {
130
142
  const platform = req.query.platform;
131
143
  if (platform) {
@@ -133,7 +145,7 @@ function createCoreRouter() {
133
145
  const result = {};
134
146
  const authType = platformModule.getAuthType();
135
147
  result.getAuthType = !!platformModule.getAuthType;
136
- switch(authType){
148
+ switch (authType) {
137
149
  case 'oauth':
138
150
  result.getOauthInfo = !!platformModule.getOauthInfo;
139
151
  break;
@@ -156,20 +168,23 @@ function createCoreRouter() {
156
168
  result.getLicenseStatus = !!platformModule.getLicenseStatus;
157
169
  result.getLogFormatType = !!platformModule.getLogFormatType;
158
170
  result.cacheCallNote = !!process.env.USE_CACHE;
159
- res.status(200).send(result);
171
+ res.status(200).send(tracer ? tracer.wrapResponse(result) : result);
160
172
  }
161
173
  else {
162
- res.status(400).send('Please provide platform.');
174
+ tracer?.trace('implementedInterfaces:noPlatform', {});
175
+ res.status(400).send(tracer ? tracer.wrapResponse('Please provide platform.') : 'Please provide platform.');
163
176
  return;
164
177
  }
165
178
  }
166
179
  catch (e) {
167
- res.status(400).send(e);
180
+ tracer?.traceError('implementedInterfaces:error', e);
181
+ res.status(400).send(tracer ? tracer.wrapResponse({ error: e.message || e }) : { error: e.message || e });
168
182
  }
169
183
  });
170
-
171
184
  router.get('/licenseStatus', async (req, res) => {
172
185
  const requestStartTime = new Date().getTime();
186
+ const tracer = req.headers['is-debug'] === 'true' ? DebugTracer.fromRequest(req) : null;
187
+ tracer?.trace('licenseStatus:start', { query: req.query });
173
188
  let platformName = null;
174
189
  let success = false;
175
190
  let extraData = {};
@@ -180,15 +195,20 @@ function createCoreRouter() {
180
195
  const { id: userId, platform } = jwt.decodeJwt(jwtToken);
181
196
  platformName = platform;
182
197
  if (!userId) {
183
- res.status(400).send();
198
+ tracer?.trace('licenseStatus:noUserId', {});
199
+ res.status(400).send(tracer ? tracer.wrapResponse('No user ID') : 'No user ID');
184
200
  success = true;
185
201
  }
186
202
  const licenseStatus = await authCore.getLicenseStatus({ userId, platform });
187
- res.status(200).send(licenseStatus);
203
+ res.status(200).send(tracer ? tracer.wrapResponse(licenseStatus) : licenseStatus);
188
204
  success = true;
189
205
  }
190
206
  else {
191
- res.status(200).send({
207
+ res.status(200).send(tracer ? tracer.wrapResponse({
208
+ isLicenseValid: false,
209
+ licenseStatus: 'Invalid (Invalid user session)',
210
+ licenseStatusDescription: ''
211
+ }) : {
192
212
  isLicenseValid: false,
193
213
  licenseStatus: 'Invalid (Invalid user session)',
194
214
  licenseStatusDescription: ''
@@ -197,7 +217,11 @@ function createCoreRouter() {
197
217
  }
198
218
  }
199
219
  catch (e) {
200
- res.status(200).send({
220
+ res.status(200).send(tracer ? tracer.wrapResponse({
221
+ isLicenseValid: false,
222
+ licenseStatus: 'Invalid (Connect to get license status)',
223
+ licenseStatusDescription: ''
224
+ }) : {
201
225
  isLicenseValid: false,
202
226
  licenseStatus: 'Invalid (Connect to get license status)',
203
227
  licenseStatusDescription: ''
@@ -222,9 +246,10 @@ function createCoreRouter() {
222
246
  eventAddedVia
223
247
  });
224
248
  });
225
-
226
249
  router.get('/authValidation', async (req, res) => {
227
250
  const requestStartTime = new Date().getTime();
251
+ const tracer = req.headers['is-debug'] === 'true' ? DebugTracer.fromRequest(req) : null;
252
+ tracer?.trace('authValidation:start', { query: req.query });
228
253
  let platformName = null;
229
254
  let success = false;
230
255
  let validationPass = false;
@@ -236,7 +261,8 @@ function createCoreRouter() {
236
261
  if (jwtToken) {
237
262
  const decodedToken = jwt.decodeJwt(jwtToken);
238
263
  if (!decodedToken) {
239
- res.status(400).send('Invalid JWT token');
264
+ tracer?.trace('authValidation:invalidJwtToken', {});
265
+ res.status(400).send(tracer ? tracer.wrapResponse('Invalid JWT token') : 'Invalid JWT token');
240
266
  return;
241
267
  }
242
268
  const { id: userId, platform } = decodedToken;
@@ -246,17 +272,19 @@ function createCoreRouter() {
246
272
  validationPass = successful;
247
273
  reason = failReason;
248
274
  statusCode = status;
249
- res.status(200).send({ successful, returnMessage });
275
+ res.status(200).send(tracer ? tracer.wrapResponse({ successful, returnMessage }) : { successful, returnMessage });
250
276
  }
251
277
  else {
252
- res.status(400).send('Please go to Settings and authorize CRM platform');
278
+ tracer?.trace('authValidation:noToken', {});
279
+ res.status(400).send(tracer ? tracer.wrapResponse('Please go to Settings and authorize CRM platform') : 'Please go to Settings and authorize CRM platform');
253
280
  success = false;
254
281
  }
255
282
  }
256
283
  catch (e) {
257
284
  console.log(`platform: ${platformName} \n${e.stack}`);
285
+ tracer?.traceError('authValidation:error', e);
258
286
  statusCode = e.response?.status ?? 'unknown';
259
- res.status(400).send(e);
287
+ res.status(400).send(tracer ? tracer.wrapResponse({ error: e.message || e }) : { error: e.message || e });
260
288
  success = false;
261
289
  }
262
290
  const requestEndTime = new Date().getTime();
@@ -279,15 +307,15 @@ function createCoreRouter() {
279
307
  eventAddedVia
280
308
  });
281
309
  });
282
-
283
310
  // Obsolete
284
311
  router.get('/serverVersionInfo', (req, res) => {
285
312
  const defaultCrmManifest = connectorRegistry.getManifest('default');
286
313
  res.send({ version: defaultCrmManifest?.version ?? 'unknown' });
287
314
  });
288
-
289
315
  router.post('/admin/settings', async function (req, res) {
290
316
  const requestStartTime = new Date().getTime();
317
+ const tracer = req.headers['is-debug'] === 'true' ? DebugTracer.fromRequest(req) : null;
318
+ tracer?.trace('setAdminSettings:start', { body: req.body });
291
319
  let success = false;
292
320
  const { hashedExtensionId, hashedAccountId, userAgent, ip, author, eventAddedVia } = getAnalyticsVariablesInReqHeaders({ headers: req.headers })
293
321
  try {
@@ -295,17 +323,20 @@ function createCoreRouter() {
295
323
  const hashedRcAccountId = util.getHashValue(rcAccountId, process.env.HASH_KEY);
296
324
  if (isValidated) {
297
325
  await adminCore.upsertAdminSettings({ hashedRcAccountId, adminSettings: req.body.adminSettings });
298
- res.status(200).send('Admin settings updated');
326
+ res.status(200).send(tracer ? tracer.wrapResponse('Admin settings updated') : 'Admin settings updated');
299
327
  success = true;
300
328
  }
301
329
  else {
302
- res.status(401).send('Admin validation failed');
330
+ tracer?.trace('setAdminSettings:adminValidationFailed', {});
331
+ res.status(401).send(tracer ? tracer.wrapResponse('Admin validation failed') : 'Admin validation failed');
303
332
  success = false;
304
333
  }
305
334
  }
306
335
  catch (e) {
307
336
  console.log(`${e.stack}`);
308
- res.status(400).send(e);
337
+ tracer?.traceError('setAdminSettings:error', e);
338
+ res.status(400).send(tracer ? tracer.wrapResponse({ error: e.message || e }) : { error: e.message || e });
339
+ success = false;
309
340
  }
310
341
  const requestEndTime = new Date().getTime();
311
342
  analytics.track({
@@ -321,9 +352,10 @@ function createCoreRouter() {
321
352
  eventAddedVia
322
353
  });
323
354
  });
324
-
325
355
  router.get('/admin/settings', async function (req, res) {
326
356
  const requestStartTime = new Date().getTime();
357
+ const tracer = req.headers['is-debug'] === 'true' ? DebugTracer.fromRequest(req) : null;
358
+ tracer?.trace('getAdminSettings:start', { query: req.query });
327
359
  let platformName = null;
328
360
  let success = false;
329
361
  const { hashedExtensionId, hashedAccountId, userAgent, ip, author, eventAddedVia } = getAnalyticsVariablesInReqHeaders({ headers: req.headers })
@@ -334,7 +366,8 @@ function createCoreRouter() {
334
366
  platformName = unAuthData?.platform ?? 'Unknown';
335
367
  const user = await UserModel.findByPk(unAuthData?.id);
336
368
  if (!user) {
337
- res.status(400).send('User not found');
369
+ tracer?.trace('getAdminSettings:userNotFound', {});
370
+ res.status(400).send(tracer ? tracer.wrapResponse('User not found') : 'User not found');
338
371
  return;
339
372
  }
340
373
  const { isValidated, rcAccountId } = await adminCore.validateAdminRole({ rcAccessToken: req.query.rcAccessToken });
@@ -342,10 +375,13 @@ function createCoreRouter() {
342
375
  if (isValidated) {
343
376
  const adminSettings = await adminCore.getAdminSettings({ hashedRcAccountId });
344
377
  if (adminSettings) {
345
- res.status(200).send(adminSettings);
378
+ res.status(200).send(tracer ? tracer.wrapResponse(adminSettings) : adminSettings);
346
379
  }
347
380
  else {
348
- res.status(200).send({
381
+ res.status(200).send(tracer ? tracer.wrapResponse({
382
+ customConnector: null,
383
+ userSettings: {}
384
+ }) : {
349
385
  customConnector: null,
350
386
  userSettings: {}
351
387
  });
@@ -353,17 +389,21 @@ function createCoreRouter() {
353
389
  success = true;
354
390
  }
355
391
  else {
356
- res.status(401).send('Admin validation failed');
392
+ tracer?.trace('getAdminSettings:adminValidationFailed', {});
393
+ res.status(401).send(tracer ? tracer.wrapResponse('Admin validation failed') : 'Admin validation failed');
357
394
  success = true;
358
395
  }
359
396
  }
360
397
  else {
361
- res.status(400).send('Please go to Settings and authorize CRM platform');
398
+ tracer?.trace('getAdminSettings:noToken', {});
399
+ res.status(400).send(tracer ? tracer.wrapResponse('Please go to Settings and authorize CRM platform') : 'Please go to Settings and authorize CRM platform');
362
400
  success = false;
363
401
  }
364
402
  }
365
403
  catch (e) {
366
- res.status(400).send(e);
404
+ console.log(`${e.stack}`);
405
+ tracer?.traceError('getAdminSettings:error', e);
406
+ res.status(400).send(tracer ? tracer.wrapResponse({ error: e.message || e }) : { error: e.message || e });
367
407
  }
368
408
  const requestEndTime = new Date().getTime();
369
409
  analytics.track({
@@ -380,9 +420,10 @@ function createCoreRouter() {
380
420
  eventAddedVia
381
421
  });
382
422
  });
383
-
384
423
  router.post('/admin/userMapping', async function (req, res) {
385
424
  const requestStartTime = new Date().getTime();
425
+ const tracer = req.headers['is-debug'] === 'true' ? DebugTracer.fromRequest(req) : null;
426
+ tracer?.trace('getUserMapping:start', { query: req.query });
386
427
  let platformName = null;
387
428
  let success = false;
388
429
  const { hashedExtensionId, hashedAccountId, userAgent, ip, author, eventAddedVia } = getAnalyticsVariablesInReqHeaders({ headers: req.headers })
@@ -393,29 +434,33 @@ function createCoreRouter() {
393
434
  platformName = unAuthData?.platform ?? 'Unknown';
394
435
  const user = await UserModel.findByPk(unAuthData?.id);
395
436
  if (!user) {
396
- res.status(400).send('User not found');
437
+ tracer?.trace('getUserMapping:userNotFound', {});
438
+ res.status(400).send(tracer ? tracer.wrapResponse('User not found') : 'User not found');
397
439
  return;
398
440
  }
399
441
  const { isValidated, rcAccountId } = await adminCore.validateAdminRole({ rcAccessToken: req.query.rcAccessToken });
400
442
  const hashedRcAccountId = util.getHashValue(rcAccountId, process.env.HASH_KEY);
401
443
  if (isValidated) {
402
444
  const userMapping = await adminCore.getUserMapping({ user, hashedRcAccountId, rcExtensionList: req.body.rcExtensionList });
403
- res.status(200).send(userMapping);
445
+ res.status(200).send(tracer ? tracer.wrapResponse(userMapping) : userMapping);
404
446
  success = true;
405
447
  }
406
448
  else {
407
- res.status(401).send('Admin validation failed');
449
+ tracer?.trace('getUserMapping:adminValidationFailed', {});
450
+ res.status(401).send(tracer ? tracer.wrapResponse('Admin validation failed') : 'Admin validation failed');
408
451
  success = true;
409
452
  }
410
453
  }
411
454
  else {
412
- res.status(400).send('Please go to Settings and authorize CRM platform');
455
+ tracer?.trace('getUserMapping:noToken', {});
456
+ res.status(400).send(tracer ? tracer.wrapResponse('Please go to Settings and authorize CRM platform') : 'Please go to Settings and authorize CRM platform');
413
457
  success = false;
414
458
  }
415
459
  }
416
460
  catch (e) {
417
461
  console.log(`${e.stack}`);
418
- res.status(400).send(e);
462
+ tracer?.traceError('getUserMapping:error', e);
463
+ res.status(400).send(tracer ? tracer.wrapResponse({ error: e.message || e }) : { error: e.message || e });
419
464
  }
420
465
  const requestEndTime = new Date().getTime();
421
466
  analytics.track({
@@ -432,36 +477,41 @@ function createCoreRouter() {
432
477
  eventAddedVia
433
478
  });
434
479
  });
435
-
436
480
  router.get('/admin/serverLoggingSettings', async function (req, res) {
437
481
  const requestStartTime = new Date().getTime();
482
+ const tracer = req.headers['is-debug'] === 'true' ? DebugTracer.fromRequest(req) : null;
483
+ tracer?.trace('getServerLoggingSettings:start', { query: req.query });
438
484
  let platformName = null;
439
485
  let success = false;
440
486
  const jwtToken = req.query.jwtToken;
441
487
  if (!jwtToken) {
442
- res.status(400).send('Please go to Settings and authorize CRM platform');
488
+ tracer?.trace('getServerLoggingSettings:noToken', {});
489
+ res.status(400).send(tracer ? tracer.wrapResponse('Please go to Settings and authorize CRM platform') : 'Please go to Settings and authorize CRM platform');
443
490
  return;
444
491
  }
445
492
  const { hashedExtensionId, hashedAccountId, userAgent, ip, author, eventAddedVia } = getAnalyticsVariablesInReqHeaders({ headers: req.headers })
446
493
  try {
447
494
  const unAuthData = jwt.decodeJwt(jwtToken);
448
495
  if (!unAuthData?.id) {
449
- res.status(400).send('Please go to Settings and authorize CRM platform');
496
+ tracer?.trace('getServerLoggingSettings:noToken', {});
497
+ res.status(400).send(tracer ? tracer.wrapResponse('Please go to Settings and authorize CRM platform') : 'Please go to Settings and authorize CRM platform');
450
498
  return;
451
499
  }
452
500
  platformName = unAuthData?.platform ?? 'Unknown';
453
501
  const user = await UserModel.findByPk(unAuthData?.id);
454
502
  if (!user) {
455
- res.status(400).send('User not found');
503
+ tracer?.trace('getServerLoggingSettings:userNotFound', {});
504
+ res.status(400).send(tracer ? tracer.wrapResponse('User not found') : 'User not found');
456
505
  return;
457
506
  }
458
507
  const serverLoggingSettings = await adminCore.getServerLoggingSettings({ user });
459
- res.status(200).send(serverLoggingSettings);
508
+ res.status(200).send(tracer ? tracer.wrapResponse(serverLoggingSettings) : serverLoggingSettings);
460
509
  success = true;
461
510
  }
462
511
  catch (e) {
463
512
  console.log(`${e.stack}`);
464
- res.status(400).send(e);
513
+ tracer?.traceError('getServerLoggingSettings:error', e);
514
+ res.status(400).send(tracer ? tracer.wrapResponse({ error: e.message || e }) : { error: e.message || e });
465
515
  }
466
516
  const requestEndTime = new Date().getTime();
467
517
  analytics.track({
@@ -478,40 +528,46 @@ function createCoreRouter() {
478
528
  eventAddedVia
479
529
  });
480
530
  });
481
-
482
531
  router.post('/admin/serverLoggingSettings', async function (req, res) {
483
532
  const requestStartTime = new Date().getTime();
533
+ const tracer = req.headers['is-debug'] === 'true' ? DebugTracer.fromRequest(req) : null;
534
+ tracer?.trace('setServerLoggingSettings:start', { body: req.body });
484
535
  let platformName = null;
485
536
  let success = false;
486
537
  const jwtToken = req.query.jwtToken;
487
538
  if (!jwtToken) {
488
- res.status(400).send('Please go to Settings and authorize CRM platform');
539
+ tracer?.trace('setServerLoggingSettings:noToken', {});
540
+ res.status(400).send(tracer ? tracer.wrapResponse('Please go to Settings and authorize CRM platform') : 'Please go to Settings and authorize CRM platform');
489
541
  return;
490
542
  }
491
543
  if (!req.body.additionalFieldValues) {
492
- res.status(400).send('Missing additionalFieldValues');
544
+ tracer?.trace('setServerLoggingSettings:missingAdditionalFieldValues', {});
545
+ res.status(400).send(tracer ? tracer.wrapResponse('Missing additionalFieldValues') : 'Missing additionalFieldValues');
493
546
  return;
494
547
  }
495
548
  const { hashedExtensionId, hashedAccountId, userAgent, ip, author, eventAddedVia } = getAnalyticsVariablesInReqHeaders({ headers: req.headers })
496
549
  try {
497
550
  const unAuthData = jwt.decodeJwt(jwtToken);
498
551
  if (!unAuthData?.id) {
499
- res.status(400).send('Please go to Settings and authorize CRM platform');
552
+ tracer?.trace('setServerLoggingSettings:noToken', {});
553
+ res.status(400).send(tracer ? tracer.wrapResponse('Please go to Settings and authorize CRM platform') : 'Please go to Settings and authorize CRM platform');
500
554
  return;
501
555
  }
502
556
  platformName = unAuthData?.platform ?? 'Unknown';
503
557
  const user = await UserModel.findByPk(unAuthData?.id);
504
558
  if (!user) {
505
- res.status(400).send('User not found');
559
+ tracer?.trace('setServerLoggingSettings:userNotFound', {});
560
+ res.status(400).send(tracer ? tracer.wrapResponse('User not found') : 'User not found');
506
561
  return;
507
562
  }
508
563
  const { successful, returnMessage } = await adminCore.updateServerLoggingSettings({ user, additionalFieldValues: req.body.additionalFieldValues });
509
- res.status(200).send({ successful, returnMessage });
564
+ res.status(200).send(tracer ? tracer.wrapResponse({ successful, returnMessage }) : { successful, returnMessage });
510
565
  success = true;
511
566
  }
512
567
  catch (e) {
513
568
  console.log(`${e.stack}`);
514
- res.status(400).send({ successful: false, returnMessage: { messageType: 'warning', message: 'Server logging settings update failed', ttl: 5000 } });
569
+ tracer?.traceError('setServerLoggingSettings:error', e);
570
+ res.status(400).send(tracer ? tracer.wrapResponse({ successful: false, returnMessage: { messageType: 'warning', message: 'Server logging settings update failed', ttl: 5000 } }) : { successful: false, returnMessage: { messageType: 'warning', message: 'Server logging settings update failed', ttl: 5000 } });
515
571
  success = false;
516
572
  }
517
573
  const requestEndTime = new Date().getTime();
@@ -529,27 +585,32 @@ function createCoreRouter() {
529
585
  eventAddedVia
530
586
  });
531
587
  })
532
-
533
588
  router.get('/user/preloadSettings', async function (req, res) {
589
+ const tracer = req.headers['is-debug'] === 'true' ? DebugTracer.fromRequest(req) : null;
590
+ tracer?.trace('getUserSettingsByAdmin:start', { query: req.query });
534
591
  try {
535
592
  const rcAccessToken = req.query.rcAccessToken;
536
593
  const rcAccountId = req.query.rcAccountId;
537
594
  if (rcAccessToken || rcAccountId) {
538
595
  const userSettings = await userCore.getUserSettingsByAdmin({ rcAccessToken, rcAccountId });
539
- res.status(200).send(userSettings);
596
+ res.status(200).send(tracer ? tracer.wrapResponse(userSettings) : userSettings);
540
597
  }
541
598
  else {
542
- res.status(400).send('Cannot find rc user login');
599
+ tracer?.trace('getUserSettingsByAdmin:noRcAccessTokenOrRcAccountId', {});
600
+ res.status(400).send(tracer ? tracer.wrapResponse('Cannot find rc user login') : 'Cannot find rc user login');
543
601
  }
544
602
  }
545
603
  catch (e) {
546
604
  console.log(`${e.stack}`);
547
- res.status(400).send(e);
605
+ tracer?.traceError('getUserSettingsByAdmin:error', e);
606
+ res.status(400).send(tracer ? tracer.wrapResponse({ error: e.message || e }) : { error: e.message || e });
548
607
  }
549
608
  }
550
609
  );
551
610
  router.get('/user/settings', async function (req, res) {
552
611
  const requestStartTime = new Date().getTime();
612
+ const tracer = req.headers['is-debug'] === 'true' ? DebugTracer.fromRequest(req) : null;
613
+ tracer?.trace('getUserSettings:start', { query: req.query });
553
614
  let platformName = null;
554
615
  let success = false;
555
616
  const { hashedExtensionId, hashedAccountId, userAgent, ip, author, eventAddedVia } = getAnalyticsVariablesInReqHeaders({ headers: req.headers })
@@ -560,7 +621,8 @@ function createCoreRouter() {
560
621
  platformName = unAuthData?.platform ?? 'Unknown';
561
622
  const user = await UserModel.findByPk(unAuthData?.id);
562
623
  if (!user) {
563
- res.status(400).send('User not found');
624
+ tracer?.trace('getUserSettings:userNotFound', {});
625
+ res.status(400).send(tracer ? tracer.wrapResponse('User not found') : 'User not found');
564
626
  return;
565
627
  }
566
628
  else {
@@ -568,16 +630,19 @@ function createCoreRouter() {
568
630
  const rcAccountId = req.query.rcAccountId;
569
631
  const userSettings = await userCore.getUserSettings({ user, rcAccessToken, rcAccountId });
570
632
  success = true;
571
- res.status(200).send(userSettings);
633
+ res.status(200).send(tracer ? tracer.wrapResponse(userSettings) : userSettings);
572
634
  }
573
635
  }
574
636
  else {
575
637
  success = false;
576
- res.status(400).send('Please go to Settings and authorize CRM platform');
638
+ tracer?.trace('getUserSettings:noToken', {});
639
+ res.status(400).send(tracer ? tracer.wrapResponse('Please go to Settings and authorize CRM platform') : 'Please go to Settings and authorize CRM platform');
577
640
  }
578
641
  }
579
642
  catch (e) {
580
643
  console.log(`platform: ${platformName} \n${e.stack}`);
644
+ tracer?.traceError('getUserSettings:error', e, { platform: platformName });
645
+ res.status(400).send(tracer ? tracer.wrapResponse({ error: e.message || e }) : { error: e.message || e });
581
646
  }
582
647
  const requestEndTime = new Date().getTime();
583
648
  analytics.track({
@@ -594,9 +659,10 @@ function createCoreRouter() {
594
659
  eventAddedVia
595
660
  });
596
661
  });
597
-
598
662
  router.post('/user/settings', async function (req, res) {
599
663
  const requestStartTime = new Date().getTime();
664
+ const tracer = req.headers['is-debug'] === 'true' ? DebugTracer.fromRequest(req) : null;
665
+ tracer?.trace('setUserSettings:start', { body: req.body });
600
666
  let platformName = null;
601
667
  let success = false;
602
668
  const { hashedExtensionId, hashedAccountId, userAgent, ip, author, eventAddedVia } = getAnalyticsVariablesInReqHeaders({ headers: req.headers })
@@ -606,23 +672,30 @@ function createCoreRouter() {
606
672
  const unAuthData = jwt.decodeJwt(jwtToken);
607
673
  platformName = unAuthData?.platform;
608
674
  if (!platformName) {
609
- res.status(400).send('Unknown platform');
675
+ tracer?.trace('setUserSettings:unknownPlatform', {});
676
+ res.status(400).send(tracer ? tracer.wrapResponse('Unknown platform') : 'Unknown platform');
677
+ return;
610
678
  }
611
679
  const user = await UserModel.findByPk(unAuthData?.id);
612
680
  if (!user) {
613
- res.status(400).send();
681
+ tracer?.trace('setUserSettings:userNotFound', {});
682
+ res.status(400).send(tracer ? tracer.wrapResponse('User not found') : 'User not found');
683
+ return;
614
684
  }
615
685
  const { userSettings } = await userCore.updateUserSettings({ user, userSettings: req.body.userSettings, platformName });
616
- res.status(200).send({ userSettings });
686
+ res.status(200).send(tracer ? tracer.wrapResponse({ userSettings }) : { userSettings });
617
687
  success = true;
618
688
  }
619
689
  else {
620
- res.status(400).send('Please go to Settings and authorize CRM platform');
690
+ tracer?.trace('setUserSettings:noToken', {});
691
+ res.status(400).send(tracer ? tracer.wrapResponse('Please go to Settings and authorize CRM platform') : 'Please go to Settings and authorize CRM platform');
621
692
  success = false;
622
693
  }
623
694
  }
624
695
  catch (e) {
625
696
  console.log(`platform: ${platformName} \n${e.stack}`);
697
+ tracer?.traceError('setUserSettings:error', e, { platform: platformName });
698
+ res.status(400).send(tracer ? tracer.wrapResponse({ error: e.message || e }) : { error: e.message || e });
626
699
  }
627
700
  const requestEndTime = new Date().getTime();
628
701
  analytics.track({
@@ -639,45 +712,54 @@ function createCoreRouter() {
639
712
  eventAddedVia
640
713
  });
641
714
  });
642
-
643
715
  router.get('/hostname', async function (req, res) {
716
+ const tracer = req.headers['is-debug'] === 'true' ? DebugTracer.fromRequest(req) : null;
717
+ tracer?.trace('hostname:start', { query: req.query });
644
718
  try {
645
719
  const jwtToken = req.query.jwtToken;
646
720
  if (jwtToken) {
647
721
  const unAuthData = jwt.decodeJwt(jwtToken);
648
722
  const user = await UserModel.findByPk(unAuthData?.id);
649
723
  if (!user) {
650
- res.status(400).send();
724
+ tracer?.trace('hostname:userNotFound', {});
725
+ res.status(400).send(tracer ? tracer.wrapResponse('User not found') : 'User not found');
651
726
  return;
652
727
  }
653
- res.status(200).send(user.hostname);
728
+ res.status(200).send(tracer ? tracer.wrapResponse(user.hostname) : user.hostname);
654
729
  }
655
730
  else {
656
- res.status(400).send('Please go to Settings and authorize CRM platform');
731
+ tracer?.trace('hostname:noToken', {});
732
+ res.status(400).send(tracer ? tracer.wrapResponse('Please go to Settings and authorize CRM platform') : 'Please go to Settings and authorize CRM platform');
657
733
  }
658
734
  }
659
735
  catch (e) {
660
736
  console.log(`${e.stack}`);
661
- res.status(500).send(e);
737
+ tracer?.traceError('hostname:error', e);
738
+ res.status(500).send(tracer ? tracer.wrapResponse({ error: e.message || e }) : { error: e.message || e });
662
739
  }
663
740
  })
664
-
665
741
  router.get('/oauth-callback', async function (req, res) {
666
742
  const requestStartTime = new Date().getTime();
743
+ const tracer = req.headers['is-debug'] === 'true' ? DebugTracer.fromRequest(req) : null;
744
+ tracer?.trace('oauth-callback:start', { query: req.query });
667
745
  let platformName = null;
668
746
  let success = false;
669
747
  const { hashedExtensionId, hashedAccountId, userAgent, ip, author, eventAddedVia } = getAnalyticsVariablesInReqHeaders({ headers: req.headers })
670
748
  try {
671
749
  if (!req.query?.callbackUri || req.query.callbackUri === 'undefined') {
672
- throw 'Missing callbackUri';
750
+ tracer?.trace('oauth-callback:missingCallbackUri', {});
751
+ res.status(400).send(tracer ? tracer.wrapResponse('Missing callbackUri') : 'Missing callbackUri');
752
+ return;
673
753
  }
674
754
  platformName = req.query.state ?
675
755
  req.query.state.split('platform=')[1] :
676
- decodeURIComponent(req.originalUrl).split('state=')[1].split('&')[0].split('platform=')[1];
756
+ decodeURIComponent(decodeURIComponent(req.originalUrl).split('state=')[1].split('&')[0]).split('platform=')[1];
677
757
  const hostname = req.query.hostname;
678
758
  const tokenUrl = req.query.tokenUrl;
679
759
  if (!platformName) {
680
- throw 'Missing platform name';
760
+ tracer?.trace('oauth-callback:missingPlatformName', {});
761
+ res.status(400).send(tracer ? tracer.wrapResponse('Missing platform name') : 'Missing platform name');
762
+ return;
681
763
  }
682
764
  const hasAuthCodeInCallbackUri = req.query.callbackUri.includes('code=');
683
765
  if (!hasAuthCodeInCallbackUri) {
@@ -688,28 +770,25 @@ function createCoreRouter() {
688
770
  platform: platformName,
689
771
  hostname,
690
772
  tokenUrl,
691
- callbackUri: req.query.callbackUri,
692
- apiUrl: req.query.apiUrl,
693
- username: req.query.username,
694
- query: req.query,
695
- proxyId: req.query.proxyId
773
+ query: req.query
696
774
  });
697
775
  if (userInfo) {
698
776
  const jwtToken = jwt.generateJwt({
699
777
  id: userInfo.id.toString(),
700
778
  platform: platformName
701
779
  });
702
- res.status(200).send({ jwtToken, name: userInfo.name, returnMessage });
780
+ res.status(200).send(tracer ? tracer.wrapResponse({ jwtToken, name: userInfo.name, returnMessage }) : { jwtToken, name: userInfo.name, returnMessage });
703
781
  success = true;
704
782
  }
705
783
  else {
706
- res.status(200).send({ returnMessage });
784
+ res.status(200).send(tracer ? tracer.wrapResponse({ returnMessage }) : { returnMessage });
707
785
  success = false;
708
786
  }
709
787
  }
710
788
  catch (e) {
711
789
  console.log(`platform: ${platformName} \n${e.stack}`);
712
- res.status(400).send(e);
790
+ tracer?.traceError('oauth-callback:error', e, { platform: platformName });
791
+ res.status(400).send(tracer ? tracer.wrapResponse({ error: e.message || e }) : { error: e.message || e });
713
792
  success = false;
714
793
  }
715
794
  const requestEndTime = new Date().getTime();
@@ -729,6 +808,8 @@ function createCoreRouter() {
729
808
  })
730
809
  router.post('/apiKeyLogin', async function (req, res) {
731
810
  const requestStartTime = new Date().getTime();
811
+ const tracer = req.headers['is-debug'] === 'true' ? DebugTracer.fromRequest(req) : null;
812
+ tracer?.trace('apiKeyLogin:start', { body: req.body });
732
813
  let platformName = null;
733
814
  let success = false;
734
815
  const { hashedExtensionId, hashedAccountId, userAgent, ip, author, eventAddedVia } = getAnalyticsVariablesInReqHeaders({ headers: req.headers })
@@ -740,10 +821,14 @@ function createCoreRouter() {
740
821
  const proxyId = req.body.proxyId;
741
822
  const additionalInfo = req.body.additionalInfo;
742
823
  if (!platform) {
743
- throw 'Missing platform name';
824
+ tracer?.trace('apiKeyLogin:missingPlatform', {});
825
+ res.status(400).send(tracer ? tracer.wrapResponse('Missing platform name') : 'Missing platform name');
826
+ return;
744
827
  }
745
828
  if (!apiKey) {
746
- throw 'Missing api key';
829
+ tracer?.trace('apiKeyLogin:missingApiKey', {});
830
+ res.status(400).send(tracer ? tracer.wrapResponse('Missing api key') : 'Missing api key');
831
+ return;
747
832
  }
748
833
  const { userInfo, returnMessage } = await authCore.onApiKeyLogin({ platform, hostname, apiKey, proxyId, additionalInfo });
749
834
  if (userInfo) {
@@ -751,17 +836,18 @@ function createCoreRouter() {
751
836
  id: userInfo.id.toString(),
752
837
  platform: platform
753
838
  });
754
- res.status(200).send({ jwtToken, name: userInfo.name, returnMessage });
839
+ res.status(200).send(tracer ? tracer.wrapResponse({ jwtToken, name: userInfo.name, returnMessage }) : { jwtToken, name: userInfo.name, returnMessage });
755
840
  success = true;
756
841
  }
757
842
  else {
758
- res.status(400).send({ returnMessage });
843
+ res.status(400).send(tracer ? tracer.wrapResponse({ returnMessage }) : { returnMessage });
759
844
  success = false;
760
845
  }
761
846
  }
762
847
  catch (e) {
763
848
  console.log(`platform: ${platformName} \n${e.stack}`);
764
- res.status(400).send(e);
849
+ tracer?.traceError('apiKeyLogin:error', e, { platform: platformName });
850
+ res.status(400).send(tracer ? tracer.wrapResponse({ error: e.message || e }) : { error: e.message || e });
765
851
  success = false;
766
852
  }
767
853
  const requestEndTime = new Date().getTime();
@@ -781,6 +867,8 @@ function createCoreRouter() {
781
867
  })
782
868
  router.post('/unAuthorize', async function (req, res) {
783
869
  const requestStartTime = new Date().getTime();
870
+ const tracer = req.headers['is-debug'] === 'true' ? DebugTracer.fromRequest(req) : null;
871
+ tracer?.trace('unAuthorize:start', { query: req.query });
784
872
  let platformName = null;
785
873
  let success = false;
786
874
  const { hashedExtensionId, hashedAccountId, userAgent, ip, author, eventAddedVia } = getAnalyticsVariablesInReqHeaders({ headers: req.headers })
@@ -791,22 +879,25 @@ function createCoreRouter() {
791
879
  platformName = unAuthData?.platform ?? 'Unknown';
792
880
  const userToLogout = await UserModel.findByPk(unAuthData?.id);
793
881
  if (!userToLogout) {
794
- res.status(400).send();
882
+ tracer?.trace('unAuthorize:userNotFound', {});
883
+ res.status(400).send(tracer ? tracer.wrapResponse('User not found') : 'User not found');
795
884
  return;
796
885
  }
797
886
  const platformModule = connectorRegistry.getConnector(unAuthData?.platform ?? 'Unknown');
798
887
  const { returnMessage } = await platformModule.unAuthorize({ user: userToLogout });
799
- res.status(200).send({ returnMessage });
888
+ res.status(200).send(tracer ? tracer.wrapResponse(returnMessage) : returnMessage);
800
889
  success = true;
801
890
  }
802
891
  else {
803
- res.status(400).send('Please go to Settings and authorize CRM platform');
892
+ tracer?.trace('unAuthorize:noToken', {});
893
+ res.status(400).send(tracer ? tracer.wrapResponse('Please go to Settings and authorize CRM platform') : 'Please go to Settings and authorize CRM platform');
804
894
  success = false;
805
895
  }
806
896
  }
807
897
  catch (e) {
808
898
  console.log(`platform: ${platformName} \n${e.stack}`);
809
- res.status(400).send(e);
899
+ tracer?.traceError('unAuthorize:error', e, { platform: platformName });
900
+ res.status(400).send(tracer ? tracer.wrapResponse({ error: e.message || e }) : { error: e.message || e });
810
901
  success = false;
811
902
  }
812
903
  const requestEndTime = new Date().getTime();
@@ -825,18 +916,24 @@ function createCoreRouter() {
825
916
  });
826
917
  });
827
918
  router.get('/userInfoHash', async function (req, res) {
919
+ const tracer = req.headers['is-debug'] === 'true' ? DebugTracer.fromRequest(req) : null;
828
920
  try {
921
+ tracer?.trace('userInfoHash:start', { query: req.query });
829
922
  const extensionId = util.getHashValue(req.query.extensionId, process.env.HASH_KEY);
830
923
  const accountId = util.getHashValue(req.query.accountId, process.env.HASH_KEY);
831
- res.status(200).send({ extensionId, accountId });
924
+ res.status(200).send(tracer ? tracer.wrapResponse({ extensionId, accountId }) : { extensionId, accountId });
832
925
  }
833
926
  catch (e) {
834
927
  console.log(`${e.stack}`);
835
- res.status(400).send(e);
928
+ res.status(400).send(tracer ? tracer.wrapResponse({ error: e.message || e }) : { error: e.message || e });
929
+ tracer?.traceError('userInfoHash:error', e);
836
930
  }
837
931
  })
838
932
  router.get('/contact', async function (req, res) {
839
933
  const requestStartTime = new Date().getTime();
934
+ const tracer = req.headers['is-debug'] === 'true' ? DebugTracer.fromRequest(req) : null;
935
+ tracer?.trace('findContact:start', { query: req.query });
936
+
840
937
  let platformName = null;
841
938
  let success = false;
842
939
  let resultCount = 0;
@@ -846,14 +943,25 @@ function createCoreRouter() {
846
943
  const jwtToken = req.query.jwtToken;
847
944
  if (jwtToken) {
848
945
  const decodedToken = jwt.decodeJwt(jwtToken);
946
+ tracer?.trace('findContact:jwtDecoded', { decodedToken });
849
947
  if (!decodedToken) {
850
- res.status(400).send('Please go to Settings and authorize CRM platform');
948
+ tracer?.trace('findContact:invalidToken', {});
949
+ res.status(400).send(tracer ? tracer.wrapResponse('Please go to Settings and authorize CRM platform') : 'Please go to Settings and authorize CRM platform');
851
950
  return;
852
951
  }
853
952
  const { id: userId, platform } = decodedToken;
854
953
  platformName = platform;
855
- const { successful, returnMessage, contact, extraDataTracking } = await contactCore.findContact({ platform, userId, phoneNumber: req.query.phoneNumber.replace(' ', '+'), overridingFormat: req.query.overridingFormat, isExtension: req.query?.isExtension ?? false });
856
- res.status(200).send({ successful, returnMessage, contact });
954
+ const { successful, returnMessage, contact, extraDataTracking } = await contactCore.findContact({
955
+ platform,
956
+ userId,
957
+ phoneNumber: req.query.phoneNumber.replace(' ', '+'),
958
+ overridingFormat: req.query.overridingFormat,
959
+ isExtension: req.query?.isExtension ?? false,
960
+ tracer,
961
+ isForceRefreshAccountData: req.query?.isForceRefreshAccountData === 'true'
962
+ });
963
+ tracer?.trace('findContact:result', { successful, returnMessage, contact });
964
+ res.status(200).send(tracer ? tracer.wrapResponse({ successful, returnMessage, contact }) : { successful, returnMessage, contact });
857
965
  if (successful) {
858
966
  const nonNewContact = contact?.filter(c => !c.isNewContact) ?? [];
859
967
  resultCount = nonNewContact.length;
@@ -864,14 +972,16 @@ function createCoreRouter() {
864
972
  }
865
973
  }
866
974
  else {
867
- res.status(400).send('Please go to Settings and authorize CRM platform');
975
+ tracer?.trace('findContact:noToken', {});
976
+ res.status(400).send(tracer ? tracer.wrapResponse('Please go to Settings and authorize CRM platform') : 'Please go to Settings and authorize CRM platform');
868
977
  success = false;
869
978
  }
870
979
  }
871
980
  catch (e) {
872
981
  console.log(`platform: ${platformName} \n${e.stack}`);
982
+ tracer?.traceError('findContact:error', e, { platform: platformName });
873
983
  extraData.statusCode = e.response?.status ?? 'unknown';
874
- res.status(400).send(e);
984
+ res.status(400).send(tracer ? tracer.wrapResponse({ error: e.message || e }) : { error: e.message || e });
875
985
  success = false;
876
986
  }
877
987
  const requestEndTime = new Date().getTime();
@@ -895,6 +1005,8 @@ function createCoreRouter() {
895
1005
  });
896
1006
  router.post('/contact', async function (req, res) {
897
1007
  const requestStartTime = new Date().getTime();
1008
+ const tracer = req.headers['is-debug'] === 'true' ? DebugTracer.fromRequest(req) : null;
1009
+ tracer?.trace('createContact:start', { query: req.query });
898
1010
  let platformName = null;
899
1011
  let success = false;
900
1012
  let extraData = {};
@@ -904,27 +1016,30 @@ function createCoreRouter() {
904
1016
  if (jwtToken) {
905
1017
  const decodedToken = jwt.decodeJwt(jwtToken);
906
1018
  if (!decodedToken) {
907
- res.status(400).send('Please go to Settings and authorize CRM platform');
1019
+ tracer?.trace('createContact:invalidToken', {});
1020
+ res.status(400).send(tracer ? tracer.wrapResponse('Please go to Settings and authorize CRM platform') : 'Please go to Settings and authorize CRM platform');
908
1021
  return;
909
1022
  }
910
1023
  const { id: userId, platform } = decodedToken;
911
1024
  platformName = platform;
912
1025
  const { successful, returnMessage, contact, extraDataTracking } = await contactCore.createContact({ platform, userId, phoneNumber: req.body.phoneNumber, newContactName: req.body.newContactName, newContactType: req.body.newContactType, additionalSubmission: req.body.additionalSubmission });
913
- res.status(200).send({ successful, returnMessage, contact });
1026
+ res.status(200).send(tracer ? tracer.wrapResponse({ successful, returnMessage, contact }) : { successful, returnMessage, contact });
914
1027
  success = true;
915
1028
  if (extraDataTracking) {
916
1029
  extraData = extraDataTracking;
917
1030
  }
918
1031
  }
919
1032
  else {
920
- res.status(400).send('Please go to Settings and authorize CRM platform');
1033
+ tracer?.trace('createContact:noToken', {});
1034
+ res.status(400).send(tracer ? tracer.wrapResponse('Please go to Settings and authorize CRM platform') : 'Please go to Settings and authorize CRM platform');
921
1035
  success = false;
922
1036
  }
923
1037
  }
924
1038
  catch (e) {
925
1039
  console.log(`platform: ${platformName} \n${e.stack}`);
1040
+ tracer?.traceError('createContact:error', e, { platform: platformName });
926
1041
  extraData.statusCode = e.response?.status ?? 'unknown';
927
- res.status(400).send(e);
1042
+ res.status(400).send(tracer ? tracer.wrapResponse({ error: e.message || e }) : { error: e.message || e });
928
1043
  success = false;
929
1044
  }
930
1045
  const requestEndTime = new Date().getTime();
@@ -947,6 +1062,8 @@ function createCoreRouter() {
947
1062
  });
948
1063
  router.post('/callLog/cacheNote', async function (req, res) {
949
1064
  const requestStartTime = new Date().getTime();
1065
+ const tracer = req.headers['is-debug'] === 'true' ? DebugTracer.fromRequest(req) : null;
1066
+ tracer?.trace('saveNoteCache:start', { query: req.query });
950
1067
  let platformName = null;
951
1068
  let success = false;
952
1069
  let extraData = {};
@@ -956,13 +1073,14 @@ function createCoreRouter() {
956
1073
  if (jwtToken) {
957
1074
  const decodedToken = jwt.decodeJwt(jwtToken);
958
1075
  if (!decodedToken) {
959
- res.status(400).send('Please go to Settings and authorize CRM platform');
1076
+ tracer?.trace('saveNoteCache:invalidToken', {});
1077
+ res.status(400).send(tracer ? tracer.wrapResponse('Please go to Settings and authorize CRM platform') : 'Please go to Settings and authorize CRM platform');
960
1078
  return;
961
1079
  }
962
1080
  const { id: userId, platform } = decodedToken;
963
1081
  platformName = platform;
964
1082
  const { successful, returnMessage, extraDataTracking } = await logCore.saveNoteCache({ sessionId: req.body.sessionId, note: req.body.note });
965
- res.status(200).send({ successful, returnMessage });
1083
+ res.status(200).send(tracer ? tracer.wrapResponse({ successful, returnMessage }) : { successful, returnMessage });
966
1084
  success = true;
967
1085
  if (extraDataTracking) {
968
1086
  extraData = extraDataTracking;
@@ -970,8 +1088,9 @@ function createCoreRouter() {
970
1088
  }
971
1089
  } catch (e) {
972
1090
  console.log(`platform: ${platformName} \n${e.stack}`);
1091
+ tracer?.traceError('saveNoteCache:error', e, { platform: platformName });
973
1092
  extraData.statusCode = e.response?.status ?? 'unknown';
974
- res.status(400).send(e);
1093
+ res.status(400).send(tracer ? tracer.wrapResponse({ error: e.message || e }) : { error: e.message || e });
975
1094
  success = false;
976
1095
  }
977
1096
  const requestEndTime = new Date().getTime();
@@ -986,6 +1105,8 @@ function createCoreRouter() {
986
1105
  })
987
1106
  router.get('/callLog', async function (req, res) {
988
1107
  const requestStartTime = new Date().getTime();
1108
+ const tracer = req.headers['is-debug'] === 'true' ? DebugTracer.fromRequest(req) : null;
1109
+ tracer?.trace('getCallLog:start', { query: req.query });
989
1110
  let platformName = null;
990
1111
  let success = false;
991
1112
  let extraData = {};
@@ -995,13 +1116,14 @@ function createCoreRouter() {
995
1116
  if (jwtToken) {
996
1117
  const decodedToken = jwt.decodeJwt(jwtToken);
997
1118
  if (!decodedToken) {
998
- res.status(400).send('Please go to Settings and authorize CRM platform');
1119
+ tracer?.trace('getCallLog:invalidToken', {});
1120
+ res.status(400).send(tracer ? tracer.wrapResponse('Please go to Settings and authorize CRM platform') : 'Please go to Settings and authorize CRM platform');
999
1121
  return;
1000
1122
  }
1001
1123
  const { id: userId, platform } = decodedToken;
1002
1124
  platformName = platform;
1003
1125
  const { successful, logs, returnMessage, extraDataTracking } = await logCore.getCallLog({ userId, sessionIds: req.query.sessionIds, platform, requireDetails: req.query.requireDetails === 'true' });
1004
- res.status(200).send({ successful, logs, returnMessage });
1126
+ res.status(200).send(tracer ? tracer.wrapResponse({ successful, logs, returnMessage }) : { successful, logs, returnMessage });
1005
1127
  success = true;
1006
1128
  if (extraDataTracking) {
1007
1129
  extraData = extraDataTracking;
@@ -1009,14 +1131,16 @@ function createCoreRouter() {
1009
1131
  extraData.requireDetails = req.query.requireDetails === 'true';
1010
1132
  }
1011
1133
  else {
1012
- res.status(400).send('Please go to Settings and authorize CRM platform');
1134
+ tracer?.trace('getCallLog:noToken', {});
1135
+ res.status(400).send(tracer ? tracer.wrapResponse('Please go to Settings and authorize CRM platform') : 'Please go to Settings and authorize CRM platform');
1013
1136
  success = false;
1014
1137
  }
1015
1138
  }
1016
1139
  catch (e) {
1017
1140
  console.log(`platform: ${platformName} \n${e.stack}`);
1018
1141
  extraData.statusCode = e.response?.status ?? 'unknown';
1019
- res.status(400).send(e);
1142
+ res.status(400).send(tracer ? tracer.wrapResponse({ error: e.message || e }) : { error: e.message || e });
1143
+ tracer?.traceError('getCallLog:error', e, { platform: platformName });
1020
1144
  success = false;
1021
1145
  }
1022
1146
  const requestEndTime = new Date().getTime();
@@ -1039,6 +1163,8 @@ function createCoreRouter() {
1039
1163
  });
1040
1164
  router.post('/callLog', async function (req, res) {
1041
1165
  const requestStartTime = new Date().getTime();
1166
+ const tracer = req.headers['is-debug'] === 'true' ? DebugTracer.fromRequest(req) : null;
1167
+ tracer?.trace('createCallLog:start', { query: req.query });
1042
1168
  let platformName = null;
1043
1169
  let success = false;
1044
1170
  let extraData = {};
@@ -1048,7 +1174,8 @@ function createCoreRouter() {
1048
1174
  if (jwtToken) {
1049
1175
  const decodedToken = jwt.decodeJwt(jwtToken);
1050
1176
  if (!decodedToken) {
1051
- res.status(400).send('Please go to Settings and authorize CRM platform');
1177
+ tracer?.trace('createCallLog:invalidToken', {});
1178
+ res.status(400).send(tracer ? tracer.wrapResponse('Please go to Settings and authorize CRM platform') : 'Please go to Settings and authorize CRM platform');
1052
1179
  return;
1053
1180
  }
1054
1181
  const { id: userId, platform } = decodedToken;
@@ -1057,18 +1184,20 @@ function createCoreRouter() {
1057
1184
  if (extraDataTracking) {
1058
1185
  extraData = extraDataTracking;
1059
1186
  }
1060
- res.status(200).send({ successful, logId, returnMessage });
1187
+ res.status(200).send(tracer ? tracer.wrapResponse({ successful, logId, returnMessage }) : { successful, logId, returnMessage });
1061
1188
  success = true;
1062
1189
  }
1063
1190
  else {
1064
- res.status(400).send('Please go to Settings and authorize CRM platform');
1191
+ tracer?.trace('createCallLog:noToken', {});
1192
+ res.status(400).send(tracer ? tracer.wrapResponse('Please go to Settings and authorize CRM platform') : 'Please go to Settings and authorize CRM platform');
1065
1193
  success = false;
1066
1194
  }
1067
1195
  }
1068
1196
  catch (e) {
1069
1197
  console.log(`platform: ${platformName} \n${e.stack}`);
1070
1198
  extraData.statusCode = e.response?.status ?? 'unknown';
1071
- res.status(400).send(e);
1199
+ res.status(400).send(tracer ? tracer.wrapResponse({ error: e.message || e }) : { error: e.message || e });
1200
+ tracer?.traceError('createCallLog:error', e, { platform: platformName });
1072
1201
  success = false;
1073
1202
  }
1074
1203
  const requestEndTime = new Date().getTime();
@@ -1091,6 +1220,8 @@ function createCoreRouter() {
1091
1220
  });
1092
1221
  router.patch('/callLog', async function (req, res) {
1093
1222
  const requestStartTime = new Date().getTime();
1223
+ const tracer = req.headers['is-debug'] === 'true' ? DebugTracer.fromRequest(req) : null;
1224
+ tracer?.trace('updateCallLog:start', { query: req.query });
1094
1225
  let platformName = null;
1095
1226
  let success = false;
1096
1227
  let extraData = {};
@@ -1100,7 +1231,8 @@ function createCoreRouter() {
1100
1231
  if (jwtToken) {
1101
1232
  const decodedToken = jwt.decodeJwt(jwtToken);
1102
1233
  if (!decodedToken) {
1103
- res.status(400).send('Please go to Settings and authorize CRM platform');
1234
+ tracer?.trace('updateCallLog:invalidToken', {});
1235
+ res.status(400).send(tracer ? tracer.wrapResponse('Please go to Settings and authorize CRM platform') : 'Please go to Settings and authorize CRM platform');
1104
1236
  return;
1105
1237
  }
1106
1238
  const { id: userId, platform } = decodedToken;
@@ -1109,18 +1241,20 @@ function createCoreRouter() {
1109
1241
  if (extraDataTracking) {
1110
1242
  extraData = extraDataTracking;
1111
1243
  }
1112
- res.status(200).send({ successful, logId, updatedNote, returnMessage });
1244
+ res.status(200).send(tracer ? tracer.wrapResponse({ successful, logId, updatedNote, returnMessage }) : { successful, logId, updatedNote, returnMessage });
1113
1245
  success = true;
1114
1246
  }
1115
1247
  else {
1116
- res.status(400).send('Please go to Settings and authorize CRM platform');
1248
+ tracer?.trace('updateCallLog:noToken', {});
1249
+ res.status(400).send(tracer ? tracer.wrapResponse('Please go to Settings and authorize CRM platform') : 'Please go to Settings and authorize CRM platform');
1117
1250
  success = false;
1118
1251
  }
1119
1252
  }
1120
1253
  catch (e) {
1121
1254
  console.log(`platform: ${platformName} \n${e.stack}`);
1122
1255
  extraData.statusCode = e.response?.status ?? 'unknown';
1123
- res.status(400).send(e);
1256
+ res.status(400).send(tracer ? tracer.wrapResponse({ error: e.message || e }) : { error: e.message || e });
1257
+ tracer?.traceError('updateCallLog:error', e, { platform: platformName });
1124
1258
  success = false;
1125
1259
  }
1126
1260
  const requestEndTime = new Date().getTime();
@@ -1143,6 +1277,8 @@ function createCoreRouter() {
1143
1277
  });
1144
1278
  router.put('/callDisposition', async function (req, res) {
1145
1279
  const requestStartTime = new Date().getTime();
1280
+ const tracer = req.headers['is-debug'] === 'true' ? DebugTracer.fromRequest(req) : null;
1281
+ tracer?.trace('upsertCallDisposition:start', { query: req.query });
1146
1282
  let platformName = null;
1147
1283
  let success = false;
1148
1284
  let extraData = {};
@@ -1153,7 +1289,9 @@ function createCoreRouter() {
1153
1289
  const { id: userId, platform } = jwt.decodeJwt(jwtToken);
1154
1290
  platformName = platform;
1155
1291
  if (!userId) {
1156
- res.status(400).send();
1292
+ tracer?.trace('upsertCallDisposition:invalidToken', {});
1293
+ res.status(400).send(tracer ? tracer.wrapResponse('Please go to Settings and authorize CRM platform') : 'Please go to Settings and authorize CRM platform');
1294
+ return;
1157
1295
  }
1158
1296
  const { successful, returnMessage, extraDataTracking } = await dispositionCore.upsertCallDisposition({
1159
1297
  platform,
@@ -1165,18 +1303,20 @@ function createCoreRouter() {
1165
1303
  if (extraDataTracking) {
1166
1304
  extraData = extraDataTracking;
1167
1305
  }
1168
- res.status(200).send({ successful, returnMessage });
1306
+ res.status(200).send(tracer ? tracer.wrapResponse({ successful, returnMessage }) : { successful, returnMessage });
1169
1307
  success = true;
1170
1308
  }
1171
1309
  else {
1172
- res.status(400).send('Please go to Settings and authorize CRM platform');
1310
+ tracer?.trace('upsertCallDisposition:noToken', {});
1311
+ res.status(400).send(tracer ? tracer.wrapResponse('Please go to Settings and authorize CRM platform') : 'Please go to Settings and authorize CRM platform');
1173
1312
  success = false;
1174
1313
  }
1175
1314
  }
1176
1315
  catch (e) {
1177
1316
  console.log(`platform: ${platformName} \n${e.stack}`);
1178
1317
  extraData.statusCode = e.response?.status ?? 'unknown';
1179
- res.status(400).send(e);
1318
+ res.status(400).send(tracer ? tracer.wrapResponse({ error: e.message || e }) : { error: e.message || e });
1319
+ tracer?.traceError('upsertCallDisposition:error', e, { platform: platformName });
1180
1320
  success = false;
1181
1321
  }
1182
1322
  const requestEndTime = new Date().getTime();
@@ -1199,6 +1339,8 @@ function createCoreRouter() {
1199
1339
  });
1200
1340
  router.post('/messageLog', async function (req, res) {
1201
1341
  const requestStartTime = new Date().getTime();
1342
+ const tracer = req.headers['is-debug'] === 'true' ? DebugTracer.fromRequest(req) : null;
1343
+ tracer?.trace('createMessageLog:start', { query: req.query });
1202
1344
  let platformName = null;
1203
1345
  let success = false;
1204
1346
  let statusCode = 200;
@@ -1209,7 +1351,8 @@ function createCoreRouter() {
1209
1351
  if (jwtToken) {
1210
1352
  const decodedToken = jwt.decodeJwt(jwtToken);
1211
1353
  if (!decodedToken) {
1212
- res.status(400).send('Please go to Settings and authorize CRM platform');
1354
+ tracer?.trace('createMessageLog:invalidToken', {});
1355
+ res.status(400).send(tracer ? tracer.wrapResponse('Please go to Settings and authorize CRM platform') : 'Please go to Settings and authorize CRM platform');
1213
1356
  return;
1214
1357
  }
1215
1358
  const { id: userId, platform } = decodedToken;
@@ -1218,18 +1361,20 @@ function createCoreRouter() {
1218
1361
  if (extraDataTracking) {
1219
1362
  extraData = extraDataTracking;
1220
1363
  }
1221
- res.status(200).send({ successful, returnMessage, logIds });
1364
+ res.status(200).send(tracer ? tracer.wrapResponse({ successful, returnMessage, logIds }) : { successful, returnMessage, logIds });
1222
1365
  success = true;
1223
1366
  }
1224
1367
  else {
1225
- res.status(400).send('Please go to Settings and authorize CRM platform');
1368
+ tracer?.trace('createMessageLog:noToken', {});
1369
+ res.status(400).send(tracer ? tracer.wrapResponse('Please go to Settings and authorize CRM platform') : 'Please go to Settings and authorize CRM platform');
1226
1370
  success = false;
1227
1371
  }
1228
1372
  }
1229
1373
  catch (e) {
1230
1374
  console.log(`platform: ${platformName} \n${e.stack}`);
1231
1375
  statusCode = e.response?.status ?? 'unknown';
1232
- res.status(400).send(e);
1376
+ res.status(400).send(tracer ? tracer.wrapResponse({ error: e.message || e }) : { error: e.message || e });
1377
+ tracer?.traceError('createMessageLog:error', e, { platform: platformName });
1233
1378
  success = false;
1234
1379
  }
1235
1380
  const requestEndTime = new Date().getTime();
@@ -1251,9 +1396,10 @@ function createCoreRouter() {
1251
1396
  eventAddedVia
1252
1397
  });
1253
1398
  });
1254
-
1255
1399
  router.post('/calldown', async function (req, res) {
1256
1400
  const requestStartTime = new Date().getTime();
1401
+ const tracer = req.headers['is-debug'] === 'true' ? DebugTracer.fromRequest(req) : null;
1402
+ tracer?.trace('scheduleCallDown:start', { query: req.query });
1257
1403
  let platformName = null;
1258
1404
  let success = false;
1259
1405
  let statusCode = 200;
@@ -1261,16 +1407,18 @@ function createCoreRouter() {
1261
1407
  try {
1262
1408
  const jwtToken = req.query.jwtToken;
1263
1409
  if (!jwtToken) {
1264
- res.status(400).send('Please go to Settings and authorize CRM platform');
1410
+ tracer?.trace('scheduleCallDown:noToken', {});
1411
+ res.status(400).send(tracer ? tracer.wrapResponse('Please go to Settings and authorize CRM platform') : 'Please go to Settings and authorize CRM platform');
1265
1412
  return;
1266
1413
  }
1267
1414
  const { id } = await calldown.schedule({ jwtToken, rcAccessToken: req.query.rcAccessToken, body: req.body });
1268
1415
  success = true;
1269
- res.status(200).send({ successful: true, id });
1416
+ res.status(200).send(tracer ? tracer.wrapResponse({ successful: true, id }) : { successful: true, id });
1270
1417
  } catch (e) {
1271
1418
  console.log(`platform: ${platformName} \n${e.stack}`);
1272
1419
  statusCode = e.response?.status ?? 'unknown';
1273
- res.status(400).send(e);
1420
+ res.status(400).send(tracer ? tracer.wrapResponse({ error: e.message || e }) : { error: e.message || e });
1421
+ tracer?.traceError('scheduleCallDown:error', e, { platform: platformName });
1274
1422
  success = false;
1275
1423
  }
1276
1424
  const requestEndTime = new Date().getTime();
@@ -1291,10 +1439,10 @@ function createCoreRouter() {
1291
1439
  eventAddedVia
1292
1440
  });
1293
1441
  });
1294
-
1295
-
1296
1442
  router.get('/calldown', async function (req, res) {
1297
1443
  const requestStartTime = new Date().getTime();
1444
+ const tracer = req.headers['is-debug'] === 'true' ? DebugTracer.fromRequest(req) : null;
1445
+ tracer?.trace('getCallDownList:start', { query: req.query });
1298
1446
  let platformName = null;
1299
1447
  let success = false;
1300
1448
  let statusCode = 200;
@@ -1302,16 +1450,18 @@ function createCoreRouter() {
1302
1450
  try {
1303
1451
  const jwtToken = req.query.jwtToken;
1304
1452
  if (!jwtToken) {
1305
- res.status(400).send('Please go to Settings and authorize CRM platform');
1453
+ tracer?.trace('getCallDownList:noToken', {});
1454
+ res.status(400).send(tracer ? tracer.wrapResponse('Please go to Settings and authorize CRM platform') : 'Please go to Settings and authorize CRM platform');
1306
1455
  return;
1307
1456
  }
1308
1457
  const { items } = await calldown.list({ jwtToken, status: req.query.status });
1309
1458
  success = true;
1310
- res.status(200).send({ successful: true, items });
1459
+ res.status(200).send(tracer ? tracer.wrapResponse({ successful: true, items }) : { successful: true, items });
1311
1460
  } catch (e) {
1312
1461
  console.log(`platform: ${platformName} \n${e.stack}`);
1313
1462
  statusCode = e.response?.status ?? 'unknown';
1314
- res.status(400).send(e);
1463
+ res.status(400).send(tracer ? tracer.wrapResponse({ error: e.message || e }) : { error: e.message || e });
1464
+ tracer?.traceError('getCallDownList:error', e, { platform: platformName });
1315
1465
  success = false;
1316
1466
  }
1317
1467
  const requestEndTime = new Date().getTime();
@@ -1330,10 +1480,10 @@ function createCoreRouter() {
1330
1480
  eventAddedVia
1331
1481
  });
1332
1482
  });
1333
-
1334
-
1335
1483
  router.delete('/calldown/:id', async function (req, res) {
1336
1484
  const requestStartTime = new Date().getTime();
1485
+ const tracer = req.headers['is-debug'] === 'true' ? DebugTracer.fromRequest(req) : null;
1486
+ tracer?.trace('deleteCallDownItem:start', { query: req.query });
1337
1487
  let platformName = null;
1338
1488
  let success = false;
1339
1489
  let statusCode = 200;
@@ -1342,21 +1492,24 @@ function createCoreRouter() {
1342
1492
  const jwtToken = req.query.jwtToken;
1343
1493
  const id = req.query.id;
1344
1494
  if (!jwtToken) {
1345
- res.status(400).send('Please go to Settings and authorize CRM platform');
1495
+ tracer?.trace('deleteCallDownItem:noToken', {});
1496
+ res.status(400).send(tracer ? tracer.wrapResponse('Please go to Settings and authorize CRM platform') : 'Please go to Settings and authorize CRM platform');
1346
1497
  return;
1347
1498
  }
1348
1499
  const rid = req.params.id || id;
1349
1500
  if (!rid) {
1350
- res.status(400).send('Missing id');
1501
+ tracer?.trace('deleteCallDownItem:missingId', {});
1502
+ res.status(400).send(tracer ? tracer.wrapResponse('Missing id') : 'Missing id');
1351
1503
  return;
1352
1504
  }
1353
1505
  await calldown.remove({ jwtToken, id: rid });
1354
1506
  success = true;
1355
- res.status(200).send({ successful: true });
1507
+ res.status(200).send(tracer ? tracer.wrapResponse({ successful: true }) : { successful: true });
1356
1508
  } catch (e) {
1357
1509
  console.log(`platform: ${platformName} \n${e.stack}`);
1358
1510
  statusCode = e.response?.status ?? 'unknown';
1359
- res.status(400).send(e);
1511
+ res.status(400).send(tracer ? tracer.wrapResponse({ error: e.message || e }) : { error: e.message || e });
1512
+ tracer?.traceError('deleteCallDownItem:error', e, { platform: platformName });
1360
1513
  success = false;
1361
1514
  }
1362
1515
  const requestEndTime = new Date().getTime();
@@ -1375,10 +1528,10 @@ function createCoreRouter() {
1375
1528
  eventAddedVia
1376
1529
  });
1377
1530
  });
1378
-
1379
-
1380
1531
  router.patch('/calldown/:id', async function (req, res) {
1381
1532
  const requestStartTime = new Date().getTime();
1533
+ const tracer = req.headers['is-debug'] === 'true' ? DebugTracer.fromRequest(req) : null;
1534
+ tracer?.trace('markCallDownCalled:start', { query: req.query });
1382
1535
  let platformName = null;
1383
1536
  let success = false;
1384
1537
  let statusCode = 200;
@@ -1386,21 +1539,24 @@ function createCoreRouter() {
1386
1539
  try {
1387
1540
  const jwtToken = req.query.jwtToken;
1388
1541
  if (!jwtToken) {
1389
- res.status(400).send('Please go to Settings and authorize CRM platform');
1542
+ tracer?.trace('markCallDownCalled:noToken', {});
1543
+ res.status(400).send(tracer ? tracer.wrapResponse('Please go to Settings and authorize CRM platform') : 'Please go to Settings and authorize CRM platform');
1390
1544
  return;
1391
1545
  }
1392
1546
  const id = req.params.id || req.body?.id;
1393
1547
  if (!id) {
1394
- res.status(400).send('Missing id');
1548
+ tracer?.trace('markCallDownCalled:missingId', {});
1549
+ res.status(400).send(tracer ? tracer.wrapResponse('Missing id') : 'Missing id');
1395
1550
  return;
1396
1551
  }
1397
- await calldown.markCalled({ jwtToken, id, lastCallAt: req.body?.lastCallAt });
1552
+ await calldown.update({ jwtToken, id, updateData: req.body });
1398
1553
  success = true;
1399
- res.status(200).send({ successful: true });
1554
+ res.status(200).send(tracer ? tracer.wrapResponse({ successful: true }) : { successful: true });
1400
1555
  } catch (e) {
1401
1556
  console.log(`platform: ${platformName} \n${e.stack}`);
1402
1557
  statusCode = e.response?.status ?? 'unknown';
1403
- res.status(400).send(e);
1558
+ res.status(400).send(tracer ? tracer.wrapResponse({ error: e.message || e }) : { error: e.message || e });
1559
+ tracer?.traceError('markCallDownCalled:error', e, { platform: platformName });
1404
1560
  success = false;
1405
1561
  }
1406
1562
  const requestEndTime = new Date().getTime();
@@ -1419,9 +1575,10 @@ function createCoreRouter() {
1419
1575
  eventAddedVia
1420
1576
  });
1421
1577
  });
1422
-
1423
1578
  router.get('/custom/contact/search', async function (req, res) {
1424
1579
  const requestStartTime = new Date().getTime();
1580
+ const tracer = req.headers['is-debug'] === 'true' ? DebugTracer.fromRequest(req) : null;
1581
+ tracer?.trace('contactSearchByName:start', { query: req.query });
1425
1582
  let platformName = null;
1426
1583
  let success = false;
1427
1584
  let resultCount = 0;
@@ -1433,11 +1590,12 @@ function createCoreRouter() {
1433
1590
  const { id: userId, platform } = jwt.decodeJwt(jwtToken);
1434
1591
  platformName = platform;
1435
1592
  const { successful, returnMessage, contact } = await contactCore.findContactWithName({ platform, userId, name: req.query.name });
1436
- res.status(200).send({ successful, returnMessage, contact });
1593
+ res.status(200).send(tracer ? tracer.wrapResponse({ successful, returnMessage, contact }) : { successful, returnMessage, contact });
1437
1594
  success = successful;
1438
1595
  }
1439
1596
  else {
1440
- res.status(400).send('Please go to Settings and authorize CRM platform');
1597
+ tracer?.trace('contactSearchByName:noToken', {});
1598
+ res.status(400).send(tracer ? tracer.wrapResponse('Please go to Settings and authorize CRM platform') : 'Please go to Settings and authorize CRM platform');
1441
1599
  success = false;
1442
1600
  }
1443
1601
 
@@ -1445,7 +1603,8 @@ function createCoreRouter() {
1445
1603
  catch (e) {
1446
1604
  console.log(`platform: ${platformName} \n${e.stack}`);
1447
1605
  statusCode = e.response?.status ?? 'unknown';
1448
- res.status(400).send(e);
1606
+ res.status(400).send(tracer ? tracer.wrapResponse({ error: e.message || e }) : { error: e.message || e });
1607
+ tracer?.traceError('contactSearchByName:error', e, { platform: platformName });
1449
1608
  success = false;
1450
1609
  }
1451
1610
  const requestEndTime = new Date().getTime();
@@ -1465,9 +1624,10 @@ function createCoreRouter() {
1465
1624
  }
1466
1625
  });
1467
1626
  });
1468
-
1469
1627
  router.get('/ringcentral/admin/report', async function (req, res) {
1470
1628
  const requestStartTime = new Date().getTime();
1629
+ const tracer = req.headers['is-debug'] === 'true' ? DebugTracer.fromRequest(req) : null;
1630
+ tracer?.trace('getAdminReport:start', { query: req.query });
1471
1631
  let platformName = null;
1472
1632
  let success = false;
1473
1633
  const { hashedExtensionId, hashedAccountId, userAgent, ip, author, eventAddedVia } = getAnalyticsVariablesInReqHeaders({ headers: req.headers })
@@ -1477,20 +1637,23 @@ function createCoreRouter() {
1477
1637
  const unAuthData = jwt.decodeJwt(jwtToken);
1478
1638
  const user = await UserModel.findByPk(unAuthData?.id);
1479
1639
  if (!user) {
1480
- res.status(400).send('User not found');
1640
+ tracer?.trace('getAdminReport:userNotFound', {});
1641
+ res.status(400).send(tracer ? tracer.wrapResponse('User not found') : 'User not found');
1481
1642
  return;
1482
1643
  }
1483
- const report = await adminCore.getAdminReport({ rcAccountId: user.rcAccountId, timezone: req.query.timezone, timeFrom: req.query.timeFrom, timeTo: req.query.timeTo });
1484
- res.status(200).send(report);
1644
+ const report = await adminCore.getAdminReport({ rcAccountId: user.rcAccountId, timezone: req.query.timezone, timeFrom: req.query.timeFrom, timeTo: req.query.timeTo, groupBy: req.query.groupBy });
1645
+ res.status(200).send(tracer ? tracer.wrapResponse(report) : report);
1485
1646
  success = true;
1486
1647
  return;
1487
1648
  }
1488
- res.status(400).send('Invalid request');
1649
+ tracer?.trace('getAdminReport:invalidRequest', {});
1650
+ res.status(400).send(tracer ? tracer.wrapResponse('Invalid request') : 'Invalid request');
1489
1651
  success = false;
1490
1652
  }
1491
1653
  catch (e) {
1492
1654
  console.log(`${e.stack}`);
1493
- res.status(400).send(e);
1655
+ res.status(400).send(tracer ? tracer.wrapResponse({ error: e.message || e }) : { error: e.message || e });
1656
+ tracer?.traceError('getAdminReport:error', e, { platform: platformName });
1494
1657
  }
1495
1658
  const requestEndTime = new Date().getTime();
1496
1659
  analytics.track({
@@ -1507,9 +1670,10 @@ function createCoreRouter() {
1507
1670
  eventAddedVia
1508
1671
  });
1509
1672
  });
1510
-
1511
1673
  router.get('/ringcentral/admin/userReport', async function (req, res) {
1512
1674
  const requestStartTime = new Date().getTime();
1675
+ const tracer = req.headers['is-debug'] === 'true' ? DebugTracer.fromRequest(req) : null;
1676
+ tracer?.trace('getUserReport:start', { query: req.query });
1513
1677
  let platformName = null;
1514
1678
  let success = false;
1515
1679
  const { hashedExtensionId, hashedAccountId, userAgent, ip, author, eventAddedVia } = getAnalyticsVariablesInReqHeaders({ headers: req.headers })
@@ -1519,19 +1683,22 @@ function createCoreRouter() {
1519
1683
  const unAuthData = jwt.decodeJwt(jwtToken);
1520
1684
  const user = await UserModel.findByPk(unAuthData?.id);
1521
1685
  if (!user) {
1522
- res.status(400).send('User not found');
1686
+ tracer?.trace('getUserReport:userNotFound', {});
1687
+ res.status(400).send(tracer ? tracer.wrapResponse('User not found') : 'User not found');
1523
1688
  return;
1524
1689
  }
1525
1690
  const report = await adminCore.getUserReport({ rcAccountId: user.rcAccountId, rcExtensionId: req.query.rcExtensionId, timezone: req.query.timezone, timeFrom: req.query.timeFrom, timeTo: req.query.timeTo });
1526
- res.status(200).send(report);
1691
+ res.status(200).send(tracer ? tracer.wrapResponse(report) : report);
1527
1692
  return;
1528
1693
  }
1529
- res.status(400).send('Invalid request');
1694
+ tracer?.trace('getUserReport:invalidRequest', {});
1695
+ res.status(400).send(tracer ? tracer.wrapResponse('Invalid request') : 'Invalid request');
1530
1696
  success = false;
1531
1697
  }
1532
1698
  catch (e) {
1533
1699
  console.log(`${e.stack}`);
1534
- res.status(400).send(e);
1700
+ res.status(400).send(tracer ? tracer.wrapResponse({ error: e.message || e }) : { error: e.message || e });
1701
+ tracer?.traceError('getUserReport:error', e, { platform: platformName });
1535
1702
  }
1536
1703
  const requestEndTime = new Date().getTime();
1537
1704
  analytics.track({
@@ -1548,22 +1715,59 @@ function createCoreRouter() {
1548
1715
  eventAddedVia
1549
1716
  });
1550
1717
  });
1551
-
1552
1718
  router.get('/ringcentral/oauth/callback', async function (req, res) {
1719
+ const tracer = req.headers['is-debug'] === 'true' ? DebugTracer.fromRequest(req) : null;
1720
+ tracer?.trace('onRingcentralOAuthCallback:start', { query: req.query });
1553
1721
  const jwtToken = req.query.jwtToken;
1554
1722
  if (jwtToken) {
1555
1723
  const unAuthData = jwt.decodeJwt(jwtToken);
1556
1724
  const { code } = req.query;
1557
1725
  const user = await UserModel.findByPk(unAuthData?.id);
1558
1726
  if (!user) {
1559
- res.status(400).send('User not found');
1727
+ tracer?.trace('onRingcentralOAuthCallback:userNotFound', {});
1728
+ res.status(400).send(tracer ? tracer.wrapResponse('User not found') : 'User not found');
1560
1729
  return;
1561
1730
  }
1562
1731
  await authCore.onRingcentralOAuthCallback({ code, rcAccountId: user.rcAccountId });
1563
- res.status(200).send('OK');
1732
+ res.status(200).send(tracer ? tracer.wrapResponse({ successful: true }) : { successful: true });
1564
1733
  return;
1565
1734
  }
1566
- res.status(400).send('Invalid request');
1735
+ tracer?.trace('onRingcentralOAuthCallback:invalidRequest', {});
1736
+ res.status(400).send(tracer ? tracer.wrapResponse('Invalid request') : 'Invalid request');
1737
+ });
1738
+ router.get('/debug/report/url', async function (req, res) {
1739
+ const requestStartTime = new Date().getTime();
1740
+ const tracer = req.headers['is-debug'] === 'true' ? DebugTracer.fromRequest(req) : null;
1741
+ tracer?.trace('getErrorLogReportURL:start', { query: req.query });
1742
+ let platformName = null;
1743
+ let success = false;
1744
+ const { hashedExtensionId, hashedAccountId, userAgent, ip, author, eventAddedVia } = getAnalyticsVariablesInReqHeaders({ headers: req.headers })
1745
+ const jwtToken = req.query.jwtToken;
1746
+ if (jwtToken) {
1747
+ const unAuthData = jwt.decodeJwt(jwtToken);
1748
+ const uploadUrl = await s3ErrorLogReport.getUploadUrl({ userId: unAuthData?.id, platform: unAuthData?.platform });
1749
+ res.status(200).send(tracer ? tracer.wrapResponse({ presignedUrl: uploadUrl }) : { presignedUrl: uploadUrl });
1750
+ success = true;
1751
+ }
1752
+ else {
1753
+ tracer?.trace('getErrorLogReportURL:invalidRequest', {});
1754
+ res.status(400).send(tracer ? tracer.wrapResponse('Invalid request') : 'Invalid request');
1755
+ success = false;
1756
+ }
1757
+ const requestEndTime = new Date().getTime();
1758
+ analytics.track({
1759
+ eventName: 'Get error log report URL',
1760
+ interfaceName: 'getErrorLogReportURL',
1761
+ connectorName: platformName,
1762
+ accountId: hashedAccountId,
1763
+ extensionId: hashedExtensionId,
1764
+ success,
1765
+ requestDuration: (requestEndTime - requestStartTime) / 1000,
1766
+ userAgent,
1767
+ ip,
1768
+ author,
1769
+ eventAddedVia
1770
+ });
1567
1771
  });
1568
1772
 
1569
1773
  if (process.env.IS_PROD === 'false') {
@@ -1626,6 +1830,15 @@ function createCoreRouter() {
1626
1830
  function createCoreMiddleware() {
1627
1831
  return [
1628
1832
  bodyParser.json(),
1833
+ bodyParser.xml({
1834
+ limit: '50mb',
1835
+ xmlParseOptions: {
1836
+ explicitArray: false,
1837
+ normalize: true,
1838
+ normalizeTags: false,
1839
+ trim: true
1840
+ }
1841
+ }),
1629
1842
  cors({
1630
1843
  methods: ['GET', 'POST', 'PATCH', 'PUT', 'DELETE']
1631
1844
  })
@@ -1674,3 +1887,4 @@ exports.createCoreApp = createCoreApp;
1674
1887
  exports.initializeCore = initializeCore;
1675
1888
  exports.connectorRegistry = connectorRegistry;
1676
1889
  exports.proxyConnector = proxyConnector;
1890
+ exports.DebugTracer = DebugTracer;