elationjs
Version:
A node SDK for interacting with the Elation Health API
143 lines (117 loc) • 4.37 kB
JavaScript
;
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;