sensis-validation
Version:
Validation addresses with sensis validation API
86 lines (67 loc) • 2.2 kB
JavaScript
var request = require('request');
var querystring = require('querystring');
module.exports = function(opts) {
var ROOT_URI = 'sensisdata.com.au/rest/';
var VERSION = (opts && opts.version) || 'current';
var ENV = (opts && opts.env) || 'development';
var USERNAME = (opts && opts.username) || '';
var PASSWORD = (opts && opts.password) || '';
function validateAddress(address, callback) {
var root = getRootUri();
var authHeader = getAuthorizationHeader();
var qs = querystring.stringify({'formatted_address': address});
var uri = [root, '?', qs].join('');
var opts = {
url: uri,
headers: {'Authorization': authHeader},
json: true
};
request(opts, handleSearchResponse(callback));
}
function handleSearchResponse(callback) {
return function(err, response, body) {
if(err) return callback(err);
if(!body || !body.status || body.status !== 'OK')
return callback(invalidResponse());
if(body.result_count === 0)
return callback(null, null);
var authHeader = getAuthorizationHeader();
var search_id = body.results[0].search_result_id;
var root = getRootUri();
var uri = [root, search_id].join('');
var opts = {
url: uri,
headers: {'Authorization': authHeader},
json: true
};
request(opts, function(err, response, body) {
if(err) return callback(err);
if(!body || !body.status || body.status !== 'OK')
return callback(invalidResponse());
return callback(null, body.result);
});
}
}
function invalidResponse() {
return new Error("Invalid response recieved.");
}
function getAuthorizationHeader() {
var buff = new Buffer(USERNAME + ':' + PASSWORD);
return 'Basic ' + buff.toString('base64');
}
function getRootUri() {
var sub = (ENV && ENV === 'production')
? 'api.'
: 'stage-api.ext.';
return [
'https://',
sub,
ROOT_URI,
VERSION,
'/address/'
].join('');
}
return {
validateAddress: validateAddress
};
}