private async Task UpdateCityAndCityDistrictsAsync(FlatForRentAnnouncementPreference flatForRentAnnouncementPreference, Guid cityId, ICollection <Guid> cityDistricts) { if (flatForRentAnnouncementPreference.CityId != cityId) { var cityAndCityDistrictsVerificationResult = await _cityVerificationService.VerifyCityAndCityDistrictsAsync(cityId, cityDistricts); if (!cityAndCityDistrictsVerificationResult.Success) { throw new ValidationException(cityAndCityDistrictsVerificationResult.Errors); } flatForRentAnnouncementPreference.ChangeCityId(cityId); flatForRentAnnouncementPreference.ChangeCityDistricts(cityDistricts); } else { var sameCityDistricts = flatForRentAnnouncementPreference.CityDistricts.All(cityDistricts.Contains) && flatForRentAnnouncementPreference.CityDistricts.Count == cityDistricts.Count; if (!sameCityDistricts) { var cityAndCityDistrictsVerificationResult = await _cityVerificationService.VerifyCityAndCityDistrictsAsync(cityId, cityDistricts); if (!cityAndCityDistrictsVerificationResult.Success) { throw new ValidationException(cityAndCityDistrictsVerificationResult.Errors); } flatForRentAnnouncementPreference.ChangeCityDistricts(cityDistricts); } } }
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 VerifyCityAndCityDistrictsAsync_Should_Return_VerificationResult_With_Success() { var cityId = Guid.NewGuid(); var cityDistricts = new List <Guid> { Guid.NewGuid() }; var city = new City(cityId, cityDistricts); var getCityResult = GetResult <City> .Ok(city); var expectedResult = VerificationResult.Ok(); _cityGetterServiceMock.Setup(x => x.GetByIdAsync(It.IsAny <Guid>())) .ReturnsAsync(getCityResult); var result = await _service.VerifyCityAndCityDistrictsAsync(cityId, cityDistricts); result.Should().BeEquivalentTo(expectedResult); }