From bc35477ad81e7ddceadc16ebc9470889195c9618 Mon Sep 17 00:00:00 2001 From: Gibran Parvez Date: Wed, 3 Jan 2018 16:46:06 -0500 Subject: [PATCH] Use external resources --- Dockerfile | 22 ++++++++++++++++++---- controller/convert.js | 43 +++++++++++++++++++++++++++++++++++++++++++ routes/v1.js | 32 ++++++++------------------------ service/external.js | 18 ++++++++++++++++++ 4 files changed, 87 insertions(+), 28 deletions(-) create mode 100644 controller/convert.js create mode 100644 service/external.js diff --git a/Dockerfile b/Dockerfile index e28228c3..5b12735f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,11 @@ # base image -FROM pelias/baseimage +FROM pelias/libpostal_baseimage # maintainer information LABEL maintainer="pelias@mapzen.com" EXPOSE 3100 +EXPOSE 3150 # Where the app is built and run inside the docker fs ENV WORK=/opt/pelias @@ -12,18 +13,31 @@ ENV WORK=/opt/pelias # Used indirectly for saving npm logs etc. ENV HOME=/opt/pelias +# Update git submodules +RUN git submodule update --init --recursive --remote + WORKDIR ${WORK} COPY . ${WORK} + # Build and set permissions for arbitrary non-root user RUN npm install && \ npm test && \ chmod -R a+rwX . + + +# Compile GeoTrans +RUN npm install --unsafe-perm geotrans-mgrs-converter +# Install node-gyp for GeoTrans +RUN npm install -g node-gyp +# Configure and build NBIND for Geotrans node module +RUN node-gyp configure build --directory=node_modules/geotrans-mgrs-converter/ + +# Run geotrans env variable script +#RUN . ./node_modules/geotrans-mgrs-converter/install.sh # Don't run as root, because there's no reason to (https://docs.docker.com/engine/articles/dockerfile_best-practices/#user). # This also reveals permission problems on local Docker. RUN chown -R 9999:9999 ${WORK} -USER 9999 +# USER 9999 -# start service -CMD [ "npm", "start" ] diff --git a/controller/convert.js b/controller/convert.js new file mode 100644 index 00000000..21cd08a9 --- /dev/null +++ b/controller/convert.js @@ -0,0 +1,43 @@ +"use strict"; + + +const _ = require('lodash'); +const DATUM = 'WGE'; +const external = require('../service/external'); +const logger = require( 'pelias-logger' ).get( 'api' ); + +"use strict"; + + + +function converter( req, res, next) { + let result; + try{ + if(_.find(req.query, (val, key) => val === 'mgrs')){ + //If mgrs is specified as a conversion parameter + //let mgrsConverter = new MGRS_converter(DATUM); + if(req.query.from === 'mgrs' && req.query.to === 'decdeg'){ + logger.info("testing"); + result = external.geotrans(req.query.q); + logger.info(result); + } + } + if(typeof result === 'string' && result.indexOf('ERROR') > -1){ + //Relay error + throw result; + } + result.properties.from = req.query.from; + result.properties.to = req.query.to; + if(result.properties.name.toLowerCase() !== req.query.q.toLowerCase()){ + result.properties.name = req.query.q.toUpperCase(); + } + } + catch(error){ + result = {"error": error}; + } + finally{ + res.send(result); + } +} + +module.exports = converter; diff --git a/routes/v1.js b/routes/v1.js index fb3539a8..18c32059 100644 --- a/routes/v1.js +++ b/routes/v1.js @@ -29,12 +29,12 @@ var controllers = { coarse_reverse: require('../controller/coarse_reverse'), mdToHTML: require('../controller/markdownToHtml'), libpostal: require('../controller/libpostal'), - structured_libpostal: require('../controller/structured_libpostal'), place: require('../controller/place'), placeholder: require('../controller/placeholder'), search: require('../controller/search'), search_with_ids: require('../controller/search_with_ids'), - status: require('../controller/status') + status: require('../controller/status'), + convert: require('../controller/convert') }; var queries = { @@ -97,7 +97,6 @@ const PlaceHolder = require('../service/configurations/PlaceHolder'); const PointInPolygon = require('../service/configurations/PointInPolygon'); const Language = require('../service/configurations/Language'); const Interpolation = require('../service/configurations/Interpolation'); -const Libpostal = require('../service/configurations/Libpostal'); /** * Append routes to app @@ -124,18 +123,6 @@ function addRoutes(app, peliasConfig) { const interpolationService = serviceWrapper(interpolationConfiguration); const isInterpolationEnabled = _.constant(interpolationConfiguration.isEnabled()); - // standard libpostal should use req.clean.text for the `address` parameter - const libpostalConfiguration = new Libpostal( - _.defaultTo(peliasConfig.api.services.libpostal, {}), - _.property('clean.text')); - const libpostalService = serviceWrapper(libpostalConfiguration); - - // structured libpostal should use req.clean.parsed_text.address for the `address` parameter - const structuredLibpostalConfiguration = new Libpostal( - _.defaultTo(peliasConfig.api.services.libpostal, {}), - _.property('clean.parsed_text.address')); - const structuredLibpostalService = serviceWrapper(structuredLibpostalConfiguration); - // fallback to coarse reverse when regular reverse didn't return anything const coarseReverseShouldExecute = all( isPipServiceEnabled, not(hasRequestErrors), not(hasResponseData) @@ -146,12 +133,6 @@ function addRoutes(app, peliasConfig) { not(isRequestSourcesOnlyWhosOnFirst) ); - // for libpostal to execute for structured requests, req.clean.parsed_text.address must exist - const structuredLibpostalShouldExecute = all( - not(hasRequestErrors), - hasParsedTextProperties.all('address') - ); - // execute placeholder if libpostal only parsed as admin-only and needs to // be geodisambiguated const placeholderGeodisambiguationShouldExecute = all( @@ -276,7 +257,7 @@ function addRoutes(app, peliasConfig) { sanitizers.search.middleware(peliasConfig.api), middleware.requestLanguage, middleware.calcSize(), - controllers.libpostal(libpostalService, libpostalShouldExecute), + controllers.libpostal(libpostalShouldExecute), controllers.placeholder(placeholderService, geometricFiltersApply, placeholderGeodisambiguationShouldExecute), controllers.placeholder(placeholderService, geometricFiltersDontApply, placeholderIdsLookupShouldExecute), controllers.search_with_ids(peliasConfig.api, esclient, queries.address_using_ids, searchWithIdsShouldExecute), @@ -306,7 +287,6 @@ function addRoutes(app, peliasConfig) { sanitizers.structured_geocoding.middleware(peliasConfig.api), middleware.requestLanguage, middleware.calcSize(), - controllers.structured_libpostal(structuredLibpostalService, structuredLibpostalShouldExecute), controllers.search(peliasConfig.api, esclient, queries.structured_geocoding, not(hasResponseDataOrRequestErrors)), postProc.trimByGranularityStructured(), postProc.distances('focus.point.'), @@ -398,6 +378,9 @@ function addRoutes(app, peliasConfig) { ]), status: createRouter([ controllers.status + ]), + convert: createRouter([ + controllers.convert ]) }; @@ -407,6 +390,7 @@ function addRoutes(app, peliasConfig) { app.get ( base + 'attribution', routers.attribution ); app.get ( '/attribution', routers.attribution ); app.get ( '/status', routers.status ); + app.get ( base + 'convert', routers.convert ); // backend dependent endpoints app.get ( base + 'place', routers.place ); @@ -434,4 +418,4 @@ function createRouter(functions) { } -module.exports.addRoutes = addRoutes; +module.exports.addRoutes = addRoutes; \ No newline at end of file diff --git a/service/external.js b/service/external.js new file mode 100644 index 00000000..caf1ab74 --- /dev/null +++ b/service/external.js @@ -0,0 +1,18 @@ +const request = require('request'); +const logger = require('pelias-logger').get('api'); + +"use strict"; + +async function geotrans(coord) { + let result; + request(`http://10.0.2.62:3150?datum=WGE&coord=${coord}`, function (error, response, body) { + logger.info(response.body); + result = response.body; + }); + return result; + +} + +module.exports = { + geotrans: geotrans +}; \ No newline at end of file