public async Task <Order> CreateOrderAsync(string buyerEmail, int deliveryMethodId, string basketId, Core.Entities.OrderAggregate.Address shippingAddress) { // get basket from the repo var basket = await _basketRepo.GetBasketAsync(basketId); // get items from the product repo var items = new List <OrderItem>(); foreach (var item in basket.Items) { var productItem = await _unitOfWork.Repository <Product>().GetByIdAsync(item.Id); var itemOrdered = new ProductItemOrdered(productItem.Id, productItem.Name, productItem.PictureUrl); var orderItem = new OrderItem(itemOrdered, productItem.Price, item.Quantity); items.Add(orderItem); } // get delivery method fromthe repo var deliveryMethod = await _unitOfWork.Repository <DeliveryMethod>().GetByIdAsync(deliveryMethodId); // calc subtotal var subtotal = items.Sum(item => item.Price * item.Quantity); // create order // check if order exists var spec = new OrdersByPaymentIntentIdSpecification(basket.PaymentIntentId); var existingOrder = await _unitOfWork.Repository <Order>().GetEntityWithSpec(spec); if (existingOrder != null) { _unitOfWork.Repository <Order>().Delete(existingOrder); await _paymentService.CreateOrUpdatePaymentIntent(basket.PaymentIntentId); } // create order var order = new Order(items, buyerEmail, shippingAddress, deliveryMethod, subtotal, basket.PaymentIntentId); _unitOfWork.Repository <Order>().Add(order); // save to db var result = await _unitOfWork.Complete(); if (result <= 0) { return(null); } // delete basket await _basketRepo.DeleteBasketAsync(basketId); return(order); }
public async Task <Order> CreateOrderAsync(string buyerEmail, int deliveryMethodId, string basketId, Address deliveryAddress) { //get the user from the repo var user = await _userManager.FindByEmailAsync(buyerEmail); // get basket from the repo var basket = await _basketRepo.GetBasketAsync(basketId); // items from the meal repo var items = new List <OrderItem>(); foreach (var item in basket.Items) { var mealItem = await _unitOfWork.Repository <Meal>().GetByIdAsync(item.Id); var mealOrdered = new MealItemOrdered(mealItem.Id, mealItem.Name, mealItem.PictureUrl); var orderItem = new OrderItem(mealOrdered, mealItem.Price, item.Quantity, item.Grams, item.Calories, item.Proteins, item.Carbohydrates, item.Fats); items.Add(orderItem); } //update the user according to the items he ordered foreach (var item in items) { user.DailyCalories = user.DailyCalories - (item.Quantity * item.Calories); user.DailyProteins = user.DailyProteins - (item.Quantity * item.Proteins); user.DailyCarbohydrates = user.DailyCarbohydrates - (item.Quantity * item.Carbohydrates); user.DailyFats = user.DailyFats - (item.Quantity * item.Fats); } _identityDbContext.Set <AppUser>().Attach(user); _identityDbContext.Entry(user).State = EntityState.Modified; // get delivery method from repo var deliveryMethod = await _unitOfWork.Repository <DeliveryMethod>().GetByIdAsync(deliveryMethodId); //calculate subtotal var subtotal = items.Sum(items => items.Price * items.Quantity); //check to see if orders exists var spec = new OrdersWithItemsAndOrderingSpecification(basket.PaymentIntentId); var existingOrder = await _unitOfWork.Repository <Order>().GetEntityWithSpec(spec); if (existingOrder != null) { _unitOfWork.Repository <Order>().Delete(existingOrder); await _paymentService.CreateOrUpdatePaymentIntent(basket.PaymentIntentId); } // create order var order = new Order(buyerEmail, subtotal, deliveryAddress, deliveryMethod, items, basket.PaymentIntentId); //add the order _unitOfWork.Repository <Order>().Add(order); //save to database var result = await _unitOfWork.Complete(); await _identityDbContext.SaveChangesAsync(); if (result <= 0) { return(null); } // return order return(order); }