UNPKG

almarestapi-lib

Version:

A Node.js library for calling Ex Libris Alma REST APIs

173 lines (150 loc) 4.72 kB
var request = require('request'); var xpath = require('xpath'); var dom = require('@xmldom/xmldom').DOMParser; var serializer = require('@xmldom/xmldom').XMLSerializer; var API_PATH = process.env.ALMA_APIPATH || 'https://api-na.hosted.exlibrisgroup.com/almaws/v1'; var API_KEY = process.env.ALMA_APIKEY; const ALMAWS_NS = {"alma": "http://com/exlibris/urm/general/xmlbeans"}; const XPATH_ALMAWS_ERROR = '/alma:web_service_result/alma:errorList/alma:error/alma:errorMessage'; function performRequestPromise(endpoint, method, data, contentType='json') { return new Promise(function (resolve, reject) { performRequest(endpoint, method, data, function(err, data) { if (err) reject(err); else resolve(data); }, contentType); }); } function performRequest(endpoint, method, data, callback, contentType='json') { if (!API_KEY) throw new Error('No API key provided.'); var dataString; var headers = { 'Authorization': 'apikey ' + API_KEY, 'Accept': (contentType=='json' ? 'application/json' : 'application/xml') }; var options = { uri: (endpoint.substring(0,4) == 'http' ? '' : API_PATH) + endpoint, method: method, headers: headers, }; if (method != 'GET') { if (contentType=='json') { dataString = JSON.stringify(data); headers['Content-Type'] = 'application/json'; } else { dataString = typeof data == 'object' ? new serializer().serializeToString(data) : data; headers['Content-Type'] = 'application/xml'; } headers['Content-Length'] = dataString.length; options['body'] = dataString; } request( options, function(err, response, body) { var obj; try { if (method != 'DELETE') { if (body=='') body = contentType=='json' ? 'null' : '<root/>'; obj = (contentType=='json' ? JSON.parse(body) : new dom().parseFromString(body)); } if (!err && ('' + response.statusCode).match(/^[4-5]\d\d$/)) { var message; try { if (contentType=='json') { message = obj.errorList.error[0].errorMessage + " (" + obj.errorList.error[0].errorCode + ")"; } else { var select = xpath.useNamespaces(ALMAWS_NS); message = select(XPATH_ALMAWS_ERROR, obj)[0] .firstChild.data; } } catch (e) { message = "Unknown error from Alma."; } err = new Error(message); } } catch (e) { err = e; } callback(err, contentType=='json' ? obj : body); }); } exports.get = function(url, callback) { performRequest(url, 'GET', null, function(err, data) { if (err) callback(err); else callback(null, data); }); }; exports.getp = function(url) { return performRequestPromise(url, 'GET', null); } exports.getXml = function(url, callback) { performRequest(url, 'GET', null, function(err, data) { if (err) callback(err); else callback(null, data); }, 'xml'); }; exports.getXmlp = function(url) { return performRequestPromise(url, 'GET', null, 'xml'); } exports.post = function(url, data, callback) { performRequest(url, 'POST', data, function(err, data) { if (err) callback(err); else callback(null, data); }); }; exports.postp = function(url, data) { return performRequestPromise(url, 'POST', data); } exports.postXml = function(url, data, callback) { performRequest(url, 'POST', data, function(err, data) { if (err) callback(err); else callback(null, data); }, 'xml'); }; exports.postXmlp = function(url, data) { return performRequestPromise(url, 'POST', data, 'xml'); } exports.put = function(url, data, callback) { performRequest(url, 'PUT', data, function(err, data) { if (err) callback(err); else callback(null, data); }); }; exports.putp = function(url, data) { return performRequestPromise(url, 'PUT', data); } exports.putXml = function(url, data, callback) { performRequest(url, 'PUT', data, function(err, data) { if (err) callback(err); else callback(null, data); }, 'xml'); }; exports.putXmlp = function(url, data) { return performRequestPromise(url, 'PUT', data, 'xml'); } exports.delete = function(url, callback) { performRequest(url, 'DELETE', null, function(err, data) { if (err) callback(err); else callback(null, data); }); } exports.deletep = function(url) { return performRequestPromise(url, 'DELETE', null); } exports.setOptions = function(apiKey, apiPath = API_PATH) { API_PATH = apiPath; API_KEY = apiKey; }