/** * helper sanitiser methods for geo parameters */ var util = require('util'), check = require('check-types'), _ = require('lodash'); /** * Parse and validate rect parameter * * @param {string} key_prefix * @param {object} clean * @param {object} raw * @param {bool} bbox_is_required */ function sanitize_rect( key_prefix, clean, raw, bbox_is_required ) { // the names we use to define the corners of the rect var mandatoryProps = [ 'min_lat', 'max_lat', 'min_lon', 'max_lon' ]; // count up how many fields the user actually specified var totalFieldsSpecified = 0; mandatoryProps.forEach( function( prop ){ if( raw.hasOwnProperty( key_prefix + '.' + prop ) ){ totalFieldsSpecified++; } }); // all fields specified if( 4 === totalFieldsSpecified ) { // reuse the coord sanitizer and set required:true so we get a fatal error if // any one of the corners is not specified. sanitize_coord( key_prefix + '.min_lat', clean, raw[ key_prefix + '.min_lat' ], true ); sanitize_coord( key_prefix + '.max_lat', clean, raw[ key_prefix + '.max_lat' ], true ); sanitize_coord( key_prefix + '.min_lon', clean, raw[ key_prefix + '.min_lon' ], true ); sanitize_coord( key_prefix + '.max_lon', clean, raw[ key_prefix + '.max_lon' ], true ); } // fields only partially specified else if( totalFieldsSpecified > 0 ){ var format1 = 'missing rect param \'%s\' requires all of: \'%s\' to be present'; throw new Error( util.format( format1, key_prefix, mandatoryProps.join('\',\'') ) ); } // fields required, eg. ( totalFieldsSpecified === 0 && bbox_is_required === true ) else if( bbox_is_required ){ var format2 = 'missing rect param \'%s\' requires all of: \'%s\' to be present'; throw new Error( util.format( format2, key_prefix, mandatoryProps.join('\',\'') ) ); } } /** * Parse and validate circle parameter * * @param {string} key_prefix * @param {object} clean * @param {object} raw * @param {bool} circle_is_required */ function sanitize_circle( key_prefix, clean, raw, circle_is_required ) { // the names we use to define the centroid var mandatoryProps = [ 'lat', 'lon' ]; // count up how many fields the user actually specified var totalFieldsSpecified = 0; mandatoryProps.forEach( function( prop ){ if( raw.hasOwnProperty( key_prefix + '.' + prop ) ){ totalFieldsSpecified++; } }); // all fields specified if( 2 === totalFieldsSpecified ) { // reuse the coord sanitizer and set required:true so we get a fatal error if // any one of the coords is not specified. sanitize_coord( key_prefix + '.lat', clean, raw[ key_prefix + '.lat' ], true ); sanitize_coord( key_prefix + '.lon', clean, raw[ key_prefix + '.lon' ], true ); if( check.assigned( raw[ key_prefix + '.radius' ] ) ){ sanitize_coord( key_prefix + '.radius', clean, raw[ key_prefix + '.radius' ], true ); } } // fields only partially specified else if( totalFieldsSpecified > 0 ){ var format1 = 'missing circle param \'%s\' requires all of: \'%s\' to be present'; throw new Error( util.format( format1, key_prefix, mandatoryProps.join('\',\'') ) ); } // radius was specified without lat or lon else if( raw.hasOwnProperty( key_prefix + '.radius' ) ){ var format2 = 'missing circle param \'%s\' requires all of: \'%s\' to be present'; throw new Error( util.format( format2, key_prefix, mandatoryProps.join('\',\'') ) ); } // fields required, eg. ( totalFieldsSpecified === 0 && bbox_is_required === true ) else if( circle_is_required ){ var format3 = 'missing circle param \'%s\' requires all of: \'%s\' to be present'; throw new Error( util.format( format3, key_prefix, mandatoryProps.join('\',\'') ) ); } } /** * Parse and validate point parameter * * @param {string} key_prefix * @param {object} clean * @param {object} raw * @param {bool} point_is_required */ function sanitize_point( key_prefix, clean, raw, point_is_required ) { // the names we use to define the point var mandatoryProps = [ 'lat', 'lon' ]; // count up how many fields the user actually specified var totalFieldsSpecified = 0; mandatoryProps.forEach( function( prop ){ if( raw.hasOwnProperty( key_prefix + '.' + prop ) ){ totalFieldsSpecified++; } }); // all fields specified if( 2 === totalFieldsSpecified ) { // reuse the coord sanitizer and set required:true so we get a fatal error if // any one of the coords is not specified. sanitize_coord( key_prefix + '.lat', clean, raw[ key_prefix + '.lat' ], true ); sanitize_coord( key_prefix + '.lon', clean, raw[ key_prefix + '.lon' ], true ); } // fields only partially specified else if( totalFieldsSpecified > 0 ){ var format1 = 'missing point param \'%s\' requires all of: \'%s\' to be present'; throw new Error( util.format( format1, key_prefix, mandatoryProps.join('\',\'') ) ); } // fields required, eg. ( totalFieldsSpecified === 0 && bbox_is_required === true ) else if( point_is_required ){ var format2 = 'missing point param \'%s\' requires all of: \'%s\' to be present'; throw new Error( util.format( format2, key_prefix, mandatoryProps.join('\',\'') ) ); } } /** * Validate lat,lon values * * @param {string} key * @param {object} clean * @param {string} rawValue * @param {bool} latlon_is_required */ function sanitize_coord( key, clean, rawValue, latlon_is_required ) { var parsedValue = parseFloat( rawValue ); if ( _.isFinite( parsedValue ) ) { clean[key] = parsedValue; } else if (latlon_is_required) { throw new Error( util.format( 'missing param \'%s\'', key ) ); } } module.exports = { sanitize_rect: sanitize_rect, sanitize_coord: sanitize_coord, sanitize_circle: sanitize_circle, sanitize_point: sanitize_point };