예제 #1
0
        public async Task <GetOffersAvailabilityResponse> GetOffersAvailability(
            GetOffersAvailabilityRequest request, CallContext context = default)
        {
            if (request.OfferIds == null || !request.OfferIds.Any())
            {
                return new GetOffersAvailabilityResponse {
                           OfferAvailabilities = new List <OfferAvailability>()
                }
            }
            ;

            var offers = await _offerRepository.GetMultipleWithIds(request.OfferIds);

            if (offers == null || offers.Count == 0)
            {
                return new GetOffersAvailabilityResponse {
                           OfferAvailabilities = new List <OfferAvailability>()
                }
            }
            ;

            var offerAvailabilities = new List <OfferAvailability>();

            foreach (var offerId in request.OfferIds)
            {
                var offer = offers.FirstOrDefault(x => x.Id == offerId);

                offerAvailabilities.Add(new OfferAvailability
                {
                    OfferId      = offerId,
                    Availability = GetAvailability(offer)
                });
            }

            return(new GetOffersAvailabilityResponse
            {
                OfferAvailabilities = offerAvailabilities
            });
        }
예제 #2
0
        public async Task <Guid> Handle(FinalizeCartCommand request, CancellationToken cancellationToken)
        {
            var userId = _httpContext.User.Claims.ToTokenPayload().UserClaims.Id;
            var cart   = await _cartRepository.GetOrCreateByUserIdAsync(userId);

            if (cart.IsEmpty)
            {
                throw new CartsDomainException($"Cart {cart.Id} cannot be finalized because it's empty");
            }

            var offersServiceClient          = _offersServiceClientFactory.Create(_endpointsConfig.Offers.Grpc.ToString());
            var offerIds                     = cart.CartItems.Select(x => x.OfferId).ToList();
            var getOffersAvailabilityRequest = new GetOffersAvailabilityRequest {
                OfferIds = offerIds
            };
            var getOffersAvailabilityResponse = await offersServiceClient.GetOffersAvailability(getOffersAvailabilityRequest);

            var notActiveOffers = getOffersAvailabilityResponse.OfferAvailabilities.Where(x => x.Availability != Availability.Active).ToList();

            if (notActiveOffers.Any())
            {
                foreach (var offer in notActiveOffers.Where(x => x.Availability == Availability.NotActive))
                {
                    await _eventBus.PublishAsync(new OfferBecameUnavailableIntegrationEvent
                    {
                        OfferId = offer.OfferId
                    });

                    _logger.LogWithProps(LogLevel.Error,
                                         $"Published {nameof(OfferBecameUnavailableIntegrationEvent)} integration event",
                                         "CartId".ToKvp(cart.Id),
                                         "OfferId".ToKvp(offer.OfferId));
                }

                var notExistingOffers = notActiveOffers.Where(x => x.Availability == Availability.DoesNotExist).ToList();
                if (notExistingOffers.Any())
                {
                    foreach (var notExistingOffer in notExistingOffers)
                    {
                        _cartItemRepository.RemoveWithOfferId(notExistingOffer.OfferId);
                    }

                    await _cartItemRepository.UnitOfWork.SaveChangesAndDispatchDomainEventsAsync(cancellationToken);

                    _logger.LogWithProps(LogLevel.Error,
                                         $"Removed not existing offers from cart",
                                         "CartId".ToKvp(cart.Id),
                                         "OffersIds".ToKvp(string.Join(",", notExistingOffers.Select(x => x.OfferId))));
                }

                throw new CartsDomainException("At least offer is not active");
            }

            var ordersServiceClient = _ordersServiceClientFactory.Create(_endpointsConfig.Orders.Grpc.ToString());
            var createOrderRequest  = PrepareCreateOrderRequest(cart);
            var createOrderResponse = await ordersServiceClient.CreateOrder(createOrderRequest);

            _logger.LogWithProps(LogLevel.Debug, "Order created from cart",
                                 "OrderId".ToKvp(createOrderResponse.OrderId),
                                 "CartId".ToKvp(cart.Id));

            _cartRepository.Remove(cart);
            await _cartRepository.UnitOfWork.SaveChangesAndDispatchDomainEventsAsync(cancellationToken);

            _logger.LogWithProps(LogLevel.Debug, "Removed cart", "CartId".ToKvp(cart.Id));

            return(createOrderResponse.OrderId);
        }