# Tasks ## 1. Список edit-ролей - [x] 1.1 В `backend/internal/photos/edit_render.go` собрать общий список ролей (`RoleEdit`, `RoleEditThumb`, `RoleEditMedium`, `RoleEditPreview`) и хелпер проверки роли; проверить, что список используется в обоих хранилищах и не дублируется строковыми литералами ## 2. Копирование без отредактированной версии - [x] 2.1 В `Store.Clone` (`backend/internal/photos/store.go`) исключить edit-роли из переносимых привязок `photo_objects`; проверить тестом `copy_test.go`: копия получает обычные варианты и не получает edit-объекты - [x] 2.2 В `SQLiteStore.Clone` (`backend/internal/photos/sqlite_store.go`) сделать то же для SQLite; проверить тем же тестом, прогнанным на SQLite-хранилище ## 3. Разовая чистка существующих копий - [x] 3.1 Добавить миграцию Postgres `backend/migrations/000016_*.up.sql` и `.down.sql`, удаляющую edit-привязки у фото с пустыми `edit_params`; проверить на тестовой базе, что привязки исходных фото с правками остались, а «чужие» удалены - [x] 3.2 Добавить миграцию SQLite `backend/migrations/sqlite/000008_*.up.sql` и `.down.sql` с тем же действием; проверить тем же сценарием на SQLite - [x] 3.3 Убедиться, что удалённые объекты подбираются сборщиком мусора (`ClaimGarbage` не возвращает объекты с привязками); проверить существующим тестом `objects_test.go` ## 4. Интеграционная проверка - [x] 4.1 Прогнать `cd backend && go test ./internal/photos/ -v`; убедиться, что тесты зелёные - [x] 4.2 Прогнать `make test`; убедиться, что весь бэкенд зелёный - [x] 4.3 Проверить вручную: отредактировать фото, скопировать его в другой альбом и убедиться, что копия показывает исходник, а панель правок у копии пустая