All files / lib/query render-features.js

80.95% Statements 17/21
68% Branches 17/25
100% Functions 2/2
80.95% Lines 17/21

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 793x     3x       3x 3x                 8x         8x               8x   8x                         8x 1x     8x                 8x   8x   8x       8x 8x                   3x  
const _ = require('lodash')
const {
  QueryFields
} = require('../helpers/fields')
const {
  getCollectionCrs,
  normalizeSpatialReference
} = require('../helpers')
const featureResponseTemplate = require('../../templates/features.json')
 
/**
 * Modifies a template features json file with metadata, capabilities, and data from the model
 * @param {object} data - data from provider model
 * @param {object} params
 * @return {object} formatted features data
 */
function renderFeaturesResponse (data = {}, params = {}) {
  const template = _.cloneDeep(featureResponseTemplate)
 
  const {
    uniqueIdField: uniqueIdFieldDefault,
    objectIdFieldName: objectIdFieldNameDefault
  } = template
 
  const {
    metadata: {
      limitExceeded,
      transform,
      idField
    } = {}
  } = data
 
  const computedProperties = {
    geometryType: params.geometryType,
    spatialReference: getOutputSpatialReference(data, params),
    fields: QueryFields.create({ data, ...params }),
    features: data.features || [],
    exceededTransferLimit: !!limitExceeded,
    objectIdFieldName: idField || objectIdFieldNameDefault,
    uniqueIdField: {
      ...uniqueIdFieldDefault,
      name: idField || uniqueIdFieldDefault.name
    }
  }
 
  if (transform) {
    computedProperties.transform = transform
  }
 
  return { ...template, ...computedProperties }
}
 
function getOutputSpatialReference (collection, {
  outSR,
  outputCrs,
  inputCrs,
  sourceSR
}) {
  const spatialReference = outputCrs || outSR || inputCrs || sourceSR || getCollectionCrs(collection) || 4326
 
  const { wkid, wkt, latestWkid } = normalizeSpatialReference(spatialReference)
 
  Iif (wkid && latestWkid) {
    return { wkid, latestWkid }
  }
 
  Eif (wkid) {
    return { wkid }
  }
 
  if (latestWkid) {
    return { latestWkid }
  }
 
  return { wkt }
}
 
module.exports = { renderFeaturesResponse }