110 lines
4.1 KiB
JavaScript
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,
|
|
};
|