Перейти к основному содержимому

GET /api/admin/v1/buildings/{buildingId}/override — Просмотр оверрайда корпуса (admin)

Назначение

Возвращает администратору платформы картину корпусного оверрайда (BuildingDisplayOverride, display-override.md): исходные значения источника (снапшот карточки проекта), текущий оверрайд (если есть) и эффективные значения витрины — чтобы решить, какие поля переопределить.

Зачем в ответе контекст проекта

Корпусные поля (ComplexName/Stars/DeliveryDate/ReadinessPercent/Address/DistanceMinutes) поднимаются на карточку проекта и денормализуются в объекты недвижимости корпуса — поэтому ответ включает контекст проекта (ProjectId/ProjectName/ProjectCardStatus).

Metadata

ПолеЗначение
Сервис/контекстcatalog
API areaadmin (ADR-0053)
Feature groupadmin-overrides
Статусdraft
Документdocs/06-services/catalog/api/admin/get-building-override.md

Актор и доступ

ПроверкаЗначение
Actor typeExternalSystem (администратор платформы через admin API; m2m client-credentials — ADR-0053)
Auth policy / Permissionspolicy AdminSystemOnly (клиент pin-admin-system); каталожное соответствие — permission catalog.overrides.view
Scope (RBAC)платформа (не tenanted — ADR-0052 п.3)
Auditread-sensitive: Comment — internal; чтение логируется

HTTP-контракт

ПолеЗначение
MethodGET
Route/api/admin/v1/buildings/{buildingId}/override
Success status200
Idempotency headerне применяется (чтение)
Correlationсквозной trace через traceparent; X-Admin-User-Id (Guid админа) — обязателен

Входные данные / параметры запроса

ПолеИсточникТипОбязательностьВалидация / ОграниченияБезопасность
BuildingIdrouteGuidДа!= Guid.Empty; существование корпуса в витрине — шаг 2
AdminUserIdheader X-Admin-User-IdGuidДа!= Guid.Emptyлог admin-доступа

Модель ответа BuildingOverrideView

ПолеТипОбязательностьИсточникMaskingОписание
BuildingIdGuidДаroute (подтверждён шагом 2)Корпус.
BuildingNamestringДаCatalogPropertyObjectCard.BuildingName (любой объект недвижимости корпуса)Название корпуса для формы админки.
ProjectIdGuidДаCatalogPropertyObjectCard.ProjectIdПроект корпуса.
ProjectNamestringДаCatalogProjectCard.NameЭффективное название проекта (контекст формы).
ProjectCardStatusstring (enum ProjectCardStatus)ДаCatalogProjectCard.StatusВидимость проекта.
PropertyObjectsInBuildingintДачисло объектов недвижимости корпуса (кроме Delisted)Сколько объектов недвижимости затронет правка.
SourceBuildingOverrideSourceBlockДаCatalogProjectCard.SourceSnapshotИсходные значения до оверрайда.
OverrideBuildingOverrideBlock?Нет (null — оверрайда нет)BuildingDisplayOverrideТекущий оверрайд.
EffectiveBuildingOverrideEffectiveBlockДаCatalogProjectCard (эффективные колонки)Что видит витрина.

Модель BuildingOverrideSourceBlock (проекция ProjectSourceSnapshotDocument — дом catalog-project-card.md)

ПолеТипОбязательностьИсточникMaskingОписание
NamestringДаSourceSnapshot.NameИсходное название проекта/комплекса (chessboard).
AddressstringДаSourceSnapshot.AddressИсходный адрес.
Starsshort?НетSourceSnapshot.StarsИсходная звёздность.
DeliveryDateDateOnly?НетSourceSnapshot.DeliveryDateИсходный срок сдачи.
ReadinessPercentshort?НетSourceSnapshot.ReadinessPercentИсходная готовность.
DistanceMinutesint?НетSourceSnapshot.DistanceMinutesИсходные минуты до точки.
ChessboardVersionlongДаSourceSnapshot.ChessboardVersionВерсия источника.

Модель BuildingOverrideBlock (проекция BuildingDisplayOverride — дом display-override.md)

