@app-connect/core 1.7.4 → 1.7.8

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