Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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;
            }
        }