ПолеТипОбязательностьИсточникMaskingОписание
IdGuidДаBuildingDisplayOverride.IdИдентификатор оверрайда.
IsVisiblebool?НетBuildingDisplayOverride.IsVisiblefalse — корпус скрыт (все объекты недвижимости → Hidden); null = не переопределено.
ComplexNamestring?НетBuildingDisplayOverride.ComplexName
Starsshort?НетBuildingDisplayOverride.Stars
DeliveryDateDateOnly?НетBuildingDisplayOverride.DeliveryDate
ReadinessPercentshort?НетBuildingDisplayOverride.ReadinessPercent
Addressstring?НетBuildingDisplayOverride.Address
DistanceMinutesint?НетBuildingDisplayOverride.DistanceMinutes
Commentstring?НетBuildingDisplayOverride.Commentinternal — только admin-областьКомментарий админа.
UpdatedAtDateTimeOffsetДаBuildingDisplayOverride.UpdatedAtПоследняя правка.
UpdatedByUserIdGuid?НетUpdatedByUserId ?? CreatedByUserIdАвтор последней правки.
VersionlongДаBuildingDisplayOverride.VersionДля optimistic-check в PUT.

Модель BuildingOverrideEffectiveBlock (эффективные колонки CatalogProjectCard)

ПолеТипОбязательностьИсточникMaskingОписание
NamestringДаCatalogProjectCard.NameЭффективное название комплекса.
AddressstringДаCatalogProjectCard.Address
Starsshort?НетCatalogProjectCard.Stars
DeliveryDateDateOnly?НетCatalogProjectCard.DeliveryDate
ReadinessPercentshort?НетCatalogProjectCard.ReadinessPercent
DistanceMinutesint?НетCatalogProjectCard.DistanceMinutes

Алгоритм

  1. Контекст и доступ. Актор — администратор платформы (admin API, m2m-клиент pin-admin-system, policy AdminSystemOnly); заголовок X-Admin-User-Id логируется как admin-доступ. Идемпотентность к чтению не применяется.
  2. Проверка входа. BuildingId != Guid.Empty, AdminUserId != Guid.Empty; иначе ValidationError. Существование корпуса в витрине: корпус существует, только если в catalog.property_object_cards есть хотя бы один объект недвижимости с этим BuildingId (объект недвижимости — носитель BuildingId); ни одного объекта → CATALOG_BUILDING_NOT_FOUND (404). Граничный случай: все объекты корпуса Delisted (живых нет) — корпус считается несуществующим для витрины → CATALOG_BUILDING_NOT_FOUND (404). Состояние чтение не ограничивает (Published/Hidden объекты показываются — админ должен видеть скрытое).
  3. Что читаем. Карточку проекта корпуса (по ProjectId любого объекта корпуса; существование гарантирует INV-2 ProjectFirst), живой оверрайд корпуса BuildingDisplayOverride (может отсутствовать → блок Override = null) и число объектов недвижимости корпуса в статусе, отличном от Delisted.
  4. Маппинг. Source.* ← снапшот источника карточки проекта (SourceSnapshot); Override.* ← оверрайд корпуса (или null); Effective.* ← эффективные колонки карточки проекта; BuildingName ← название корпуса из объекта; PropertyObjectsInBuilding ← счётчик шага 3.
  5. Результат. BuildingOverrideView; freshness — актуальная строка (source of truth оверрайдов — этот контекст).

Диаграмма

Ошибки и failure modes

КодHTTP statusУсловиеСообщениеRetry
ValidationError400Пустой BuildingId/X-Admin-User-IdОшибка валидации запросаno retry
UNAUTHORIZED401Нет/просрочен m2m client-credentials токенТребуется авторизацияno retry
FORBIDDEN403Клиент не pin-admin-system / нет catalog.overrides.viewДоступ запрещёнno retry
CATALOG_BUILDING_NOT_FOUND404Ни одного живого объекта недвижимости с таким BuildingId в catalog.property_object_cards (нет объектов или все Delisted)Корпус не найден в каталогеno retry

Совместимость и наблюдаемость

  • Новые optional поля блоков — additive; удаление/переименование/смена типа — breaking (migration + rollout).
  • Logs: admin-building-override-viewed (buildingId, adminUserId); metrics: catalog_admin_operations_total{operation="get-building-override"}, duration; traces: span приёма → span обработки → span обращения к хранилищу; correlation — сквозной trace через traceparent. Dashboard catalog-overview.

Обратные ссылки

Автоссылки: где используется этот документ.

Связанные документы