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

LinkUserIdentityCommand

Назначение

Привязка существующего пользователя к identity provider (Keycloak, Bitrix24, AmmoCRM).

Цели

  • Добавить связь UserIdentityEntity между пользователем и провайдером
  • Обеспечить уникальность (Provider, ProviderUserId) глобально
  • Не допустить дублирования связи пользователь–провайдер

Command: LinkUserIdentityCommand

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

ПолеТипОбязательноеОписание
TenantIdGuidДаИдентификатор тенанта
UserIdGuidДаИдентификатор пользователя
ProviderIdentityProviderДаKeycloak, Bitrix24, AmmoCRM
ProviderUserIdstringДаID пользователя у провайдера
IdempotencyKeyGuidДаКлюч идемпотентности

Result: LinkUserIdentityCommandResult

ПолеТипОписание
UserIdentityIdGuidИдентификатор созданной связи

Валидация

  • Пользователь должен существовать и принадлежать указанному TenantId
  • (Provider, ProviderUserId) должны быть глобально уникальны — ошибка «Пользователь с таким ProviderUserId уже существует»
  • У пользователя ещё не должно быть связи с этим Provider — ошибка «У пользователя уже есть связь с этим провайдером»

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

  1. Acquire distributed lock LinkUserIdentity_{Provider}_{ProviderUserId} (1 минута).
  2. Начать транзакцию (Serializable).
  3. Проверить существование пользователя и TenantId.
  4. Проверить, что (Provider, ProviderUserId) не заняты другим пользователем.
  5. Проверить, что у пользователя нет связи с этим Provider.
  6. Создать UserIdentityEntity.
  7. Publish AfterUserUpdatedNotification.
  8. Commit.
  9. Вернуть UserIdentityId.

События