chore(openspec): архивировать add-orphaned-preview-handling и синхронизировать спеки
Новое требование в phone-album-sync о потере/возврате серверной копии у разгруженного превью, требование в android-client о метке потерянного элемента и действии удаления с устройства.
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
# Proposal
|
||||
|
||||
## Why
|
||||
|
||||
В режиме переноса (C) на устройстве остаётся только превью, а оригинал живёт на
|
||||
сервере. Если серверное фото исчезает из целевого альбома (удалено с другого
|
||||
устройства, из web или из экрана серверного альбома), приложение этого не
|
||||
замечает: локальный индекс продолжает держать `serverPhotoId`, элемент
|
||||
показывается с обычным значком облака, а при открытии оригинал бесконечно не
|
||||
загружается. Пользователь не видит, что связи с сервером больше нет, и не может
|
||||
этот элемент убрать или перезалить.
|
||||
|
||||
## What Changes
|
||||
|
||||
- Новое локальное состояние ассета **ORPHANED**: превью на устройстве есть, а
|
||||
серверного фото в целевом альбоме больше нет.
|
||||
- Определение состояния при проверке синхронизации: `serverPhotoId` элемента
|
||||
сверяется с живыми фото альбома; отсутствие переводит элемент в `ORPHANED`,
|
||||
повторное появление — обратно в `PREVIEW`.
|
||||
- Метка элемента в сетке: для `ORPHANED` показывается перечёркнутое облако
|
||||
вместо обычного.
|
||||
- Действие `ORPHANED`-элемента — «Удалить с устройства»: удаляет превью-файл и
|
||||
запись индекса, сервер не затрагивается (его копии уже нет). Серверные
|
||||
атрибуты (теги, обложка, серверное удаление) для такого элемента недоступны.
|
||||
- Возврат оригинала: если содержимое с исходным hash снова появляется на
|
||||
телефоне (в этом же альбоме или в другом альбоме устройства), элемент
|
||||
заливается заново; в режиме C он снова проходит обычный цикл разгрузки.
|
||||
- Автоматическое поведение остаётся консервативным: файл-превью не удаляется и
|
||||
не перезаливается без участия пользователя, превью не выдаётся за оригинал.
|
||||
|
||||
## Capabilities
|
||||
|
||||
### New Capabilities
|
||||
|
||||
Нет.
|
||||
|
||||
### Modified Capabilities
|
||||
|
||||
- `phone-album-sync`: отражение серверных изменений распространяется на
|
||||
разгруженные превью (элемент становится `ORPHANED`, файл сохраняется), добавляется
|
||||
действие удаления с устройства и повторная заливка вернувшегося оригинала.
|
||||
- `android-client`: метка перенесённого элемента получает состояние
|
||||
«перечёркнутое облако», а шит элемента — действие «Удалить с устройства» для
|
||||
потерявших серверную копию.
|
||||
|
||||
## Impact
|
||||
|
||||
- Android-клиент: `domain/model/Sync.kt` (`LocalAssetState`),
|
||||
`domain/sync/GallerySyncPolicy.kt`, `data/sync/SyncPlan.kt`,
|
||||
`data/sync/SyncCoordinator.kt`, `data/sync/SyncCheck.kt`,
|
||||
`ui/devicealbum/DeviceAlbumViewModel.kt`, `ui/devicealbum/DeviceAlbumScreen.kt`,
|
||||
`domain/attributes/PhotoAttributeSource.kt`.
|
||||
- Удаление превью — через MediaStore delete-consent (элемент галереи не
|
||||
принадлежит приложению), переиспользуется существующий путь согласия.
|
||||
- Серверный API и схема БД не меняются.
|
||||
Reference in New Issue
Block a user