Files
ds-galo/openspec/specs/albums/spec.md
T
iu 6e68242ec2 chore(openspec): архивировать album-live-sync и синхронизировать основные спеки
- realtime: личный поток несёт события жизненного цикла альбома и изменения
  счётчика фото; добавлены требования о жизненном цикле, получателях, форме
  payload'а, догоне и потере доступа
- albums: photos_count считает только фото вне корзины
2026-10-15 23:25:07 +03:00

99 lines
6.2 KiB
Markdown

# albums Specification
## Purpose
Управление фотоальбомами: создание, просмотр, редактирование, удаление и владение.
## Requirements
### Requirement: Создание альбома
Зарегистрированный пользователь SHALL иметь возможность создать альбом и стать его владельцем.
#### Scenario: Создание альбома
- **WHEN** пользователь создаёт альбом с названием
- **THEN** система создаёт альбом и назначает пользователя владельцем
### Requirement: Список альбомов пользователя
Пользователь SHALL иметь возможность получить список альбомов, к которым у него есть доступ.
#### Scenario: Список альбомов
- **WHEN** пользователь запрашивает список альбомов
- **THEN** система возвращает альбомы, где он владелец или участник
### Requirement: Получение альбома
Участник SHALL иметь возможность получить данные альбома по id.
#### Scenario: Просмотр альбома
- **WHEN** участник запрашивает альбом по id
- **THEN** система возвращает данные альбома
### Requirement: Редактирование альбома
Владелец и админ SHALL иметь возможность редактировать название, описание и обложку альбома.
#### Scenario: Редактирование альбома
- **WHEN** админ изменяет описание альбома
- **THEN** система сохраняет изменения
### Requirement: Удаление альбома
Владелец SHALL иметь возможность удалить альбом; фото альбома SHALL помещаться в корзину без
удаления объектов хранилища, а участники и share-ссылки SHALL удаляться вместе с альбомом.
#### Scenario: Удаление альбома
- **WHEN** владелец удаляет альбом
- **THEN** фото альбома попадают в корзину без привязки к альбому и файлы сохраняются, участники и share-ссылки удаляются
### Requirement: Отображение обложки альбома
Данные альбома SHALL включать URL обложки, когда обложка задана, чтобы клиенты могли
показать её в списке, рейле и карточке; URL SHALL указывать на вариант, достаточный для
крупного отображения, с откатом на миниатюру, пока крупный вариант не готов.
#### Scenario: Обложка задана
- **WHEN** клиент запрашивает список альбомов или альбом по id, и у альбома есть обложка
- **THEN** ответ содержит URL обложки
#### Scenario: Обложка отсутствует
- **WHEN** у альбома нет обложки или фото обложки удалено
- **THEN** ответ не содержит URL обложки, и клиент показывает плейсхолдер
#### Scenario: Крупный вариант ещё не готов
- **WHEN** у обложки готов только вариант-миниатюра
- **THEN** ответ содержит URL миниатюры обложки
### Requirement: Выбор обложки
Владелец и админ SHALL иметь возможность назначить обложкой любое фото альбома или сбросить
обложку; после сброса обложка SHALL становиться не заданной (без возврата к значению по
умолчанию).
#### Scenario: Назначение обложки
- **WHEN** владелец выбирает фото альбома как обложку
- **THEN** система сохраняет выбор и отражает его в списке и карточках
#### Scenario: Сброс обложки
- **WHEN** админ сбрасывает обложку
- **THEN** система снимает обложку, и альбом отображается без обложки, пока обложку не назначат снова
#### Scenario: Нет прав на смену обложки
- **WHEN** участник без права редактирования пытается сменить обложку
- **THEN** система отклоняет запрос
### Requirement: Счётчики альбома
Данные альбома SHALL включать количество фото и участников, чтобы панель и карточки могли
показать их без отдельных запросов. Количество фото SHALL учитывать только фото, доступные в
альбоме (не помещённые в корзину), и совпадать с числом фото, отображаемых в сетке альбома.
#### Scenario: Счётчики в ответе
- **WHEN** клиент запрашивает список альбомов или альбом по id
- **THEN** ответ содержит число фото и число участников альбома
#### Scenario: Фото в корзине не учитывается
- **WHEN** фото альбома помещается в корзину
- **THEN** `photos_count` этого альбома уменьшается на единицу
#### Scenario: Фото восстановлено из корзины
- **WHEN** фото восстанавливается из корзины в альбом
- **THEN** `photos_count` этого альбома увеличивается на единицу