bir-regon
Version:
Polish legal company data query API
127 lines (107 loc) • 3.45 kB
JavaScript
const rp = require('request-promise');
const entities = require('entities');
const xml2js = require('xml2js');
const { LoginEnvelope, LogoutEnvelope, QueryEnvelope } = require('./envelopes');
const config = require('./config');
module.exports = class BirAPI {
/**
* Creates an instance of BirAPI.
*
* @param {string} url
*/
constructor(url) {
this._url = url;
this._sessionID = null;
}
/**
* Tries to authenticate to the BIR database. Returns the session ID.
*
* @param {string} apiKey
* @returns {Promise<string>}
*/
login(apiKey) {
let loginEnvelope = new LoginEnvelope(this._url, apiKey);
let loginOptions = BirAPI._getRequestOptions(this._url, loginEnvelope.toString());
return rp(loginOptions)
.then(body => {
let bodyParts = config.loginEnvRegex.exec(body);
return bodyParts ? bodyParts[1] : Promise.reject('Invalid api key');
})
.then(sessionID => {
this._sessionID = sessionID;
return sessionID;
});
}
/**
* Queries the BIR database for a specific NIP. Returns parsed company's information.
*
* @param {string} nip
* @returns {Promise<Object>}
*/
query(nip) {
if (!this.isAuthenticated()) {
return Promise.reject('Not authenticated');
}
let queryEnvelope = new QueryEnvelope(this._url, nip);
let queryOptions = BirAPI._getRequestOptions(this._url, queryEnvelope.toString(),
this._sessionID);
return rp(queryOptions)
.then(body => {
let results = config.queryEnvRegex.exec(body);
return results ? results[1] : Promise.reject('NIP not found or invalid');
})
.then(entities.decodeXML.bind(entities))
.then(queryResultsString => new Promise((resolve, reject) =>
xml2js.parseString(queryResultsString, (err, result) => err ? reject(err) : resolve(result))
))
.then(queryResultsWrapped => queryResultsWrapped['root']['dane'][0])
.then(queryResults => {
let result = {};
for (let key in queryResults) {
if (queryResults.hasOwnProperty(key)) {
result[key] = Array.isArray(queryResults[key]) ? queryResults[key][0] : queryResults[key];
}
}
return result;
});
}
logout() {
if (!this.isAuthenticated()) {
return Promise.reject();
}
this._sessionID = null;
let logoutEnvelope = new LogoutEnvelope(this._url, this._sessionID);
let logoutHeaders = BirAPI._getRequestOptions(this._url, logoutEnvelope.toString(),
this._sessionID);
return rp(logoutHeaders)
.then(() => true);
}
/**
* Checks if session ID already exists.
*
* @returns {boolean}
*/
isAuthenticated() {
return !!this._sessionID;
}
/**
* Prepares request options, fills in the URL, body and session ID if provided.
*
* @static
* @param {string} uri
* @param {string} body
* @param {string} [sessionID=null]
* @returns {Object}
*/
static _getRequestOptions(uri, body, sessionID = null) {
let requestHeaders = Object.assign({}, config.commonOptions.headers);
if (sessionID) {
requestHeaders.sid = sessionID;
}
return Object.assign({}, config.commonOptions, {
headers: requestHeaders,
body,
uri
});
}
};