Exemple #1
0
        public async Task <IActionResult> Add_To_Basket_Item(string username, BasketCartItem item_to_add)
        {
            if (string.IsNullOrEmpty(username))
            {
                return(BadRequest());
            }
            var basket_that_receives = await _repository.AddBasketItem(username, item_to_add);

            if (basket_that_receives == null)
            {
                return(StatusCode(500, "basket could not receive items"));
            }
            return(Ok(basket_that_receives));
        }
        public IActionResult AddBasketItem(Guid basketGuid, [FromBody] Item item)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var repoResponse = _basket.AddBasketItem(basketGuid, item);

            if (!repoResponse.IsTransactionSuccess)
            {
                return(StatusCode(StatusCodes.Status500InternalServerError));
            }
            return(Ok(repoResponse));
        }
        public async Task <(Basket basket, BusinessErrorCollection errors)> AddItemToBasket(string userId, int productId, int quantity)
        {
            var product = await _productBusinessComponent.GetProductById(productId);

            var errors    = new BusinessErrorCollection();
            var newBasket = false;

            // Validate product is found
            if (product == null)
            {
                errors.Add(BusinessErrors.P001ProductNotFound);
                return(null, errors);
            }

            // Other business rules
            if (product.Stock.Total - product.Stock.Reserved < quantity)
            {
                errors.Add(BusinessErrors.S001InsufficientStock);
            }

            var basket = await _basketRepository.GetBasketByUserId(userId);

            if (!errors.IsValid)
            {
                return(basket, errors);
            }

            if (basket == null)
            {
                newBasket = true;
                basket    = new Basket
                {
                    UserId = userId,
                    Items  = new List <BasketItem>()
                };
            }

            var item = basket.Items.SingleOrDefault(i => i.ProductId == productId);

            try
            {
                await _shopDbTransactionManager.BeginTransaction();

                if (newBasket)
                {
                    await _basketRepository.AddBasket(basket);
                }
                else
                {
                    await _basketRepository.UpdateBasket(basket);
                }

                if (item == null)
                {
                    item = new BasketItem
                    {
                        BasketId  = basket.Id,
                        ProductId = productId,
                        Quantity  = quantity
                    };
                    await _basketRepository.AddBasketItem(item);
                }
                else
                {
                    item.Quantity += quantity;
                    await _basketRepository.UpdateBasketItem(item);
                }

                await _shopDbTransactionManager.CommitTransaction();
            }
            catch
            {
                await _shopDbTransactionManager.RollbackTransaction();

                throw;
            }

            return(basket, errors);
        }