- backend: switch EXIF parser to dsoprea/go-exif/v3 (all recognised tags, numeric normalization); store in photos.exif jsonb (migration 000003); add storage.Get and cmd/backfill-exif to backfill existing photos from S3 originals - frontend: info panel renders all EXIF attributes with RU labels, enum translation and units (1/N, f/N, mm, EV); service tags hidden - viewer: remove make-cover action (cover managed from panel only), icon-only download - openspec: sync lightroom-workspace-ui artifacts (EXIF, cover-from-panel) and add plan for configurable info attributes/labels stored in user profile
56 lines
3.3 KiB
Markdown
56 lines
3.3 KiB
Markdown
# Spec Delta
|
|
|
|
## ADDED Requirements
|
|
|
|
### Requirement: Обложка по умолчанию
|
|
При обработке загруженного фото система SHALL назначать его обложкой альбома только если
|
|
обложка ещё не задана.
|
|
|
|
#### Scenario: Первое фото
|
|
- **WHEN** фото обработано, и у альбома нет обложки
|
|
- **THEN** система назначает это фото обложкой
|
|
|
|
#### Scenario: Обложка уже задана
|
|
- **WHEN** фото обработано, а обложка уже задана
|
|
- **THEN** система не меняет обложку
|
|
|
|
### Requirement: Переименование фото
|
|
Автор фото, владелец и админ альбома SHALL иметь возможность изменить имя файла фото;
|
|
остальные SHALL получать отказ, а пустое имя SHALL отклоняться.
|
|
|
|
#### Scenario: Переименование автором
|
|
- **WHEN** автор меняет имя файла своего фото на непустое
|
|
- **THEN** система сохраняет новое имя и транслирует изменение подписчикам альбома
|
|
|
|
#### Scenario: Пустое имя
|
|
- **WHEN** пользователь подтверждает пустое имя файла
|
|
- **THEN** система отклоняет запрос
|
|
|
|
#### Scenario: Нет прав
|
|
- **WHEN** участник без прав переименовывает чужое фото
|
|
- **THEN** система отклоняет запрос
|
|
|
|
### Requirement: Ограничение размера загрузки
|
|
Система SHALL ограничивать размер загружаемых файлов и SHALL отвечать понятной ошибкой при
|
|
превышении лимита, а не ошибкой разбора формы.
|
|
|
|
#### Scenario: Превышение лимита
|
|
- **WHEN** загружаемый файл превышает максимальный размер
|
|
- **THEN** система отклоняет загрузку с явной ошибкой о превышении размера
|
|
|
|
#### Scenario: Файл в пределах лимита
|
|
- **WHEN** файл не превышает лимит
|
|
- **THEN** система принимает multipart-загрузку и обрабатывает фото
|
|
|
|
### Requirement: Метаданные фото (EXIF)
|
|
При загрузке фото система SHALL извлекать распознаваемые EXIF-атрибуты и SHALL возвращать их
|
|
вместе с данными фото; при отсутствии метаданных SHALL возвращать пустой набор.
|
|
|
|
#### Scenario: Фото с метаданными
|
|
- **WHEN** загружается фото с EXIF
|
|
- **THEN** данные фото содержат извлечённые атрибуты (камера, экспозиция, ISO, дата съёмки и др.)
|
|
|
|
#### Scenario: Фото без метаданных
|
|
- **WHEN** загружается фото без читаемых EXIF
|
|
- **THEN** данные фото не содержат атрибутов, а загрузка выполняется успешно
|