UNPKG

@app-connect/core

Version:
275 lines (272 loc) 10.8 kB
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;