diff --git a/helper/adminFields.js b/helper/adminFields.js index de1dd009..275e03c1 100644 --- a/helper/adminFields.js +++ b/helper/adminFields.js @@ -1,5 +1,7 @@ -var peliasSchema = require('pelias-schema'); -var peliasLogger = require( 'pelias-logger' ).get( 'api' ); + +var _ = require('lodash'), + peliasSchema = require('pelias-schema'), + peliasLogger = require( 'pelias-logger' ).get( 'api' ); var ADMIN_FIELDS = [ 'admin0', @@ -29,7 +31,7 @@ function getAvailableAdminFields(schema, expectedFields, logger) { // check if expected fields are actually in current schema var available = expectedFields.filter(function (field) { - return (actualFields.indexOf(field) !== -1); + return _.contains( actualFields, field ); }); if (available.length === 0) { diff --git a/helper/geojsonify.js b/helper/geojsonify.js index dcd96168..18e11b3d 100644 --- a/helper/geojsonify.js +++ b/helper/geojsonify.js @@ -1,9 +1,8 @@ -var GeoJSON = require('geojson'); -var extent = require('geojson-extent'); -var outputGenerator = require('./outputGenerator'); -var logger = require('pelias-logger').get('api'); - +var GeoJSON = require('geojson'), + extent = require('geojson-extent'), + outputGenerator = require('./outputGenerator'), + logger = require('pelias-logger').get('api'); // Properties to be copied var DETAILS_PROPS = [ @@ -104,15 +103,13 @@ function geojsonifyPlace(place) { return warning('No doc or center_point property'); } - var geocoding = {}; + var output = {}; - addMetaData(place, geocoding); - addDetails(place, geocoding); - addLabel(place, geocoding); + addMetaData(place, output); + addDetails(place, output); + addLabel(place, output); - var output = {}; - output.geocoding = geocoding; // map center_point for GeoJSON to work properly // these should not show up in the final feature properties output.lat = parseFloat(place.center_point.lat); @@ -204,4 +201,4 @@ function warning( doc ) { } -module.exports.search = geojsonifyPlaces; \ No newline at end of file +module.exports.search = geojsonifyPlaces; diff --git a/sanitiser/_details.js b/sanitiser/_details.js new file mode 100644 index 00000000..f0e2bade --- /dev/null +++ b/sanitiser/_details.js @@ -0,0 +1,32 @@ + +var _ = require('lodash'), + check = require('check-types'); + +var DEFAULT_DETAILS_BOOL = true; + +// validate inputs, convert types and apply defaults +function sanitize( raw, clean ){ + + // error & warning messages + var messages = { errors: [], warnings: [] }; + + if( !check.undefined( raw.details ) ){ + clean.details = isTruthy( raw.details ); + } else { + clean.details = DEFAULT_DETAILS_BOOL; + } + + return messages; +} + +// be lenient with 'truthy' values +function isTruthy(val) { + if( check.string( val ) ){ + return _.contains( ['true', '1'], val ); + } + + return val === 1 || val === true; +} + +// export function +module.exports = sanitize; diff --git a/sanitiser/_id.js b/sanitiser/_id.js index 77d21fa8..ff6834ca 100644 --- a/sanitiser/_id.js +++ b/sanitiser/_id.js @@ -1,5 +1,6 @@ -var check = require('check-types'), +var _ = require('lodash'), + check = require('check-types'), types = require('../query/types'); var ID_DELIM = ':'; @@ -18,12 +19,7 @@ function sanitize( raw, clean ){ var messages = { errors: [], warnings: [] }; // 'raw.id' can be an array!? - var rawIds = check.array( raw.id ) ? raw.id : [ raw.id ]; - - // de-dupe ids - rawIds = rawIds.filter(function(item, pos) { - return rawIds.indexOf( item ) === pos; - }); + var rawIds = check.array( raw.id ) ? _.unique( raw.id ) : [ raw.id ]; // ensure all elements are valid non-empty strings rawIds = rawIds.filter( function( uc ){ @@ -60,7 +56,7 @@ function sanitize( raw, clean ){ messages.errors.push( errorMessage( rawId ) ); } // type text must be one of the types - if( types.indexOf( type ) === -1 ){ + if( !_.contains( types, type ) ){ messages.errors.push( errorMessage('type', type + ' is invalid. It must be one of these values - [' + types.join(', ') + ']') ); diff --git a/sanitiser/_source.js b/sanitiser/_source.js index 88d620fc..fae33d1d 100644 --- a/sanitiser/_source.js +++ b/sanitiser/_source.js @@ -1,5 +1,6 @@ -var check = require('check-types'), +var _ = require('lodash'), + check = require('check-types'), sources_map = require( '../query/sources' ); var ALL_SOURCES = Object.keys(sources_map), @@ -20,7 +21,7 @@ function sanitize( raw, clean ) { var sources = raw.source.split(','); var invalid_sources = sources.filter(function(source) { - return ALL_SOURCES.indexOf(source) === -1; + return !_.contains( ALL_SOURCES, source ); }); if( invalid_sources.length > 0 ){ diff --git a/test/unit/helper/geojsonify.js b/test/unit/helper/geojsonify.js index dca0d3fb..838dc526 100644 --- a/test/unit/helper/geojsonify.js +++ b/test/unit/helper/geojsonify.js @@ -140,25 +140,23 @@ module.exports.tests.search = function(test, common) { ] }, 'properties': { - 'geocoding': { - 'id': 'id1', - 'layer': 'type1', - 'source': 'type1', - 'label': '\'Round Midnight Jazz and Blues Bar, test3, Angel', - 'name': '\'Round Midnight Jazz and Blues Bar', - 'country_a': 'GBR', - 'country': 'United Kingdom', - 'region': 'Islington', - 'region_a': 'ISL', - 'county': 'Angel', - 'localadmin': 'test1', - 'locality': 'test2', - 'neighbourhood': 'test3', - 'category': ['food', 'nightlife'], - 'housenumber': '13', - 'street': 'Liverpool Road', - 'postalcode': 'N1 0RW' - } + 'id': 'id1', + 'layer': 'type1', + 'source': 'type1', + 'label': '\'Round Midnight Jazz and Blues Bar, test3, Angel', + 'name': '\'Round Midnight Jazz and Blues Bar', + 'country_a': 'GBR', + 'country': 'United Kingdom', + 'region': 'Islington', + 'region_a': 'ISL', + 'county': 'Angel', + 'localadmin': 'test1', + 'locality': 'test2', + 'neighbourhood': 'test3', + 'category': ['food', 'nightlife'], + 'housenumber': '13', + 'street': 'Liverpool Road', + 'postalcode': 'N1 0RW' } }, { @@ -171,21 +169,19 @@ module.exports.tests.search = function(test, common) { ] }, 'properties': { - 'geocoding': { - 'id': 'id2', - 'layer': 'type2', - 'source': 'type2', - 'label': 'Blues Cafe, test3, Smithfield', - 'name': 'Blues Cafe', - 'country_a': 'GBR', - 'country': 'United Kingdom', - 'region': 'City And County Of The City Of London', - 'region_a': 'COL', - 'county': 'Smithfield', - 'localadmin': 'test1', - 'locality': 'test2', - 'neighbourhood': 'test3' - } + 'id': 'id2', + 'layer': 'type2', + 'source': 'type2', + 'label': 'Blues Cafe, test3, Smithfield', + 'name': 'Blues Cafe', + 'country_a': 'GBR', + 'country': 'United Kingdom', + 'region': 'City And County Of The City Of London', + 'region_a': 'COL', + 'county': 'Smithfield', + 'localadmin': 'test1', + 'locality': 'test2', + 'neighbourhood': 'test3' } }, { @@ -198,22 +194,20 @@ module.exports.tests.search = function(test, common) { ] }, 'properties': { - 'geocoding': { - 'id': '34633854', - 'layer': 'venue', - 'source': 'osm', - 'label': 'Empire State Building, Manhattan, NY', - 'name': 'Empire State Building', - 'country_a': 'USA', - 'country': 'United States', - 'region': 'New York', - 'region_a': 'NY', - 'county': 'New York', - 'localadmin': 'Manhattan', - 'locality': 'New York', - 'neighbourhood': 'Koreatown', - 'category': ['tourism', 'transport'] - } + 'id': '34633854', + 'layer': 'venue', + 'source': 'osm', + 'label': 'Empire State Building, Manhattan, NY', + 'name': 'Empire State Building', + 'country_a': 'USA', + 'country': 'United States', + 'region': 'New York', + 'region_a': 'NY', + 'county': 'New York', + 'localadmin': 'Manhattan', + 'locality': 'New York', + 'neighbourhood': 'Koreatown', + 'category': ['tourism', 'transport'] } } ] @@ -235,4 +229,4 @@ module.exports.all = function (tape, common) { for( var testCase in module.exports.tests ){ module.exports.tests[testCase](test, common); } -}; \ No newline at end of file +}; diff --git a/test/unit/sanitiser/reverse.js b/test/unit/sanitiser/reverse.js index 3a8bacde..3a580684 100644 --- a/test/unit/sanitiser/reverse.js +++ b/test/unit/sanitiser/reverse.js @@ -133,7 +133,7 @@ module.exports.tests.sanitize_private = function(test, common) { }); }); - var valid_values = ['true', true, 1]; + var valid_values = ['true', true, 1, '1']; valid_values.forEach(function(value) { test('valid private param ' + value, function(t) { sanitize({ 'point.lat': 0, 'point.lon': 0, 'private': value }, function( err, clean ){