diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/controller/product/ProductController.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/controller/product/ProductController.java index f3cb955a068789c1f27c597d9485fe5853d172dc..dbb511b39b3987bf994dc55b68db8f56b357b5ca 100644 --- a/src/main/java/ntnu/idatt2016/v233/SmartMat/controller/product/ProductController.java +++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/controller/product/ProductController.java @@ -5,10 +5,7 @@ import ntnu.idatt2016.v233.SmartMat.dto.request.ProductRequest; import ntnu.idatt2016.v233.SmartMat.entity.product.Product; import ntnu.idatt2016.v233.SmartMat.service.product.ProductService; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; /** * The product controller is responsible for handling requests related to products. @@ -47,4 +44,18 @@ public class ProductController { } + /** + * Returns a product with the given ean. + * @param ean The ean of the product to be returned. + * @return The product with the given ean. + */ + @GetMapping("ean/{ean}") + public ResponseEntity<Product> getProduct(@PathVariable long ean) { + return productService.getProductById(ean) + .map(ResponseEntity::ok) + .orElse(ResponseEntity.notFound().build()); + } + + + } diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/service/product/ProductService.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/service/product/ProductService.java index e668812f2caab46bcd4e121be3c6cc979bf517a4..1e8c53a791c6f2a19dd19ca0ed993324b87042e2 100644 --- a/src/main/java/ntnu/idatt2016/v233/SmartMat/service/product/ProductService.java +++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/service/product/ProductService.java @@ -76,7 +76,7 @@ public class ProductService { * @param id The id of the product to get the volume from * @return The volume of the product, if it exists */ - public Optional<String> getProductVolume(long id) { + public Optional<List<String>> getProductVolume(long id) { if(productRepository.findById(id).isEmpty()) return Optional.empty(); diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/util/ProductUtil.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/util/ProductUtil.java index 6aa4a7062447f2d514ee41d811716d7ed8a7056a..c77016523dfd1161343e576eb1ff5493963f951e 100644 --- a/src/main/java/ntnu/idatt2016/v233/SmartMat/util/ProductUtil.java +++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/util/ProductUtil.java @@ -5,6 +5,7 @@ import ntnu.idatt2016.v233.SmartMat.entity.product.Product; import java.util.Arrays; import java.util.List; import java.util.Optional; +import java.util.regex.Pattern; /** * Utility class for products @@ -26,7 +27,7 @@ public class ProductUtil { * @param product The product to get the volume from * @return The volume of the product, if it exists */ - public static Optional<String> getVolumeFromProduct(Product product) { + public static Optional<List<String>> getVolumeFromProduct(Product product) { for (String desc : Arrays.asList(product.getName(), product.getDescription())) { List<String> words = List.of(desc.split(" ")); if (words.size() > 1) { @@ -34,16 +35,25 @@ public class ProductUtil { for (String unit : VOLUME_UNITS) { int i = words.indexOf(unit); if (i != -1) { - return Optional.of(words.get(i - 1) + unit); + return Optional.of(List.of(words.get(i - 1), unit)); } } - volume = words.stream().filter(word -> Arrays.stream(VOLUME_UNITS).anyMatch(word::contains)) + volume = words.stream().map(word -> Arrays.stream(VOLUME_UNITS).map(unit -> { + int index = word.indexOf(unit); + if (index == -1) { + if (!Pattern.matches("[a-zA-Z]+", word) && ProductUtil.hasNumbers(word)) { + return word; + } + return ""; + } + return word.substring(0, index) + " " + word.substring(index); + }).findAny().orElse("")) .filter(ProductUtil::hasNumbers) .findAny() .orElse(""); if (!volume.equals("")){ - return Optional.of(volume); + return Optional.of(List.of(volume.split(" "))); } } } diff --git a/src/test/java/ntnu/idatt2016/v233/SmartMat/service/product/ProductServiceTest.java b/src/test/java/ntnu/idatt2016/v233/SmartMat/service/product/ProductServiceTest.java index e73b0826625ecf46065283f6f74c3a2840323261..c9a580871f06b0dc6a7f0d5c01340c3023d05292 100644 --- a/src/test/java/ntnu/idatt2016/v233/SmartMat/service/product/ProductServiceTest.java +++ b/src/test/java/ntnu/idatt2016/v233/SmartMat/service/product/ProductServiceTest.java @@ -133,9 +133,9 @@ public class ProductServiceTest { ProductService productService = new ProductService(mockRepository); // Verify that the service returns the correct volume - Optional<String> returnedVolume = productService.getProductVolume(productId); + Optional<List<String>> returnedVolume = productService.getProductVolume(productId); assertTrue(returnedVolume.isPresent()); - assertEquals("500ml", returnedVolume.get()); + assertEquals(List.of("500", "ml"), returnedVolume.get()); } @Test @@ -150,7 +150,7 @@ public class ProductServiceTest { ProductService productService = new ProductService(mockRepository); // Verify that the service returns an empty optional - Optional<String> returnedVolume = productService.getProductVolume(productId); + Optional<List<String>> returnedVolume = productService.getProductVolume(productId); assertTrue(returnedVolume.isEmpty()); } diff --git a/src/test/java/ntnu/idatt2016/v233/SmartMat/util/ProductUtilTest.java b/src/test/java/ntnu/idatt2016/v233/SmartMat/util/ProductUtilTest.java index 2eb3f4d6d5d323351c472703aa24d61351d9d214..0164ae29d869b4a85b47dab4cdd82d95c78d8b1e 100644 --- a/src/test/java/ntnu/idatt2016/v233/SmartMat/util/ProductUtilTest.java +++ b/src/test/java/ntnu/idatt2016/v233/SmartMat/util/ProductUtilTest.java @@ -4,6 +4,8 @@ import ntnu.idatt2016.v233.SmartMat.entity.product.Product; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import java.util.List; + import static org.junit.jupiter.api.Assertions.*; class ProductUtilTest { @@ -20,7 +22,7 @@ class ProductUtilTest { @Test void getVolumeFromProduct() { - assertEquals("24x500ml", ProductUtil.getVolumeFromProduct(product).get()); + assertEquals(List.of("24x500", "ml"), ProductUtil.getVolumeFromProduct(product).get()); this.product = Product.builder() .ean(123456789) @@ -28,7 +30,7 @@ class ProductUtilTest { .description("Pepsi Original 24x500 ml") .build(); - assertEquals("24x500ml", ProductUtil.getVolumeFromProduct(product).get()); + assertEquals(List.of("24x500", "ml"), ProductUtil.getVolumeFromProduct(product).get()); this.product = Product.builder() .ean(123456789) @@ -37,7 +39,7 @@ class ProductUtilTest { .build(); - assertEquals("24x500ml", ProductUtil.getVolumeFromProduct(product).get()); + assertEquals(List.of("24x500", "ml"), ProductUtil.getVolumeFromProduct(product).get()); this.product = Product.builder() .ean(123456789) @@ -46,6 +48,6 @@ class ProductUtilTest { .build(); - assertEquals("24x500ml", ProductUtil.getVolumeFromProduct(product).get()); + assertEquals(List.of("24x500", "ml"), ProductUtil.getVolumeFromProduct(product).get()); } } \ No newline at end of file