Browse Source

Use external resources

pull/1076/head
Gibran Parvez 7 years ago
parent
commit
bc35477ad8
  1. 22
      Dockerfile
  2. 43
      controller/convert.js
  3. 30
      routes/v1.js
  4. 18
      service/external.js

22
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" ]

43
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;

30
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 );

18
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
};
Loading…
Cancel
Save