@hmcts/os-places-client
Version:
Ordnance Survey address lookup client (https://apidocs.os.uk/docs/os-places-postcode)
80 lines • 10.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const requestPromise = require("request-promise-native");
const address_1 = require("./address");
const addressInfoResponse_1 = require("./addressInfoResponse");
const header_1 = require("./header");
const point_1 = require("./point");
class OSPlacesClient {
constructor(apiToken, request = requestPromise, apiUrl = 'https://api.os.uk', apiPath = '/search/places/v1/postcode') {
this.apiToken = apiToken;
this.request = request;
this.apiUrl = apiUrl;
this.apiPath = apiPath;
}
lookupByPostcode(postcode) {
if (!postcode) {
return Promise.reject(new Error('Missing required postcode'));
}
const uri = this.getUri(postcode, 0, '');
return this.getResponse(uri, new addressInfoResponse_1.AddressInfoResponse(999, [], false));
}
lookupByPostcodeAndDataSet(postcode, dataset) {
if (!postcode) {
return Promise.reject(new Error('Missing required postcode'));
}
const uri = this.getUri(postcode, 0, dataset);
return this.getResponse(uri, new addressInfoResponse_1.AddressInfoResponse(999, [], false));
}
getUri(postcode, offset, dataset) {
if (!dataset) {
return `${this.apiUrl}${this.apiPath}?offset=${offset}&key=${this.apiToken}&postcode=${postcode}`;
}
else {
return `${this.apiUrl}${this.apiPath}?offset=${offset}&key=${this.apiToken}&dataset=${dataset}&postcode=${postcode}`;
}
}
getResponse(uri, addressInfoResponse) {
return this.request.get({
json: false,
resolveWithFullResponse: true,
simple: false,
uri: `${uri}`
}).then((response) => {
if (response.statusCode >= 500) {
throw new Error('Error with OS Places service');
}
else if (response.statusCode === 404) {
return new addressInfoResponse_1.AddressInfoResponse(404, [], false);
}
else if (response.statusCode === 401) {
throw new Error('Authentication failed');
}
const placesQueryBody = JSON.parse(response.body);
const header = new header_1.Header(placesQueryBody.header.uri, placesQueryBody.header.query, placesQueryBody.header.offset, placesQueryBody.header.totalresults, placesQueryBody.header.format, placesQueryBody.header.dataset, placesQueryBody.header.lr, placesQueryBody.header.maxresults, placesQueryBody.header.epoch, placesQueryBody.header.output_srs);
if (addressInfoResponse.statusCode === 999) {
addressInfoResponse = new addressInfoResponse_1.AddressInfoResponse(response.statusCode, [], response.statusCode === 200);
}
if (placesQueryBody.results) {
addressInfoResponse.addAll(placesQueryBody.results.map((jsonAddress) => {
if (!jsonAddress.DPA) {
return new address_1.Address(jsonAddress.LPI.UPRN, jsonAddress.LPI.ORGANISATION, jsonAddress.LPI.DEPARTMENT_NAME, jsonAddress.LPI.PO_BOX_NUMBER, jsonAddress.LPI.PAO_TEXT, jsonAddress.LPI.SAO_TEXT, jsonAddress.LPI.BUILDING_NUMBER, jsonAddress.LPI.STREET_DESCRIPTION, jsonAddress.LPI.DEPENDENT_THOROUGHFARE_NAME, jsonAddress.LPI.DEPENDENT_LOCALITY, jsonAddress.LPI.DOUBLE_DEPENDENT_LOCALITY, jsonAddress.LPI.TOWN_NAME, jsonAddress.LPI.POSTCODE_LOCATOR, jsonAddress.LPI.POSTAL_ADDRESS_CODE, jsonAddress.LPI.ADDRESS, new point_1.Point('Point', [jsonAddress.LPI.X_COORDINATE, jsonAddress.LPI.Y_COORDINATE]), jsonAddress.LPI.USRN);
}
else {
return new address_1.Address(jsonAddress.DPA.UPRN, jsonAddress.DPA.ORGANISATION_NAME, jsonAddress.DPA.DEPARTMENT_NAME, jsonAddress.DPA.PO_BOX_NUMBER, jsonAddress.DPA.BUILDING_NAME, jsonAddress.DPA.SUB_BUILDING_NAME, jsonAddress.DPA.BUILDING_NUMBER, jsonAddress.DPA.THOROUGHFARE_NAME, jsonAddress.DPA.DEPENDENT_THOROUGHFARE_NAME, jsonAddress.DPA.DEPENDENT_LOCALITY, jsonAddress.DPA.DOUBLE_DEPENDENT_LOCALITY, jsonAddress.DPA.POST_TOWN, jsonAddress.DPA.POSTCODE, jsonAddress.DPA.POSTAL_ADDRESS_CODE, jsonAddress.DPA.ADDRESS, new point_1.Point('Point', [jsonAddress.DPA.X_COORDINATE, jsonAddress.DPA.Y_COORDINATE]), jsonAddress.DPA.UDPRN);
}
}));
}
if (header.hasNextPage()) {
const next = this.getUri(addressInfoResponse.addresses[0].postcode, header.getNextOffset(), header.dataset);
return this.getResponse(next, addressInfoResponse);
}
if (addressInfoResponse.addresses.length === 0) {
addressInfoResponse.isValid = false;
}
return addressInfoResponse;
});
}
}
exports.OSPlacesClient = OSPlacesClient;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3NQbGFjZXNDbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvb3NQbGFjZXNDbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSx5REFBd0Q7QUFDeEQsdUNBQW1DO0FBQ25DLCtEQUEyRDtBQUMzRCxxQ0FBaUM7QUFDakMsbUNBQStCO0FBRS9CO0lBRUUsWUFBOEIsUUFBZ0IsRUFDM0IsVUFFa0IsY0FBYyxFQUNoQyxTQUFpQixtQkFBbUIsRUFDcEMsVUFBa0IsNEJBQTRCO1FBTG5DLGFBQVEsR0FBUixRQUFRLENBQVE7UUFDM0IsWUFBTyxHQUFQLE9BQU8sQ0FFeUI7UUFDaEMsV0FBTSxHQUFOLE1BQU0sQ0FBOEI7UUFDcEMsWUFBTyxHQUFQLE9BQU8sQ0FBdUM7SUFDakUsQ0FBQztJQUVNLGdCQUFnQixDQUFFLFFBQWdCO1FBQ3ZDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDYixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFBO1NBQzlEO1FBRUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQ3hDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsSUFBSSx5Q0FBbUIsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7SUFDdkUsQ0FBQztJQUVNLDBCQUEwQixDQUFFLFFBQWdCLEVBQUUsT0FBZTtRQUNsRSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2IsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQTtTQUM5RDtRQUVELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUM3QyxP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