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

AddUserContactCommand

Назначение

Добавление контактной информации текущему пользователю. Создаёт запись в UserContactEntity и публикует AfterUserUpdated через Outbox.

Цели

  • Добавить контакт (телефон, email, сайт и т.д.) текущему пользователю
  • Обеспечить транзакционную целостность
  • Публиковать полный snapshot пользователя в Kafka

Command: AddUserContactCommand

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

ПолеТипОбязательноеОписание
ContactInfoTypeIdintДаИдентификатор типа контакта (из ContactInfoTypeHandbookEntity)
ValuestringДаЗначение контакта
примечание

UserId и TenantId берутся из IdentityContext (текущий авторизованный пользователь).

Result: AddUserContactResult

ПолеТипОбязательноеОписание
ContactIdGuidДаИдентификатор созданного контакта
ContactInfoTypeIdintДаТип контакта
ValuestringДаЗначение

Валидация

  • Пользователь должен существовать (из IdentityContext)
  • ContactInfoTypeId должен соответствовать существующему типу в ContactInfoTypeHandbookEntity

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

  1. Получить UserId и TenantId из TenantedUserIdentityContext.
  2. Начать транзакцию (ReadCommitted).
  3. Получить UserEntity по UserId. Если не найден — ошибка «Пользователь не найден».
  4. Получить ContactInfoTypeHandbookEntity по ContactInfoTypeId. Если не найден — ошибка «Тип контакта не найден».
  5. Создать UserContactEntity (Id = Guid.CreateVersion7, TenantId, UserId, ContactInfoTypeId, Value).
  6. Добавить в репозиторий.
  7. Publish AfterUserUpdatedNotification (UserId, TenantId).
  8. Commit.
  9. Вернуть AddUserContactResult.

События

  • AfterUserUpdatedNotification — handler формирует AfterUserUpdatedEvent с полным snapshot пользователя и записывает в Outbox. Kafka-событие публикуется асинхронно после commit.

Схема потока данных

AddUserContactCommand
→ UserContactEntityRepository.Add
→ NotificationSender.Publish(AfterUserUpdatedNotification)
→ OutboxMessageEntity (AfterUserUpdatedEvent)
→ Kafka: identity.after-user-updated