Beispiel #1
0
        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));
        }