@app-connect/core
Version:
RingCentral App Connect Core
310 lines (300 loc) • 12.7 kB
JavaScript
const oauth = require('../lib/oauth');
const { UserModel } = require('../models/userModel');
const errorMessage = require('../lib/generalErrorMessage');
const connectorRegistry = require('../connector/registry');
const { Connector } = require('../models/dynamo/connectorSchema');
const { DebugTracer } = require('../lib/debugTracer');
async function findContact({ platform, userId, phoneNumber, overridingFormat, isExtension, tracer }) {
tracer?.trace('handler.findContact:entered', { platform, userId, phoneNumber });
try {
let user = await UserModel.findOne({
where: {
id: userId,
platform
}
});
tracer?.trace('handler.findContact:userFound', { user });
if (!user || !user.accessToken) {
tracer?.trace('handler.findContact:noUser', { userId });
return {
successful: false,
returnMessage: {
message: `Contact not found`,
messageType: 'warning',
ttl: 5000
}
};
}
const proxyId = user.platformAdditionalInfo?.proxyId;
let proxyConfig = null;
if (proxyId) {
proxyConfig = await Connector.getProxyConfig(proxyId);
tracer?.trace('handler.findContact:proxyConfig', { proxyConfig });
}
const platformModule = connectorRegistry.getConnector(platform);
const authType = await platformModule.getAuthType({ proxyId, proxyConfig });
tracer?.trace('handler.findContact:authType', { authType });
let authHeader = '';
switch (authType) {
case 'oauth':
const oauthApp = oauth.getOAuthApp((await platformModule.getOauthInfo({ tokenUrl: user?.platformAdditionalInfo?.tokenUrl, hostname: user?.hostname, proxyId, proxyConfig })));
user = await oauth.checkAndRefreshAccessToken(oauthApp, user);
authHeader = `Bearer ${user.accessToken}`;
tracer?.trace('handler.findContact:oauthAuth', { authHeader });
break;
case 'apiKey':
const basicAuth = platformModule.getBasicAuth({ apiKey: user.accessToken });
authHeader = `Basic ${basicAuth}`;
tracer?.trace('handler.findContact:apiKeyAuth', {});
break;
}
const { successful, matchedContactInfo, returnMessage, extraDataTracking } = await platformModule.findContact({ user, authHeader, phoneNumber, overridingFormat, isExtension, proxyConfig, tracer });
tracer?.trace('handler.findContact:platformFindResult', { successful, matchedContactInfo });
if (matchedContactInfo != null && matchedContactInfo?.filter(c => !c.isNewContact)?.length > 0) {
tracer?.trace('handler.findContact:contactsFound', { count: matchedContactInfo.length });
return { successful, returnMessage, contact: matchedContactInfo, extraDataTracking };
}
else {
tracer?.trace('handler.findContact:noContactsMatched', { matchedContactInfo });
if (returnMessage) {
return {
successful,
returnMessage,
extraDataTracking,
contact: matchedContactInfo,
}
}
return {
successful,
returnMessage:
{
message: `Contact not found`,
messageType: 'warning',
details: [{
title: 'Details',
items: [
{
id: '1',
type: 'text',
text: `A contact with the phone number ${phoneNumber} could not be found in your ${platform} account.`
}
]
}],
ttl: 5000
},
contact: matchedContactInfo,
extraDataTracking
};
}
} catch (e) {
console.error(`platform: ${platform} \n${e.stack} \n${JSON.stringify(e.response?.data)}`);
tracer?.traceError('handler.findContact:error', e, { platform, statusCode: e.response?.status });
if (e.response?.status === 429) {
return {
successful: false,
returnMessage: errorMessage.rateLimitErrorMessage({ platform }),
extraDataTracking: {
statusCode: e.response?.status,
}
};
}
else if (e.response?.status >= 400 && e.response?.status < 410) {
return {
successful: false,
returnMessage: errorMessage.authorizationErrorMessage({ platform }),
extraDataTracking: {
statusCode: e.response?.status,
}
};
}
return {
successful: false,
returnMessage:
{
message: `Error finding contacts`,
messageType: 'warning',
details: [
{
title: 'Details',
items: [
{
id: '1',
type: 'text',
text: `Please check if your account has permission to VIEW and LIST contacts`
}
]
}
],
ttl: 5000
},
extraDataTracking: {
statusCode: e.response?.status,
}
};
}
}
async function createContact({ platform, userId, phoneNumber, newContactName, newContactType, additionalSubmission }) {
try {
let user = await UserModel.findOne({
where: {
id: userId,
platform
}
});
if (!user || !user.accessToken) {
return { successful: false, message: `Contact not found` };
}
const proxyId = user.platformAdditionalInfo?.proxyId;
let proxyConfig = null;
if (proxyId) {
proxyConfig = await Connector.getProxyConfig(proxyId);
}
const platformModule = connectorRegistry.getConnector(platform);
const authType = await platformModule.getAuthType({ proxyId, proxyConfig });
let authHeader = '';
switch (authType) {
case 'oauth':
const oauthApp = oauth.getOAuthApp((await platformModule.getOauthInfo({ tokenUrl: user?.platformAdditionalInfo?.tokenUrl, hostname: user?.hostname, proxyId, proxyConfig })));
user = await oauth.checkAndRefreshAccessToken(oauthApp, user);
authHeader = `Bearer ${user.accessToken}`;
break;
case 'apiKey':
const basicAuth = platformModule.getBasicAuth({ apiKey: user.accessToken });
authHeader = `Basic ${basicAuth}`;
break;
}
const { contactInfo, returnMessage, extraDataTracking } = await platformModule.createContact({ user, authHeader, phoneNumber, newContactName, newContactType, additionalSubmission, proxyConfig });
if (contactInfo != null) {
return { successful: true, returnMessage, contact: contactInfo, extraDataTracking };
}
else {
return { successful: false, returnMessage };
}
} catch (e) {
console.log(`platform: ${platform} \n${e.stack}`);
if (e.response?.status === 429) {
return {
successful: false,
returnMessage: errorMessage.rateLimitErrorMessage({ platform }),
};
}
else if (e.response?.status >= 400 && e.response?.status < 410) {
return {
successful: false,
returnMessage: errorMessage.authorizationErrorMessage({ platform }),
extraDataTracking: {
statusCode: e.response?.status,
}
};
}
return {
successful: false,
returnMessage:
{
message: `Error creating contact`,
messageType: 'warning',
details: [
{
title: 'Details',
items: [
{
id: '1',
type: 'text',
text: `A contact with the phone number ${phoneNumber} could not be created. Make sure you have permission to create contacts in ${platform}.`
}
]
}
],
ttl: 5000
}
};
}
}
async function findContactWithName({ platform, userId, name }) {
try {
let user = await UserModel.findOne({
where: {
id: userId,
platform
}
});
if (!user || !user.accessToken) {
return {
successful: false,
returnMessage: {
message: `No contact found with name ${name}`,
messageType: 'warning',
ttl: 5000
}
};
}
const proxyId = user.platformAdditionalInfo?.proxyId;
let proxyConfig = null;
if (proxyId) {
proxyConfig = await Connector.getProxyConfig(proxyId);
}
const platformModule = connectorRegistry.getConnector(platform);
const authType = await platformModule.getAuthType({ proxyId, proxyConfig });
let authHeader = '';
switch (authType) {
case 'oauth':
const oauthApp = oauth.getOAuthApp((await platformModule.getOauthInfo({ tokenUrl: user?.platformAdditionalInfo?.tokenUrl, hostname: user?.hostname, proxyId, proxyConfig })));
user = await oauth.checkAndRefreshAccessToken(oauthApp, user);
authHeader = `Bearer ${user.accessToken}`;
break;
case 'apiKey':
const basicAuth = platformModule.getBasicAuth({ apiKey: user.accessToken });
authHeader = `Basic ${basicAuth}`;
break;
}
const { successful, matchedContactInfo, returnMessage } = await platformModule.findContactWithName({ user, authHeader, name, proxyConfig });
if (matchedContactInfo != null && matchedContactInfo?.filter(c => !c.isNewContact)?.length > 0) {
return { successful, returnMessage, contact: matchedContactInfo };
}
else {
if (returnMessage) {
return {
successful,
returnMessage,
contact: matchedContactInfo,
}
}
return {
successful,
returnMessage:
{
message: `No contact found with name ${name} `,
messageType: 'warning',
ttl: 5000
},
contact: matchedContactInfo
};
}
} catch (e) {
console.error(`platform: ${platform} \n${e.stack} \n${JSON.stringify(e.response?.data)}`);
if (e.response?.status === 429) {
return {
successful: false,
returnMessage: errorMessage.rateLimitErrorMessage({ platform })
};
}
else if (e.response?.status >= 400 && e.response?.status < 410) {
return {
successful: false,
returnMessage: errorMessage.authorizationErrorMessage({ platform }),
};
}
return {
successful: false,
returnMessage:
{
message: `Error finding contacts`,
messageType: 'warning',
ttl: 5000
}
};
}
}
exports.findContact = findContact;
exports.createContact = createContact;
exports.findContactWithName = findContactWithName;