FeatureConfig описывает структуру дорожной сущности (RoadEntity): как называются её поля, как они группируются в карточке объекта, какие поля можно редактировать и фильтровать, а также как разворачивать поля-связи в читаемые значения. Это метаданные источника — по ним потребитель знает, что именно вернёт эндпоинт получения данных и как это отобразить.

Приходит в составе RoadEntityFeatureSourceConfigDto (поле FeatureConfig):

GET api/v1/public/Config/FeatureSources/RoadEntity/{dataSourceId}

Регистр имён. Технические имена (EntityName, Name поля, Type, поля Related, Virtual, а также имена в RelatedFeatureConfigs и ComplexPropertySchemas) отдаются в camelCase. Человекочитаемые псевдонимы (Alias) сохраняют исходный регистр.

Структура FeatureConfig

ПолеТипОписание
EntityNamestringИмя сущности. Используется как {entityName} в маршрутах получения данных (шаг 6 в public-api).
PropertyGroupsFeatureConfigPropertyGroupShort[]Группы полей карточки объекта — основная часть конфига (см. ниже).
ShortcutNamePropertiesstring[]?Имена полей, из которых складывается краткое (заголовочное) имя объекта. null, если не заданы.
RelatedFeatureConfigsRelatedFeatureConfig[]?Связанные источники, по которым сущность можно дополнительно фильтровать. null, если их нет.
ComplexPropertySchemasFeatureComplexPropertyScheme[]?Схемы составных (комплексных) полей. null, если их нет.
HaveRelatedGeomEntitiesboolЕсть ли у сущности связанные геометрические сущности.

PropertyGroups — группировка полей карточки

PropertyGroups задаёт, как поля сущности разложены по секциям в карточке объекта. Каждая группа — это FeatureConfigPropertyGroupShort:

ПолеТипОписание
OrderintПорядок группы в карточке.
Aliasstring?Заголовок группы (человекочитаемый).
CollapsedboolДолжна ли группа быть свёрнута по умолчанию.
PropertiesFeaturePropertyShort[]Поля, входящие в группу.

FeaturePropertyShort — метаинформация об одном поле

Самая важная часть конфига. Описывает одно поле сущности.

ПолеТипОписание
NamestringТехническое имя поля — под этим ключом значение приходит в ответе данных и указывается в Fields/фильтрах.
Aliasstring?Человекочитаемое название поля (напр. «размер»).
Typestring?Тип поля (см. таблицу значений).
RequiredboolПоле обязательно в базе (NOT NULL).
EditableboolПоле разрешено изменять согласно настройке текущего слоя.
FilterableboolПо полю разрешена фильтрация согласно настройке текущего слоя.
RelatedFeatureConfigRelatedProperty?Описание поля-связи (см. ниже). null для обычных полей.
IdGuid?Идентификатор поля в конфигурации.
Virtualobject?Служебное поле, для публичного API не используется.

Пример поля:

{
  "name": "size",
  "alias": "размер",
  "type": "string",
  "required": true,
  "editable": true,
  "filterable": true
}

Читается так: у поля техническое имя size, отображается как «размер», строкового типа, обязательно в базе, его можно редактировать и по нему можно фильтровать.

Возможные значения Type

Значения соответствуют классификатору типов полей (PropertyTypeClassifier) и отдаются в camelCase:

TypeЗначениеПримечание
stringСтрокаСтроковые поля; сюда же попадают идентификаторы (Guid хранится как строка).
integerЦелое числоshort/int/long и беззнаковые варианты.
realЧисло с плавающей точкойfloat/double.
boolЛогический тип
dateДата (без времени)
timeВремя (без даты)
dateTimeДата и время (без часового пояса)
dateTimeTzДата и время с часовым поясом
geometryГеометрияГеометрическое поле сущности.
jsonBJSONХранится в БД как jsonb.
guidИдентификаторОтдельный тип идентификатора (на практике Guid чаще отдаётся как string).
nullНеопределённый типСлужебное значение (тип поля не установлен).

Related — поля-связи

Если поле является ссылкой на другую сущность, у него заполнено Related. Оно подсказывает, из какой сущности и какое поле нужно подставить вместо идентификатора.

ПолеТипОписание
EntitystringИмя связанной сущности.
PropertystringПоле связанной сущности, которое подставляется вместо идентификатора.
RelatedFeatureConfigRelatedProperty?Вложенная связь (цепочка), если целевое поле само является ссылкой.

Пример. У поля busStopId в Related указано Entity = "busStop", Property = "name". Значение поля в данных приходит как идентификатор остановки. Чтобы показать читаемое значение, нужно запросить все busStop, построить словарь id → name и подставить имя остановки вместо busStopId. Если Related.Related тоже заполнено — связь многоуровневая, и её разворачивают по цепочке.

Прочие поля

  • RelatedFeatureConfig ({ RelatedEntityName, RelatedEntityAlias?, FilteredPropertyName }) — связанный источник, по которому можно дополнительно фильтровать сущность.
  • FeatureComplexPropertyScheme ({ RelationshipSourceName?, BasePropertyName?, RelatedPropertiesList[] }, где элемент списка — { PropertyId, EntityName, DisplayPropertyName, RelationshipPropertyName }) — схема составного поля, собираемого из нескольких связанных полей.

Для базового сценария (отображение сущности на карте и в карточке, фильтрация) достаточно EntityName и PropertyGroups.

  • No labels