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

UC-CTL-005. Карточка проекта (ограниченная, для гостя)

Назначение

Гость или пользователь без полного доступа открывает карточку проекта и видит основную информацию: описание, локация, финансирование, юридические данные, ход строительства, видео, карта. Витринную часть отдаёт каталог из CatalogProjectCard, вкладки структуры проекта — контекст chessboard. Точные цены, статусы объектов и шахматка для гостя скрываются; факт просмотра записывается в user-activity.

Metadata

ПолеЗначение
IDUC-CTL-005
Контекстcatalog (см. docs/06-services/catalog/) + чтение chessboard
Типосновной
Статусdraft

Актор

ПолеЗначение
РольГость (в т.ч. без реф-cookie — ограниченная карточка проекта доступна без гейта ленты) / Инвестор без полного доступа
Permissions / scopepermissions не требуются; маскирование точных цен/статусов — по отсутствию JWT
Tenantне применяется — платформенная витрина (ADR-0052 п.3)
Record-levelне применяется

Предусловие

  • CatalogProjectCard с запрошенным Id существует и Status = Published.
  • chessboard public API доступен для вкладок структуры (при недоступности — деградация A3).

Триггер

ПолеЗначение
ИсточникUI navigation
Триггерящий элементКлик по карточке проекта в ленте (UC-CTL-001) либо прямая/расшаренная ссылка /hotels/[id]/info

Основной Поток

  1. Пользователь кликает по карточке проекта в ленте; интерфейс открывает /hotels/[id]/info.
  2. Интерфейс запрашивает витринную часть карточки проекта по id.
  3. Каталог формирует ограниченную карточку:
    • Гейт ленты не применяется — ограниченная карточка проекта открыта без авторизации.
    • Проверка входа. id — валидный Guid, иначе ValidationError (400). Карточка существует и Status = Published; иначе — CATALOG_PROJECT_NOT_FOUND (404). Hidden/Delisted неотличимы от отсутствующего (тот же 404, утечки скрытых проектов нет).
    • Состав карточки (витринная часть, одна строка витрины): название, адрес, гео GeoLocation {Latitude, Longitude} (карта), девелопер (+лого; переход на девелопера), тип, класс, статус строительства, срок сдачи, готовность, звёзды, рейтинг, рост цены, окупаемость, обложка, короткое описание.
    • Гостевое маскирование. minPrice/maxPrice/propertyObjectsAvailable = null, masked = true; ссылки на шахматку и список объектов помечаются requiresAuth = true (интерфейс показывает CTA «Войдите»).
    • Результат — витринная часть карточки.
  4. Интерфейс параллельно запрашивает у chessboard детали вкладок (дом структуры — docs/06-services/chessboard/): описание, локация/инфраструктура, финансирование и банки, юридические данные/проектные декларации, ход строительства, видео; ссылки на декларации и девелопера — из этого ответа.
  5. Интерфейс отображает страницу с вкладками: Информация, Локация, Финансирование, Юридическая информация, Ход строительства, Видео, Карта; блоки цен/статусов/шахматки заменены CTA «Войдите, чтобы увидеть цены и шахматку».
  6. Интерфейс записывает просмотр в user-activity: { targetKind = Project, targetId = id, sessionId, userId? / anonymous_id } — для гостя просмотр привязывается к anonymous_id гостевой сессии (ADR-0054/0056); дом записи — user-activity/domain/property-object-view.md.

Альтернативные Потоки

A1. Пользователь авторизован

  1. Шаг 3 не маскирует поля (minPrice/maxPrice/propertyObjectsAvailable заполнены); блоки шахматки и списка объектов активны.
  2. Продолжение — UC-CTL-006 (полная карточка). Просмотр записывается с userId.

A2. Проект не найден / скрыт / делистнут

  1. Шаг 3 → CATALOG_PROJECT_NOT_FOUND (404).
  2. Интерфейс показывает страницу «Проект недоступен» со ссылкой на ленту. Сценарий завершается.

A3. chessboard недоступен (деградация вкладок)

  1. Шаг 4 падает по таймауту; витринная часть (шаг 3) уже отображена.
  2. Интерфейс показывает карточку без вкладок структуры (skeleton + повтор запроса); просмотр всё равно записывается (шаг 6). Сценарий завершается частично успешно.

A4. Переход по ссылке на девелопера

  1. Пользователь кликает имя/лого девелопера.
  2. Интерфейс открывает ленту с фильтром по девелоперу (developerId = DeveloperId карточки). Возврат к UC-CTL-001.

A5. Повторные открытия карточки в одной сессии

  1. Пользователь открывает карточку проекта несколько раз за короткое время (кнопка «назад»/перезаход).
  2. Просмотр в user-activity привязан к сессии и закрывается polling-ом по неактивности (10–15 мин, ADR-0056 п.3): серия открытий в одном окне активности схлопывается в один завершённый просмотр, поэтому счётчик популярности проекта инкрементируется один раз на просмотр (pin.user-activity.property-object-view-ended.v1), а не на каждый рендер. Поток не меняется.

Постусловие

  • Пользователь видит ограниченную карточку: вкладки структуры без точных цен, статусов объектов и шахматки.
  • В user-activity создана запись просмотра проекта (anonymous_id для гостя) — источник «истории просмотров» и статистики застройщика (ADR-0057).
  • Состояние каталога не изменилось (read-only).

Возможные Ошибки

КодHTTPУсловиеПоведение клиента
ValidationError400id — не GuidСтраница ошибки
CATALOG_PROJECT_NOT_FOUND404Карточки нет или Status != PublishedСтраница «Проект недоступен» + ссылка на ленту

Kafka Интеграционные События

СобытиеTopicКогда публикуетсяConsumers
PropertyObjectViewEnded (производит user-activity после закрытия просмотра polling-ом, ADR-0056 п.3)pin.user-activity.property-object-view-ended.v1через 10–15 мин неактивности просмотраcatalog (PopularityViews проекта), dev-stats

Acceptance Criteria

#КритерийПроверка
AC1Ограниченная карточка открывается без JWT и без реф-cookie (в отличие от ленты)запрос без credentials → 200
AC2Гость не получает minPrice/maxPrice/propertyObjectsAvailable (null + masked=true); авторизованный получаетдва запроса разными акторами
AC3Hidden/Delisted проект → 404, неотличимо от несуществующего idтри запроса: published/hidden/random
AC4Витринная часть отвечает одной строкой project_cards (без джойнов)проверка выборки
AC5Просмотр гостя записан в user-activity с anonymous_id; авторизованного — с userIdпроверка записей views
AC6Вкладки структуры приходят из chessboard, каталог их не дублируетконтракт-тест: полей вкладок нет в ответе каталога
AC7Серия открытий карточки в одном окне активности даёт один завершённый просмотр (один +1 к популярности), а не по инкременту на рендертест повторных открытий в пределах окна polling-закрытия

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

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

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

  • API метод: ../api/public/get-project.md (ограниченная/полная версия одного endpoint-а, GET /api/v1/projects/{id}).
  • Domain entity: ../domain/catalog-project-card.md.
  • Дом структуры проекта: ../../chessboard/domain/project.md (вкладки Информация/Локация/ Финансирование/Юридическая информация/Ход строительства/Видео).
  • Запись просмотров: ../../user-activity/domain/property-object-view.md (дом записи, ADR-0054/0056).
  • Связанные UC: UC-CTL-001 (лента), UC-CTL-006 (полная карточка), UC-IDN-001 (вход по CTA).