public async Task HandleAsync(CreateRoomForRentAnnouncementPreferenceCommand command, CancellationToken cancellationToken = default) { var getUserResult = await _userGetterService.GetByIdAsync(command.UserId); if (!getUserResult.Success) { throw new ResourceNotFoundException(getUserResult.Errors); } var cityAndCityDistrictsVerificationResult = await _cityVerificationService.VerifyCityAndCityDistrictsAsync(command.CityId, command.CityDistricts); if (!cityAndCityDistrictsVerificationResult.Success) { throw new ValidationException(cityAndCityDistrictsVerificationResult.Errors); } var announcementPreferenceLimitIsNotExceededVerificationResult = _userVerificationService.VerifyAnnouncementPreferenceLimitIsNotExceeded( getUserResult.Value.AnnouncementPreferenceLimit, getUserResult.Value.RoomForRentAnnouncementPreferences.Count + getUserResult.Value.RoomForRentAnnouncementPreferences.Count); if (!announcementPreferenceLimitIsNotExceededVerificationResult.Success) { throw new ValidationException(announcementPreferenceLimitIsNotExceededVerificationResult.Errors); } var roomForRentAnnouncementPreference = _mapper.Map <CreateRoomForRentAnnouncementPreferenceCommand, RoomForRentAnnouncementPreference>(command); var roomForRentAnnouncementPreferences = getUserResult.Value.RoomForRentAnnouncementPreferences.ToList(); roomForRentAnnouncementPreferences.Add(roomForRentAnnouncementPreference); var roomForRentAnnouncementPreferencesVerificationResult = _roomForRentAnnouncementPreferenceVerificationService.VerifyRoomForRentAnnouncementPreferences(roomForRentAnnouncementPreferences); if (!roomForRentAnnouncementPreferencesVerificationResult.Success) { throw new ValidationException(roomForRentAnnouncementPreferencesVerificationResult.Errors); } getUserResult.Value.AddRoomForRentAnnouncementPreference(roomForRentAnnouncementPreference, command.CorrelationId); await _communicationBus.DispatchDomainEventsAsync(getUserResult.Value, cancellationToken); await _userRepository.UpdateAsync(getUserResult.Value); var userRoomForRentAnnouncementPreferenceCreatedIntegrationEvent = new UserRoomForRentAnnouncementPreferenceCreatedIntegrationEvent(command.CorrelationId, getUserResult.Value.Id, roomForRentAnnouncementPreference.Id, getUserResult.Value.Email, roomForRentAnnouncementPreference.CityId, getUserResult.Value.ServiceActive, getUserResult.Value.AnnouncementSendingFrequency.ConvertToEnum(), roomForRentAnnouncementPreference.PriceMin, roomForRentAnnouncementPreference.PriceMax, roomForRentAnnouncementPreference.RoomType.ConvertToEnum(), roomForRentAnnouncementPreference.CityDistricts); await _integrationEventBus.PublishIntegrationEventAsync(userRoomForRentAnnouncementPreferenceCreatedIntegrationEvent); }
public async Task AddAsync(UserRoomForRentAnnouncementPreferenceCreatedIntegrationEvent integrationEvent) { var roomForRentAnnouncementPreference = new RoomForRentAnnouncementPreference { Id = integrationEvent.RoomForRentAnnouncementPreferenceId, UserId = integrationEvent.UserId, UserEmail = integrationEvent.UserEmail, CityId = integrationEvent.CityId, ServiceActive = integrationEvent.ServiceActive, AnnouncementSendingFrequency = integrationEvent.AnnouncementSendingFrequency, PriceMin = integrationEvent.PriceMin, PriceMax = integrationEvent.PriceMax, RoomType = integrationEvent.RoomType, CityDistricts = integrationEvent.CityDistricts.ToList(), CosmosEntityName = nameof(RoomForRentAnnouncementPreference) }; var addResult = await _cosmosStore.AddAsync(roomForRentAnnouncementPreference); if (!addResult.IsSuccess) { throw addResult.Exception; } }