UC-OVR-007. Просмотр каталога «глазами инвестора» (impersonation)
Назначение
Cross-service контракт-левел сценарий (реализация отложена): агент/менеджер ПИН просматривает
каталог, избранное и историю просмотров своего лида-инвестора, чтобы вести консультацию по его контексту.
Это не полноценный вход под инвестором, а read-only проекция активности инвестора для владельца лида,
защищённая отдельным permission catalog.view-as-investor и жёстким аудитом. Здесь фиксируется контракт и
границы; сам эндпоинт помечен как будущий.
Metadata
| Поле | Значение |
|---|---|
| Статус | draft (реализация отложена) |
| Owning team | catalog |
| Primary capability | agent-view-as-investor |
| Risk level | high |
Scope И Участники
| Участник | Роль |
|---|---|
| Агент / Менеджер ПИН | Актор: просматривает каталог в контексте инвестора |
identity | Проверка permission catalog.view-as-investor + запись ImpersonationKind в actor-контекст |
crm | Проверка record-level: инвестор — активный лид этого агента (право контекста) |
catalog | Отдаёт каталог с ранжированием/фильтрами инвестора (read-only) |
favorites | Избранное инвестора (read-only проекция) |
user-activity | История просмотров/действий инвестора (read-only) |
Preconditions
- У агента есть активный лид с этим инвестором (
crm) — контекстное основание доступа. - Агенту выдан permission
catalog.view-as-investorв соответствующем scope. - Инвестор дал согласие на просмотр его активности (политика приватности — см. Риски).
Основной Сценарий
- Агент в CRM открывает карточку лида и жмёт «Смотреть каталог как инвестор».
- Фронт вызывает будущий эндпоинт
catalogсtargetInvestorUserId(контракт — см. catalog/README.md, раздел impersonation; путь по конвенции). identityпроверяет permissioncatalog.view-as-investor; в actor-контекст записывается признак impersonationImpersonationKind.crmподтверждает record-level:targetInvestorUserId— активный лид актора (иначе403).catalogформирует выдачу с фильтрами/ранжированием инвестора (read-only);favoritesиuser-activityотдают избранное и историю просмотров инвестора как проекции.- Каждый такой доступ аудируется (кто, кого, когда смотрел); мутации от лица инвестора запрещены.
Sequence
Постусловие
После каждого разрешённого доступа гарантированно:
- актору возвращена read-only проекция каталога/избранного/истории просмотров в контексте инвестора
(
targetInvestorUserId); никакие сущности инвестора не изменены (мутации запрещены на уровне контракта); - в
identityзаписан аудит-факт impersonation: кто (актор), кого (инвестор), когда, признакImpersonationKind— на каждый вход, не только на первый; - состояние согласия инвестора и наличие активного лида перепроверены на момент доступа (не кэшируются между запросами).
Побочных доменных изменений и интеграционных событий сценарий не порождает (read-only): счётчики просмотров/избранное инвестора не растут от чужого просмотра.
Альтернативные Сценарии И Отказы
| Ситуация | Поведение |
|---|---|
| Нет активного лида с инвестором | 403 — контекстного основания нет |
| Лид истёк/сконвертирован между входами | Доступ прекращается при следующем запросе (403) — право контекста проверяется каждый раз |
Нет permission catalog.view-as-investor | 403 — доступ не выдан |
| Permission отозван во время сессии | Следующий запрос → 403; открытая проекция не продлевается |
| Попытка мутации (добавить в избранное и т.п.) | Запрещено — режим строго read-only |
| Инвестор отозвал согласие | Доступ закрывается; контракт учитывает флаг согласия (проверка на каждый вход) |
favorites/user-activity недоступны | Деградация: соответствующий блок скрыт, каталог отдаётся без проекции активности |
Согласованность И Идемпотентность
- Двойная проверка основания на каждый доступ: permission (
identity) и активный лид (record-level вcrm) и флаг согласия инвестора — все синхронно, до отдачи проекции; кэширование права между запросами запрещено (просроченное основание не должно давать доступ). - Строгий read-only на уровне контракта: любой мутирующий вызов от лица инвестора отклоняется; проекции
favorites/user-activityотдают снимок на момент запроса (freshness — их обычный SLA чтения). - Аудит обязателен и не идемпотентен по смыслу: каждый вход добавляет отдельную запись (для расследования «кто и когда смотрел»), повторный доступ — новая запись, не дедуп.
- Реализация отложена: здесь фиксируется контракт и границы; сам эндпоинт
catalogпомечен будущим.
Acceptance Criteria (Given/When/Then)
- Happy (просмотр по основанию). Дано: у агента активный лид с инвестором, выдан permission
catalog.view-as-investor, инвестор дал согласие. Когда: агент открывает «Смотреть каталог как инвестор». Тогда: возвращается read-only проекция каталога/избранного/истории инвестора, записан аудит-факт, мутаций нет. - Нет активного лида. Дано: лида с инвестором нет. Когда: запрос проекции. Тогда:
403, аудит фиксирует отказ. - Нет/отозван permission. Дано: permission не выдан или отозван. Когда: запрос проекции. Тогда:
403. - Попытка мутации. Дано: разрешённая сессия просмотра. Когда: актор пытается добавить объект в избранное инвестора. Тогда: операция отклонена (строгий read-only), состояние инвестора неизменно.
- Отзыв согласия. Дано: инвестор отозвал согласие между входами. Когда: следующий запрос. Тогда: доступ
закрыт (
403).
Source Of Truth И Данные
| Данные | Владелец | Consistency rule |
|---|---|---|
| Право контекста (активный лид) | crm | Record-level, проверяется на каждый доступ |
Permission / ImpersonationKind | identity | Проверка + аудит на каждый вход |
| Каталог / избранное / история | catalog / favorites / user-activity | Read-only проекции, без мутаций |
Контракты И Зависимости
- Permission:
catalog.view-as-investor(проектируется — permission.md; ср.support.workspaces.impersonate-viewдля роли «Забота»). - Actor-контекст: 04-actors-providers-middleware.md (
ImpersonationKind). - Сервисы: catalog/README.md, favorites/README.md, user-activity/README.md.
- Смежное: UC-CHS-004 (гость vs инвестор).
Наблюдаемость
- critical metrics: число impersonation-сессий, уникальные пары агент↔инвестор, доля отказов
403. - trace path:
identity(permission) →crm(record-level) →catalog/favorites/user-activity. - alerts: аномальный рост impersonation одним агентом; доступ без активного лида.
Риски И Guardrails
- Риск: слежка за инвестором без основания. Control: обязательный активный лид + permission + аудит каждого входа.
- Риск: подмена данных инвестора. Control: строгий read-only, мутации от его лица запрещены на уровне контракта.
- Риск: приватность. Control: флаг согласия инвестора; реализация отложена до проработки политики приватности.
Обратные ссылки
Автоссылки: где используется этот документ.
- scenarios (1): Кросс-сервисные сценарии PIN (OVR)
- registries (1): Реестр use cases и user stories PIN