public async Task <Order?> CreateOrderAsync(string buyerEmail, int deliveryMethodId, string basketId, Address shippingAddress) { //get basket from repo var basket = await _basketRepo.GetBasketAsync(basketId); //get item from produtc repo var items = new List <OrderItem>(); foreach (var item in basket.Items) { int index = item.PictureUrl.IndexOf("images/products/", StringComparison.Ordinal); string pictureUrl = item.PictureUrl.Substring(index); var productItem = await _unitOfWork.Repository <Product>().GetByIdAsync(item.Id); var itemOrdered = new ProductItemOrdered(productItem.Id, productItem.Name, pictureUrl); var orderItem = new OrderItem(itemOrdered, productItem.Price, item.Quantity); items.Add(orderItem); } //get delivery method from repo var deliveryMethod = await _unitOfWork.Repository <DeliveryMethod>().GetByIdAsync(deliveryMethodId); //calc subtotal var subtotal = items.Sum(item => item.Quantity * item.Price); // check to see if order exists var spec = new OrderByPaymentIntentIdWithItemsSpecification(basket.PaymentIntentId); var existingOrder = await _unitOfWork.Repository <Order>().GetEntityWithSpec(spec); if (existingOrder is {})
public async Task <Order> CreateOrderAsync(string buyerEmail, int deliveryMethodId, string basketId, Address shippingAddress) { //get basket from basket repo var basket = await _basketRepo.GetBasketAsync(basketId); //get items from 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 from repo var deliveryMethod = await _unitOfWork.Repository <DeliveryMethod>() .GetByIdAsync(deliveryMethodId); //calc subtotal var subtotal = items.Sum(item => item.Price * item.Quantity); //check the order exist var spec = new OrderByPaymentIntentIdWithItemsSpecification(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, shippingAddress, buyerEmail, deliveryMethod, subtotal, basket.PaymentIntentId); _unitOfWork.Repository <Order>().Add(order); //save order to db var result = await _unitOfWork.Complete(); if (result <= 0) { return(null); } //delete basket from the redis-memory // await _basketRepo.DeleteBasketAsync(basketId); //return order return(order); }
public async Task <Order> UpdateOrderPaymentFailed(string paymentIntentId) { var spec = new OrderByPaymentIntentIdWithItemsSpecification(paymentIntentId); var order = await _unitOfWork.Repository <Order>().GetEntityWithSpec(spec); if (order == null) { return(null); } order.Status = OrderStatus.PaymentFailed; await _unitOfWork.Complete(); return(order); }
public async Task <Order> CreateOrderAsync(string buyerEmail, int deliveryMethodId, string basketId, Address shippingAddress) { var basket = await _basketRepo.GetBasketAsync(basketId); 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); } var deliveryMethod = await _unitOfWork.Repository <DeliveryMethod>().GetByIdAsync(deliveryMethodId); var subtotal = items.Sum(i => i.Price * i.Quantity); var spec = new OrderByPaymentIntentIdWithItemsSpecification(basket.PaymentIntentId); var existingOrder = await _unitOfWork.Repository <Order>().GetEntityWithSpecs(spec); if (existingOrder != null) { _unitOfWork.Repository <Order>().Delete(existingOrder); await _paymentService.CreateOrUpdatePaymentIntent(basket.PaymentIntentId); } var order = new Order(items, buyerEmail, shippingAddress, deliveryMethod, subtotal, basket.PaymentIntentId); var copyOfOrder = order; copyOfOrder.DeliveryMethod = null; _unitOfWork.Repository <Order>().Add(copyOfOrder); var result = await _unitOfWork.Complete(); if (result <= 0) { return(null); } order.DeliveryMethod = deliveryMethod; return(order); }
/// <inheritdoc /> public async Task <Order> UpdateOrderOnPaymentSucceeded(string stripePaymentIntentId) { var spec = new OrderByPaymentIntentIdWithItemsSpecification(stripePaymentIntentId); var order = await _unitOfWork.Repository <Order>().GetEntityWithSpec(spec); if (order == null) { return(null); } order.OrderStatus = OrderStatus.PaymentReceived; _unitOfWork.Repository <Order>().Update(order); await _unitOfWork.Complete(); return(order); }
public async Task <Core.Entities.OrderAggregate.Order> UpdateOrderPaymentFailed(string paymentIntentId) { var spec = new OrderByPaymentIntentIdWithItemsSpecification(paymentIntentId); var order = await uow.Repository <Order>().GetEntityWithSpec(spec); if (order == null) { return(null); } order.Status = OrderStatus.PaymentFailed; uow.Repository <Order>().Update(order); await uow.Complete(); return(null); }
public async Task <Order> CreateOrderAsync(string buyerEmail, int deliveryMethodId, string basketId, Address shippingAddress) { var basket = await _basketRepo.GetBasketAsync(basketId); 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.Photos.FirstOrDefault(x => x.IsMain)?.PictureUrl); var orderItem = new OrderItem(itemOrdered, productItem.Price, item.Quantity); items.Add(orderItem); } var deliveryMethod = await _unitOfWork.Repository <DeliveryMethod>().GetByIdAsync(deliveryMethodId); var subtotal = items.Sum(item => item.Price * item.Quantity); //check to see if order exists var spec = new OrderByPaymentIntentIdWithItemsSpecification(basket.PaymentIntentId); var existingOrder = await _unitOfWork.Repository <Order>().GetEntityWithSpec(spec); if (existingOrder != null) { _unitOfWork.Repository <Order>().Delete(existingOrder); await _paymentService.CreateOrUpdatePaymentIntent(basket.PaymentIntentId); } var order = new Order(items, buyerEmail, shippingAddress, deliveryMethod, subtotal, basket.PaymentIntentId); //here add menas to track the entity _unitOfWork.Repository <Order>().Add(order); //Save to Db var result = await _unitOfWork.Complete(); if (result <= 0) { return(null); } return(order); }
/// <inheritdoc /> public async Task <Order> CreateOrderAsync(string buyerEmail, int deliveryMethodId, string basketId, 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); } // ret delivery method from repo var deliveryMethod = await _unitOfWork.Repository <DeliveryMethod>().GetByIdAsync(deliveryMethodId); // calculate subtotal var subTotal = items.Sum(item => item.Price); // check to see if order exists (same paymentIntentId) var spec = new OrderByPaymentIntentIdWithItemsSpecification(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); // save t db _unitOfWork.Repository <Order>().Add(order); // nothing saved to database at this point await _unitOfWork.Complete(); // if error , it will throw an error // return order return(order); }
public async Task <Order> CreateOrderAsync(string buyerEmail, int deliveryMethodId, string basketId, Address shippingAddress) { //get bastket 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 specProduct = new ProductWithTypesAndBrandsSpecification(item.Id); var productItem = await _unitOfWork.Repository <Product>().GetEntityWithSpec(specProduct); var itemOrdered = new ProductItemOrdered(productItem.Id, item.Size, productItem.Name, productItem.Photos.FirstOrDefault(x => x.IsMain)?.PictureUrl); var productSize = productItem.ProductSizes.FirstOrDefault(x => x.Size == item.Size); var orderItem = new OrderItem(); if (item.Quantity > productSize.Quantity) { orderItem = new OrderItem(itemOrdered, productItem.Price, productSize.Quantity); productSize.Quantity = 0; } else { orderItem = new OrderItem(itemOrdered, productItem.Price, item.Quantity); productSize.Quantity = productSize.Quantity - item.Quantity; } productItem.AddOrUpdateProductSize(productSize.Size, productSize.Quantity); _unitOfWork.Repository <Product>().Update(productItem); items.Add(orderItem); } //get delivery method from repo var deliveryMethod = await _unitOfWork.Repository <DeliveryMethod>().GetByIdAsync(deliveryMethodId); //calc subtotal var subtotal = items.Sum(item => item.Price * item.Quantity); //check to see if order exists var spec = new OrderByPaymentIntentIdWithItemsSpecification(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); } //return order return(order); }