Дельта android-live-albums: android-client (+3 требования: живое обновление списка, догон при переподключении, потеря доступа) и realtime (порядок списка теперь правило отображения клиента). Дельта fix-album-cover-readiness: realtime (+1 требование: album.updated при готовности вариантов фото-обложки).
6.3 KiB
6.3 KiB
Tasks
1. Клиент персонального потока
- 1.1 Добавить в
GaloApiзапрос персонального потока (api/sse/me,Accept: text/event-stream); проверить request-тестом, что URL собран от базового адреса и заголовок выставлен - 1.2 Добавить парсер событий жизненного цикла альбома (
album.created,album.updated,album.deleted-> типы с объектом/идентификатором;notificationи неизвестные -> игнорировать); проверить unit-тестами на каждый тип, на неизвестный тип и на битый JSON - 1.3 Добавить
PersonalSseClientпо образцуAlbumSseClient(backoff, событиеReconnectedпосле разрыва); проверить тестом: события доходят в порядке получения, после разрыва приходитReconnected - 1.4 Проверить завершение соединения при отмене коллектора (отменяется ли
EventSource, когда поток перестают собирать), при необходимости закрывать его вfinally/invokeOnClose; проверить тестом, что после отмены поток не переоткрывается
2. Применение событий к кэшу
- 2.1 Вывести удаление в
AlbumLocalSource(deleteByIds) иPhotoLocalSource(очистка фото альбома); проверить тестами локального источника, что записи удаляются - 2.2 Добавить в
AlbumRepositoryприменение событий:album.created/album.updatedзаменяют альбом,album.deletedудаляет альбом вместе с его фото; проверить тестами на фейках: обновлённый объект виден изobserveAlbums, удалённый исчезает вместе со своими фото - 2.3 Связать клиент персонального потока с репозиторием в
AppContainerи обработчиком событий; проверить тестом, что событие из потока меняет то, что отдаётobserveAlbums
3. Подписка на время сессии
- 3.1 Подписаться на персональный поток в
AlbumsViewModelи завершать подписку при уничтожении ViewModel; проверить тестом, что подписка создаётся один раз и не пересоздаётся при повторном обращении к состоянию - 3.2 На
ReconnectedвызыватьalbumRepository.refresh(); проверить тестом, что альбом, удалённый на сервере за время разрыва, исчезает из кэша после догона - 3.3 Обновить
android/README.md, раздел «Live updates»: персональный поток, обновление списка и потеря доступа; проверить, что описанный эндпоинт совпадает с реализованным запросом
4. Потеря доступа к альбому
- 4.1 Отслеживать в
AlbumViewModelфакт «альбом уже был показан» и отдавать сигнал потери доступа при переходе «ненулевой -> отсутствует»; проверить unit-тестами оба случая: был и исчез — сигнал есть, не было изначально (нет кэша, нет сети) — сигнала нет - 4.2 По сигналу потери доступа экран альбома возвращается к списку; проверить Compose-тестом (Robolectric), что экран инициирует возврат, а список больше не содержит альбом
- 4.3 Проверить сценарий исключения участника:
album.deletedприходит только личным потоком, альбом исчезает из списка и открытый экран уходит назад
5. Интеграционная проверка
- 5.1 Прогнать сквозной сценарий на двух аккаунтах против локального сервера: создание, переименование, смена обложки, удаление альбома и исключение участника — список и открытый экран обновляются без ручного обновления; приложить результат (шаги и наблюдение)
- 5.2 Проверить поведение при истечении токена в долгоживущем потоке: соединение восстанавливается после обновления токена; если нет — зафиксировать ограничение в README
- 5.3 Прогнать на финальной ревизии
cd android && ./gradlew testиcd android && ./gradlew :app:assembleDebug; зафиксировать, что обе команды проходят - 5.4 Прогонять unit-тесты только на debug-варианте (тестовая активность Compose приходит из debug-зависимости
ui-test-manifest), чтобыcd android && ./gradlew testпроходил без тестовой активности в release-манифесте; проверить./gradlew test,:app:assembleDebugи:app:assembleRelease
Workflow follow-up
- Заархивировать change после прохождения ревью проекта (
openspec archive android-live-albums). - Проверить, что после архивации требования вошли в
openspec/specs/android-client/spec.mdиopenspec/specs/realtime/spec.md, аopenspec validate --strict android-live-albumsне выдаёт ошибок.