Files
ds-galo/openspec/changes/fix-album-cover/proposal.md
T
iu d7a37328f0 fix(photos): faster large-album loading and album cover lifecycle
Large albums opened slowly and flickered; the default album cover was
also lost in the media-objects refactor.

Large-album loading:
- quantize signed object URLs within a window and send Cache-Control so
  previews are reused instead of re-fetched
- publish photo.updated (not photo.created) when variants are ready, so
  clients update in place without reordering the grid
- worker concurrency + newest-first variant priority; raise default batch

Album cover:
- first uploaded photo becomes the cover when none is set
- clear the cover when the cover photo is trashed or moved out
- "set as album cover" in the photo context menu and actions panel

OpenSpec changes: fix-large-album-load, fix-album-cover
2026-10-11 14:15:59 +03:00

2.6 KiB

Proposal

Why

Автобложка «первое фото» была специфицирована, но потерялась при рефакторинге media-objects: при загрузке обложка больше не назначается, поэтому большинство альбомов (в т.ч. семенные) остаются без обложки. Дополнительно нужно довести жизненный цикл обложки: снимать её, когда фото-обложка покидает альбом, и сделать явный сброс предсказуемым.

What Changes

  • Обложка по умолчанию при загрузке. Если у альбома нет обложки, обложкой становится первое загруженное фото; последующие фото её не меняют.
  • Снятие обложки при уходе фото-обложки. Помещение фото-обложки в корзину или перенос её в другой альбом очищает обложку (без перевыбора).
  • Явный сброс обложки (clear_cover) обнуляет обложку и не пересчитывает её.
  • Frontend. Пункт «Установить как обложку альбома» в контекстном меню фото сетки и в разделе «Действия» правой панели; доступен только владельцу и админу.
  • Без backfill существующих альбомов без обложки.

Capabilities

New Capabilities

Modified Capabilities

  • photos: обложка по умолчанию назначается при загрузке (первое фото) и снимается, когда фото-обложка покидает альбом.
  • albums: сброс обложки делает её не заданной (без возврата к значению по умолчанию).

Impact

  • Backend: internal/photos/service.go (Upload, Delete, MoveBatch), internal/photos/{store,repository,sqlite_store}.go (метод снятия обложки).
  • Frontend: контекстное меню фото в сетке (albums/[id]/+page.svelte), раздел «Действия» в PhotoPanel.svelte; используется существующий PATCH /albums/:id через albums.setCover.
  • Данные/миграции: не требуются; backfill не выполняется.