# Proposal ## Why Обложка альбома на карточке в списке не обновляется вживую: после загрузки фото счётчик `photos_count` приходит, а обложка остаётся заглушкой до ручного обновления. Ссылка на обложку (`cover_thumb_url` / `cover_medium_url`) появляется в объекте альбома только после генерации вариантов thumb/medium, но событие об этом в персональные потоки не публикуется. Дефект серверной стороны способности `realtime`, поэтому затрагивает и веб-клиент, и Android. ## What Changes - Когда для фото, являющегося обложкой альбома, готовы варианты, система публикует `album.updated` с актуальным объектом альбома в персональные потоки владельца и участников — именно тогда объект впервые получает ссылку на обложку. - Готовность вариантов фото, которое обложкой не является, объект альбома не меняет и события не порождает: иначе массовая загрузка даёт лишний веер `album.updated` на каждый файл. - Контракт существующих событий и REST не меняется, новых эндпоинтов и миграций нет. - **BREAKING**: нет. ## Capabilities ### New Capabilities _Нет — поведение расширяет существующую способность `realtime`._ ### Modified Capabilities - `realtime`: добавляется публикация `album.updated` в персональные потоки при готовности вариантов фото-обложки, поскольку только тогда объект альбома получает ссылку на обложку. ## Impact - **Код (backend):** `internal/albums/service.go` (новая публикация), порт `AlbumAccess` в `internal/photos/service.go`, вызов из `internal/photos/worker.go` (готовность вариантов), стаб порта в `internal/photos/helpers_test.go`. - **Документация:** `project.md` (§11 «Real-time (SSE)», §12 «SSE — детали реализации»). - **Не затрагивается:** схема БД, миграции, REST, пер-альбомный контракт (`photo.updated` по-прежнему приходит в канал альбома), клиенты — веб и Android уже применяют `album.updated` из персонального потока.