AddUserContactCommand
Назначение
Добавление контактной информации текущему пользователю. Создаёт запись в UserContactEntity и публикует AfterUserUpdated через Outbox.
Цели
- Добавить контакт (телефон, email, сайт и т.д.) текущему пользователю
- Обеспечить транзакционную целостность
- Публиковать полный snapshot пользователя в Kafka
Command: AddUserContactCommand
Входные данные
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| ContactInfoTypeId | int | Да | Идентификатор типа контакта (из ContactInfoTypeHandbookEntity) |
| Value | string | Да | Значение контакта |
примечание
UserId и TenantId берутся из IdentityContext (текущий авторизованный пользователь).
Result: AddUserContactResult
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| ContactId | Guid | Да | Идентификатор созданного контакта |
| ContactInfoTypeId | int | Да | Тип контакта |
| Value | string | Да | Значение |
Валидация
- Пользователь должен существовать (из IdentityContext)
- ContactInfoTypeId должен соответствовать существующему типу в ContactInfoTypeHandbookEntity
Бизнес-логика
- Получить UserId и TenantId из TenantedUserIdentityContext.
- Начать транзакцию (ReadCommitted).
- Получить UserEntity по UserId. Если не найден — ошибка «Пользователь не найден».
- Получить ContactInfoTypeHandbookEntity по ContactInfoTypeId. Если не найден — ошибка «Тип контакта не найден».
- Создать UserContactEntity (Id = Guid.CreateVersion7, TenantId, UserId, ContactInfoTypeId, Value).
- Добавить в репозиторий.
- Publish AfterUserUpdatedNotification (UserId, TenantId).
- Commit.
- Вернуть AddUserContactResult.
События
- AfterUserUpdatedNotification — handler формирует AfterUserUpdatedEvent с полным snapshot пользователя и записывает в Outbox. Kafka-событие публикуется асинхронно после commit.
Схема потока данных
AddUserContactCommand
→ UserContactEntityRepository.Add
→ NotificationSender.Publish(AfterUserUpdatedNotification)
→ OutboxMessageEntity (AfterUserUpdatedEvent)
→ Kafka: identity.after-user-updated