docs(specs): archive auth and cache remediation

This commit is contained in:
2026-08-23 22:42:40 +03:00
parent 72444dbbb1
commit 6e20cdffaf
8 changed files with 257 additions and 1 deletions
@@ -60,3 +60,18 @@
#### Scenario: Отображение записи только с инструментом
- **WHEN** полный журнал отображает запись без денежной выплаты
- **THEN** страница определяет её как запись без движения денег
### Requirement: Кэш страниц журнала ограничивает локальные ресурсы
Система SHALL кэшировать не более 100 недавно использованных страниц Account Ledger в каждом backend process не более чем на 30 секунд. Cache key MUST включать User, Brokerage Account, нормализованные период и categories, opaque cursor и limit; порядок или дублирование categories MUST NOT создавать отдельную cache identity, а отсутствующий конец периода MUST использовать текущий 30-секундный bucket. Просроченная страница MUST NOT возвращаться, а при переполнении cache MUST удалять наименее недавно использованную страницу.
#### Scenario: Равнозначные фильтры используют одну cache identity
- **WHEN** User в одном 30-секундном bucket повторяет запрос страницы журнала с теми же периодом, cursor и limit, но с categories в другом порядке или с дубликатами
- **THEN** система использует ту же cache identity и не запрашивает upstream повторно для свежей страницы
#### Scenario: Большое число уникальных запросов не увеличивает cache без границы
- **WHEN** backend обслуживает больше 100 уникальных запросов страниц журнала
- **THEN** cache содержит не более 100 страниц и освобождает наименее недавно использованные страницы
#### Scenario: Просроченная страница не возвращается
- **WHEN** cached страница журнала старше 30 секунд
- **THEN** система не возвращает её как свежий результат и получает актуальную страницу из upstream
+9 -1
View File
@@ -19,6 +19,10 @@
- **WHEN** пользователь регистрирует email, уже принадлежащий User после нормализации
- **THEN** система отвечает `409` Problem Details с code `EMAIL_ALREADY_REGISTERED`
#### Scenario: Конкурентная регистрация
- **WHEN** два запроса одновременно регистрируют один нормализованный email
- **THEN** ровно один запрос создаёт User и Session, а второй отвечает `409` Problem Details с code `EMAIL_ALREADY_REGISTERED`
#### Scenario: Невалидные регистрационные данные
- **WHEN** пользователь отправляет email или пароль, не соответствующий правилам регистрации
- **THEN** система отвечает `400` Problem Details с code `VALIDATION_ERROR` и указателями на невалидные поля
@@ -41,13 +45,17 @@
- **WHEN** клиент отправляет действительный refresh-cookie
- **THEN** система заменяет refresh-cookie и возвращает новый access token и профиль Session
#### Scenario: Конкурентное восстановление сессии
- **WHEN** два запроса одновременно отправляют один действительный refresh-cookie одной Session
- **THEN** ровно один запрос заменяет refresh-cookie и возвращает новый access token и профиль, второй отвечает `401` Problem Details с code `UNAUTHORIZED`, а Session победителя остаётся активной
#### Scenario: Истёкшая сессия
- **WHEN** клиент отправляет refresh-cookie Session, не обновлявшейся более 7 дней
- **THEN** система удаляет refresh-cookie и отвечает `401` Problem Details с code `UNAUTHORIZED`
#### Scenario: Повторное использование refresh token
- **WHEN** клиент отправляет refresh token, заменённый предыдущим успешным refresh
- **THEN** система отзывает только связанную Session, удаляет refresh-cookie и отвечает `401` Problem Details с code `UNAUTHORIZED`
- **THEN** система удаляет refresh-cookie и отвечает `401` Problem Details с code `UNAUTHORIZED`, не отзывая связанную Session только из-за этого запроса
### Requirement: Завершение сессии
Система SHALL позволять завершить текущую Session через logout. Logout MUST отозвать Session, если refresh-cookie соответствует активной Session, и MUST удалить refresh-cookie. Logout MUST быть идемпотентным и не раскрывать существование Session.