Пример #1
0
        public void VerifyAnnouncementPreferenceLimitIsNotExceeded_Should_Return_VerificationResult_With_Success_True()
        {
            const int announcementPreferenceLimit         = 10;
            const int currentAnnouncementPreferencesCount = 1;
            var       expectedResult = VerificationResult.Ok();

            var result = _service.VerifyAnnouncementPreferenceLimitIsNotExceeded(announcementPreferenceLimit,
                                                                                 currentAnnouncementPreferencesCount);

            result.Should().BeEquivalentTo(expectedResult);
        }
Пример #2
0
        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);
        }