CreateEmployeeCommand
Назначение
Создание сотрудника: запись UserEntity в БД и запуск Saga для создания учётной записи в Keycloak. Используется для приглашения новых сотрудников. Требует разрешение Identity.Employees.Create.
Цели
- Создать UserEntity (Status = Pending)
- Создать UserRoleReferenceEntity для каждой роли
- Запустить CreateEmployee Saga (CreateKeycloakUser)
- Опубликовать AfterUserCreatedNotification
Command: CreateEmployeeCommand
Входные данные
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| string | Да | ||
| PhoneNumber | string | Да | Номер телефона |
| Name | FullName | Да | ФИО |
| RoleIds | IReadOnlyCollection<long> | Да | Идентификаторы ролей (может быть пустым) |
примечание
TenantId берётся из TenantedUserIdentityContext.
Result: CreateEmployeeCommandResult
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| UserId | Guid | Да | Идентификатор созданного пользователя |
Бизнес-логика
Основной сценарий
- Distributed lock по Email.
- Начать транзакцию (Serializable).
- Проверить отсутствие пользователя с таким Email через
userEntityRepository.FindBy. - Если найден — ошибка «Пользователь с таким email уже существует».
- Валидировать RoleIds через ValidateAndGetRoleEntities (GetByIds, проверить наличие всех).
- Если не все роли найдены — ошибка «Не все указанные роли найдены».
- Создать UserEntity (Id = Guid.CreateVersion7, Status = Pending, TenantId из контекста).
- Создать UserRoleReferenceEntity для каждой роли.
- Создать Saga CreateEmployee (CreateKeycloakUser).
- Publish AfterUserCreatedNotification.
- Commit.
- Вернуть UserId.
Альтернативные сценарии
- Email уже существует: ошибка «Пользователь с таким email уже существует».
- Не все роли найдены: ошибка «Не все указанные роли найдены» с метаданными missingRoleIds.
- RoleIds пустой: создание без ролей (UserRoleReferences не создаются).
Диаграмма алгоритма
События
- CreateEmployee Saga (CreateKeycloakUser, UpdateUserKeycloakId)
- AfterUserCreatedNotification