Files
vidconf/docs/architecture/adr/002-phrase-attribution-session-participant.md

3.1 KiB
Raw Permalink Blame History

ADR-002. Атрибуция аудиотреков и фраз к участнику сеанса (participant_id вместо user_id)

Статус

ПРИНЯТО

Контекст

FR-4.2 ТЗ фиксирует схему phrases (id, user_id, conferences_id, data, t_start, t_end) — атрибуция фразы к зарегистрированному пользователю. После перехода на динамические конференции (ADR-001) среди участников сеанса есть ГОСТИ без user_id (conference_participants допускает ровно одну identity: user_id ИЛИ guest_id). Кроме того, для записи per-track аудио (LiveKit Track Egress) нужен персистентный маппинг «файл записи ↔ участник сеанса», которого в схеме нет. Альтернативы:

  • пара nullable-колонок user_id/guest_id в phrases — дублирует CHECK-логику conference_participants в каждой таблице пайплайна;
  • заводить фиктивного user для гостя — нарушает модель auth и FR-1.

Решение

  1. В phrases колонка user_id заменяется на participant_id — NOT NULL FK на conference_participants.id (ON DELETE CASCADE). Спикер фразы — всегда строка участника сеанса; имя/email для отображения и рассылки берутся join'ом через user_id/guest_id участника.
  2. Вводится таблица session_audio_tracks: одна строка на audio-трек сеанса (track SID, egress ID, путь к файлу, статус, started_at, segments JSONB) с тем же FK participant_id. Она — источник маппинга «файл ↔ спикер» и точка идемпотентного возобновления транскрибации.

Последствия

  • Плюсы: гости атрибутируются без костылей; единая точка истины об identity (conference_participants); повторное подключение того же пользователя даёт разные строки участника — тайм-окна присутствия точны.
  • Минусы: выборка фраз «по пользователю» требует join через conference_participants; отступление от буквы FR-4.2 (фиксируется этим ADR).
  • Нейтрально: segments JSONB — промежуточный артефакт пайплайна, очищается не обязательно (объём мал: текст+тайминги).

Ссылки

  • ADR-001 (динамические конференции, гостевой доступ).
  • backend/models/phrase.py, backend/models/participant.py, backend/models/audio_track.py.
  • Сеанс (conference_sessions) — единица пайплайна пост-обработки.