UNPKG

@mountainpass/addressr

Version:

Australian Address Validation, Search and Autocomplete

139 lines (136 loc) 4.42 kB
"use strict"; 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(); } }