RemoveRoleFromEmployeeCommand
Назначение
Удаление роли у сотрудника. Опционально можно сразу назначить новую роль (NewRoleId), чтобы не оставить пользователя без ролей. Требует разрешение Identity.Employees.Roles.Remove.
Цели
- Удалить UserRoleReferenceEntity (UserId, RoleId)
- Опционально: создать UserRoleReferenceEntity для NewRoleId перед удалением
- Запретить удаление последней роли без назначения NewRoleId
Command: RemoveRoleFromEmployeeCommand
Входные данные
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| UserId | Guid | Да | Идентификатор пользователя |
| RoleId | long | Да | Идентификатор роли для удаления |
| NewRoleId | long? | Нет | Идентификатор новой роли (если удаляется последняя роль) |
Result: RemoveRoleFromEmployeeCommandResult
Пустой результат.
Бизнес-логика
Основной сценарий
- Начать транзакцию (ReadCommitted).
- Получить UserEntity по UserId. Если не найден — ошибка «Сотрудник не найден».
- Проверить TenantId пользователя; если не совпадает — ошибка «Сотрудник не принадлежит текущему тенанту».
- Получить RoleEntity по RoleId. Если не найден — ошибка «Роль не найдена».
- Проверить TenantId роли; если не совпадает — ошибка «Роль не принадлежит текущему тенанту».
- Найти UserRoleReference (UserId, RoleId). Если не найдена — ошибка «У сотрудника нет указанной роли».
- Подсчитать количество ролей у пользователя.
- Если это последняя роль и NewRoleId не указан — ошибка «Невозможно удалить последнюю роль у сотрудника».
- Если указан NewRoleId: проверить существование и TenantId новой роли; если у пользователя её ещё нет — создать UserRoleReferenceEntity.
- Удалить UserRoleReferenceEntity.
- Publish AfterUserUpdatedNotification.
- Commit.
- Вернуть Result.
Альтернативные сценарии
- Сотрудник не найден: ошибка «Сотрудник не найден».
- Сотрудник не принадлежит тенанту: ошибка «Сотрудник не принадлежит текущему тенанту».
- Роль не найдена: ошибка «Роль не найдена».
- Роль не принадлежит тенанту: ошибка «Роль не принадлежит текущему тенанту».
- У сотрудника нет указанной роли: ошибка «У сотрудника нет указанной роли».
- Последняя роль без NewRoleId: ошибка «Невозможно удалить последнюю роль у сотрудника».
- NewRoleId не найден: ошибка «Новая роль для назначения не найдена».
- NewRoleId не принадлежит тенанту: ошибка «Новая роль для назначения не принадлежит текущему тенанту».