@app-connect/core 1.7.15 → 1.7.17
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/handlers/admin.js +23 -1
- package/handlers/contact.js +36 -4
- package/handlers/disposition.js +11 -0
- package/handlers/log.js +112 -24
- package/index.js +110 -57
- package/lib/oauth.js +22 -15
- package/package.json +72 -72
- package/releaseNotes.json +28 -0
- package/test/handlers/log.test.js +225 -0
- package/test/setup.js +176 -176
package/index.js
CHANGED
|
@@ -333,7 +333,7 @@ function createCoreRouter() {
|
|
|
333
333
|
}
|
|
334
334
|
else {
|
|
335
335
|
tracer?.trace('setAdminSettings:adminValidationFailed', {});
|
|
336
|
-
res.status(
|
|
336
|
+
res.status(403).send(tracer ? tracer.wrapResponse('Admin validation failed') : 'Admin validation failed');
|
|
337
337
|
success = false;
|
|
338
338
|
}
|
|
339
339
|
}
|
|
@@ -395,7 +395,7 @@ function createCoreRouter() {
|
|
|
395
395
|
}
|
|
396
396
|
else {
|
|
397
397
|
tracer?.trace('getAdminSettings:adminValidationFailed', {});
|
|
398
|
-
res.status(
|
|
398
|
+
res.status(403).send(tracer ? tracer.wrapResponse('Admin validation failed') : 'Admin validation failed');
|
|
399
399
|
success = true;
|
|
400
400
|
}
|
|
401
401
|
}
|
|
@@ -447,12 +447,18 @@ function createCoreRouter() {
|
|
|
447
447
|
const hashedRcAccountId = util.getHashValue(rcAccountId, process.env.HASH_KEY);
|
|
448
448
|
if (isValidated) {
|
|
449
449
|
const userMapping = await adminCore.getUserMapping({ user, hashedRcAccountId, rcExtensionList: req.body.rcExtensionList });
|
|
450
|
-
|
|
451
|
-
|
|
450
|
+
if (userMapping?.isRevokeUserSession) {
|
|
451
|
+
res.status(401).send(tracer ? tracer.wrapResponse(userMapping) : userMapping);
|
|
452
|
+
success = false;
|
|
453
|
+
}
|
|
454
|
+
else {
|
|
455
|
+
res.status(200).send(tracer ? tracer.wrapResponse(userMapping) : userMapping);
|
|
456
|
+
success = true;
|
|
457
|
+
}
|
|
452
458
|
}
|
|
453
459
|
else {
|
|
454
460
|
tracer?.trace('getUserMapping:adminValidationFailed', {});
|
|
455
|
-
res.status(
|
|
461
|
+
res.status(403).send(tracer ? tracer.wrapResponse('Admin validation failed') : 'Admin validation failed');
|
|
456
462
|
success = true;
|
|
457
463
|
}
|
|
458
464
|
}
|
|
@@ -504,12 +510,18 @@ function createCoreRouter() {
|
|
|
504
510
|
const hashedRcAccountId = util.getHashValue(rcAccountId, process.env.HASH_KEY);
|
|
505
511
|
if (isValidated) {
|
|
506
512
|
const userMapping = await adminCore.reinitializeUserMapping({ user, hashedRcAccountId, rcExtensionList: req.body.rcExtensionList });
|
|
507
|
-
|
|
508
|
-
|
|
513
|
+
if (userMapping?.isRevokeUserSession) {
|
|
514
|
+
res.status(401).send(tracer ? tracer.wrapResponse(userMapping) : userMapping);
|
|
515
|
+
success = false;
|
|
516
|
+
}
|
|
517
|
+
else {
|
|
518
|
+
res.status(200).send(tracer ? tracer.wrapResponse(userMapping) : userMapping);
|
|
519
|
+
success = true;
|
|
520
|
+
}
|
|
509
521
|
}
|
|
510
522
|
else {
|
|
511
523
|
tracer?.trace('reinitializeUserMapping:adminValidationFailed', {});
|
|
512
|
-
res.status(
|
|
524
|
+
res.status(403).send(tracer ? tracer.wrapResponse('Admin validation failed') : 'Admin validation failed');
|
|
513
525
|
success = true;
|
|
514
526
|
}
|
|
515
527
|
}
|
|
@@ -825,8 +837,7 @@ function createCoreRouter() {
|
|
|
825
837
|
const stateParams = new URLSearchParams(state ? decodeURIComponent(state) : '');
|
|
826
838
|
platformName = stateParams.get('platform');
|
|
827
839
|
// backward compatibility
|
|
828
|
-
if(!platformName)
|
|
829
|
-
{
|
|
840
|
+
if (!platformName) {
|
|
830
841
|
platformName = req.query.callbackUri?.split('platform=')[1] ?? state.split('platform=')[1];
|
|
831
842
|
}
|
|
832
843
|
// Extract mcp auth sessionId if present
|
|
@@ -870,7 +881,7 @@ function createCoreRouter() {
|
|
|
870
881
|
res.status(200).send("Authentication successful. Please go back to AI Agent and confirm it.");
|
|
871
882
|
success = true;
|
|
872
883
|
}
|
|
873
|
-
else {
|
|
884
|
+
else {
|
|
874
885
|
res.status(200).send(tracer ? tracer.wrapResponse({ jwtToken, name: userInfo.name, returnMessage }) : { jwtToken, name: userInfo.name, returnMessage });
|
|
875
886
|
success = true;
|
|
876
887
|
}
|
|
@@ -1057,7 +1068,7 @@ function createCoreRouter() {
|
|
|
1057
1068
|
}
|
|
1058
1069
|
const { id: userId, platform } = decodedToken;
|
|
1059
1070
|
platformName = platform;
|
|
1060
|
-
const { successful, returnMessage, contact, extraDataTracking } = await contactCore.findContact({
|
|
1071
|
+
const { successful, returnMessage, contact, extraDataTracking, isRevokeUserSession } = await contactCore.findContact({
|
|
1061
1072
|
platform,
|
|
1062
1073
|
userId,
|
|
1063
1074
|
phoneNumber: req.query.phoneNumber.replace(' ', '+'),
|
|
@@ -1066,15 +1077,21 @@ function createCoreRouter() {
|
|
|
1066
1077
|
tracer,
|
|
1067
1078
|
isForceRefreshAccountData: req.query?.isForceRefreshAccountData === 'true'
|
|
1068
1079
|
});
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
const nonNewContact = contact?.filter(c => !c.isNewContact) ?? [];
|
|
1073
|
-
resultCount = nonNewContact.length;
|
|
1080
|
+
if (isRevokeUserSession) {
|
|
1081
|
+
res.status(401).send(tracer ? tracer.wrapResponse({ successful, returnMessage }) : { successful, returnMessage });
|
|
1082
|
+
success = false;
|
|
1074
1083
|
}
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1084
|
+
else {
|
|
1085
|
+
tracer?.trace('findContact:result', { successful, returnMessage, contact });
|
|
1086
|
+
res.status(200).send(tracer ? tracer.wrapResponse({ successful, returnMessage, contact }) : { successful, returnMessage, contact });
|
|
1087
|
+
if (successful) {
|
|
1088
|
+
const nonNewContact = contact?.filter(c => !c.isNewContact) ?? [];
|
|
1089
|
+
resultCount = nonNewContact.length;
|
|
1090
|
+
}
|
|
1091
|
+
success = successful;
|
|
1092
|
+
if (extraDataTracking) {
|
|
1093
|
+
extraData = extraDataTracking;
|
|
1094
|
+
}
|
|
1078
1095
|
}
|
|
1079
1096
|
}
|
|
1080
1097
|
else {
|
|
@@ -1128,11 +1145,17 @@ function createCoreRouter() {
|
|
|
1128
1145
|
}
|
|
1129
1146
|
const { id: userId, platform } = decodedToken;
|
|
1130
1147
|
platformName = platform;
|
|
1131
|
-
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 });
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1148
|
+
const { successful, returnMessage, contact, extraDataTracking, isRevokeUserSession } = await contactCore.createContact({ platform, userId, phoneNumber: req.body.phoneNumber, newContactName: req.body.newContactName, newContactType: req.body.newContactType, additionalSubmission: req.body.additionalSubmission });
|
|
1149
|
+
if (isRevokeUserSession) {
|
|
1150
|
+
res.status(401).send(tracer ? tracer.wrapResponse({ successful, returnMessage }) : { successful, returnMessage });
|
|
1151
|
+
success = false;
|
|
1152
|
+
}
|
|
1153
|
+
else {
|
|
1154
|
+
res.status(200).send(tracer ? tracer.wrapResponse({ successful, returnMessage, contact }) : { successful, returnMessage, contact });
|
|
1155
|
+
success = true;
|
|
1156
|
+
if (extraDataTracking) {
|
|
1157
|
+
extraData = extraDataTracking;
|
|
1158
|
+
}
|
|
1136
1159
|
}
|
|
1137
1160
|
}
|
|
1138
1161
|
else {
|
|
@@ -1236,13 +1259,19 @@ function createCoreRouter() {
|
|
|
1236
1259
|
}
|
|
1237
1260
|
const { id: userId, platform } = decodedToken;
|
|
1238
1261
|
platformName = platform;
|
|
1239
|
-
const { successful, logs, returnMessage, extraDataTracking } = await logCore.getCallLog({ userId, sessionIds: req.query.sessionIds, platform, requireDetails: req.query.requireDetails === 'true' });
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1262
|
+
const { successful, logs, returnMessage, extraDataTracking, isRevokeUserSession } = await logCore.getCallLog({ userId, sessionIds: req.query.sessionIds, platform, requireDetails: req.query.requireDetails === 'true' });
|
|
1263
|
+
if (isRevokeUserSession) {
|
|
1264
|
+
res.status(401).send(tracer ? tracer.wrapResponse({ successful, returnMessage }) : { successful, returnMessage });
|
|
1265
|
+
success = false;
|
|
1266
|
+
}
|
|
1267
|
+
else {
|
|
1268
|
+
res.status(200).send(tracer ? tracer.wrapResponse({ successful, logs, returnMessage }) : { successful, logs, returnMessage });
|
|
1269
|
+
success = true;
|
|
1270
|
+
if (extraDataTracking) {
|
|
1271
|
+
extraData = extraDataTracking;
|
|
1272
|
+
}
|
|
1273
|
+
extraData.requireDetails = req.query.requireDetails === 'true';
|
|
1244
1274
|
}
|
|
1245
|
-
extraData.requireDetails = req.query.requireDetails === 'true';
|
|
1246
1275
|
}
|
|
1247
1276
|
else {
|
|
1248
1277
|
tracer?.trace('getCallLog:noToken', {});
|
|
@@ -1294,12 +1323,18 @@ function createCoreRouter() {
|
|
|
1294
1323
|
}
|
|
1295
1324
|
const { id: userId, platform } = decodedToken;
|
|
1296
1325
|
platformName = platform;
|
|
1297
|
-
const { successful, logId, returnMessage, extraDataTracking } = await logCore.createCallLog({ platform, userId, incomingData: req.body, hashedAccountId: hashedAccountId ?? util.getHashValue(req.body.logInfo?.accountId, process.env.HASH_KEY), isFromSSCL: userAgent === 'SSCL' });
|
|
1298
|
-
if (
|
|
1299
|
-
|
|
1326
|
+
const { successful, logId, returnMessage, extraDataTracking, isRevokeUserSession } = await logCore.createCallLog({ platform, userId, incomingData: req.body, hashedAccountId: hashedAccountId ?? util.getHashValue(req.body.logInfo?.accountId, process.env.HASH_KEY), isFromSSCL: userAgent === 'SSCL' });
|
|
1327
|
+
if (isRevokeUserSession) {
|
|
1328
|
+
res.status(401).send(tracer ? tracer.wrapResponse({ successful, returnMessage }) : { successful, returnMessage });
|
|
1329
|
+
success = false;
|
|
1330
|
+
}
|
|
1331
|
+
else {
|
|
1332
|
+
if (extraDataTracking) {
|
|
1333
|
+
extraData = extraDataTracking;
|
|
1334
|
+
}
|
|
1335
|
+
res.status(200).send(tracer ? tracer.wrapResponse({ successful, logId, returnMessage }) : { successful, logId, returnMessage });
|
|
1336
|
+
success = true;
|
|
1300
1337
|
}
|
|
1301
|
-
res.status(200).send(tracer ? tracer.wrapResponse({ successful, logId, returnMessage }) : { successful, logId, returnMessage });
|
|
1302
|
-
success = true;
|
|
1303
1338
|
}
|
|
1304
1339
|
else {
|
|
1305
1340
|
tracer?.trace('createCallLog:noToken', {});
|
|
@@ -1407,18 +1442,24 @@ function createCoreRouter() {
|
|
|
1407
1442
|
res.status(400).send(tracer ? tracer.wrapResponse('Please go to Settings and authorize CRM platform') : 'Please go to Settings and authorize CRM platform');
|
|
1408
1443
|
return;
|
|
1409
1444
|
}
|
|
1410
|
-
const { successful, returnMessage, extraDataTracking } = await dispositionCore.upsertCallDisposition({
|
|
1445
|
+
const { successful, returnMessage, extraDataTracking, isRevokeUserSession } = await dispositionCore.upsertCallDisposition({
|
|
1411
1446
|
platform,
|
|
1412
1447
|
userId,
|
|
1413
1448
|
sessionId: req.body.sessionId,
|
|
1414
1449
|
dispositions: req.body.dispositions,
|
|
1415
1450
|
additionalSubmission: req.body.additionalSubmission
|
|
1416
1451
|
});
|
|
1417
|
-
if (
|
|
1418
|
-
|
|
1452
|
+
if (isRevokeUserSession) {
|
|
1453
|
+
res.status(401).send(tracer ? tracer.wrapResponse({ successful, returnMessage }) : { successful, returnMessage });
|
|
1454
|
+
success = false;
|
|
1455
|
+
}
|
|
1456
|
+
else {
|
|
1457
|
+
if (extraDataTracking) {
|
|
1458
|
+
extraData = extraDataTracking;
|
|
1459
|
+
}
|
|
1460
|
+
res.status(200).send(tracer ? tracer.wrapResponse({ successful, returnMessage }) : { successful, returnMessage });
|
|
1461
|
+
success = true;
|
|
1419
1462
|
}
|
|
1420
|
-
res.status(200).send(tracer ? tracer.wrapResponse({ successful, returnMessage }) : { successful, returnMessage });
|
|
1421
|
-
success = true;
|
|
1422
1463
|
}
|
|
1423
1464
|
else {
|
|
1424
1465
|
tracer?.trace('upsertCallDisposition:noToken', {});
|
|
@@ -1435,8 +1476,8 @@ function createCoreRouter() {
|
|
|
1435
1476
|
}
|
|
1436
1477
|
const requestEndTime = new Date().getTime();
|
|
1437
1478
|
analytics.track({
|
|
1438
|
-
eventName: '
|
|
1439
|
-
interfaceName: '
|
|
1479
|
+
eventName: 'Disposition call log',
|
|
1480
|
+
interfaceName: 'dispositionCallLog',
|
|
1440
1481
|
connectorName: platformName,
|
|
1441
1482
|
accountId: hashedAccountId,
|
|
1442
1483
|
extensionId: hashedExtensionId,
|
|
@@ -1471,12 +1512,18 @@ function createCoreRouter() {
|
|
|
1471
1512
|
}
|
|
1472
1513
|
const { id: userId, platform } = decodedToken;
|
|
1473
1514
|
platformName = platform;
|
|
1474
|
-
const { successful, returnMessage, logIds, extraDataTracking } = await logCore.createMessageLog({ platform, userId, incomingData: req.body });
|
|
1475
|
-
if (
|
|
1476
|
-
|
|
1515
|
+
const { successful, returnMessage, logIds, extraDataTracking, isRevokeUserSession } = await logCore.createMessageLog({ platform, userId, incomingData: req.body });
|
|
1516
|
+
if (isRevokeUserSession) {
|
|
1517
|
+
res.status(401).send(tracer ? tracer.wrapResponse({ successful, returnMessage }) : { successful, returnMessage });
|
|
1518
|
+
success = false;
|
|
1519
|
+
}
|
|
1520
|
+
else {
|
|
1521
|
+
if (extraDataTracking) {
|
|
1522
|
+
extraData = extraDataTracking;
|
|
1523
|
+
}
|
|
1524
|
+
res.status(200).send(tracer ? tracer.wrapResponse({ successful, returnMessage, logIds }) : { successful, returnMessage, logIds });
|
|
1525
|
+
success = true;
|
|
1477
1526
|
}
|
|
1478
|
-
res.status(200).send(tracer ? tracer.wrapResponse({ successful, returnMessage, logIds }) : { successful, returnMessage, logIds });
|
|
1479
|
-
success = true;
|
|
1480
1527
|
}
|
|
1481
1528
|
else {
|
|
1482
1529
|
tracer?.trace('createMessageLog:noToken', {});
|
|
@@ -1707,9 +1754,15 @@ function createCoreRouter() {
|
|
|
1707
1754
|
if (jwtToken) {
|
|
1708
1755
|
const { id: userId, platform } = jwt.decodeJwt(jwtToken);
|
|
1709
1756
|
platformName = platform;
|
|
1710
|
-
const { successful, returnMessage, contact } = await contactCore.findContactWithName({ platform, userId, name: req.query.name });
|
|
1711
|
-
|
|
1712
|
-
|
|
1757
|
+
const { successful, returnMessage, contact, isRevokeUserSession } = await contactCore.findContactWithName({ platform, userId, name: req.query.name });
|
|
1758
|
+
if (isRevokeUserSession) {
|
|
1759
|
+
res.status(401).send(tracer ? tracer.wrapResponse({ successful, returnMessage }) : { successful, returnMessage });
|
|
1760
|
+
success = false;
|
|
1761
|
+
}
|
|
1762
|
+
else {
|
|
1763
|
+
res.status(200).send(tracer ? tracer.wrapResponse({ successful, returnMessage, contact }) : { successful, returnMessage, contact });
|
|
1764
|
+
success = successful;
|
|
1765
|
+
}
|
|
1713
1766
|
}
|
|
1714
1767
|
else {
|
|
1715
1768
|
tracer?.trace('contactSearchByName:noToken', {});
|
|
@@ -1896,7 +1949,7 @@ function createCoreRouter() {
|
|
|
1896
1949
|
res.status(200).send(mockUser ? 'Mock user registered' : 'Mock user already existed');
|
|
1897
1950
|
}
|
|
1898
1951
|
else {
|
|
1899
|
-
res.status(
|
|
1952
|
+
res.status(403).send('Unauthorized');
|
|
1900
1953
|
}
|
|
1901
1954
|
});
|
|
1902
1955
|
router.delete('/deleteMockUser', async function (req, res) {
|
|
@@ -1906,7 +1959,7 @@ function createCoreRouter() {
|
|
|
1906
1959
|
res.status(200).send(foundAndDeleted ? 'Mock user deleted' : 'Mock user not found');
|
|
1907
1960
|
}
|
|
1908
1961
|
else {
|
|
1909
|
-
res.status(
|
|
1962
|
+
res.status(403).send('Unauthorized');
|
|
1910
1963
|
}
|
|
1911
1964
|
});
|
|
1912
1965
|
router.get('/mockCallLog', async function (req, res) {
|
|
@@ -1916,7 +1969,7 @@ function createCoreRouter() {
|
|
|
1916
1969
|
res.status(200).send(callLogs);
|
|
1917
1970
|
}
|
|
1918
1971
|
else {
|
|
1919
|
-
res.status(
|
|
1972
|
+
res.status(403).send('Unauthorized');
|
|
1920
1973
|
}
|
|
1921
1974
|
});
|
|
1922
1975
|
router.post('/mockCallLog', async function (req, res) {
|
|
@@ -1926,7 +1979,7 @@ function createCoreRouter() {
|
|
|
1926
1979
|
res.status(200).send('Mock call log created');
|
|
1927
1980
|
}
|
|
1928
1981
|
else {
|
|
1929
|
-
res.status(
|
|
1982
|
+
res.status(403).send('Unauthorized');
|
|
1930
1983
|
}
|
|
1931
1984
|
});
|
|
1932
1985
|
router.delete('/mockCallLog', async function (req, res) {
|
|
@@ -1936,7 +1989,7 @@ function createCoreRouter() {
|
|
|
1936
1989
|
res.status(200).send('Mock call logs cleaned up');
|
|
1937
1990
|
}
|
|
1938
1991
|
else {
|
|
1939
|
-
res.status(
|
|
1992
|
+
res.status(403).send('Unauthorized');
|
|
1940
1993
|
}
|
|
1941
1994
|
});
|
|
1942
1995
|
}
|
|
@@ -1944,7 +1997,7 @@ function createCoreRouter() {
|
|
|
1944
1997
|
router.get('/.well-known/openai-apps-challenge', (req, res) => {
|
|
1945
1998
|
res.send(process.env.CHATGPT_VERIFICATION_CODE);
|
|
1946
1999
|
});
|
|
1947
|
-
|
|
2000
|
+
|
|
1948
2001
|
// --- METADATA ENDPOINT 1: Resource Metadata ---
|
|
1949
2002
|
// Tells the client "I am protected" and "Here is who protects me"
|
|
1950
2003
|
router.get('/.well-known/oauth-protected-resource', (req, res) => {
|
package/lib/oauth.js
CHANGED
|
@@ -101,41 +101,48 @@ async function checkAndRefreshAccessToken(oauthApp, user, tokenLockTimeout = 20)
|
|
|
101
101
|
try {
|
|
102
102
|
const startRefreshTime = moment();
|
|
103
103
|
const token = oauthApp.createToken(user.accessToken, user.refreshToken);
|
|
104
|
-
|
|
104
|
+
logger.info('token refreshing...')
|
|
105
105
|
const { accessToken, refreshToken, expires } = await token.refresh();
|
|
106
106
|
user.accessToken = accessToken;
|
|
107
107
|
user.refreshToken = refreshToken;
|
|
108
108
|
user.tokenExpiry = expires;
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
109
|
+
try {
|
|
110
|
+
await user.save();
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
return handleDatabaseError(error, 'Error saving user');
|
|
114
|
+
}
|
|
115
115
|
if (newLock) {
|
|
116
116
|
const deletionStartTime = moment();
|
|
117
117
|
await newLock.delete();
|
|
118
118
|
const deletionEndTime = moment();
|
|
119
|
-
|
|
119
|
+
logger.info(`lock deleted in ${deletionEndTime.diff(deletionStartTime)}ms`)
|
|
120
120
|
}
|
|
121
121
|
const endRefreshTime = moment();
|
|
122
|
-
|
|
122
|
+
logger.info(`token refreshing finished in ${endRefreshTime.diff(startRefreshTime)}ms`)
|
|
123
123
|
}
|
|
124
124
|
catch (e) {
|
|
125
125
|
console.log('token refreshing failed', e.stack)
|
|
126
126
|
if (newLock) {
|
|
127
127
|
await newLock.delete();
|
|
128
128
|
}
|
|
129
|
+
return null;
|
|
129
130
|
}
|
|
130
131
|
}
|
|
131
132
|
// case: run withou token refresh lock
|
|
132
133
|
else {
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
134
|
+
try {
|
|
135
|
+
logger.info('token refreshing...')
|
|
136
|
+
const token = oauthApp.createToken(user.accessToken, user.refreshToken);
|
|
137
|
+
const { accessToken, refreshToken, expires } = await token.refresh();
|
|
138
|
+
user.accessToken = accessToken;
|
|
139
|
+
user.refreshToken = refreshToken;
|
|
140
|
+
user.tokenExpiry = expires;
|
|
141
|
+
}
|
|
142
|
+
catch (e) {
|
|
143
|
+
console.log('token refreshing failed', e.stack)
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
139
146
|
try {
|
|
140
147
|
await user.save();
|
|
141
148
|
}
|
package/package.json
CHANGED
|
@@ -1,72 +1,72 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@app-connect/core",
|
|
3
|
-
"version": "1.7.
|
|
4
|
-
"description": "RingCentral App Connect Core",
|
|
5
|
-
"main": "index.js",
|
|
6
|
-
"repository": {
|
|
7
|
-
"type": "git",
|
|
8
|
-
"url": "git+https://github.com/ringcentral/rc-unified-crm-extension.git"
|
|
9
|
-
},
|
|
10
|
-
"keywords": [
|
|
11
|
-
"RingCentral",
|
|
12
|
-
"App Connect"
|
|
13
|
-
],
|
|
14
|
-
"author": "RingCentral Labs",
|
|
15
|
-
"license": "MIT",
|
|
16
|
-
"peerDependencies": {
|
|
17
|
-
"axios": "^1.12.2",
|
|
18
|
-
"express": "^4.22.1",
|
|
19
|
-
"moment": "^2.29.4",
|
|
20
|
-
"moment-timezone": "^0.5.39",
|
|
21
|
-
"pg": "^8.8.0",
|
|
22
|
-
"sequelize": "^6.29.0"
|
|
23
|
-
},
|
|
24
|
-
"dependencies": {
|
|
25
|
-
"@aws-sdk/client-dynamodb": "^3.751.0",
|
|
26
|
-
"@aws-sdk/client-s3": "^3.947.0",
|
|
27
|
-
"@aws-sdk/s3-request-presigner": "^3.947.0",
|
|
28
|
-
"@modelcontextprotocol/sdk": "^1.21.1",
|
|
29
|
-
"awesome-phonenumber": "^5.6.0",
|
|
30
|
-
"body-parser": "^1.20.4",
|
|
31
|
-
"body-parser-xml": "^2.0.5",
|
|
32
|
-
"client-oauth2": "^4.3.3",
|
|
33
|
-
"cors": "^2.8.5",
|
|
34
|
-
"country-state-city": "^3.2.1",
|
|
35
|
-
"dotenv": "^16.0.3",
|
|
36
|
-
"dynamoose": "^4.0.3",
|
|
37
|
-
"jsonwebtoken": "^9.0.0",
|
|
38
|
-
"mixpanel": "^0.18.0",
|
|
39
|
-
"shortid": "^2.2.17",
|
|
40
|
-
"tz-lookup": "^6.1.25",
|
|
41
|
-
"ua-parser-js": "^1.0.38"
|
|
42
|
-
},
|
|
43
|
-
"scripts": {
|
|
44
|
-
"test": "jest",
|
|
45
|
-
"test:watch": "jest --watch",
|
|
46
|
-
"test:coverage": "jest --coverage",
|
|
47
|
-
"test:ci": "jest --ci --coverage --watchAll=false"
|
|
48
|
-
},
|
|
49
|
-
"devDependencies": {
|
|
50
|
-
"@eslint/js": "^9.22.0",
|
|
51
|
-
"@octokit/rest": "^19.0.5",
|
|
52
|
-
"axios": "^1.12.2",
|
|
53
|
-
"eslint": "^9.22.0",
|
|
54
|
-
"express": "^4.22.1",
|
|
55
|
-
"globals": "^16.0.0",
|
|
56
|
-
"jest": "^29.3.1",
|
|
57
|
-
"moment": "^2.29.4",
|
|
58
|
-
"moment-timezone": "^0.5.39",
|
|
59
|
-
"nock": "^13.2.9",
|
|
60
|
-
"pg": "^8.8.0",
|
|
61
|
-
"sequelize": "^6.29.0",
|
|
62
|
-
"sqlite3": "^5.1.2",
|
|
63
|
-
"supertest": "^6.3.1"
|
|
64
|
-
},
|
|
65
|
-
"overrides": {
|
|
66
|
-
"js-object-utilities": "2.2.1"
|
|
67
|
-
},
|
|
68
|
-
"bugs": {
|
|
69
|
-
"url": "https://github.com/ringcentral/rc-unified-crm-extension/issues"
|
|
70
|
-
},
|
|
71
|
-
"homepage": "https://github.com/ringcentral/rc-unified-crm-extension#readme"
|
|
72
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@app-connect/core",
|
|
3
|
+
"version": "1.7.17",
|
|
4
|
+
"description": "RingCentral App Connect Core",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/ringcentral/rc-unified-crm-extension.git"
|
|
9
|
+
},
|
|
10
|
+
"keywords": [
|
|
11
|
+
"RingCentral",
|
|
12
|
+
"App Connect"
|
|
13
|
+
],
|
|
14
|
+
"author": "RingCentral Labs",
|
|
15
|
+
"license": "MIT",
|
|
16
|
+
"peerDependencies": {
|
|
17
|
+
"axios": "^1.12.2",
|
|
18
|
+
"express": "^4.22.1",
|
|
19
|
+
"moment": "^2.29.4",
|
|
20
|
+
"moment-timezone": "^0.5.39",
|
|
21
|
+
"pg": "^8.8.0",
|
|
22
|
+
"sequelize": "^6.29.0"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"@aws-sdk/client-dynamodb": "^3.751.0",
|
|
26
|
+
"@aws-sdk/client-s3": "^3.947.0",
|
|
27
|
+
"@aws-sdk/s3-request-presigner": "^3.947.0",
|
|
28
|
+
"@modelcontextprotocol/sdk": "^1.21.1",
|
|
29
|
+
"awesome-phonenumber": "^5.6.0",
|
|
30
|
+
"body-parser": "^1.20.4",
|
|
31
|
+
"body-parser-xml": "^2.0.5",
|
|
32
|
+
"client-oauth2": "^4.3.3",
|
|
33
|
+
"cors": "^2.8.5",
|
|
34
|
+
"country-state-city": "^3.2.1",
|
|
35
|
+
"dotenv": "^16.0.3",
|
|
36
|
+
"dynamoose": "^4.0.3",
|
|
37
|
+
"jsonwebtoken": "^9.0.0",
|
|
38
|
+
"mixpanel": "^0.18.0",
|
|
39
|
+
"shortid": "^2.2.17",
|
|
40
|
+
"tz-lookup": "^6.1.25",
|
|
41
|
+
"ua-parser-js": "^1.0.38"
|
|
42
|
+
},
|
|
43
|
+
"scripts": {
|
|
44
|
+
"test": "jest",
|
|
45
|
+
"test:watch": "jest --watch",
|
|
46
|
+
"test:coverage": "jest --coverage",
|
|
47
|
+
"test:ci": "jest --ci --coverage --watchAll=false"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@eslint/js": "^9.22.0",
|
|
51
|
+
"@octokit/rest": "^19.0.5",
|
|
52
|
+
"axios": "^1.12.2",
|
|
53
|
+
"eslint": "^9.22.0",
|
|
54
|
+
"express": "^4.22.1",
|
|
55
|
+
"globals": "^16.0.0",
|
|
56
|
+
"jest": "^29.3.1",
|
|
57
|
+
"moment": "^2.29.4",
|
|
58
|
+
"moment-timezone": "^0.5.39",
|
|
59
|
+
"nock": "^13.2.9",
|
|
60
|
+
"pg": "^8.8.0",
|
|
61
|
+
"sequelize": "^6.29.0",
|
|
62
|
+
"sqlite3": "^5.1.2",
|
|
63
|
+
"supertest": "^6.3.1"
|
|
64
|
+
},
|
|
65
|
+
"overrides": {
|
|
66
|
+
"js-object-utilities": "2.2.1"
|
|
67
|
+
},
|
|
68
|
+
"bugs": {
|
|
69
|
+
"url": "https://github.com/ringcentral/rc-unified-crm-extension/issues"
|
|
70
|
+
},
|
|
71
|
+
"homepage": "https://github.com/ringcentral/rc-unified-crm-extension#readme"
|
|
72
|
+
}
|
package/releaseNotes.json
CHANGED
|
@@ -1,4 +1,32 @@
|
|
|
1
1
|
{
|
|
2
|
+
"1.7.17": {
|
|
3
|
+
"global": [
|
|
4
|
+
{
|
|
5
|
+
"type": "New",
|
|
6
|
+
"description": "Support for Group SMS logging"
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
"type": "Better",
|
|
10
|
+
"description": "User session will log be revoked is token refresh fails"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"type": "Fix",
|
|
14
|
+
"description": "Contact call pop issue"
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
},
|
|
18
|
+
"1.7.16": {
|
|
19
|
+
"global": [
|
|
20
|
+
{
|
|
21
|
+
"type": "Fix",
|
|
22
|
+
"description": "SMS logging issue of repeatedly logging same messages"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"type": "Fix",
|
|
26
|
+
"description": "Mixpanel token issue that blocks certain webpage access"
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
},
|
|
2
30
|
"1.7.15": {
|
|
3
31
|
"global": [
|
|
4
32
|
{
|