Первоначальная версия VidConf
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
# 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`) — единица пайплайна пост-обработки.
|
||||
Reference in New Issue
Block a user