Files
iu 98aaa3156a chore(openspec): архивировать add-orphaned-preview-handling и синхронизировать спеки
Новое требование в phone-album-sync о потере/возврате серверной копии у
разгруженного превью, требование в android-client о метке потерянного элемента
и действии удаления с устройства.
2026-10-16 14:13:01 +03:00

35 lines
4.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Tasks
## 1. Доменное состояние и политика
- [x] 1.1 Добавить `LocalAssetState.ORPHANED` в `android/.../domain/model/Sync.kt` и проверить, что `LocalAssetState.from`/Room-строка корректно читают значение (unit-тест на round-trip состояния)
- [x] 1.2 Обработать `ORPHANED` в `GallerySyncPolicy.decide`: `NONE` во всех режимах, без `RESTORE`; проверить покрытием всех сочетаний mode × state в `GallerySyncPolicyTest`
- [x] 1.3 Пропускать `ORPHANED` в цикле загрузки `SyncPlanner.plan` наравне с `PREVIEW` (не заливать превью как оригинал); проверить unit-тестом `SyncPlannerTest`
- [x] 1.4 Исключить `ORPHANED` из `RestoreManager.restoreTargets`; проверить unit-тестом `RestoreManagerTest`
## 2. Детекция и переходы синхронизации
- [x] 2.1 В `SyncCoordinator.reconcile` помечать `ORPHANED` записи индекса, чей `serverPhotoId` отсутствует в `livePhotoIds`; проверить unit-тестом `SyncCoordinatorTest`
- [x] 2.2 В `reconcile` снимать пометку `ORPHANED`, если `serverPhotoId` снова в `livePhotoIds`; проверить unit-тестом `SyncCoordinatorTest`
- [x] 2.3 Реализовать повторную заливку вернувшегося оригинала: считать `ORPHANED`, если hash из индекса/`hashesOutside` снова присутствует на устройстве, и ставить обычную загрузку; проверить unit-тестом планировщика/координатора
- [x] 2.4 Убедиться, что в режиме C загруженный обратно оригинал снова разгружается обычным проходом; проверить unit-тестом координатора
## 3. UI: метка и действия
- [x] 3.1 В `DeviceAlbumViewModel` отдавать набор `orphanedMediaIds`, а `serverOriginalsByMediaId`/`transferredMediaIds` должны исключать `ORPHANED`; проверить unit-тестом helper-функции
- [x] 3.2 Показать перечёркнутое облако (`Icons.Filled.CloudOff`) для `ORPHANED` в сетке `DeviceAlbumScreen` с отдельным `testTag`; проверить Compose-тестом маркера
- [x] 3.3 Добавить источник `PhotoAttributeSource.Orphaned` в `PhotoAttributeResolver.resolve`; проверить unit-тестом резолвера (приоритет над `Server` при отсутствии копии)
- [x] 3.4 Для `ORPHANED`-шита показать только действие «Удалить с устройства» без серверных атрибутов; проверить Compose-тестом шита
- [x] 3.5 Реализовать удаление превью с устройства через существующий delete-consent и удаление записи индекса, без запросов к серверу; проверить instrumented-тестом (файл и индекс удалены)
## 4. Интеграционная проверка
- [ ] 4.1 E2E: разгрузить в режиме C, удалить серверное фото, прогнать `reconcile` и убедиться, что элемент стал `ORPHANED` с перечёркнутым облаком; проверить прогоном `DeviceSyncE2ETest`
- [ ] 4.2 E2E: вернуть оригинал на устройство и убедиться, что элемент заливается заново и снова разгружается в C; проверить прогоном `DeviceSyncE2ETest`
- [x] 4.3 Прогнать `cd android && ./gradlew test` и `cd android && ./gradlew :app:assembleDebug`; убедиться, что сборка и unit-тесты зелёные
## Workflow follow-up
- Архивировать change после выполнения задач и прохождения ревью по правилам проекта.
- Проверить итоговый результат после архивации.