public async Task HandleAsync(CreateFlatForRentAnnouncementPreferenceCommand 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.FlatForRentAnnouncementPreferences.Count + getUserResult.Value.RoomForRentAnnouncementPreferences.Count); if (!announcementPreferenceLimitIsNotExceededVerificationResult.Success) { throw new ValidationException(announcementPreferenceLimitIsNotExceededVerificationResult.Errors); } var flatForRentAnnouncementPreference = _mapper.Map <CreateFlatForRentAnnouncementPreferenceCommand, FlatForRentAnnouncementPreference>(command); var flatForRentAnnouncementPreferences = getUserResult.Value.FlatForRentAnnouncementPreferences.ToList(); flatForRentAnnouncementPreferences.Add(flatForRentAnnouncementPreference); var flatForRentAnnouncementPreferencesVerificationResult = _flatForRentAnnouncementPreferenceVerificationService.VerifyFlatForRentAnnouncementPreferences(flatForRentAnnouncementPreferences); if (!flatForRentAnnouncementPreferencesVerificationResult.Success) { throw new ValidationException(flatForRentAnnouncementPreferencesVerificationResult.Errors); } getUserResult.Value.AddFlatForRentAnnouncementPreference(flatForRentAnnouncementPreference, command.CorrelationId); await _communicationBus.DispatchDomainEventsAsync(getUserResult.Value, cancellationToken); await _userRepository.UpdateAsync(getUserResult.Value); var userFlatForRentAnnouncementPreferenceCreatedIntegrationEvent = new UserFlatForRentAnnouncementPreferenceCreatedIntegrationEvent(command.CorrelationId, getUserResult.Value.Id, flatForRentAnnouncementPreference.Id, getUserResult.Value.Email, flatForRentAnnouncementPreference.CityId, getUserResult.Value.ServiceActive, getUserResult.Value.AnnouncementSendingFrequency.ConvertToEnum(), flatForRentAnnouncementPreference.PriceMin, flatForRentAnnouncementPreference.PriceMax, flatForRentAnnouncementPreference.RoomNumbersMin, flatForRentAnnouncementPreference.RoomNumbersMax, flatForRentAnnouncementPreference.CityDistricts); await _integrationEventBus.PublishIntegrationEventAsync(userFlatForRentAnnouncementPreferenceCreatedIntegrationEvent); }
public async Task AddAsync(UserFlatForRentAnnouncementPreferenceCreatedIntegrationEvent integrationEvent) { var flatForRentAnnouncementPreference = new FlatForRentAnnouncementPreference { Id = integrationEvent.FlatForRentAnnouncementPreferenceId, UserId = integrationEvent.UserId, UserEmail = integrationEvent.UserEmail, CityId = integrationEvent.CityId, ServiceActive = integrationEvent.ServiceActive, AnnouncementSendingFrequency = integrationEvent.AnnouncementSendingFrequency, PriceMin = integrationEvent.PriceMin, PriceMax = integrationEvent.PriceMax, RoomNumbersMin = integrationEvent.RoomNumbersMin, RoomNumbersMax = integrationEvent.RoomNumbersMax, CityDistricts = integrationEvent.CityDistricts.ToList(), CosmosEntityName = nameof(FlatForRentAnnouncementPreference) }; var addResult = await _cosmosStore.AddAsync(flatForRentAnnouncementPreference); if (!addResult.IsSuccess) { throw addResult.Exception; } }