Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | 1x 1x 1x 16x 12x 8x 16x 16x 4x 4x 12x 12x 7x 5x 4x 4x 4x 5x 2x 1x 1x 8x 8x 5x 3x 1x 2x 2x 1x 2x 2x 1x | const joi = require('joi') const { CodedError } = require('../helpers/errors') const classificationDefinitionSchema = joi .object({ type: joi .string() .valid('classBreaksDef', 'uniqueValueDef') .error(new Error('invalid classification type')), baseSymbol: joi .object({ type: joi .string() .valid('esriSMS', 'esriSLS', 'esriSFS') .required() .error( new Error( 'baseSymbol requires a valid type: esriSMS, esriSLS, esriSFS' ) ) }) .optional() .unknown(), uniqueValueFields: joi.array().items(joi.string()) }) .required() .unknown() .messages({ 'any.required': 'classification definition is required' }) function validateClassificationDefinition ( definition, geometryType, classification ) { validateDefinitionShape(definition) validateDefinitionSymbolAgainstGeometry(definition.baseSymbol, geometryType) validateUniqueValueFields(definition, classification) } function validateDefinitionShape (definition) { const { error } = classificationDefinitionSchema.validate(definition) if (error) { error.code = 400 throw error } } function validateDefinitionSymbolAgainstGeometry ( baseSymbol = {}, geometryType ) { const { type: symbolType } = baseSymbol if (!symbolType) { return } if (symbolLookup(geometryType) !== symbolType) { const error = new Error( 'Classification defintion uses a base symbol type that is incompatiable with dataset geometry' ) error.code = 400 throw error } } function symbolLookup (geometryType) { switch (geometryType) { case 'esriGeometryPoint': case 'esriGeometryMultipoint': return 'esriSMS' case 'esriGeometryPolyline': return 'esriSLS' case 'esriGeometryPolygon': return 'esriSFS' default: } } function validateUniqueValueFields (definition, classification) { const { uniqueValueFields, type } = definition if (type !== 'uniqueValueDef') { return } if (!uniqueValueFields) { throw new CodedError('uniqueValueDef requires a classification definition with "uniqueValueFields" array', 400) } const classificationFieldNames = Object.keys(classification[0]) if (areFieldsMissingFromClassification(uniqueValueFields, classificationFieldNames)) { throw new CodedError(`Unique value definition fields are incongruous with classification fields: ${uniqueValueFields.join(', ')} : ${classificationFieldNames.join(', ')}`, 400) } } function areFieldsMissingFromClassification (definitionFields, classificationFieldNames) { return definitionFields.some( (fieldName) => !classificationFieldNames.includes(fieldName) ) } module.exports = validateClassificationDefinition |