diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..d3648d95df599d219c29e289112a6e4c5aa102b8 Binary files /dev/null and b/.DS_Store differ diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..762544dcee765c6eb61d0b4f482a5ac9e8dd1409 Binary files /dev/null and b/src/.DS_Store differ diff --git a/src/main/.DS_Store b/src/main/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..7d2cf189b634358d6bdc3ace1bfaa3d97aa8c709 Binary files /dev/null and b/src/main/.DS_Store differ diff --git a/src/main/java/com/nisum/ascend/inventory/controller/ProductController.java b/src/main/java/com/nisum/ascend/inventory/controller/ProductController.java index 003a4b726bd7faef7e327aac900013cd3230c9ba..feff271214967eb56830047025b937714d83a56d 100644 --- a/src/main/java/com/nisum/ascend/inventory/controller/ProductController.java +++ b/src/main/java/com/nisum/ascend/inventory/controller/ProductController.java @@ -1,11 +1,22 @@ package com.nisum.ascend.inventory.controller; +import com.nisum.ascend.inventory.dto.ProductDto; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.nisum.ascend.inventory.service.ProductService; +import reactor.core.publisher.Flux; @RestController +@RequestMapping("/api/products") public class ProductController { @Autowired ProductService productService; + + @GetMapping() + public ResponseEntity<Flux<ProductDto>> getAllProducts() { + return ResponseEntity.ok(productService.findAllProducts()); + } } diff --git a/src/main/java/com/nisum/ascend/inventory/dto/ProductDto.java b/src/main/java/com/nisum/ascend/inventory/dto/ProductDto.java index 24c4727a37ac47f23c8b6fe0ce8c617027975679..3bba3e3c30df3437ba903356b5116ff383d17be1 100644 --- a/src/main/java/com/nisum/ascend/inventory/dto/ProductDto.java +++ b/src/main/java/com/nisum/ascend/inventory/dto/ProductDto.java @@ -4,6 +4,9 @@ import lombok.AllArgsConstructor; import lombok.Getter; import com.nisum.ascend.inventory.model.Product; +import java.util.ArrayList; +import java.util.List; + @Getter @AllArgsConstructor public class ProductDto { @@ -16,14 +19,14 @@ public class ProductDto { private String brand; private String category; private int stock; - private PromotionDto promotion; + private List<PromotionDto> promotions; public static ProductDto generateDtoFromProduct(Product product) { // TODO: Fetch the product's promotion from the Promotions com.nisum.ascend.inventory.service - PromotionDto promotion = new PromotionDto(); + List<PromotionDto> promotions = new ArrayList<>(); - return new ProductDto(product.getSku(), product.getUpc(), product.getProductName(), product.getProductDescription(), product.getPrice(), product.getProductImageUrl(), product.getBrand(), product.getCategory(), product.getAvailableStock(), promotion); + return new ProductDto(product.getSku(), product.getUpc(), product.getProductName(), product.getProductDescription(), product.getPrice(), product.getProductImageUrl(), product.getBrand(), product.getCategory(), product.getAvailableStock(), promotions); } } diff --git a/src/main/java/com/nisum/ascend/inventory/model/Product.java b/src/main/java/com/nisum/ascend/inventory/model/Product.java index 21aff2fc0d441c6a1f28c4f14fcd5f7aa39057e7..aab05b9bcedd1c4b848fe3d7b6b288dce58fe723 100644 --- a/src/main/java/com/nisum/ascend/inventory/model/Product.java +++ b/src/main/java/com/nisum/ascend/inventory/model/Product.java @@ -8,7 +8,7 @@ import org.springframework.data.mongodb.core.mapping.Document; @Getter @Setter -@Document +@Document(collection = "products") public class Product { @Id private String id; diff --git a/src/main/java/com/nisum/ascend/inventory/service/ProductService.java b/src/main/java/com/nisum/ascend/inventory/service/ProductService.java index eb8517f3f0fb07922f90ded28ed3e36a6867ca76..c8a1fd058b81f680e57dbd9c4e9c167be97c6b66 100644 --- a/src/main/java/com/nisum/ascend/inventory/service/ProductService.java +++ b/src/main/java/com/nisum/ascend/inventory/service/ProductService.java @@ -1,6 +1,7 @@ package com.nisum.ascend.inventory.service; import com.nisum.ascend.inventory.dto.ProductDto; +import com.nisum.ascend.inventory.model.Product; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import reactor.core.publisher.Flux; @@ -11,4 +12,10 @@ public class ProductService { @Autowired ProductRepository productRepository; + public Flux<ProductDto> findAllProducts() { + return productRepository.findAll() + .map(ProductDto::generateDtoFromProduct); + } + + } diff --git a/src/test/java/com/nisum/ascend/inventory/controller/ProductControllerTest.java b/src/test/java/com/nisum/ascend/inventory/controller/ProductControllerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..d33338c612598f734afe486984ba5f6e95fa1b8c --- /dev/null +++ b/src/test/java/com/nisum/ascend/inventory/controller/ProductControllerTest.java @@ -0,0 +1,63 @@ +package com.nisum.ascend.inventory.controller; + +import com.nisum.ascend.inventory.controller.ProductController; +import com.nisum.ascend.inventory.model.Product; +import com.nisum.ascend.inventory.repository.ProductRepository; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.web.reactive.server.WebTestClient; +import org.springframework.web.reactive.function.client.WebClient; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@ExtendWith(SpringExtension.class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@DirtiesContext +@AutoConfigureWebTestClient +@ActiveProfiles("test") +@Slf4j +class ProductControllerTest { + + @Autowired + private WebTestClient webTestClient; + + @BeforeEach + void setUp() { + } + + @Test + void testFindAllProducts(){ + webTestClient.get() + .uri("/api/products") + .exchange() + .expectStatus().isOk() + .expectHeader().contentType(MediaType.APPLICATION_JSON_VALUE) + .expectBodyList(Product.class) + .consumeWith(product ->{ + List<Product> products = product.getResponseBody(); + products.forEach( p ->{ + assertNotNull(p.getSku()); + assertNotNull(p.getUpc()); + System.out.println("Product SKU: " + p.getSku()); + System.out.println("Product UPC: " + p.getUpc()); + }); + }); + } + + +} \ No newline at end of file