示例#1
0
        public async Task <IActionResult> CheckoutBasketAsync([FromBody] BasketCheckoutDto basketCheckout)
        {
            try
            {
                var basket = await _basketRepository.GetBasketById(basketCheckout.BasketId);

                if (basket == null)
                {
                    return(BadRequest());
                }
                BasketCheckoutMessage basketCheckoutMessage = _mapper.Map <BasketCheckoutMessage>(basketCheckout);
                basketCheckoutMessage.BasketLines = new List <BasketLineMessage>();
                int total = 0;
                foreach (var b in basket.BasketLines)
                {
                    var basketLineMessage = new BasketLineMessage
                    {
                        BasketLineId = b.BasketLineId,
                        Price        = b.Price,
                        TicketAmount = b.TicketAmount
                    };
                    total += b.Price * b.TicketAmount;
                    basketCheckoutMessage.BasketLines.Add(basketLineMessage);
                }
                Discount discount = null;
                if (basket.DiscountId.HasValue)
                {
                    discount = await _discountService.GetDiscount(basket.DiscountId.Value);
                }
                if (discount != null)
                {
                    basketCheckoutMessage.BasketTotal = total - discount.Amount;
                }
                else
                {
                    basketCheckoutMessage.BasketTotal = total;
                }

                try
                {
                    ProductPriceChangedIntegrationEvent queueData = new ProductPriceChangedIntegrationEvent
                                                                        (basketCheckoutMessage.BasketId, basketCheckoutMessage.BasketTotal, basketCheckoutMessage.UserId);
                    _eventBus.Publish(queueData);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                    throw;
                }
                await _basketRepository.ClearBasket(basketCheckout.BasketId);

                return(Accepted(basketCheckoutMessage));
            }
            catch (Exception e)
            {
                return(StatusCode(StatusCodes.Status500InternalServerError, e.StackTrace));
            }
        }
        public async Task <IActionResult> CheckoutBasketAsync([FromBody] BasketCheckout basketCheckout)
        {
            try
            {
                //based on basket checkout, fetch the basket lines from repo
                var basket = await basketRepository.GetBasketById(basketCheckout.BasketId);

                if (basket == null)
                {
                    return(BadRequest());
                }

                var basketCheckoutMessage = mapper.Map <BasketCheckoutMessage>(basketCheckout);
                basketCheckoutMessage.BasketLines = new List <BasketLineMessage>();
                int total = 0;

                foreach (var b in basket.BasketLines)
                {
                    var basketLineMessage = new BasketLineMessage
                    {
                        BasketLineId = b.BasketLineId,
                        Price        = b.Price,
                        TicketAmount = b.TicketAmount
                    };

                    total += b.Price * b.TicketAmount;

                    basketCheckoutMessage.BasketLines.Add(basketLineMessage);
                }

                //apply discount by talking to the discount service
                Coupon coupon = null;

                //var userId = basketCheckout.UserId;

                // var userId = Guid.Parse(HttpContext.Request.Headers["CurrentUser"][0]);

                var userId = Guid.Parse(User.Claims.FirstOrDefault(c => c.Type == "sub")?.Value);

                if (!(userId == Guid.Empty))
                {
                    coupon = await discountService.GetCoupon(userId);
                }

                if (coupon != null)
                {
                    basketCheckoutMessage.BasketTotal = total - coupon.Amount;
                }
                else
                {
                    basketCheckoutMessage.BasketTotal = total;
                }

                var incomingToken = await HttpContext.GetTokenAsync("access_token");

                var accessTokenForOrderingService = await tokenExchangeService.GetTokenAsync(
                    incomingToken,
                    "ordering.fullaccess");

                basketCheckoutMessage.SecurityContext.AccessToken = accessTokenForOrderingService;

                try
                {
                    await messageBus.PublishMessage(basketCheckoutMessage, "checkoutmessage");
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                    throw;
                }

                await basketRepository.ClearBasket(basketCheckout.BasketId);

                return(Accepted(basketCheckoutMessage));
            }
            catch (BrokenCircuitException ex)
            {
                string message = ex.Message;
                return(StatusCode(StatusCodes.Status500InternalServerError, ex.StackTrace));
            }
            catch (Exception e)
            {
                return(StatusCode(StatusCodes.Status500InternalServerError, e.StackTrace));
            }
        }
        public async Task <IActionResult> CheckoutBasketAsync([FromBody] BasketCheckout basketCheckout)
        {
            try
            {
                //based on basket checkout, fetch the basket lines from repo
                var basket = await basketRepository.GetBasketById(basketCheckout.BasketId);

                if (basket == null)
                {
                    return(BadRequest());
                }

                BasketCheckoutMessage basketCheckoutMessage = mapper.Map <BasketCheckoutMessage>(basketCheckout);
                basketCheckoutMessage.BasketLines = new List <BasketLineMessage>();
                int total = 0;

                foreach (var b in basket.BasketLines)
                {
                    var basketLineMessage = new BasketLineMessage
                    {
                        BasketLineId = b.BasketLineId,
                        Price        = b.Price,
                        TicketAmount = b.TicketAmount
                    };

                    total += b.Price * b.TicketAmount;

                    basketCheckoutMessage.BasketLines.Add(basketLineMessage);
                }

                //apply discount by talking to the discount service
                Coupon coupon = null;

                //if (basket.CouponId.HasValue)
                //    coupon = await discountService.GetCoupon(basket.CouponId.Value);

                if (basket.CouponId.HasValue)
                {
                    coupon = await discountService.GetCouponWithError(basket.CouponId.Value);
                }

                if (coupon != null)
                {
                    basketCheckoutMessage.BasketTotal = total - coupon.Amount;
                }
                else
                {
                    basketCheckoutMessage.BasketTotal = total;
                }

                try
                {
                    await messageBus.PublishMessage(basketCheckoutMessage, "checkoutmessage");
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                    throw;
                }

                await basketRepository.ClearBasket(basketCheckout.BasketId);

                return(Accepted(basketCheckoutMessage));
            }
            catch (BrokenCircuitException ex)
            {
                string message = ex.Message;
                return(StatusCode(StatusCodes.Status500InternalServerError, ex.StackTrace));
            }
            catch (Exception e)
            {
                return(StatusCode(StatusCodes.Status500InternalServerError, e.StackTrace));
            }
        }
        public async Task <IActionResult> CheckoutBasketAsync([FromBody] BasketCheckout basketCheckout)
        {
            using var scope = logger.BeginScope("Checking out basket {BasketId}", basketCheckout.BasketId);

            try
            {
                //based on basket checkout, fetch the basket lines from repo
                var basket = await basketRepository.GetBasketById(basketCheckout.BasketId);

                if (basket == null)
                {
                    logger.LogWarning("Basket was not found");
                    return(BadRequest());
                }

                logger.LogDebug("Loaded basket");

                BasketCheckoutMessage basketCheckoutMessage = mapper.Map <BasketCheckoutMessage>(basketCheckout);
                basketCheckoutMessage.BasketLines = new List <BasketLineMessage>();
                int total = 0;

                foreach (var b in basket.BasketLines)
                {
                    var basketLineMessage = new BasketLineMessage
                    {
                        BasketLineId = b.BasketLineId,
                        Price        = b.Price,
                        TicketAmount = b.TicketAmount
                    };

                    total += b.Price * b.TicketAmount;

                    basketCheckoutMessage.BasketLines.Add(basketLineMessage);
                }

                //apply discount by talking to the discount service
                Coupon coupon = null;

                var channel = GrpcChannel.ForAddress("https://localhost:5007");

                DiscountService discountService = new DiscountService(new Discounts.DiscountsClient(channel));
                if (basket.CouponId.HasValue)
                {
                    coupon = await discountService.GetCoupon(basket.CouponId.Value);
                }

                if (coupon != null)
                {
                    logger.LogDebug("Applying discount {DiscountAmount} from {CouponId}", coupon.Amount, basket.CouponId.Value);
                    basketCheckoutMessage.BasketTotal = total - coupon.Amount;
                }
                else
                {
                    logger.LogDebug("No discount to apply");
                    basketCheckoutMessage.BasketTotal = total;
                }

                try
                {
                    await messageBus.PublishMessage(basketCheckoutMessage, "checkoutmessage",
                                                    Activity.Current.TraceId.ToString());

                    logger.LogDebug("Published checkout message");
                }
                catch (Exception e)
                {
                    logger.LogError(e, "Unable to publish checkout message");
                    throw;
                }

                await basketRepository.ClearBasket(basketCheckout.BasketId);

                return(Accepted(basketCheckoutMessage));
            }
            catch (Exception e)
            {
                logger.LogError(e, "An exception occurred when checking out the basket");

                return(StatusCode(StatusCodes.Status500InternalServerError, e.StackTrace));
            }
        }