@app-connect/core
Version:
RingCentral App Connect Core
275 lines (272 loc) • 10.8 kB
JavaScript
const oauth = require('../lib/oauth');
const { UserModel } = require('../models/userModel');
const errorMessage = require('../lib/generalErrorMessage');
const adapterRegistry = require('../adapter/registry');
async function findContact({ platform, userId, phoneNumber, overridingFormat, isExtension }) {
try {
let user = await UserModel.findOne({
where: {
id: userId,
platform
}
});
if (!user || !user.accessToken) {
return {
successful: false,
returnMessage: {
message: `Contact not found`,
messageType: 'warning',
ttl: 5000
}
};
}
const platformModule = adapterRegistry.getAdapter(platform);
const authType = platformModule.getAuthType();
let authHeader = '';
switch (authType) {
case 'oauth':
const oauthApp = oauth.getOAuthApp((await platformModule.getOauthInfo({ tokenUrl: user?.platformAdditionalInfo?.tokenUrl, hostname: user?.hostname })));
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, extraDataTracking } = await platformModule.findContact({ user, authHeader, phoneNumber, overridingFormat, isExtension });
if (matchedContactInfo != null && matchedContactInfo?.filter(c => !c.isNewContact)?.length > 0) {
return { successful, returnMessage, contact: matchedContactInfo, extraDataTracking };
}
else {
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)}`);
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 platformModule = adapterRegistry.getAdapter(platform);
const authType = platformModule.getAuthType();
let authHeader = '';
switch (authType) {
case 'oauth':
const oauthApp = oauth.getOAuthApp((await platformModule.getOauthInfo({ tokenUrl: user?.platformAdditionalInfo?.tokenUrl, hostname: user?.hostname })));
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 });
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 platformModule = adapterRegistry.getAdapter(platform);
const authType = platformModule.getAuthType();
let authHeader = '';
switch (authType) {
case 'oauth':
const oauthApp = oauth.getOAuthApp((await platformModule.getOauthInfo({ tokenUrl: user?.platformAdditionalInfo?.tokenUrl, hostname: user?.hostname })));
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 });
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;