diff --git a/store-dto/src/main/java/hr/ivlahek/sample/store/client/order/OrderDto.java b/store-dto/src/main/java/hr/ivlahek/sample/store/client/order/OrderDto.java index 84c8f30..d36ff02 100644 --- a/store-dto/src/main/java/hr/ivlahek/sample/store/client/order/OrderDto.java +++ b/store-dto/src/main/java/hr/ivlahek/sample/store/client/order/OrderDto.java @@ -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 @@ -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 orderItemDtos = new ArrayList<>(); - } diff --git a/store-service/src/main/java/hr/ivlahek/sample/store/rest/OrderController.java b/store-service/src/main/java/hr/ivlahek/sample/store/rest/OrderController.java index 82dd73a..560abe3 100644 --- a/store-service/src/main/java/hr/ivlahek/sample/store/rest/OrderController.java +++ b/store-service/src/main/java/hr/ivlahek/sample/store/rest/OrderController.java @@ -2,10 +2,7 @@ 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; @@ -13,17 +10,11 @@ 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 @@ -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 getOrders(Pageable pageable, Date dateFrom, Date dateTo) { logger.info("Get order between dates {} and {}. Page {} ", dateFrom, dateTo, pageable); - Page page = orderService.getOrders(pageable, dateFrom, dateTo); - List orderItemList = orderItemService.findOrderItems(page.getContent()); - Map> 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> groupItemsPerOrder(List orderItemList) { - return orderItemList - .stream() - .collect(groupingBy(orderItem -> orderItem.getOrder().getId(), - mapping(orderItem -> new OrderItemDto(orderItem.getProductId(), - orderItem.getQuantity(), - BigDecimal.valueOf(orderItem.getProductPrice())), toList()))); } } diff --git a/store-service/src/main/java/hr/ivlahek/sample/store/rest/ProductController.java b/store-service/src/main/java/hr/ivlahek/sample/store/rest/ProductController.java index ee759c6..c51de18 100644 --- a/store-service/src/main/java/hr/ivlahek/sample/store/rest/ProductController.java +++ b/store-service/src/main/java/hr/ivlahek/sample/store/rest/ProductController.java @@ -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 getAllProducts(@NotNull Pageable pageable) { logger.info("Create mobile application api called {}", pageable); - Page 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 diff --git a/store-service/src/main/java/hr/ivlahek/sample/store/service/OrderService.java b/store-service/src/main/java/hr/ivlahek/sample/store/service/OrderService.java index f9448bd..53ec73d 100644 --- a/store-service/src/main/java/hr/ivlahek/sample/store/service/OrderService.java +++ b/store-service/src/main/java/hr/ivlahek/sample/store/service/OrderService.java @@ -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; @@ -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 productIds = createOrderDto.getOrderItemDtos() .stream() @@ -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 getOrders(Pageable pageable, Date dateFrom, Date dateTo) { + public PageResponseDto getOrders(Pageable pageable, Date dateFrom, Date dateTo) { logger.info("Fetching orders!"); - return orderRepository.findByDateCreatedBetween(dateFrom, dateTo, pageable); + Page 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(); } } diff --git a/store-service/src/main/java/hr/ivlahek/sample/store/service/ProductService.java b/store-service/src/main/java/hr/ivlahek/sample/store/service/ProductService.java index 498f864..1047f9d 100644 --- a/store-service/src/main/java/hr/ivlahek/sample/store/service/ProductService.java +++ b/store-service/src/main/java/hr/ivlahek/sample/store/service/ProductService.java @@ -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; @@ -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; @@ -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 optionalProduct = productRepository.findBySku(createProductDto.getSku()); if (optionalProduct.isPresent()) { @@ -36,18 +40,27 @@ public Product create(CreateProductDto createProductDto) { logger.debug("Product mapped {}", product); productRepository.save(product); logger.debug("Product saved!"); - return product; - } - - public Page getProducts(Pageable pageable) { - return productRepository.findAll(pageable); + return new ProductMapper().map(product); } - public List findByIds(List productIds) { - return productRepository.findAllById(productIds); + public PageResponseDto getProducts(Pageable pageable) { + Page 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 productWithSameName = productRepository.findBySku(createProductDto.getSku()); @@ -55,8 +68,9 @@ public Product update(long productId, CreateProductDto createProductDto) { 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) { diff --git a/store-service/src/main/java/hr/ivlahek/sample/store/service/internal/InternalProductService.java b/store-service/src/main/java/hr/ivlahek/sample/store/service/internal/InternalProductService.java new file mode 100644 index 0000000..b110db5 --- /dev/null +++ b/store-service/src/main/java/hr/ivlahek/sample/store/service/internal/InternalProductService.java @@ -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 findByIds(List productIds) { + return productRepository.findAllById(productIds); + } + + +} diff --git a/store-service/src/main/java/hr/ivlahek/sample/store/service/mapper/OrderMapper.java b/store-service/src/main/java/hr/ivlahek/sample/store/service/mapper/OrderMapper.java index 50254f1..fb2b71a 100644 --- a/store-service/src/main/java/hr/ivlahek/sample/store/service/mapper/OrderMapper.java +++ b/store-service/src/main/java/hr/ivlahek/sample/store/service/mapper/OrderMapper.java @@ -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 { @@ -23,17 +21,6 @@ public Order map(CreateOrderDto createOrderDto, double totalPrice) { } public OrderDto map(Order order) { - OrderDto orderDto = mapCommon(order); - List 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()); @@ -42,16 +29,7 @@ private OrderDto mapCommon(Order order) { return orderDto; } - public List map(List content, Map> itemsPerPlacedOrder) { - return content - .stream() - .map(placedOrder -> map(placedOrder, itemsPerPlacedOrder.get(placedOrder.getId()))) - .collect(Collectors.toList()); - } - - private OrderDto map(Order order, List itemsPerPlacedOrder) { - OrderDto orderDto = mapCommon(order); - orderDto.getOrderItemDtos().addAll(itemsPerPlacedOrder); - return orderDto; + public List map(List content) { + return content.stream().map(this::map).collect(Collectors.toList()); } } diff --git a/store-service/src/test/java/hr/ivlahek/asserter/OrderAsserter.java b/store-service/src/test/java/hr/ivlahek/asserter/OrderAsserter.java index a777420..47f9f74 100644 --- a/store-service/src/test/java/hr/ivlahek/asserter/OrderAsserter.java +++ b/store-service/src/test/java/hr/ivlahek/asserter/OrderAsserter.java @@ -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; @@ -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(); - - } } diff --git a/store-service/src/test/java/hr/ivlahek/sample/store/rest/UatTest.java b/store-service/src/test/java/hr/ivlahek/sample/store/rest/UatTest.java index ada7d71..708402d 100644 --- a/store-service/src/test/java/hr/ivlahek/sample/store/rest/UatTest.java +++ b/store-service/src/test/java/hr/ivlahek/sample/store/rest/UatTest.java @@ -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"))); diff --git a/store-service/src/test/java/hr/ivlahek/sample/store/service/ProductServiceTest.java b/store-service/src/test/java/hr/ivlahek/sample/store/service/InternalProductServiceTest.java similarity index 84% rename from store-service/src/test/java/hr/ivlahek/sample/store/service/ProductServiceTest.java rename to store-service/src/test/java/hr/ivlahek/sample/store/service/InternalProductServiceTest.java index c59f419..185eeb2 100644 --- a/store-service/src/test/java/hr/ivlahek/sample/store/service/ProductServiceTest.java +++ b/store-service/src/test/java/hr/ivlahek/sample/store/service/InternalProductServiceTest.java @@ -1,7 +1,9 @@ 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.CreateProductDtoBuilder; +import hr.ivlahek.sample.store.client.product.ProductDto; import hr.ivlahek.sample.store.exception.AppException; import hr.ivlahek.sample.store.exception.messages.ExceptionMessage; import hr.ivlahek.sample.store.persistence.RepositoryTest; @@ -9,7 +11,6 @@ import hr.ivlahek.sample.store.persistence.entity.ProductBuilder; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import java.util.Optional; @@ -17,7 +18,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown; -public class ProductServiceTest extends RepositoryTest { +public class InternalProductServiceTest extends RepositoryTest { @Autowired private ProductService productService; @@ -26,7 +27,7 @@ public class ProductServiceTest extends RepositoryTest { public void should_save_product() { CreateProductDto createProductDto = CreateProductDtoBuilder.aCreateProductDto1().build(); //OPERATE - Product product = productService.create(createProductDto); + ProductDto product = productService.create(createProductDto); //CHECK Optional createdProduct = productRepository.findById(product.getId()); @@ -55,11 +56,11 @@ public void should_get_paged() { Product product2 = ProductBuilder.aProduct2().build(); productRepository.save(product2); - Page page = productService.getProducts(PageRequest.of(0, 1)); + PageResponseDto page = productService.getProducts(PageRequest.of(0, 1)); //check assertThat(page.getContent()).hasSize(1); - Product actual = page.getContent().get(0); + ProductDto actual = page.getContent().get(0); assertThat(actual.getId()).isEqualTo(product1.getId()); } diff --git a/store-service/src/test/java/hr/ivlahek/sample/store/service/OrderMapperTest.java b/store-service/src/test/java/hr/ivlahek/sample/store/service/OrderMapperTest.java index db756e7..9c0d232 100644 --- a/store-service/src/test/java/hr/ivlahek/sample/store/service/OrderMapperTest.java +++ b/store-service/src/test/java/hr/ivlahek/sample/store/service/OrderMapperTest.java @@ -3,7 +3,6 @@ import hr.ivlahek.sample.store.client.order.CreateOrderDto; import hr.ivlahek.sample.store.client.order.CreateOrderDtoBuilder; import hr.ivlahek.sample.store.client.order.OrderDto; -import hr.ivlahek.sample.store.client.order.OrderItemDto; import hr.ivlahek.sample.store.persistence.entity.*; import hr.ivlahek.sample.store.service.mapper.OrderMapper; import org.junit.Before; @@ -50,15 +49,6 @@ public void should_map_to_dto() { OrderDto dto = orderMapper.map(order); assertProductDto(dto, order); - assertThat(dto.getOrderItemDtos()).hasSize(2); - assertPlacedOrderItem(dto.getOrderItemDtos().get(0), placedOrder1); - assertPlacedOrderItem(dto.getOrderItemDtos().get(1), placedOrder2); - } - - private void assertPlacedOrderItem(OrderItemDto orderItemDto, OrderItem orderItem1) { - assertThat(orderItemDto.getOrderItemPrice().doubleValue()).isEqualTo(orderItem1.getProductPrice()); - assertThat(orderItemDto.getProductId()).isEqualTo(orderItem1.getProductId()).isNotZero(); - assertThat(orderItemDto.getQuantity()).isEqualTo(orderItem1.getQuantity()).isNotZero(); } private void assertProductDto(OrderDto dto, Order order) { diff --git a/store-service/src/test/java/hr/ivlahek/sample/store/service/OrderServiceTest.java b/store-service/src/test/java/hr/ivlahek/sample/store/service/OrderServiceTest.java index 37de039..ce363bf 100644 --- a/store-service/src/test/java/hr/ivlahek/sample/store/service/OrderServiceTest.java +++ b/store-service/src/test/java/hr/ivlahek/sample/store/service/OrderServiceTest.java @@ -3,6 +3,7 @@ import hr.ivlahek.sample.store.client.order.CreateOrderDto; import hr.ivlahek.sample.store.client.order.CreateOrderDtoBuilder; import hr.ivlahek.sample.store.client.order.CreateOrderItemDtoBuilder; +import hr.ivlahek.sample.store.client.order.OrderDto; import hr.ivlahek.sample.store.exception.AppException; import hr.ivlahek.sample.store.exception.messages.ExceptionMessage; import hr.ivlahek.sample.store.persistence.RepositoryTest; @@ -40,10 +41,10 @@ public void should_create_order_with_products() { .build(); //OPERATE - Order order = orderService.placeOrder(createOrderDto); + OrderDto orderDto = orderService.placeOrder(createOrderDto); //CHECK - order = orderRepository.findById(order.getId()).get(); + Order order = orderRepository.findById(orderDto.getId()).get(); assertThat(order.getTotalPrice()).isEqualTo(7d); assertThat(order.getDateCreated()).isToday(); assertThat(order.getEmail()).isEqualTo(createOrderDto.getEmail());