public bool TryCreateOrder(List <PurchaseItemDto> basket, string userId) { lock (ConcurencyMaster.LockProductsObj) { var itemsOutOfStockFound = FixQuantitiesInBasket(basket); if (itemsOutOfStockFound) { return(false); } var order = new Order { CustomerId = userId, Status = Status.AwaitingConfirmation }; var detailedPurchaseInfo = GetDetailedPurchaseInfo(basket); order.DeliveryFee = GlobalConstants.DeliveryFee(detailedPurchaseInfo.Select(x => x.Quantity * x.Weight).Sum()); foreach (var purchase in basket) { order.OrderProducts.Add(new ProductOrder { ProductId = purchase.Id, Quantity = (int)purchase.Quantity, CurrentPrice = purchase.DiscountedPrice }); } SuccessfullOrderInfoOut orderInfo = new SuccessfullOrderInfoOut { OrderDateTime = order.DateOfCreation, Value = order.OrderProducts.Select(x => (x.Quantity) * (x.CurrentPrice)).Sum(), }; orderRepository.AddAssync(order).GetAwaiter().GetResult(); RemoveProuctsFromStore(basket); orderRepository.SaveChangesAsync().GetAwaiter().GetResult(); orderInfo.OrderId = order.Id; SendEmailAsync(userId, "New order created", "Emails/OrderEmail", orderInfo); return(true); } }