Files
2026-10-10 14:21:43 +03:00

4.8 KiB
Raw Permalink Blame History

Tasks

1. Обложки — бэкенд

  • 1.1 Добавить в internal/models/models.go поле CoverURL string с тегом json:"cover_url,omitempty" у Album; убедиться, что cd backend && go build ./... проходит
  • 1.2 Расширить выборки internal/albums/store.go (ListForUser, GetByID) подзапросом к photos за thumb_key по cover_photo_id; проверить сборку и что при отсутствующем фото ключ пустой
  • 1.3 В internal/albums/service.go presign получить thumb обложки через существующий storage.Client и проставить CoverURL в List и Get; проверить, что GET /albums возвращает cover_url для альбома с обложкой
  • 1.4 Сделать photos.Store.SetCover условным (... WHERE id = $1 AND cover_photo_id IS NULL), чтобы не затирать ручной выбор; проверить сборку и покрыть тестом из 1.6
  • 1.5 В internal/albums/service.go метод Update: при заданном CoverPhotoID отклонять id фото не из этого альбома (BadRequest), обложку не менять; проверить сборку
  • 1.6 В internal/photos/service.go метод Delete: если удаляемое фото совпадает с обложкой альбома, очистить cover_photo_id; проверить сборку
  • 1.7 Добавить/обновить тесты на авто-обложку (не затирает), отклонение чужого фото-обложки и очистку при удалении; make test проходит (интеграционные тесты репозиториев — с TEST_DATABASE_URL)

2. Обложки — список альбомов

  • 2.1 Добавить cover_url?: string | null в интерфейс Album в frontend/src/lib/types.ts; cd frontend && npm run check без ошибок
  • 2.2 В frontend/src/routes/+page.svelte в карточке показывать изображение по cover_url (aspect-video, object-cover), при отсутствии — прежнюю заглушку; проверить npm run build и визуально, что карточка с обложкой показывает фото

3. Обложки — выбор в настройках

  • 3.1 В frontend/src/routes/albums/[id]/settings/+page.svelte добавить секцию «Обложка»: загрузить фото альбома (GET /albums/:id/photos) и показать сетку миниатюр; проверить npm run check
  • 3.2 Клик по миниатюре применяет обложку (PATCH /albums/:id с cover_photo_id), кнопка «Убрать» вызывает clear_cover; обновлять локальное состояние без перезагрузки; проверить визуально, что выбранная обложка помечена и появляется в списке
  • 3.3 Секция видна только владельцу/админу (role); проверить, что у участника без прав её нет

4. Создание альбома — иконка и диалог

  • 4.1 Добавить минимальный inline-SVG компонент иконки (например frontend/src/lib/components/Icon.svelte) с поддержкой class, aria-label/title; проверить npm run check
  • 4.2 В frontend/src/routes/+page.svelte заменить inline-форму на кнопку-иконку с хинтом (title + aria-label), открывающую нативный <dialog> с полем «Название»; отправка создаёт альбом через существующий POST /albums и закрывает диалог; проверить npm run build и визуально: создание через диалог добавляет альбом в список

5. Интеграция

  • 5.1 Выполнить make build (фронтенд -> backend/static -> бинарник) и убедиться, что сборка проходит без ошибок
  • 5.2 Запустить сервер (make run) и вручную проверить сквозной сценарий: создание через диалог, загрузка первого фото назначает обложку, ручной выбор не затирается следующей загрузкой, удаление фото-обложки очищает обложку в списке