UNPKG

featureserver

Version:

*An open source implementation of the GeoServices specification*

263 lines (225 loc) 5.93 kB
const _ = require('lodash') const { CURRENT_VERSION, FULL_VERSION } = require('../constants') const { LayerFields } = require('../helpers/fields') class TableLayerMetadata { static create (geojson = {}, options = {}) { const { geojson: normalizedGeojson, options: normalizedOptions } = TableLayerMetadata.normalizeInput(geojson, options) const tableMetadata = new TableLayerMetadata() return tableMetadata.mixinOverrides(normalizedGeojson, normalizedOptions) } static normalizeInput (geojson, req) { const { metadata = {}, capabilities, ...normalizedGeojson } = geojson const { params: { layer: reqLayer } = {}, query = {} } = req const layerId = reqLayer != null ? reqLayer : req.layerId const { currentVersion, fullVersion, description } = _.get(req, 'app.locals.config.featureServer', {}) const normalizedOptions = _.pickBy({ currentVersion, fullVersion, description, layerId, ...query, ...metadata, capabilities: normalizeCapabilities(capabilities, metadata.capabilities) }, (value) => value) if (!normalizedGeojson.features) { normalizedGeojson.features = [] } return { geojson: normalizedGeojson, options: normalizedOptions } } constructor () { Object.assign(this, { id: 0, name: 'Not Set', type: 'Table', description: 'This is a feature service powered by https://github.com/featureserver/featureserver', copyrightText: ' ', parentLayer: null, subLayers: null, defaultVisibility: true, hasAttachments: false, htmlPopupType: 'esriServerHTMLPopupTypeNone', displayField: 'OBJECTID', typeIdField: null, fields: [], relationships: [], capabilities: 'Query', maxRecordCount: 2000, supportsStatistics: true, supportsAdvancedQueries: true, supportedQueryFormats: 'JSON', ownershipBasedAccessControlForFeatures: { allowOthersToQuery: true }, useStandardizedQueries: true, advancedQueryCapabilities: { useStandardizedQueries: true, supportsStatistics: true, supportsOrderBy: true, supportsDistinct: true, supportsPagination: true, supportsTrueCurve: false, supportsReturningQueryExtent: true, supportsQueryWithDistance: true }, canModifyLayer: false, dateFieldsTimeReference: null, isDataVersioned: false, supportsRollbackOnFailureParameter: true, hasM: false, hasZ: false, allowGeometryUpdates: true, objectIdField: 'OBJECTID', globalIdField: '', types: [], templates: [], hasStaticData: false, timeInfo: {}, uniqueIdField: { name: 'OBJECTID', isSystemMaintained: true }, currentVersion: CURRENT_VERSION, fullVersion: FULL_VERSION }) } mixinOverrides (geojson = {}, options = {}) { const { id, idField, displayField, capabilities, layerId, hasStaticData, supportsPagination, hasAttachments } = options this._setFields(geojson, options) this._setId(layerId, id) this._setDisplayField(displayField, idField) this._setHasStaticData(hasStaticData) this._setCapabilities(capabilities) this._setUniqueIdField(idField) this._setPagination(supportsPagination) this._setDirectOverrides(options) this._setHasAttachments(hasAttachments) return this } _setFields (data, options) { const fields = LayerFields.create({ ...data, ...options }) if (fields) { this.fields = fields } } _setId (layerId, metadataId) { const requestPathLayerId = parseInt(layerId) const id = !isNaN(requestPathLayerId) ? requestPathLayerId : metadataId if (id) { this.id = id } } _setDisplayField (displayField, idField) { const overrideDisplayField = displayField || idField if (overrideDisplayField) { this.displayField = overrideDisplayField } } _setHasStaticData (hasStaticData) { if (typeof hasStaticData === 'boolean') { this.hasStaticData = hasStaticData } } _setCapabilities (capabilities) { if (!capabilities) { return } if (capabilities.list) { this.capabilities = capabilities.list return } if (_.has(capabilities, 'extract') && !this.capabilities.includes('Extract')) { this.capabilities = `${this.capabilities},Extract` } } _setUniqueIdField (idField) { if (idField) { this.uniqueIdField.name = idField } } _setPagination (supportsPagination) { if (typeof supportsPagination === 'boolean') { this.advancedQueryCapabilities.supportsPagination = supportsPagination } } _setHasAttachments (hasAttachments) { if (hasAttachments != null && typeof hasAttachments === 'boolean') { this.hasAttachments = hasAttachments } } _setDirectOverrides (options) { const { name, relationships, description, copyrightText, templates, idField, timeInfo, maxRecordCount, defaultVisibility, currentVersion, fullVersion, hasZ } = options _.merge(this, { name, relationships, description, copyrightText, templates, objectIdField: idField, timeInfo, maxRecordCount, defaultVisibility, currentVersion, fullVersion, hasZ }) } } function normalizeCapabilities (capabilities, metadataCapabilites) { if (_.isString(metadataCapabilites)) { return { ...capabilities, list: metadataCapabilites } } return { ...(metadataCapabilites || {}), ...capabilities } } module.exports = TableLayerMetadata