124 lines
3.7 KiB
JavaScript
124 lines
3.7 KiB
JavaScript
const qs = require('qs')
|
|
const axios = require('axios')
|
|
const findProperty = require('./findProperty')
|
|
const CRM = require('../models/CRM')
|
|
|
|
const { set, get, del } = require('./redisClient')
|
|
const get75PercentTimeInSeconds = require('./get75PercentTimeInSeconds')
|
|
|
|
const exchangeForTokens = async (crmOauth, exchangeProof, companyId) => {
|
|
|
|
console.log('===========> exchangeForTokens companyId: ', companyId)
|
|
|
|
const { request, body, response } = findProperty(crmOauth.crm.crmRest, 'tokenEndpoint')
|
|
|
|
let { requestContentType, requestEncoding, requestType, responseType, url } = request
|
|
|
|
let config = {
|
|
method: requestType,
|
|
url,
|
|
data: qs.stringify(exchangeProof)
|
|
}
|
|
|
|
if (requestContentType != 'none') {
|
|
config = {
|
|
...config, headers: {
|
|
'Content-Type': requestContentType
|
|
}
|
|
}
|
|
}
|
|
|
|
console.log('======> CONFIG: ', config)
|
|
console.log('======> companyId: ', companyId)
|
|
|
|
// const { data } = await axios(config)
|
|
|
|
|
|
|
|
//test
|
|
let data
|
|
try {
|
|
let { data: _data } = await axios(config)
|
|
data = _data
|
|
} catch (error) {
|
|
if (error.response) {
|
|
console.error('==================> oauth2 Erro na resposta da API:', {
|
|
status: error.response.status,
|
|
data: error.response.data,
|
|
})
|
|
}
|
|
else if (error.request) {
|
|
console.error('==================> oauth2 Nenhuma resposta recebida da API:', error.request)
|
|
}
|
|
else {
|
|
console.error('==================> oauth2 Erro ao configurar a request:', error.message)
|
|
}
|
|
|
|
throw error
|
|
}
|
|
|
|
//
|
|
|
|
console.log('===========> auth2 data: ', data)
|
|
|
|
|
|
const { refresh_token, access_token, token_type, expires_in, issued_at } = data
|
|
|
|
console.log('===========> refresh_token: ', refresh_token)
|
|
console.log('===========> access_token: ', access_token)
|
|
|
|
// `${clientId+companyId}`
|
|
|
|
// salesforce case
|
|
if (issued_at)
|
|
await set(`${crmOauth.crm.authentication.crmClientId+companyId}`, access_token, get75PercentTimeInSeconds(issued_at))
|
|
else
|
|
await set(`${crmOauth.crm.authentication.crmClientId+companyId}`, access_token, Math.round(expires_in * 0.75))
|
|
|
|
crmOauth = await CRM.findOne({ 'crm.authentication.crmClientId': crmOauth.crm.authentication.crmClientId, 'companyId': companyId })
|
|
|
|
if (refresh_token) {
|
|
console.log('===========> refresh_token2: ', refresh_token)
|
|
|
|
crmOauth.crm.authentication.crmOAuthRefreshToken = refresh_token
|
|
}
|
|
crmOauth.crm.authentication.crmOAuthToken = access_token
|
|
await crmOauth.save()
|
|
|
|
return access_token
|
|
|
|
}
|
|
|
|
const refreshAccessToken = async (clientId, companyId) => {
|
|
|
|
let crmOauth = await CRM.findOne({ 'crm.authentication.crmClientId': clientId, companyId })
|
|
|
|
crmOauth = crmOauth.toObject()
|
|
|
|
const refreshTokenProof = {
|
|
grant_type: 'refresh_token',
|
|
client_id: crmOauth.crm.authentication.crmClientId,
|
|
client_secret: crmOauth.crm.authentication.crmClientSecret,
|
|
redirect_uri: process.env.URL_OAUTH_CALLBACK,
|
|
refresh_token: crmOauth.crm.authentication.crmOAuthRefreshToken
|
|
}
|
|
return await exchangeForTokens(crmOauth, refreshTokenProof, companyId)
|
|
}
|
|
|
|
const getAccessToken = async (clientId, companyId) => {
|
|
|
|
console.log(`============> clientId+companyId: ${clientId+companyId}`)
|
|
|
|
if (!await get(`${clientId+companyId}`)) {
|
|
console.log('Refreshing expired access token')
|
|
await refreshAccessToken(clientId, companyId)
|
|
}
|
|
return await get(`${clientId+companyId}`)
|
|
}
|
|
|
|
|
|
module.exports = {
|
|
exchangeForTokens,
|
|
refreshAccessToken,
|
|
getAccessToken
|
|
} |