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