fix(realtime): доставлять обложку альбома после готовности вариантов

Карточка альбома не получала ссылку на обложку: она появляется в объекте
альбома только после генерации thumb/medium, а событие об этом шаге в
персональные потоки не публиковалось — счётчик обновлялся, обложка нет.

- albums.Service.NotifyCoverReady публикует album.updated получателям, когда
  варианты готовы у фото, являющегося текущей обложкой (иначе no-op, чтобы
  массовая загрузка не рассылала событие на каждый файл)
- photos: порт AlbumAccess расширен, worker вызывает публикацию после
  photo.updated
- project.md §11/§12: триггер добавлен в контракт персонального потока
This commit is contained in:
iu
2026-10-16 12:47:50 +03:00
parent 742745e6aa
commit 44cb7c7d68
7 changed files with 129 additions and 11 deletions
+7 -1
View File
@@ -464,7 +464,7 @@ data: {"id":"...","album_id":"...","thumb_url":"...","uploader":{...}}
|---|---|---|
| `notification` | создано уведомление для пользователя | объект уведомления |
| `album.created` | альбом появился в списке пользователя (он его создал или принял инвайт) | объект альбома |
| `album.updated` | изменены название/описание/обложка, состав участников или состав фото | объект альбома |
| `album.updated` | изменены название/описание/обложка, состав участников, состав фото или готовы варианты фото-обложки | объект альбома |
| `album.deleted` | альбом удалён владельцем или доступ отозван (исключение из участников) | `{"id":"..."}` |
Объект альбома в `album.created` и `album.updated` совпадает по полям с элементом
@@ -481,6 +481,12 @@ data: {"id":"...","album_id":"...","thumb_url":"...","uploader":{...}}
страница узнаёт об изменениях из `photo.*`). `photos_count` считает только фото вне
корзины и совпадает с числом фото в сетке альбома.
Ссылка на обложку (`cover_thumb_url`, `cover_medium_url`) появляется в объекте альбома
только после генерации вариантов thumb/medium, поэтому готовность вариантов у фото,
являющегося текущей обложкой, тоже публикует `album.updated` получателям — иначе карточки
альбомов остаются с заглушкой вместо обложки. Готовность вариантов прочих фото объект
альбома не меняет и события не порождает.
### Backend: hub на каналах
- В памяти `map[albumID]map[clientID]chan Event`
- Регистрация клиента при подключении, удаление при отключении