Files
ds-galo/openspec/changes/fix-album-cover/tasks.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
Raw Blame History

Tasks

1. Автобложка при загрузке

  • 1.1 В backend/internal/photos/service.go (Upload) вызывать store.SetCoverIfEmpty(ctx, in.AlbumID, p.ID) после успешного сохранения фото; проверить cd backend && go test ./internal/e2e/ — тест загружает два фото в новый альбом и проверяет, что обложкой стало первое
  • 1.2 Добавить в тот же тест проверку сценария «обложка уже задана»: загрузка второго фото не меняет уже назначенную обложку

2. Снятие обложки при уходе фото-обложки

  • 2.1 Добавить ClearCoverIfMatches(ctx, albumID, photoID) в backend/internal/photos/repository.go, store.go и sqlite_store.go (UPDATE albums SET cover_photo_id = NULL WHERE id = $1 AND cover_photo_id = $2); проверить cd backend && go test ./internal/repo/contract/ — снятие срабатывает только при совпадении обложки
  • 2.2 Вызывать ClearCoverIfMatches в Delete (корзина) и MoveBatch (исходный альбом) в service.go; проверить тестом, что удаление и перенос фото-обложки снимают обложку

3. Пункт «Установить как обложку альбома»

  • 3.1 Добавить пункт в контекстное меню фото сетки (frontend/src/routes/(app)/albums/[id]/+page.svelte, openMenuForPhoto) с иконкой wallpaper и вызовом albums.setCover(albumId, photo.id), видимый только owner/admin; проверить cd frontend && npm run check
  • 3.2 Добавить тот же пункт в секцию «Действия» компонента frontend/src/lib/components/PhotoPanel.svelte; проверить npm run check и наблюдаемо: пункт показывается только владельцу/админу

4. Интеграционная проверка

  • 4.1 cd backend && go test ./... и cd frontend && npm run check — оба зелёные
  • 4.2 Собрать (make build), загрузить фото в новый альбом (обложка = первое фото), затем удалить фото-обложку (обложка пуста) и перенести фото-обложку (обложка пуста); сбросить обложку вручную через панель — остаётся пустой