Перейти к основному содержимому

CreateEmployeeCommand

Назначение

Создание сотрудника: запись UserEntity в БД и запуск Saga для создания учётной записи в Keycloak. Используется для приглашения новых сотрудников. Требует разрешение Identity.Employees.Create.

Цели

  • Создать UserEntity (Status = Pending)
  • Создать UserRoleReferenceEntity для каждой роли
  • Запустить CreateEmployee Saga (CreateKeycloakUser)
  • Опубликовать AfterUserCreatedNotification

Command: CreateEmployeeCommand

Входные данные

ПолеТипОбязательноеОписание
EmailstringДаEmail
PhoneNumberstringДаНомер телефона
NameFullNameДаФИО
RoleIdsIReadOnlyCollection<long>ДаИдентификаторы ролей (может быть пустым)
примечание

TenantId берётся из TenantedUserIdentityContext.

Result: CreateEmployeeCommandResult

ПолеТипОбязательноеОписание
UserIdGuidДаИдентификатор созданного пользователя

Бизнес-логика

Основной сценарий

  1. Distributed lock по Email.
  2. Начать транзакцию (Serializable).
  3. Проверить отсутствие пользователя с таким Email через userEntityRepository.FindBy.
  4. Если найден — ошибка «Пользователь с таким email уже существует».
  5. Валидировать RoleIds через ValidateAndGetRoleEntities (GetByIds, проверить наличие всех).
  6. Если не все роли найдены — ошибка «Не все указанные роли найдены».
  7. Создать UserEntity (Id = Guid.CreateVersion7, Status = Pending, TenantId из контекста).
  8. Создать UserRoleReferenceEntity для каждой роли.
  9. Создать Saga CreateEmployee (CreateKeycloakUser).
  10. Publish AfterUserCreatedNotification.
  11. Commit.
  12. Вернуть UserId.

Альтернативные сценарии

  • Email уже существует: ошибка «Пользователь с таким email уже существует».
  • Не все роли найдены: ошибка «Не все указанные роли найдены» с метаданными missingRoleIds.
  • RoleIds пустой: создание без ролей (UserRoleReferences не создаются).

Диаграмма алгоритма

События

Связанные сущности