UNPKG

@amnet/server

Version:

A tweaked version of pubsweet-server for use by Coko's projects

91 lines (73 loc) 2.43 kB
const get = require('lodash/get') const config = require('config') const axios = require('axios') const { ServiceCredential } = require('../models') const getAccessToken = async (serviceName, renew = false) => { try { const services = config.has('services') && config.get('services') if (!services) { throw new Error('services are undefined') } const service = get(services, `${serviceName}`) if (!service) { throw new Error(`service ${serviceName} configuration is undefined `) } const { clientId, clientSecret, port, protocol, host } = service const buff = Buffer.from(`${clientId}:${clientSecret}`, 'utf8') const base64data = buff.toString('base64') const serviceURL = `${protocol}://${host}${port ? `:${port}` : ''}` const serviceHealthCheck = await axios({ method: 'get', url: `${serviceURL}/healthcheck`, }) const { data: healthCheckData } = serviceHealthCheck const { message } = healthCheckData if (message !== 'Coolio') { throw new Error(`service ${serviceName} is down`) } const foundServiceCredential = await ServiceCredential.query().findOne({ name: serviceName, }) if (!foundServiceCredential) { const { data } = await axios({ method: 'post', url: `${serviceURL}/api/auth`, headers: { authorization: `Basic ${base64data}` }, }) const { accessToken } = data await ServiceCredential.query().insert({ name: serviceName, accessToken, }) return accessToken } const { accessToken, id } = foundServiceCredential if (!accessToken || renew) { const { data } = await axios({ method: 'post', url: `${serviceURL}/api/auth`, headers: { authorization: `Basic ${base64data}` }, }) const { accessToken: freshAccessToken } = data await ServiceCredential.query().patchAndFetchById(id, { accessToken: freshAccessToken, }) return freshAccessToken } return accessToken } catch (e) { const foundServiceCredential = await ServiceCredential.query().findOne({ name: serviceName, }) if (foundServiceCredential) { await ServiceCredential.query().patchAndFetchById( foundServiceCredential.id, { accessToken: null, }, ) } throw new Error(e) } } module.exports = getAccessToken