Files
ds-galo/openspec/changes/archive/2026-10-11-fix-album-cover/proposal.md
T
iu d99ac77587 chore(openspec): archive completed changes and sync main specs
- fix-large-album-load -> photos, realtime, media-objects
- fix-album-cover -> photos, albums
2026-10-11 14:16:38 +03:00

38 lines
2.6 KiB
Markdown

# 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 не выполняется.