public override async Task <ActionResult <CreateOrderResponse> > HandleAsync(CreateOrderRequest request, CancellationToken cancellationToken = default) { var response = new CreateOrderResponse(request.CorrelationId()); if (request.Items.Count <= 0) { return(BadRequest("Items can't less than 1")); } var itemsSpecification = new ItemFilterSpecification(request.Items.Select(i => i.ItemId).ToArray()); var items = await _itemRepository.ListAsync(itemsSpecification); if (items.Count <= 0) { return(BadRequest("Items doesn't exists")); } var orderedItems = items.Select(orderedItem => { var item = items.First(c => c.Id == orderedItem.Id); var units = request.Items.FirstOrDefault(i => i.ItemId == item.Id).Units; var itemOrdered = new ItemOrdered(orderedItem.Id, orderedItem.Name, orderedItem.Description, orderedItem.PictureUri); var orderItem = new OrderItem(itemOrdered, item.Price, units); return(orderItem); }).ToList(); var order = new Order(request.CustomerUsername, orderedItems, request.Comment); await _orderRepository.AddAsync(order); response.Order = new OrderDto { CustomerUsername = order.CustomerId, Comment = order.Comment, OrderDate = order.OrderDate, TotalPrice = order.GetTotalPrice() }; foreach (var item in order.OrderItems) { response.Order.Items.Add(new ItemDto { Id = item.Id, Description = item.OrderedItem.Description, Name = item.OrderedItem.Name, PictureUri = item.OrderedItem.PictureUri, Price = item.UnitPrice }); } return(response); }
public override async Task <ActionResult <GetItemListResponse> > HandleAsync([FromQuery] GetItemListRequest request, CancellationToken cancellationToken = default) { var response = new GetItemListResponse(request.CorrelationId()); int totalItems = 0; var items = new List <ShopItem>().AsReadOnly() as IReadOnlyList <ShopItem>; if (request.PriceSpecification) { if (request.PriceFrom > request.PriceTo) { return(BadRequest("Price from can't be less than Price to")); } var filterSpec = new ItemFilterSpecification(request.PriceFrom, request.PriceTo); totalItems = await _itemRepository.CountAsync(filterSpec); var pagedSpec = new ItemFilterPaginatedSpecification( request.ItemsPerPage * (request.PageIndex - 1), request.ItemsPerPage, request.PriceFrom, request.PriceTo); items = await _itemRepository.ListAsync(pagedSpec); } else { var filterSpec = new ItemFilterSpecification(); totalItems = await _itemRepository.CountAsync(filterSpec); var pagedSpec = new ItemFilterPaginatedSpecification( request.ItemsPerPage * (request.PageIndex - 1), request.ItemsPerPage); items = await _itemRepository.ListAsync(pagedSpec); } response.Items.AddRange(items.Select(_mapper.Map <ItemDto>)); response.PageCount = int.Parse(Math.Ceiling((decimal)totalItems / request.ItemsPerPage).ToString()); return(Ok(response)); }