4.8 KiB
4.8 KiB
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.gopresign получить 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) и вручную проверить сквозной сценарий: создание через диалог, загрузка первого фото назначает обложку, ручной выбор не затирается следующей загрузкой, удаление фото-обложки очищает обложку в списке