Files
old-crm-integration/services/officeRnD/oauth.js
2019-08-31 06:11:15 +02:00

110 lines
4.1 KiB
JavaScript

'use strict';
require('dotenv').config();
const moment = require('moment');
const queryString = require('query-string');
const { OAuthAPI } = require('../../helpers/oauthApi');
const db = require('../../models/index');
const { officeRnDAPIErrors } = require('../../constants/constants');
const updateToken = (token, validUntil) => {
return new Promise((resolve, reject) => {
const values = {token, validUntil};
db.accessToken.update(values, {where:{}})
.then(([numberOfUpdatedRows]) => {
if (numberOfUpdatedRows > 0){
resolve(true);
}else{
db.accessToken.bulkCreate([{token, validUntil}])
.then(() => {
resolve(false);
})
.catch((error) => reject(error));
}
})
.catch((error) => reject(error));
});
};
const getToken = (returnTokenOnly = false) => {
return new Promise((resolve, reject) => {
db.accessToken.findAll()
.then((results) => {
if (results && results.length > 0){
const token = results[0].getDataValue('token');
const validUntil = results[0].getDataValue('validUntil');
const validUntilMoment = moment(validUntil);
if (validUntilMoment.isBefore(moment())){
refreshOauthToken()
.then((oauthResult) => {
if (returnTokenOnly){
resolve(oauthResult.token);
}else{
resolve(oauthResult);
}
})
.catch((error) => reject(error));
}else{
if (returnTokenOnly){
resolve(token);
}else {
resolve({token, validUntil});
}
}
}else{
refreshOauthToken()
.then((oauthResult) => {
if (returnTokenOnly){
resolve(oauthResult.token);
}else{
resolve(oauthResult);
}
})
.catch((error) => reject(error));
}
})
.catch((error) => reject(error));
});
};
const refreshOauthToken = () => {
return new Promise((resolve, reject) => {
const clientID = process.env.ORD_OAUTH_CLIENT_ID;
const clientSecret = process.env.ORD_OAUTH_CLIENT_SECRET;
const OAUTHRequestBody = {
client_id: clientID,
client_secret: clientSecret,
grant_type: 'client_credentials',
scope: 'officernd.api.read officernd.api.write',
};
OAuthAPI.post('/', queryString.stringify(OAUTHRequestBody))
.then((oauthResponse) => {
const responseData = oauthResponse && oauthResponse.data ? oauthResponse.data : null;
if (responseData){
const { access_token: accessToken, expires_in: expiresIn } = responseData;
if (accessToken && expiresIn){
const validUntil = moment().add(expiresIn, 'seconds').toISOString();
updateToken(accessToken, validUntil)
.then(() => resolve({token: accessToken, validUntil}))
.catch((error) => reject(error));
}else{
reject(officeRnDAPIErrors.OAUTH_FAILED);
}
}else{
reject(officeRnDAPIErrors.OAUTH_FAILED);
}
})
.catch((error) => {
console.log('Error obtaining OAUTH token : ', error);
reject();
});
});
};
module.exports = {
getToken,
refreshOauthToken,
};