- realtime: личный поток несёт события жизненного цикла альбома и изменения счётчика фото; добавлены требования о жизненном цикле, получателях, форме payload'а, догоне и потере доступа - albums: photos_count считает только фото вне корзины
8.3 KiB
Spec Delta
MODIFIED Requirements
Requirement: Персональный поток
Клиент SHALL иметь возможность подписаться на персональный поток (приглашения, уведомления, изменения его альбомов).
Scenario: Подписка на персональный поток
- WHEN пользователь подключается к персональному потоку
- THEN система отправляет ему персональные события
Scenario: Изменение списка альбомов
- WHEN альбом, доступный пользователю, создан, изменён или удалён
- THEN пользователь получает соответствующее событие в персональном потоке
ADDED Requirements
Requirement: События жизненного цикла альбома
Система SHALL публиковать в персональные потоки события album.created и album.updated
с объектом альбома и album.deleted с идентификатором альбома.
Scenario: Создание альбома
- WHEN пользователь создаёт альбом
- THEN владелец получает событие
album.createdс объектом альбома
Scenario: Изменение метаданных альбома
- WHEN участник с правом редактирования меняет название, описание или обложку
- THEN владелец и участники получают событие
album.updatedс актуальным объектом
Scenario: Удаление альбома
- WHEN владелец удаляет альбом
- THEN владелец и участники получают событие
album.deletedс идентификатором
Requirement: Получатели событий об альбоме
Система SHALL доставлять события жизненного цикла альбома владельцу и всем участникам альбома, для которых он доступен.
Scenario: Веер по участникам
- WHEN альбом изменён
- THEN событие получает владелец и каждый участник альбома, включая инициатора изменения
Scenario: Принятие приглашения
- WHEN пользователь принимает приглашение в альбом
- THEN приглашённый получает событие о появлении альбома в своём списке, а владелец — обновлённый объект альбома с новым числом участников
Requirement: Единая форма объекта альбома в событиях
Объект альбома в событиях SHALL совпадать по форме с элементом ответа списка альбомов, включая URL обложки и счётчики, чтобы клиент применял событие без дополнительных запросов.
Scenario: Объект события совпадает со списком
- WHEN клиент получает
album.createdилиalbum.updated - THEN объект содержит те же поля, что элемент ответа
GET /api/albums
Requirement: Применение события без повторного запроса
Клиент SHALL обновлять локальный список альбомов из payload'а события: создавать или заменять альбом по полученному объекту и удалять его по идентификатору, не выполняя дополнительный запрос списка.
Scenario: Обновление альбома из списка
- WHEN приходит событие обновления для альбома, который уже есть в списке клиента
- THEN клиент заменяет его на месте, не меняя порядок списка
Scenario: Удаление альбома из списка
- WHEN приходит событие удаления для альбома, который есть в списке клиента
- THEN клиент убирает альбом из списка
Requirement: Догон состояния альбомов при переподключении
Клиент SHALL после восстановления персонального потока синхронизировать список альбомов через REST, чтобы отразить изменения, пропущенные во время разрыва соединения.
Scenario: Переподключение персонального потока
- WHEN персональный поток восстанавливается после разрыва
- THEN клиент перезапрашивает список альбомов и приводит локальное состояние к серверному
Requirement: Потеря доступа к альбому
Клиент SHALL переставать отображать альбом, который удалён или к которому потерян доступ, при получении соответствующего персонального события, в том числе на открытой странице альбома.
Scenario: Альбом удалён во время просмотра
- WHEN владелец удаляет альбом, пока участник просматривает его страницу
- THEN участник получает событие и страница перестаёт отображать удалённый альбом
Scenario: Участник исключён из альбома
- WHEN участника исключают из альбома
- THEN исключённый получает событие, и альбом убирается из его списка
Requirement: Обновление альбома при изменении состава фото
Система SHALL публиковать album.updated с актуальным объектом альбома в персональные потоки
владельца и участников, когда состав фото альбома меняется: загрузка, копирование, перемещение,
восстановление, перевод в корзину и окончательное удаление. При загрузке система также SHALL
публиковать photo.created в поток альбома (см. способность realtime, требование «События
альбома»), чтобы открытая страница добавляла новое фото.
Scenario: Загрузка фото
- WHEN пользователь загружает фото в альбом
- THEN владелец и участники получают
album.updatedс увеличеннымphotos_count
Scenario: Перемещение фото
- WHEN фото перемещается из одного альбома в другой
- THEN владелец и участники обоих альбомов получают
album.updatedс актуальными счётчиками
Scenario: Фото в корзине
- WHEN фото переводится в корзину или восстанавливается
- THEN владелец и участники получают
album.updatedс обновлённымphotos_count
Scenario: Окончательное удаление фото
- WHEN фото удаляется окончательно
- THEN владелец и участники получают
album.updatedс уменьшеннымphotos_count