Цель: не дать системе остаться без единого активного ADMIN.
Зависимость: USR-1.
Что сделать
- Запретить деактивацию последнего активного ADMIN → внятная ошибка (например 409
LAST_ADMIN).
- Запретить деактивацию самого себя —
SelfDeactivationException уже есть: проверить, что реально срабатывает на DELETE /api/users/{id}, покрыт тестом, и маппится в правильный код в GlobalExceptionHandler.
- Проверку «последний админ» делать устойчиво к гонке (см. стретч), а не наивным
count() до апдейта.
- Стретч: гонка — два параллельных запроса деактивируют двух последних админов одновременно; оба проходят наивную проверку
count(active admins) > 1 и оставляют 0 админов. Решить через блокировку/атомарный conditional UPDATE/сериализацию, не через «проверил-потом-обновил».
Acceptance criteria
Цель: не дать системе остаться без единого активного ADMIN.
Зависимость: USR-1.
Что сделать
LAST_ADMIN).SelfDeactivationExceptionуже есть: проверить, что реально срабатывает наDELETE /api/users/{id}, покрыт тестом, и маппится в правильный код вGlobalExceptionHandler.count()до апдейта.count(active admins) > 1и оставляют 0 админов. Решить через блокировку/атомарный conditional UPDATE/сериализацию, не через «проверил-потом-обновил».Acceptance criteria
SelfDeactivationException→ корректный HTTP-код).