public async Task <ActionResult <Pagination <PartToReturnDto> > > GetPaginatedParts( [FromQuery] PartsSpecParams partsParams) { var spec = new PartsSpecification(partsParams); var countSpec = new PartsForCountSpecification(partsParams); var totalItems = await _partsRepo.CountAsync(countSpec); var parts = await _partsRepo.ListAsync(spec); var data = _mapper.Map <IReadOnlyList <Part>, IReadOnlyList <PartToReturnDto> >(parts); return(Ok(new Pagination <PartToReturnDto>(partsParams.PageIndex, partsParams.pageSize, totalItems, data))); }
public async Task <Order> CreateOrderAsync(string buyerEmail, int deliveryMethodId, string basketId, string shippingAddress) { // get basket from repo var basket = await _basketRepo.GetBasketAsync(basketId); // get items from the product and part repo var items = new List <OrderItem>(); foreach (var item in basket.ProductItems) { var spec = new ProductWithPhotosSpecification(item.Id); var productItem = await _unitOfWork.Repository <Product>().GetEntityWithSpecAsync(spec); var itemOrdered = new ItemOrdered(productItem.Id, productItem.Name, productItem.Photos.FirstOrDefault(x => x.IsMain).Url); var orderItem = new OrderItem(itemOrdered, productItem.Price, item.Quantity); items.Add(orderItem); } foreach (var item in basket.PartItems) { var spec = new PartsSpecification(item.Id); var partItem = await _unitOfWork.Repository <Part>().GetEntityWithSpecAsync(spec); var itemOrdered = new ItemOrdered(partItem.Id, partItem.Name, partItem.Photos.FirstOrDefault(x => x.IsMain).Url); var orderItem = new OrderItem(itemOrdered, partItem.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 to see if order exists var orderSpec = new OrderByPaymentIntentIdSpecification(basket.PaymentIntentId); var exisitingOrder = await _unitOfWork.Repository <Order>().GetEntityWithSpecAsync(orderSpec); if (exisitingOrder != null) { _unitOfWork.Repository <Order>().Delete(exisitingOrder); await _paymentService.CreateOrUpdatePaymentIntent(basket.PaymentIntentId); } // create order var order = new Order(items, buyerEmail, shippingAddress, deliveryMethod, subtotal, basket.PaymentIntentId); _unitOfWork.Repository <Order>().Add(order); // TODO: save to db var result = await _unitOfWork.Complete(); if (result <= 0) { return(null); } // return order return(order); }