UC-CTL-005. Карточка проекта (ограниченная, для гостя)
Назначение
Гость или пользователь без полного доступа открывает карточку проекта и видит основную информацию:
описание, локация, финансирование, юридические данные, ход строительства, видео, карта. Витринную часть
отдаёт каталог из CatalogProjectCard, вкладки структуры проекта — контекст chessboard. Точные цены,
статусы объектов и шахматка для гостя скрываются; факт просмотра записывается в user-activity.
| Поле | Значение |
|---|
| ID | UC-CTL-005 |
| Контекст | catalog (см. docs/06-services/catalog/) + чтение chessboard |
| Тип | основной |
| Статус | draft |
Актор
| Поле | Значение |
|---|
| Роль | Гость (в т.ч. без реф-cookie — ограниченная карточка проекта доступна без гейта ленты) / Инвестор без полного доступа |
| Permissions / scope | permissions не требуются; маскирование точных цен/статусов — по отсутствию JWT |
| Tenant | не применяется — платформенная витрина (ADR-0052 п.3) |
| Record-level | не применяется |
Предусловие
CatalogProjectCard с запрошенным Id существует и Status = Published.
chessboard public API доступен для вкладок структуры (при недоступности — деградация A3).
Триггер
| Поле | Значение |
|---|
| Источник | UI navigation |
| Триггерящий элемент | Клик по карточке проекта в ленте (UC-CTL-001) либо прямая/расшаренная ссылка /hotels/[id]/info |
Основной Поток
- Пользователь кликает по карточке проекта в ленте; интерфейс открывает
/hotels/[id]/info.
- Интерфейс запрашивает витринную часть карточки проекта по
id.
- Каталог формирует ограниченную карточку:
- Гейт ленты не применяется — ограниченная карточка проекта открыта без авторизации.
- Проверка входа.
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
«Войдите»).
- Результат — витринная часть карточки.
- Интерфейс параллельно запрашивает у
chessboard детали вкладок (дом структуры —
docs/06-services/chessboard/): описание, локация/инфраструктура, финансирование и банки,
юридические данные/проектные декларации, ход строительства, видео; ссылки на декларации и девелопера
— из этого ответа.
- Интерфейс отображает страницу с вкладками: Информация, Локация, Финансирование, Юридическая
информация, Ход строительства, Видео, Карта; блоки цен/статусов/шахматки заменены CTA «Войдите, чтобы
увидеть цены и шахматку».
- Интерфейс записывает просмотр в
user-activity: { targetKind = Project, targetId = id, sessionId, userId? / anonymous_id } — для гостя просмотр привязывается к anonymous_id гостевой сессии
(ADR-0054/0056); дом записи — user-activity/domain/property-object-view.md.
Альтернативные Потоки
A1. Пользователь авторизован
- Шаг 3 не маскирует поля (
minPrice/maxPrice/propertyObjectsAvailable заполнены); блоки шахматки и
списка объектов активны.
- Продолжение — UC-CTL-006 (полная карточка). Просмотр записывается с
userId.
A2. Проект не найден / скрыт / делистнут
- Шаг 3 →
CATALOG_PROJECT_NOT_FOUND (404).
- Интерфейс показывает страницу «Проект недоступен» со ссылкой на ленту. Сценарий завершается.
A3. chessboard недоступен (деградация вкладок)
- Шаг 4 падает по таймауту; витринная часть (шаг 3) уже отображена.
- Интерфейс показывает карточку без вкладок структуры (skeleton + повтор запроса); просмотр всё равно
записывается (шаг 6). Сценарий завершается частично успешно.
A4. Переход по ссылке на девелопера
- Пользователь кликает имя/лого девелопера.
- Интерфейс открывает ленту с фильтром по девелоперу (
developerId = DeveloperId карточки). Возврат к
UC-CTL-001.
A5. Повторные открытия карточки в одной сессии
- Пользователь открывает карточку проекта несколько раз за короткое время (кнопка «назад»/перезаход).
- Просмотр в
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 | Условие | Поведение клиента |
|---|
ValidationError | 400 | id — не Guid | Страница ошибки |
CATALOG_PROJECT_NOT_FOUND | 404 | Карточки нет или 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); авторизованный получает | два запроса разными акторами |
| AC3 | Hidden/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).