示例#1
0
        public async Task <IList <DeliveryMethodDto> > Handle(GetAvailableDeliveryMethodsForOrderQuery request, CancellationToken cancellationToken)
        {
            var userId  = _httpContext.User.Claims.ToTokenPayload().UserClaims.Id;
            var orderId = Guid.Parse(request.OrderId);

            var order = await _orderRepository.GetByIdAsync(orderId);

            if (order.BuyerId != userId)
            {
                throw new NotFoundException();
            }

            var offerIds = order.OrderItems.Select(orderItem => orderItem.OfferId);

            var offersServiceClient = _offersServiceClientFactory.Create(_endpointsConfig.Offers.Grpc.ToString());
            var grpcRequest         = new GetDeliveryMethodsForOffersRequest {
                OfferIds = offerIds
            };
            var grpcResponse = await offersServiceClient.GetDeliveryMethodsForOffers(grpcRequest);

            return(grpcResponse.DeliveryMethods.Select(method => new DeliveryMethodDto
            {
                Name = method.Name,
                Price = method.Price
            }).ToList());
        }
示例#2
0
        public async Task <Unit> Handle(UpdateDeliveryInfoCommand request, CancellationToken cancellationToken)
        {
            var userId  = _httpContext.User.Claims.ToTokenPayload().UserClaims.Id;
            var orderId = Guid.Parse(request.OrderId);

            var order = await _orderRepository.GetByIdAsync(orderId);

            if (order == null || order.BuyerId != userId)
            {
                throw new NotFoundException();
            }

            var deliveryAddress = new DeliveryAddress(request.FirstName, request.LastName, request.PhoneNumber,
                                                      request.Country, request.City, request.ZipCode, request.Street);

            order.SetDeliveryAddress(deliveryAddress);

            var offerIds = order.OrderItems.Select(orderItem => orderItem.OfferId);

            var offersServiceClient = _offersServiceClientFactory.Create(_endpointsConfig.Offers.Grpc.ToString());
            var grpcRequest         = new GetDeliveryMethodsForOffersRequest {
                OfferIds = offerIds
            };
            var grpcResponse = await offersServiceClient.GetDeliveryMethodsForOffers(grpcRequest);

            var matchingDeliveryMethod = grpcResponse.DeliveryMethods?.FirstOrDefault(x => x.Name == request.DeliveryMethodName);

            if (matchingDeliveryMethod == null)
            {
                throw new OrdersDomainException("Invalid delivery method name");
            }

            var deliveryMethod = new DeliveryMethod(matchingDeliveryMethod.Name, matchingDeliveryMethod.Price);

            order.SetDeliveryMethod(deliveryMethod);

            _orderRepository.Update(order);
            await _orderRepository.UnitOfWork.SaveChangesAndDispatchDomainEventsAsync(cancellationToken);

            return(await Unit.Task);
        }
示例#3
0
        public async Task <GetDeliveryMethodsForOffersResponse> GetDeliveryMethodsForOffers(
            GetDeliveryMethodsForOffersRequest request, CallContext context = default)
        {
            if (request.OfferIds == null || !request.OfferIds.Any())
            {
                return(new GetDeliveryMethodsForOffersResponse());
            }

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

            if (offers == null || offers.Count == 0)
            {
                return(new GetDeliveryMethodsForOffersResponse());
            }

            var sellerId = offers.First().OwnerId;

            if (offers.Any(x => x.OwnerId != sellerId))
            {
                return(new GetDeliveryMethodsForOffersResponse());
            }

            var flattenDeliveryMethods = offers.Where(x => x.DeliveryMethods != null)
                                         .SelectMany(x => x.DeliveryMethods);
            var mergedDeliveryMethods = flattenDeliveryMethods.GroupBy(method => method.Name)
                                        .Select(group => group.OrderByDescending(method => method.Price).FirstOrDefault())
                                        .ToList();

            return(new GetDeliveryMethodsForOffersResponse
            {
                DeliveryMethods = mergedDeliveryMethods.Select(method =>
                                                               new DeliveryMethodDto
                {
                    Name = method.Name,
                    Price = method.Price
                }
                                                               )
            });
        }