Skip to content

Commit

Permalink
refactored
Browse files Browse the repository at this point in the history
  • Loading branch information
igor.vlahek committed Apr 12, 2020
1 parent 5084eb0 commit 384b27c
Show file tree
Hide file tree
Showing 12 changed files with 89 additions and 125 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,7 @@
import lombok.NoArgsConstructor;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Data
@NoArgsConstructor
Expand All @@ -25,7 +23,4 @@ public class OrderDto {
@ApiModelProperty(value = DocumentationConstants.ORDER_DATE_CREATED, required = true)
private Date dateCreated;

@ApiModelProperty(value = DocumentationConstants.ORDER_ITEMS, required = true)
private List<OrderItemDto> orderItemDtos = new ArrayList<>();

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,19 @@

import hr.ivlahek.sample.store.client.order.CreateOrderDto;
import hr.ivlahek.sample.store.client.order.OrderDto;
import hr.ivlahek.sample.store.client.order.OrderItemDto;
import hr.ivlahek.sample.store.client.page.PageResponseDto;
import hr.ivlahek.sample.store.persistence.entity.Order;
import hr.ivlahek.sample.store.persistence.entity.OrderItem;
import hr.ivlahek.sample.store.rest.definition.OrderApiDefinition;
import hr.ivlahek.sample.store.service.OrderItemService;
import hr.ivlahek.sample.store.service.OrderService;
import hr.ivlahek.sample.store.service.mapper.OrderMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RestController;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

import static java.util.stream.Collectors.*;

@RestController
@Transactional
Expand All @@ -37,36 +28,12 @@ public class OrderController implements OrderApiDefinition {

public OrderDto placeOrder(CreateOrderDto createOrderDto) {
logger.info("Place order called {}", createOrderDto);
return new OrderMapper().map(orderService.placeOrder(createOrderDto));
return orderService.placeOrder(createOrderDto);
}

public PageResponseDto<OrderDto> getOrders(Pageable pageable, Date dateFrom, Date dateTo) {
logger.info("Get order between dates {} and {}. Page {} ", dateFrom, dateTo, pageable);
Page<Order> page = orderService.getOrders(pageable, dateFrom, dateTo);
List<OrderItem> orderItemList = orderItemService.findOrderItems(page.getContent());
Map<Long, List<OrderItemDto>> itemsPerOrder = groupItemsPerOrder(orderItemList);
return PageResponseDto.PageResponseDtoBuilder.aPageResponseDto()
.withContent(new OrderMapper().map(page.getContent(), itemsPerOrder))
.withFirst(page.isFirst())
.withLast(page.isLast())
.withNextPage(page.hasNext())
.withSize(page.getSize())
.withTotalElements(page.getTotalElements())
.withTotalPages(page.getTotalPages())
.withPreviousPage(page.hasPrevious())
.withPreviousPage(page.hasContent())
.withNumber(page.getNumber())
.withNumberOfElements(page.getNumberOfElements())
.build();

}
return orderService.getOrders(pageable, dateFrom, dateTo);

private Map<Long, List<OrderItemDto>> groupItemsPerOrder(List<OrderItem> orderItemList) {
return orderItemList
.stream()
.collect(groupingBy(orderItem -> orderItem.getOrder().getId(),
mapping(orderItem -> new OrderItemDto(orderItem.getProductId(),
orderItem.getQuantity(),
BigDecimal.valueOf(orderItem.getProductPrice())), toList())));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,30 +28,17 @@ public class ProductController implements ProductApiDefinition {

public ProductDto createProduct(CreateProductDto createProductDto) {
logger.info("Create product api called {}", createProductDto);
return new ProductMapper().map(productService.create(createProductDto));
return productService.create(createProductDto);
}

public ProductDto updateProduct(long productId, CreateProductDto createProductDto) {
logger.info("Update product {} called {}", productId, createProductDto);
return new ProductMapper().map(productService.update(productId, createProductDto));
return productService.update(productId, createProductDto);
}

public PageResponseDto<ProductDto> getAllProducts(@NotNull Pageable pageable) {
logger.info("Create mobile application api called {}", pageable);
Page<Product> products = productService.getProducts(pageable);
return PageResponseDto.PageResponseDtoBuilder.aPageResponseDto()
.withContent(new ProductMapper().map(products.getContent()))
.withFirst(products.isFirst())
.withLast(products.isLast())
.withNextPage(products.hasNext())
.withSize(products.getSize())
.withTotalElements(products.getTotalElements())
.withTotalPages(products.getTotalPages())
.withPreviousPage(products.hasPrevious())
.withPreviousPage(products.hasContent())
.withNumber(products.getNumber())
.withNumberOfElements(products.getNumberOfElements())
.build();
return productService.getProducts(pageable);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@

import hr.ivlahek.sample.store.client.order.CreateOrderDto;
import hr.ivlahek.sample.store.client.order.CreateOrderItemDto;
import hr.ivlahek.sample.store.client.order.OrderItemDto;
import hr.ivlahek.sample.store.client.order.OrderDto;
import hr.ivlahek.sample.store.client.page.PageResponseDto;
import hr.ivlahek.sample.store.exception.InternalServerErrorException;
import hr.ivlahek.sample.store.exception.messages.ExceptionMessage;
import hr.ivlahek.sample.store.persistence.entity.Order;
import hr.ivlahek.sample.store.persistence.entity.Product;
import hr.ivlahek.sample.store.persistence.repository.OrderRepository;
import hr.ivlahek.sample.store.service.internal.InternalProductService;
import hr.ivlahek.sample.store.service.mapper.OrderMapper;
import hr.ivlahek.sample.store.service.util.PriceCalculator;
import org.slf4j.Logger;
Expand All @@ -31,11 +33,11 @@ public class OrderService {
@Autowired
private OrderRepository orderRepository;
@Autowired
private ProductService productService;
private InternalProductService productService;
@Autowired
private OrderItemService orderItemService;

public Order placeOrder(CreateOrderDto createOrderDto) {
public OrderDto placeOrder(CreateOrderDto createOrderDto) {
logger.info("Place order method called {}", createOrderDto);
List<Long> productIds = createOrderDto.getOrderItemDtos()
.stream()
Expand All @@ -57,11 +59,25 @@ public Order placeOrder(CreateOrderDto createOrderDto) {
logger.info("Order saved {}!", order);
order.getOrderItems().addAll(orderItemService.save(quantityMapPerProduct, products, order));
logger.info("Details about the order saved!");
return order;
return new OrderMapper().map(order);
}

public Page<Order> getOrders(Pageable pageable, Date dateFrom, Date dateTo) {
public PageResponseDto<OrderDto> getOrders(Pageable pageable, Date dateFrom, Date dateTo) {
logger.info("Fetching orders!");
return orderRepository.findByDateCreatedBetween(dateFrom, dateTo, pageable);
Page<Order> page = orderRepository.findByDateCreatedBetween(dateFrom, dateTo, pageable);

return PageResponseDto.PageResponseDtoBuilder.aPageResponseDto()
.withContent(new OrderMapper().map(page.getContent()))
.withFirst(page.isFirst())
.withLast(page.isLast())
.withNextPage(page.hasNext())
.withSize(page.getSize())
.withTotalElements(page.getTotalElements())
.withTotalPages(page.getTotalPages())
.withPreviousPage(page.hasPrevious())
.withPreviousPage(page.hasContent())
.withNumber(page.getNumber())
.withNumberOfElements(page.getNumberOfElements())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package hr.ivlahek.sample.store.service;

import hr.ivlahek.sample.store.client.page.PageResponseDto;
import hr.ivlahek.sample.store.client.product.CreateProductDto;
import hr.ivlahek.sample.store.client.product.ProductDto;
import hr.ivlahek.sample.store.exception.ConflictErrorException;
import hr.ivlahek.sample.store.exception.NotFoundException;
import hr.ivlahek.sample.store.exception.messages.ExceptionMessage;
import hr.ivlahek.sample.store.persistence.entity.Product;
import hr.ivlahek.sample.store.persistence.repository.ProductRepository;
import hr.ivlahek.sample.store.service.internal.InternalProductService;
import hr.ivlahek.sample.store.service.mapper.ProductMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand All @@ -14,7 +17,6 @@
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Objects;
import java.util.Optional;

Expand All @@ -24,8 +26,10 @@ public class ProductService {
private static final Logger logger = LoggerFactory.getLogger(ProductService.class);
@Autowired
private ProductRepository productRepository;
@Autowired
private InternalProductService internalProductService;

public Product create(CreateProductDto createProductDto) {
public ProductDto create(CreateProductDto createProductDto) {
logger.info("Create product {}", createProductDto);
Optional<Product> optionalProduct = productRepository.findBySku(createProductDto.getSku());
if (optionalProduct.isPresent()) {
Expand All @@ -36,27 +40,37 @@ public Product create(CreateProductDto createProductDto) {
logger.debug("Product mapped {}", product);
productRepository.save(product);
logger.debug("Product saved!");
return product;
}

public Page<Product> getProducts(Pageable pageable) {
return productRepository.findAll(pageable);
return new ProductMapper().map(product);
}

public List<Product> findByIds(List<Long> productIds) {
return productRepository.findAllById(productIds);
public PageResponseDto<ProductDto> getProducts(Pageable pageable) {
Page<Product> products = productRepository.findAll(pageable);
return PageResponseDto.PageResponseDtoBuilder.aPageResponseDto()
.withContent(new ProductMapper().map(products.getContent()))
.withFirst(products.isFirst())
.withLast(products.isLast())
.withNextPage(products.hasNext())
.withSize(products.getSize())
.withTotalElements(products.getTotalElements())
.withTotalPages(products.getTotalPages())
.withPreviousPage(products.hasPrevious())
.withPreviousPage(products.hasContent())
.withNumber(products.getNumber())
.withNumberOfElements(products.getNumberOfElements())
.build();
}

public Product update(long productId, CreateProductDto createProductDto) {
public ProductDto update(long productId, CreateProductDto createProductDto) {
Product product = findProductById(productId);

Optional<Product> productWithSameName = productRepository.findBySku(createProductDto.getSku());
if (productWithSameName.isPresent() && !Objects.equals(product.getId(), productWithSameName.get().getId())) {
logger.error("Product with the provided name {} already exists!", createProductDto.getName());
throw new ConflictErrorException(ExceptionMessage.PRODUCT_SKU_ALREADY_EXISTS);
}

return new ProductMapper().mapForUpdate(product, createProductDto);
product = new ProductMapper().mapForUpdate(product, createProductDto);
productRepository.save(product);
return new ProductMapper().map(product);
}

private Product findProductById(Long productId) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package hr.ivlahek.sample.store.service.internal;

import hr.ivlahek.sample.store.persistence.entity.Product;
import hr.ivlahek.sample.store.persistence.repository.ProductRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class InternalProductService {

@Autowired
private ProductRepository productRepository;

private static final Logger logger = LoggerFactory.getLogger(InternalProductService.class);

public List<Product> findByIds(List<Long> productIds) {
return productRepository.findAllById(productIds);
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,12 @@

import hr.ivlahek.sample.store.client.order.CreateOrderDto;
import hr.ivlahek.sample.store.client.order.OrderDto;
import hr.ivlahek.sample.store.client.order.OrderItemDto;
import hr.ivlahek.sample.store.persistence.entity.Order;

import java.math.BigDecimal;
import java.sql.Date;
import java.time.Instant;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class OrderMapper {
Expand All @@ -23,17 +21,6 @@ public Order map(CreateOrderDto createOrderDto, double totalPrice) {
}

public OrderDto map(Order order) {
OrderDto orderDto = mapCommon(order);
List<OrderItemDto> orderItemDtos = order
.getOrderItems()
.stream()
.map(placedOrderItem -> new OrderItemDto(placedOrderItem.getProductId(), placedOrderItem.getQuantity(), BigDecimal.valueOf(placedOrderItem.getProductPrice())))
.collect(Collectors.toList());
orderDto.setOrderItemDtos(orderItemDtos);
return orderDto;
}

private OrderDto mapCommon(Order order) {
OrderDto orderDto = new OrderDto();
orderDto.setDateCreated(order.getDateCreated());
orderDto.setEmail(order.getEmail());
Expand All @@ -42,16 +29,7 @@ private OrderDto mapCommon(Order order) {
return orderDto;
}

public List<OrderDto> map(List<Order> content, Map<Long, List<OrderItemDto>> itemsPerPlacedOrder) {
return content
.stream()
.map(placedOrder -> map(placedOrder, itemsPerPlacedOrder.get(placedOrder.getId())))
.collect(Collectors.toList());
}

private OrderDto map(Order order, List<OrderItemDto> itemsPerPlacedOrder) {
OrderDto orderDto = mapCommon(order);
orderDto.getOrderItemDtos().addAll(itemsPerPlacedOrder);
return orderDto;
public List<OrderDto> map(List<Order> content) {
return content.stream().map(this::map).collect(Collectors.toList());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import hr.ivlahek.sample.store.client.order.CreateOrderDto;
import hr.ivlahek.sample.store.client.order.OrderDto;
import hr.ivlahek.sample.store.client.order.OrderItemDto;
import hr.ivlahek.sample.store.persistence.entity.Order;
import hr.ivlahek.sample.store.persistence.entity.OrderItem;
import hr.ivlahek.sample.store.persistence.repository.OrderRepository;
Expand Down Expand Up @@ -46,14 +45,6 @@ public void assertAgainst(OrderDto orderDto, long placedOrderId) {
assertThat(orderDto.getDateCreated()).isEqualTo(order.getDateCreated());
assertThat(orderDto.getId()).isEqualTo(order.getId());

assertThat(orderDto.getOrderItemDtos()).hasSameSizeAs(order.getOrderItems());
assertPlacedOrderProduct(orderDto.getOrderItemDtos().get(0), order.getOrderItems().get(0));
}

private void assertPlacedOrderProduct(OrderItemDto orderItemDto, OrderItem orderItem) {
assertThat(orderItemDto.getProductId()).isEqualTo(orderItem.getProductId());
assertThat(orderItemDto.getQuantity()).isEqualTo(orderItem.getQuantity());
assertThat(orderItemDto.getOrderItemPrice().doubleValue()).isEqualTo(orderItem.getProductPrice()).isNotZero();

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@ public void uat_test() {
OrderDto orderDto = orderClient.createOrder(createOrderDto);
assertThat(orderDto.getTotalPrice().doubleValue()).isEqualTo(11.3);
assertThat(orderDto.getEmail()).isEqualTo("test@test");
assertThat(orderDto.getOrderItemDtos()).hasSize(2);

//GET ORDER
String dateFrom = DateTimeFormatter.ISO_DATE_TIME.format(Instant.now().minusSeconds(150).atZone(ZoneId.of("UTC")));
Expand Down
Loading

0 comments on commit 384b27c

Please sign in to comment.