Назначение
Обновление роли: Name, Code, RoleTemplateId и полная синхронизация RoleScopeReferenceEntity с IncludeScopeIds и ExcludeScopeIds. Требует разрешение Identity.Roles.Update.
Цели
- Обновить RoleEntity (Name, Code, RoleTemplateId)
- Синхронизировать RoleScopeReferenceEntity с command (удалить лишние, добавить новые, обновить Action)
Command: UpdateRoleCommand
Входные данные
| Поле | Тип | Обязательное | Описание |
|---|
| RoleId | long | Да | Идентификатор роли |
| Name | string | Да | Название роли |
| Code | string | Да | Код роли |
| IncludeScopeIds | IReadOnlyCollection<long>? | Нет | Scope для включения |
| ExcludeScopeIds | IReadOnlyCollection<long>? | Нет | Scope для исключения |
| RoleTemplateId | long? | Нет | Идентификатор шаблона роли |
Result: UpdateRoleCommandResult
| Поле | Тип | Обязательное | Описание |
|---|
| RoleId | long | Да | Идентификатор обновлённой роли |
Бизнес-логика
Основной сценарий
- Начать транзакцию (ReadCommitted).
- Получить RoleEntity. Если не найдена — ошибка «Роль не найдена».
- Проверить TenantId.
- Если Code изменился — проверить уникальность.
- Если RoleTemplateId указан — проверить существование шаблона.
- Валидировать ScopeIds.
- Обновить RoleEntity.
- Синхронизировать RoleScopeReferenceEntity: удалить записи, отсутствующие в command; добавить новые; обновить Action при изменении.
- Commit.
- Вернуть RoleId.
Альтернативные сценарии
- Роль не найдена: ошибка «Роль не найдена».
- Роль не принадлежит тенанту: ошибка «Роль не принадлежит текущему тенанту».
- Код роли уже существует: ошибка «Код роли уже существует».
- Шаблон роли не найден: ошибка «Шаблон роли не найден».
- Не все scope существуют: ошибка «Не все записи scope существуют».
- Дубликаты ScopeId: ошибка.
Диаграмма алгоритма
Связанные сущности