@mountainpass/addressr
Version:
Australian Address Validation, Search and Autocomplete
139 lines (136 loc) • 4.42 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.startRest2Server = startRest2Server;
exports.stopServer = stopServer;
var _debug = require("debug");
var _debug2 = _interopRequireDefault(_debug);
var _express = require("express");
var _express2 = _interopRequireDefault(_express);
var _http = require("http");
var _waycharter = require("@mountainpass/waycharter");
var _addressService = require("../service/address-service");
var _version = require("../version");
var _crypto = require("crypto");
var _crypto2 = _interopRequireDefault(_crypto);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
//import connect from 'connect';
var app = (0, _express2.default)();
const ONE_DAY = 60 * 60 * 24;
const ONE_WEEK = ONE_DAY * 7;
var serverPort = process.env.PORT || 8080;
var logger = (0, _debug2.default)('api');
var error = (0, _debug2.default)('error');
error.log = console.error.bind(console); // eslint-disable-line no-console
let server;
const PAGE_SIZE = process.env.PAGE_SIZE || 8;
function startRest2Server() {
app.use((_request, response, next) => {
if (process.env.ADDRESSR_ACCESS_CONTROL_ALLOW_ORIGIN !== undefined) {
response.append('Access-Control-Allow-Origin', process.env.ADDRESSR_ACCESS_CONTROL_ALLOW_ORIGIN);
}
if (process.env.ADDRESSR_ACCESS_CONTROL_EXPOSE_HEADERS !== undefined) {
response.append('Access-Control-Expose-Headers', process.env.ADDRESSR_ACCESS_CONTROL_EXPOSE_HEADERS);
}
if (process.env.ADDRESSR_ACCESS_CONTROL_ALLOW_HEADERS !== undefined) {
response.append('Access-Control-Allow-Headers', process.env.ADDRESSR_ACCESS_CONTROL_ALLOW_HEADERS);
}
next();
});
const waycharter = new _waycharter.WayCharter();
app.use(waycharter.router);
const addressesType = waycharter.registerCollection({
itemPath: '/:pid',
itemLoader: async ({
pid
}) => {
const {
json,
hash,
statusCode
} = await (0, _addressService.getAddress)(pid);
return {
body: json,
headers: {
etag: `"${_version.version}-${hash}"`,
'cache-control': `public, max-age=${ONE_WEEK}`
},
status: statusCode || 200
};
},
collectionPath: '/addresses',
collectionLoader: async ({
page,
q
}) => {
if (q && q.length > 2) {
const foundAddresses = await (0, _addressService.searchForAddress)(q, page + 1, PAGE_SIZE);
const body = foundAddresses.body.hits.hits.map(h => {
return {
sla: h._source.sla,
...(h._source.ssla && {
ssla: h._source.ssla
}),
highlight: {
sla: h.highlight.sla[0],
...(h.highlight.ssla && {
ssla: h.highlight.ssla[0]
})
},
score: h._score,
pid: h._id.replace('/addresses/', '')
};
});
const responseHash = _crypto2.default.createHash('md5').update(JSON.stringify(body)).digest('hex');
return {
body,
hasMore: page < foundAddresses.body.hits.total.value / PAGE_SIZE - 1,
headers: {
etag: `"${_version.version}-${responseHash}"`,
'cache-control': `public, max-age=${ONE_WEEK}`
}
};
} else {
// If-None-Match
return {
body: [],
hasMore: false,
headers: {
etag: `"${_version.version}"`,
'cache-control': `public, max-age=${ONE_WEEK}`
}
};
}
},
filters: [{
rel: 'https://addressr.io/rels/address-search',
parameters: ['q']
}]
});
const index = waycharter.registerResourceType({
path: '/',
loader: async () => {
return {
body: {},
links: addressesType.additionalPaths,
headers: {
etag: `"${_version.version}"`,
'cache-control': `public, max-age=${ONE_WEEK}`
}
};
}
});
server = (0, _http.createServer)(app);
return new Promise(resolve => {
server.listen(serverPort, function () {
logger('📡 Addressr is listening on port %d ( http://localhost:%d ) ', serverPort, serverPort);
resolve(`http://localhost:${serverPort}`);
});
});
}
function stopServer() {
if (server !== undefined) {
server.close();
}
}