51 lines
3.2 KiB
Markdown
51 lines
3.2 KiB
Markdown
# Proposal
|
||
|
||
## Why
|
||
|
||
Список альбомов пустой и безликий: карточки показывают заглушку `🖼️`, а создание
|
||
альбома — постоянная inline-форма в заголовке. При этом бэкенд уже хранит
|
||
`cover_photo_id` и умеет его менять, но фронтенд нигде не отдаёт URL обложки и не
|
||
даёт её выбрать. Нужно довести UI до состояния, где альбомы узнаваемы по
|
||
обложкам, а создание не занимает место в шапке.
|
||
|
||
## What Changes
|
||
|
||
- Кнопка «Создать» в списке альбомов превращается в компактную иконку с хинтом
|
||
(`title` + `aria-label`). По клику открывается диалог с полем «Название»;
|
||
отправка создаёт альбом через существующий `POST /albums`.
|
||
- `GET /albums` начинает возвращать `cover_url` — presigned URL миниатюры
|
||
обложки (или `null`), чтобы карточка списка могла показать изображение.
|
||
- Карточки альбомов в списке показывают обложку; при её отсутствии — прежнюю
|
||
заглушку.
|
||
- В настройках альбома появляется секция «Обложка»: сетка миниатюр фото
|
||
альбома, клик по фото применяет его обложкой (`PATCH` с `cover_photo_id`),
|
||
кнопка «Убрать» очищает (`clear_cover`).
|
||
- Автоматическая обложка при загрузке фото ставится только если обложка ещё
|
||
пустая, чтобы не затирать ручной выбор владельца.
|
||
|
||
## Capabilities
|
||
|
||
### New Capabilities
|
||
|
||
Нет.
|
||
|
||
### Modified Capabilities
|
||
|
||
- `albums`: создание альбома через иконку-кнопку и диалог; `cover_url` в списке
|
||
альбомов; выбор и очистка обложки в настройках; правило автоматической
|
||
обложки (только при пустой).
|
||
|
||
## Impact
|
||
|
||
- **Frontend:** `src/routes/+page.svelte` (иконка, диалог, рендер обложки),
|
||
`src/routes/albums/[id]/settings/+page.svelte` (секция «Обложка»),
|
||
`src/lib/types.ts` (`Album.cover_url`), возможно новый переиспользуемый
|
||
inline-SVG компонент иконки.
|
||
- **Backend:** `internal/albums/store.go` и `internal/albums/service.go`
|
||
(получение thumb-ключа обложки и presign `cover_url`), `internal/photos/store.go`
|
||
(`SetCover` только при пустой обложке).
|
||
- **API:** ответ `GET /albums` расширяется полем `cover_url` (аддитивно,
|
||
обратносовместимо). `PATCH /albums/:id` уже поддерживает `cover_photo_id` и
|
||
`clear_cover` — изменений контракта не требуется.
|
||
- **Данные/миграции:** не требуются.
|