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