GET /api/messenger/conferences/{conferenceId} — Карточка конференции
Read-only карточка конференции с текущим ростером: статус, длительность, состав участников, состояние записи.
Проекция ConferenceSessionEntity + ростер
(call-participant.md). Дом полей — conference-session.md.
Назначение
Отдать участнику Deal-чата актуальное состояние конференции (для панели встречи, экрана истории, обновления
состава после потери push). Дескриптор входа Room не выдаётся — токен получают через
join-conference.md или conference-media-token.md. Owning-сервис
— messenger, feature group conferences.
| Поле | Значение |
|---|
| Сервис/контекст | messenger |
| API area | conferences |
| Feature group | conferences |
| Статус | draft |
| Документ | docs/06-services/messenger/api/conferences/get-conference.md |
Актор и доступ
| Проверка | Значение |
|---|
| Actor type | User — активный участник Deal-чата конференции |
| Auth policy / Permissions | permission messenger.conferences.use |
| Scope (RBAC) | не применяется — доступ по членству в чате |
| Record-level | активный ParticipantEntity чата ChatId конференции (INV-CHAT-4) |
| Tenant isolation | не применяется (кросс-tenant); срез — по членству |
| Audit | read (не sensitive: карточка без токенов/медиа) |
HTTP-контракт
| Поле | Значение |
|---|
| Method | GET |
| Route | /api/messenger/conferences/{conferenceId} |
| Success status | 200 |
| Idempotency header | не применяется (безопасный GET) |
| Correlation | сквозной trace через traceparent |
Входные данные / параметры запроса
| Поле | Источник | Тип | Обязательность | Валидация / Ограничения | Безопасность |
|---|
ConferenceId | route | Guid | Да | != Empty; существующая конференция, актор — участник Deal-чата | — |
ActorUserId | identity claims | Guid | Да | из JWT; активное членство в ChatId конференции | — |
Модель ответа ConferenceModel
Проекция ConferenceSessionEntity с ростером; полный состав полей карточки
и вложенной ConferenceParticipantEntry — start-conference.md. В этой (read-only)
проекции Room = null — токен на чтении не выдаётся.
| Поле | Тип | Обязательность | Источник | Masking | Описание |
|---|
ConferenceId | Guid | Да | ConferenceSessionEntity.Id | — | Идентификатор конференции. |
ChatId | Guid | Да | .ChatId | — | Deal-чат. |
DealId | Guid? | Нет | .DealId | — | Сделка. |
MediaType | CallMediaType | Да | .MediaType | — | Audio/Video. |
Status | ConferenceStatus | Да | .Status | — | Provisioning/Active/Ended/Failed. |
Title | string? | Нет | .Title | — | Название встречи. |
StartedByUserId | Guid | Да | .StartedByUserId | — | Инициатор. |
StartedAt | DateTimeOffset | Да | .StartedAt | — | Момент старта. |
EndedAt | DateTimeOffset? | Нет | .EndedAt | — | null для активной. |
DurationSeconds | int? | Нет | .DurationSeconds | — | null до завершения. |
RecordingStatus | RecordingStatus? | Нет | CallRecordingEntity.Status | — | Статус записи, если ведётся/велась. |
RecordingId | Guid? | Нет | CallRecordingEntity.Id | — | Идентификатор записи. |
ActiveParticipantCount | int | Да | .ActiveParticipantCount | — | Активных на момент чтения. |
Participants | ConferenceParticipantEntry[] | Да | ростер (call-participant.md) | — | Текущий/итоговый состав (IsActive per-строка). |
Room | MediaJoinModel? | Нет | — | — | Всегда null на чтении. |
Алгоритм
Тривиальное чтение. Операцию выполняет активный участник Deal-чата (User, право
messenger.conferences.use); ConferenceId непустой (иначе ошибка валидации). Конференция грузится по
ConferenceId (нет → MSG_CONFERENCE_NOT_FOUND) вместе с ростером; актор проверяется на активное членство в её
ChatId (INV-CHAT-4), иначе MSG_CHAT_ACCESS_DENIED. В ответ собирается ConferenceModel с
Participants (per-строка IsActive = State == Joined, DurationSeconds для вышедших) и Room = null; статус
и RecordingStatus — актуальные. HTTP 200. Токен на вход здесь не выдаётся — только через join/media-token.
Ошибки и failure modes
| Код | HTTP status | Условие | Сообщение | Retry |
|---|
VALIDATION_FAILED | 400 | ConferenceId = Empty | «Проверьте параметры запроса» | no retry |
MSG_CONFERENCE_NOT_FOUND | 404 | конференции нет | «Конференция не найдена» | no retry |
MSG_CHAT_ACCESS_DENIED | 403 | актор не участник Deal-чата | «Нет доступа к конференции» | no retry |
Acceptance Criteria
- Активная конференция (happy). Дано: актор — активный участник Deal-чата, конференция
Active. Когда
запрашивает карточку. Тогда 200 с Status = Active, актуальным ActiveParticipantCount, ростером (per-строка
IsActive = State == Joined) и Room = null (токен на чтении не выдаётся).
- Завершённая конференция. Дано: конференция
Ended. Когда актор запрашивает карточку. Тогда 200 с
Status = Ended, DurationSeconds, все участники IsActive = false, RecordingStatus — актуальный.
- Свежесть после потери push. Дано: клиент пропустил realtime-обновление состава. Когда перезапрашивает
карточку. Тогда ростер и
ActiveParticipantCount отражают текущее состояние на момент чтения (read = source of
truth, реалтайм — не source of truth).
- Не участник чата. Дано: актор не активный участник Deal-чата. Когда запрашивает карточку. Тогда
403 MSG_CHAT_ACCESS_DENIED (наличие конференции косвенно не раскрывается сверх факта доступа к чату).
- Нет конференции. Дано:
ConferenceId не существует. Тогда 404 MSG_CONFERENCE_NOT_FOUND.
Совместимость и наблюдаемость
- Новые optional поля ответа — additive; удаление/переименование/смена типа — breaking (migration + rollout).
- Logs:
conference read (ConferenceId, Status; токены/медиа не пишутся — их в модели нет); metrics:
messenger_conference_get_total{result}, latency p95 (< 500 мс, SLO чтения); traces — сквозной trace
(traceparent); dashboard pin-messenger.
Обратные ссылки
Автоссылки: где используется этот документ.
Связанные документы