コード例 #1
0
ファイル: BasketService.cs プロジェクト: oktydag/colonel
        public bool AddToBasket(AddProductToBasketRequestModel basketItems)
        {
            var productAvailability = CheckProductIsAvailable(basketItems);

            if (!productAvailability.IsAvailable)
            {
                _logger.LogError("Product is not available ! Check Logs. ");
                throw new ProductIsNotAvailableException("Product is not available ! Check Logs. ");
            }

            var userBasket = _basketRepository.GetUserBasket(basketItems.UserId);

            if (userBasket == null)
            {
                userBasket = CreateNewBasket(basketItems, productAvailability);
            }
            else
            {
                UpdateBasket(basketItems, productAvailability, userBasket);
            }

            _basketRepository.SaveBasket(userBasket);


            _eventPublisher.Publish(new ProductAddedToBasketEvent()
            {
                BasketId    = userBasket.Id.ToString(),
                BasketLines = userBasket.BasketLines,
                UserId      = userBasket.UserId
            });

            return(true);
        }
コード例 #2
0
ファイル: BasketService.cs プロジェクト: oktydag/colonel
        public Basket UpdateBasket(AddProductToBasketRequestModel basketItems, ProductAvailability productAvailability, Basket userBasket)
        {
            var addedBasketLine = userBasket.BasketLines.FirstOrDefault(x => x.ProductId == basketItems.ProductId);

            if (addedBasketLine != null)
            {
                var newQuantity = addedBasketLine.Quantity + basketItems.Quantity;

                var availableStockModelForNewQuantity = _stockService.HasAvailableStock(new StockRequestModel()
                {
                    ProductId = basketItems.ProductId, Quantity = newQuantity
                });

                if (availableStockModelForNewQuantity == null)
                {
                    _logger.LogError("Stock is not sufficient");
                    throw new ProductIsNotAvailableException("Stock is not sufficient");
                }

                addedBasketLine.Quantity = newQuantity;
                addedBasketLine.GiftNote = basketItems.GiftNote;
            }
            else
            {
                userBasket.BasketLines.Add(CreateNewBasketLine(basketItems, productAvailability));
            }

            return(userBasket);
        }
コード例 #3
0
ファイル: BasketService.cs プロジェクト: oktydag/colonel
        public BasketLine CreateNewBasketLine(AddProductToBasketRequestModel basketItems, ProductAvailability productAvailability)
        {
            var basketLine = new BasketLine()
            {
                ProductId = basketItems.ProductId,
                Quantity  = basketItems.Quantity,
                StockId   = productAvailability.StockId,
                GiftNote  = basketItems.GiftNote
            };

            return(basketLine);
        }
コード例 #4
0
 public void Setup()
 {
     addProductToBasketRequestModel
         = new AddProductToBasketRequestModel()
         {
         ProductId   = 10,
         GiftNote    = "test",
         UserId      = 11,
         Quantity    = 12,
         CreatedDate = new DateTime(2020, 3, 3)
         };
 }
コード例 #5
0
ファイル: BasketService.cs プロジェクト: oktydag/colonel
        public Basket CreateNewBasket(AddProductToBasketRequestModel basketItems, ProductAvailability productAvailability)
        {
            List <BasketLine> basketLines = new List <BasketLine>();

            basketLines.Add(CreateNewBasketLine(basketItems, productAvailability));

            var basket = new Basket()
            {
                UserId      = basketItems.UserId,
                CreatedDate = DateTime.UtcNow,
                BasketLines = basketLines,
                IsActive    = true,
                IsOrdered   = false,
                UpdateDate  = DateTimeProvider.Instance.GetUtcNow()
            };

            return(basket);
        }
コード例 #6
0
ファイル: BasketService.cs プロジェクト: oktydag/colonel
        public ProductAvailability CheckProductIsAvailable(AddProductToBasketRequestModel basketItems)
        {
            var product = _productService.GetProduct(new ProductRequestModel()
            {
                ProductId = basketItems.ProductId
            });

            if (product == null)
            {
                return(ProductAvailability.NotAvailable);
            }

            var user = _userService.GetUser(new UserRequestModel()
            {
                UserId = basketItems.UserId
            });

            if (user == null)
            {
                return(ProductAvailability.NotAvailable);
            }

            var stockModelForRequestQuantity = _stockService.HasAvailableStock(new StockRequestModel()
            {
                ProductId = basketItems.ProductId, Quantity = basketItems.Quantity
            });

            if (stockModelForRequestQuantity == null)
            {
                return(ProductAvailability.NotAvailable);
            }

            var priceOfProduct = _priceService.GetProductPrice(new PriceRequestModel()
            {
                ProductId = basketItems.ProductId, RequestDate = DateTimeProvider.Instance.GetUtcNow()
            });

            if (priceOfProduct == null)
            {
                return(ProductAvailability.NotAvailable);
            }

            return(new ProductAvailability(stockModelForRequestQuantity.Id, priceOfProduct.Value, basketItems.ProductId, true));
        }
コード例 #7
0
ファイル: BasketController.cs プロジェクト: oktydag/colonel
        public ActionResult AddToBasket([FromBody] AddProductToBasketRequestModel basketItems)
        {
            _logger.LogInformation("AddToBasket service initializer");

            try
            {
                var addToBasketResult = _basketService.AddToBasket(basketItems);

                _logger.LogInformation("AddToBasket finish own operation");

                return(Ok());
            }
            catch (ProductIsNotAvailableException productIsNotAvailableException)
            {
                _logger.LogError(productIsNotAvailableException.Message);
                return(StatusCode(406, productIsNotAvailableException.Message));
            }
            catch (Exception unExpectedException)
            {
                _logger.LogError(unExpectedException.Message);

                return(StatusCode(500, unExpectedException.Message));
            }
        }