GET /api/admin/v1/lots/{propertyObjectId}/override — Просмотр оверрайда объекта недвижимости (admin)
Назначение
Возвращает администратору платформы полную картину витринных данных объекта недвижимости для правки:
исходные значения источников (SourceSnapshot карточки), текущий оверрайд (если есть) и
эффективные значения витрины (Effective = Override ?? SourceSnapshot, INV-3
catalog-property-object-card.md).
Зачем три блока
Три блока вместо голой строки оверрайда — чтобы админ видел, что именно он перекрывает.
Metadata
| Поле | Значение |
|---|---|
| Сервис/контекст | catalog |
| API area | admin (ADR-0053) |
| Feature group | admin-overrides |
| Статус | draft |
| Документ | docs/06-services/catalog/api/admin/get-property-object-override.md |
Актор и доступ
| Проверка | Значение |
|---|---|
| Actor type | ExternalSystem (администратор платформы через admin API; m2m client-credentials — ADR-0053) |
| Auth policy / Permissions | policy AdminSystemOnly: OAuth2 client-credentials клиента pin-admin-system; каталожное соответствие — permission catalog.overrides.view (identity/domain/permission.md) |
| Scope (RBAC) | платформа (оверрайды — платформенные данные, не tenanted — ADR-0052 п.3) |
| Audit | read-sensitive: Comment оверрайда — internal; чтение логируется (admin-доступ), deep audit мутаций — в PUT-операции |
HTTP-контракт
| Поле | Значение |
|---|---|
| Method | GET |
| Route | /api/admin/v1/lots/{propertyObjectId}/override |
| Success status | 200 |
| Idempotency header | не применяется (чтение) |
| Correlation | сквозной trace через traceparent; X-Admin-User-Id (Guid админа) — обязательный заголовок admin-области |
Входные данные / параметры запроса
| Поле | Источник | Тип | Обязательность | Валидация / Ограничения | Безопасность |
|---|---|---|---|---|---|
PropertyObjectId | route | Guid | Да | != Guid.Empty; существование карточки — шаг 2 алгоритма | — |
AdminUserId | header X-Admin-User-Id | Guid | Да | != Guid.Empty | лог admin-доступа |
Модель ответа PropertyObjectOverrideView
| Поле | Тип | Обязательность | Источник | Masking | Описание |
|---|---|---|---|---|---|
PropertyObjectId | Guid | Да | CatalogPropertyObjectCard.Id | — | Объект недвижимости. |
CardStatus | string (enum PropertyObjectCardStatus) | Да | CatalogPropertyObjectCard.Status | — | Published / Hidden / Delisted. |
Source | PropertyObjectOverrideSourceBlock | Да | CatalogPropertyObjectCard.SourceSnapshot | — | Исходные значения источников до оверрайдов. |
Override | PropertyObjectOverrideBlock? | Нет (null — живого оверрайда нет) | PropertyObjectDisplayOverride | — | Текущий оверрайд. |
Effective | PropertyObjectOverrideEffectiveBlock | Да | CatalogPropertyObjectCard (эффективные колонки) | — | Что реально видит витрина. |
Модель PropertyObjectOverrideSourceBlock (проекция PropertyObjectSourceSnapshotDocument — дом полей catalog-property-object-card.md)
| Поле | Тип | Обязательность | Источник | Masking | Описание |
|---|---|---|---|---|---|
Title | string | Да | SourceSnapshot.Title | — | Исходный заголовок (chessboard). |
Price | decimal | Да | SourceSnapshot.Price | — | Исходная цена. |
Badge | string? | Нет | SourceSnapshot.Badge | — | Исходный бейдж. |
PaybackValue | decimal? | Нет | SourceSnapshot.PaybackValue | — | Окупаемость (invest-analytics). |
PaybackPeriod | string? (enum PaybackPeriod) | Нет | SourceSnapshot.PaybackPeriod | — | Years / Months. |
ReliabilityValue | short? | Нет | SourceSnapshot.ReliabilityValue | — | Надёжность. |
ReliabilityMax | short? | Нет | SourceSnapshot.ReliabilityMax | — | Шкала надёжности. |
Rating | decimal? | Нет | SourceSnapshot.Rating | — | Рейтинг. |
ChessboardVersion | long | Да | SourceSnapshot.ChessboardVersion | — | Версия источника (диагностика расхождений). |
Модель PropertyObjectOverrideBlock (проекция PropertyObjectDisplayOverride — дом полей display-override.md)
| Поле | Тип | Обязательность | Источник | Masking | Описание |
|---|---|---|---|---|---|
Id | Guid | Да | PropertyObjectDisplayOverride.Id | — | Идентификатор оверрайда. |
IsVisible | bool? | Нет | PropertyObjectDisplayOverride.IsVisible | — | null = не переопределено (правило всех полей блока). |
Price | decimal? | Нет | PropertyObjectDisplayOverride.Price | — | — |
Title | string? | Нет | PropertyObjectDisplayOverride.Title | — | — |
Badge | string? | Нет | PropertyObjectDisplayOverride.Badge | — | — |
ReliabilityValue | short? | Нет | PropertyObjectDisplayOverride.ReliabilityValue | — | — |
ReliabilityMax | short? | Нет | PropertyObjectDisplayOverride.ReliabilityMax | — | — |
PaybackValue | decimal? | Нет | PropertyObjectDisplayOverride.PaybackValue | — | — |
PaybackPeriod | string? (enum PaybackPeriod) | Нет | PropertyObjectDisplayOverride.PaybackPeriod | — | — |
Rating | decimal? | Нет | PropertyObjectDisplayOverride.Rating | — | — |
Comment | string? | Нет | PropertyObjectDisplayOverride.Comment | internal — только admin-область (в public-ответы не попадает) | Комментарий админа «зачем правка». |
UpdatedAt | DateTimeOffset | Да | PropertyObjectDisplayOverride.UpdatedAt | — | Последняя правка. |
UpdatedByUserId | Guid? | Нет | PropertyObjectDisplayOverride.UpdatedByUserId ?? CreatedByUserId | — | Автор последней правки. |
Version | long | Да | PropertyObjectDisplayOverride.Version | — | Счётчик правок — передаётся обратно в PUT для optimistic-check. |
Модель PropertyObjectOverrideEffectiveBlock (эффективные колонки CatalogPropertyObjectCard)
| Поле | Тип | Обязательность | Источник | Masking | Описание |
|---|---|---|---|---|---|
Title | string | Да | CatalogPropertyObjectCard.Title | — | Эффективный заголовок. |
Price | decimal | Да | CatalogPropertyObjectCard.Price | — | Эффективная цена. |
PricePerMeter | decimal | Да | CatalogPropertyObjectCard.PricePerMeter | — | Пересчитанная цена за м². |
Badge | string? | Нет | CatalogPropertyObjectCard.Badge | — | — |
PaybackValue | decimal? | Нет | CatalogPropertyObjectCard.Payback.Value | — | — |
PaybackPeriod | string? (enum PaybackPeriod) | Нет | CatalogPropertyObjectCard.Payback.Period | — | — |
ReliabilityValue | short? | Нет | CatalogPropertyObjectCard.Reliability.Value | — | — |
ReliabilityMax | short? | Нет | CatalogPropertyObjectCard.Reliability.Max | — | — |
Rating | decimal? | Нет | CatalogPropertyObjectCard.Rating | — | — |
Алгоритм
- Контекст и доступ. Актор — администратор платформы (admin API, m2m-клиент
pin-admin-system, policyAdminSystemOnly);X-Admin-User-Idлогируется. Идемпотентность к чтению не применяется. - Проверка входа.
PropertyObjectId != Guid.Empty,AdminUserId != Guid.Empty; иначеValidationError. Карточка объекта недвижимости существует; если нет →CATALOG_PROPERTY_OBJECT_NOT_FOUND(404). Состояние чтение не ограничивает:Hidden/Delistedкарточки тоже показываются (админ должен видеть скрытое). - Что читаем. Карточку объекта недвижимости (для блоков
Source/Effective/CardStatus) и живой оверрайд объекта недвижимостиPropertyObjectDisplayOverride(снятые оверрайды отфильтрованы; допустимо отсутствие → блокOverride = null). - Маппинг.
Source.*← снапшот источника карточки (SourceSnapshot);Override.*← оверрайд (илиnull);Effective.*← эффективные колонки карточки (Title,Price,PricePerMeter,Badge,Payback,Reliability,Rating);CardStatus← статус карточки. - Результат.
PropertyObjectOverrideView; freshness — актуальное состояние строки (source of truth оверрайдов — этот контекст, лага нет).
примечание
SourceSource — снапшот источника на момент последнего применённого события chessboard/invest-analytics:
если консюмер источника отстаёт, блоки Source и Effective отражают ещё старые значения.
Source.ChessboardVersion — диагностический маркер, по которому админ видит расхождение витрины с
источником (runbook сверки).
Диаграмма
Ошибки и failure modes
| Код | HTTP status | Условие | Сообщение | Retry |
|---|---|---|---|---|
ValidationError | 400 | Пустой PropertyObjectId/X-Admin-User-Id | Ошибка валидации запроса | no retry |
UNAUTHORIZED | 401 | Нет/просрочен m2m client-credentials токен | Требуется авторизация | no retry |
FORBIDDEN | 403 | Клиент не pin-admin-system / нет catalog.overrides.view | Доступ запрещён | no retry |
CATALOG_PROPERTY_OBJECT_NOT_FOUND | 404 | Карточка объекта недвижимости не существует в catalog.property_object_cards | Объект недвижимости не найден в каталоге | no retry |
Совместимость и наблюдаемость
- Новые optional поля блоков — без breaking change (additive); удаление/переименование/смена типа —
breaking (migration + rollout). Рост
ContractVersionsnapshot-документа отражается вSourceadditive-полями. - Logs:
admin-property-object-override-viewed(propertyObjectId, adminUserId); metrics:catalog_admin_operations_total{operation="get-property-object-override"}, duration; traces: span приёма → span обработки → span обращения к хранилищу; correlation — сквозной trace черезtraceparent. Dashboard catalog-overview; runbook — сверкаSourceSnapshot.ChessboardVersionсchessboardпри расхождениях витрины.
Обратные ссылки
Автоссылки: где используется этот документ.
- API (3): Catalog Admin API — реестр методов и общие правила области, GET /api/admin/v1/buildings/{buildingId}/override — Просмотр оверрайда корпуса (admin), PUT /api/admin/v1/lots/{propertyObjectId}/override — Создание/изменение оверрайда объекта недвижимости (admin)
- registries (1): Реестр API-методов PIN
Связанные документы
- Сущности: display-override.md (дом полей оверрайда), catalog-property-object-card.md (дом эффективных полей и snapshot-а).
- Мутация: put-property-object-override.md; корпус: get-building-override.md.
- ADR-0053 (m2m + deep audit).