UNPKG

elationjs

Version:

A node SDK for interacting with the Elation Health API

143 lines (117 loc) 4.37 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _axios = require('axios'); var _axios2 = _interopRequireDefault(_axios); var _queryString = require('query-string'); var _queryString2 = _interopRequireDefault(_queryString); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function clientFactory(credentials, sandbox) { const URL = sandbox ? 'https://sandbox.elationemr.com/api/2.0/' : 'https://app.elationemr.com/api/2.0'; const handleTokenResponse = ({ data: { access_token, refresh_token, expires_in } }) => ({ accessToken: access_token, refreshToken: refresh_token, expiresIn: parseInt(expires_in, 10) }); const authString = credentials => Buffer.from(`${credentials.clientID}:${credentials.clientSecret}`).toString('base64'); function createAPIClient(credentialsObject) { const { username, password } = credentialsObject; const authHeader = `Basic ${authString(credentialsObject)}`; const tokenQueryString = _queryString2.default.stringify({ grant_type: 'password', username, password }, { sort: false, encode: false }); const client = _axios2.default.create({ baseURL: URL, headers: { 'content-type': 'application/json' } }); const getAPITokenAndRefresh = () => client.post('/oauth2/token/', tokenQueryString, { headers: { Authorization: authHeader, 'content-type': 'application/x-www-form-urlencoded' } }); const buildConstructorInput = ({ accessToken, expiresIn, refreshToken }) => ({ accessToken, expiresIn, refreshToken, client }); return getAPITokenAndRefresh().then(handleTokenResponse).then(buildConstructorInput).catch(error => { throw error; }); } return class APIClient { constructor() { this.initialize = () => createAPIClient(credentials).then(({ client, accessToken, refreshToken, expiresIn }) => { this.client = client; this.token = accessToken; this.refresh = refreshToken; this.expires = new Date().getTime() + expiresIn * 1000; }).catch(error => { throw error; }); this.authHeader = () => { if (this.expires && new Date().getTime() > this.expires) { return this.refreshAuthToken().then(() => ({ Authorization: `Bearer ${this.token}` })); } return Promise.resolve({ Authorization: `Bearer ${this.token}` }); }; this.refreshAuthToken = () => { const refreshQstring = _queryString2.default.stringify({ grant_type: 'refresh_token', refresh_token: this.refresh }); return this.client.post('/oauth2/token/', refreshQstring, { headers: { Authorization: `Basic ${authString(credentials)}`, 'content-type': 'application/x-www-form-urlencoded' } }).then(handleTokenResponse).then(({ accessToken, refreshToken, expiresIn }) => { this.token = accessToken; this.refresh = refreshToken; this.expires = new Date().getTime() + expiresIn * 1000; }); }; this.mergeConfig = (config, header) => _extends({}, config, { headers: config ? _extends({}, config.headers, header) : header }); this.delete = (path, config) => this.authHeader().then(header => this.client.delete(path, this.mergeConfig(config, header))); this.get = (path, config) => this.authHeader().then(header => this.client.get(path, this.mergeConfig(config, header))); this.post = (path, data, config) => this.authHeader().then(header => this.client.post(path, data, this.mergeConfig(config, header))); this.put = (path, data, config) => this.authHeader().then(header => this.client.put(path, data, this.mergeConfig(config, header))); } }; } exports.default = clientFactory;