From cc8b51a12dc405b0ae0a7bb82d63441452f209b4 Mon Sep 17 00:00:00 2001 From: Vesa Meskanen Date: Tue, 18 Feb 2020 09:20:01 +0200 Subject: [PATCH] Upstream pick to fix breaking gid management changes --- helper/decode_gid.js | 21 +++++++++++++++++++++ helper/geojsonify.js | 25 ++++++++++++++++++++++--- 2 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 helper/decode_gid.js diff --git a/helper/decode_gid.js b/helper/decode_gid.js new file mode 100644 index 00000000..86b760f5 --- /dev/null +++ b/helper/decode_gid.js @@ -0,0 +1,21 @@ +const _ = require('lodash'); + +// helper method to decode a GID from a string +// for additional validation see sanitizer/_ids.js + +function decodeGID(gid) { + const parts = gid.split(':'); + + if ( parts.length < 3 ) { + return; + } + + // empty strings and other invalid values are expected to be handled by the caller + return { + source: parts[0], + layer: parts[1], + id: parts.slice(2).join(':'), + }; +} + +module.exports = decodeGID; diff --git a/helper/geojsonify.js b/helper/geojsonify.js index 624e6bdf..6743631a 100644 --- a/helper/geojsonify.js +++ b/helper/geojsonify.js @@ -4,7 +4,9 @@ const logger = require('pelias-logger').get('geojsonify'); const collectDetails = require('./geojsonify_place_details'); const _ = require('lodash'); const Document = require('pelias-model').Document; +const codec = require('pelias-model').codec; const field = require('./fieldValue'); +const decode_gid = require('./decode_gid'); function geojsonifyPlaces( params, docs ){ @@ -39,13 +41,14 @@ function geojsonifyPlaces( params, docs ){ } function geojsonifyPlace(params, place) { + const gid_components = decode_gid(place._id); // setup the base doc const doc = { - id: place._id, - gid: new Document(place.source, place.layer, place._id).getGid(), + id: gid_components.id, + gid: new Document(place.source, place.layer, gid_components.id).getGid(), layer: place.layer, source: place.source, - source_id: place.source_id, + source_id: gid_components.id, bounding_box: place.bounding_box, lat: parseFloat(place.center_point.lat), lng: parseFloat(place.center_point.lon) @@ -58,6 +61,22 @@ function geojsonifyPlace(params, place) { // assign all the details info into the doc Object.assign(doc, collectDetails(params, place)); + // add addendum data if available + // note: this should be the last assigned property, for aesthetic reasons. + if (_.has(place, 'addendum')) { + let addendum = {}; + for(let namespace in place.addendum){ + try { + addendum[namespace] = codec.decode(place.addendum[namespace]); + } catch( e ){ + logger.warn(`doc ${doc.gid} failed to decode addendum namespace ${namespace}`); + } + } + if( Object.keys(addendum).length ){ + doc.addendum = addendum; + } + } + return doc; }