'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, };