示例#1
0
        public async Task <IActionResult> AddBookToOrder([Bind("BookId,BookAmount,OrderId")] BookOrderViewModel model)
        {
            if (ModelState.IsValid)
            {
                var order = await _context.Orders.FindAsync(model.OrderId);

                var book = await _context.Books.FindAsync(model.BookId);

                if (book == null)
                {
                    return(BadRequest($"Book with id {model.BookId} does not exists."));
                }
                if (order == null)
                {
                    return(BadRequest($"Order with id {model.OrderId} does not exists."));
                }


                order.BookOrders.Add(new BookOrder
                {
                    Book       = book,
                    Order      = order,
                    BookAmount = model.BookAmount
                });

                order.TotalPrice += book.Price * model.BookAmount;

                await _context.SaveChangesAsync();
            }

            return(RedirectToAction("Create", new { id = model.OrderId }));
        }
 public HttpResponseMessage OrderBook(BookOrderViewModel model)
 {
     try
     {
         Book Book = this._uow.Books.Get(model.BookId);
         if (Book == null)
         {
             //Throw 404 (Not Found) exception if File not found.
             ModelState.AddModelError("Error", string.Format("Book not found: {0} .", model.BookId));
             return(Request.CreateErrorResponse(HttpStatusCode.NotFound, ModelState));
         }
         OrderBook order = new OrderBook(Book, model.Quantity);
         //List of orders
         List <OrderBook> cart = new List <OrderBook>();
         //If session does not exists then add order
         if (!SessionExists("cart"))
         {
             cart.Add(order);
         }
         else
         //if session already exists
         {
             cart = (List <OrderBook>)HttpContext.Current.Session["cart"];
             var OrderToChange = cart.FirstOrDefault(x => x.Book.IdBook == Book.IdBook);
             //check if order is already in card
             //if order is in shopping card increment Quantity if not add new order
             if (OrderToChange != null)
             {
                 OrderToChange.Quantity++;
             }
             else
             {
                 cart.Add(order);
             }
         }
         HttpContext.Current.Session["cart"] = cart;
         //successfully ordered
         return(Request.CreateResponse(HttpStatusCode.OK, new { Quantity = cart.Sum(item => item.Quantity) }));
     }
     catch (Exception e)
     {
         ModelState.AddModelError("Error", "Unrecognised issue: " + e.Message);
     }
     return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState));
 }
示例#3
0
        public async Task <BaseResponse> OrderBook(BookOrderViewModel model)
        {
            var order = await mediator.Send(new BookOrderCommand { BookOrder = model });

            return(ApiResponse.OK(order));
        }
示例#4
0
        public async Task <string> OrderBook(BookOrderViewModel orderViewModel)
        {
            // here we just generate order id in code.
            // we can also use navigation property and let ef generate id for us, but it would be another topic.
            var bookOrder = new BookOrder
            {
                Id           = Guid.NewGuid().ToString(),
                OrderDetails = new List <BookOrderDetail>()
            };

            foreach (var detail in orderViewModel.OrderDetails)
            {
                bookOrder.OrderDetails
                .Add(new BookOrderDetail
                {
                    Sn      = detail.Sn,
                    Count   = detail.Count,
                    OrderId = bookOrder.Id
                });
            }

            var sns = orderViewModel.OrderDetails.Select(o => o.Sn)
                      .OrderBy(x => x)
                      .ToList();

            var lockKey = string.Join(",", sns);

            using var distributedLock = await distributedLockProvider.Acquire(lockKey);

            var stocks = await bookContext.BookStocks
                         .Where(s => sns.Contains(s.Sn))
                         .ToListAsync();

            var errors = new List <string>();

            foreach (var book in orderViewModel.OrderDetails)
            {
                var stock = stocks.Find(s => s.Sn == book.Sn);
                if (stock == null)
                {
                    errors.Add($"book {book.Sn} doesn't exist in stock.");
                    continue;
                }

                if (stock.StockCount < book.Count + stock.FreezeStock)
                {
                    errors.Add($"book {book.Sn} doesn't have enough stock.");
                    continue;
                }

                stock.FreezeStock += book.Count;
            }

            if (errors.Any())
            {
                throw new DomainException(string.Join(",", errors));
            }

            bookContext.BookOrders.Add(bookOrder);

            await bookContext.SaveChangesAsync();

            await Task.Delay(500);

            await mediator.Send(new StockOrderCommand
            {
                BookStock = new BookStockViewModel
                {
                    OrderId         = bookOrder.Id,
                    StockViewModels = orderViewModel.OrderDetails
                                      .Select(o => new StockViewModel {
                        Sn = o.Sn, Count = o.Count
                    })
                                      .ToList()
                }
            });

            return(bookOrder.Id);
        }