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
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
# 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 не выполняется.
|
||||
Reference in New Issue
Block a user