Files
ds-galo/openspec/changes/album-ui-covers/proposal.md
T
2026-10-10 14:21:43 +03:00

3.2 KiB
Raw Blame History

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 — изменений контракта не требуется.
  • Данные/миграции: не требуются.