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 }); }
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); }