diff --git a/src/main/java/dev/naman/productservice/controllers/CategoryController.java b/src/main/java/dev/naman/productservice/controllers/CategoryController.java index be875bb..c2ad300 100644 --- a/src/main/java/dev/naman/productservice/controllers/CategoryController.java +++ b/src/main/java/dev/naman/productservice/controllers/CategoryController.java @@ -1,5 +1,6 @@ package dev.naman.productservice.controllers; +import dev.naman.productservice.dtos.CategoryDto; import dev.naman.productservice.dtos.GetProductTitlesRequestDto; import dev.naman.productservice.dtos.ProductDto; import dev.naman.productservice.models.Category; @@ -39,6 +40,12 @@ public List getCategory(@PathVariable("uuid") String uuid) { return productDtos; } + @GetMapping + List getAllCategoty(){ + + return categoryService.getAllCategory(); + } + @GetMapping("/titles/") public List getProductTitles(@RequestBody GetProductTitlesRequestDto requestDto) { @@ -46,4 +53,11 @@ public List getProductTitles(@RequestBody GetProductTitlesRequestDto req return categoryService.getProductTitles(uuids); } + + @GetMapping("/path/{id}") + public CategoryDto getCategotyById(@PathVariable ("id") Long id){ + + return categoryService.findCategoryById(id); + + } } diff --git a/src/main/java/dev/naman/productservice/controllers/ProductController.java b/src/main/java/dev/naman/productservice/controllers/ProductController.java index af619d5..a03e281 100644 --- a/src/main/java/dev/naman/productservice/controllers/ProductController.java +++ b/src/main/java/dev/naman/productservice/controllers/ProductController.java @@ -38,6 +38,7 @@ public ProductController(ProductService productService) { // GET /products {} @GetMapping public List getAllProducts() { + return productService.getAllProducts(); } @@ -62,8 +63,8 @@ public GenericProductDto createProduct(@RequestBody GenericProductDto product) { return productService.createProduct(product); } - @PutMapping("{id}") - public void updateProductById() { - + @PutMapping("/update") + public GenericProductDto updateProductById(@RequestBody GenericProductDto genericProductDto) { +return productService.updateProductById(genericProductDto); } } diff --git a/src/main/java/dev/naman/productservice/models/BaseModel.java b/src/main/java/dev/naman/productservice/models/BaseModel.java index c8ada58..ac2ef76 100644 --- a/src/main/java/dev/naman/productservice/models/BaseModel.java +++ b/src/main/java/dev/naman/productservice/models/BaseModel.java @@ -1,16 +1,18 @@ package dev.naman.productservice.models; import jakarta.persistence.*; +import lombok.Data; import org.hibernate.annotations.GenericGenerator; import org.hibernate.id.factory.spi.GenerationTypeStrategy; import java.util.UUID; +@Data @MappedSuperclass public class BaseModel { @Id - @GeneratedValue(generator = "naman") - @GenericGenerator(name = "naman", strategy = "uuid2") - @Column(name = "id", columnDefinition = "binary(16)", nullable = false, updatable = false) - private UUID uuid; + @GeneratedValue(strategy = GenerationType.SEQUENCE) + // @GenericGenerator(name = "naman", strategy = "uuid2") + //@Column(name = "id", columnDefinition = "binary(16)", nullable = false, updatable = false) + private Long id; } diff --git a/src/main/java/dev/naman/productservice/models/Category.java b/src/main/java/dev/naman/productservice/models/Category.java index 4fd8f7f..c5e70cc 100644 --- a/src/main/java/dev/naman/productservice/models/Category.java +++ b/src/main/java/dev/naman/productservice/models/Category.java @@ -18,7 +18,7 @@ public class Category extends BaseModel { private String name; @OneToMany(mappedBy = "category") - @Fetch(FetchMode.SELECT) + @Fetch(FetchMode.SUBSELECT) private List products = new ArrayList<>(); // this is the same relation being mapped by category attribute in the other (Product) class diff --git a/src/main/java/dev/naman/productservice/models/Product.java b/src/main/java/dev/naman/productservice/models/Product.java index aeac87b..8ecd168 100644 --- a/src/main/java/dev/naman/productservice/models/Product.java +++ b/src/main/java/dev/naman/productservice/models/Product.java @@ -22,12 +22,13 @@ public class Product extends BaseModel { // => L to R: 1 : 1 // => R to L: m : 1 // => Ans: m : 1 - @ManyToOne(cascade = {CascadeType.PERSIST}) + @ManyToOne(cascade = {CascadeType.PERSIST,CascadeType.REMOVE,CascadeType.MERGE}) @JoinColumn(name = "category") private Category category; - @OneToOne(cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, fetch = FetchType.LAZY) + @OneToOne(cascade = {CascadeType.PERSIST, CascadeType.REMOVE,CascadeType.MERGE}) // @Fetch(FetchMode.JOIN) + @JoinColumn(name = "price") private Price price; // private double price; } diff --git a/src/main/java/dev/naman/productservice/repositories/CategoryRepository.java b/src/main/java/dev/naman/productservice/repositories/CategoryRepository.java index 6521d4a..6f399a7 100644 --- a/src/main/java/dev/naman/productservice/repositories/CategoryRepository.java +++ b/src/main/java/dev/naman/productservice/repositories/CategoryRepository.java @@ -10,10 +10,10 @@ @Lazy public interface CategoryRepository -extends JpaRepository { +extends JpaRepository { - Optional findById(UUID uuid); + // Optional findById(UUID uuid); - @Override - List findAllById(Iterable uuids); + // @Override + // List findAllById(Iterable uuids); } diff --git a/src/main/java/dev/naman/productservice/repositories/ProductRepository.java b/src/main/java/dev/naman/productservice/repositories/ProductRepository.java index c2bd45c..5677f1f 100644 --- a/src/main/java/dev/naman/productservice/repositories/ProductRepository.java +++ b/src/main/java/dev/naman/productservice/repositories/ProductRepository.java @@ -14,7 +14,7 @@ @Repository public interface ProductRepository -extends JpaRepository { +extends JpaRepository { Product findByTitleEquals(String title); diff --git a/src/main/java/dev/naman/productservice/services/CategoryService.java b/src/main/java/dev/naman/productservice/services/CategoryService.java index 91d2912..e49b639 100644 --- a/src/main/java/dev/naman/productservice/services/CategoryService.java +++ b/src/main/java/dev/naman/productservice/services/CategoryService.java @@ -1,5 +1,6 @@ package dev.naman.productservice.services; +import dev.naman.productservice.dtos.CategoryDto; import dev.naman.productservice.models.Category; import java.util.List; @@ -7,4 +8,8 @@ public interface CategoryService { Category getCategory(String uuid); List getProductTitles(List categoryUUIDs); + + List getAllCategory(); + + CategoryDto findCategoryById(Long id); } diff --git a/src/main/java/dev/naman/productservice/services/CategoryServiceImpl.java b/src/main/java/dev/naman/productservice/services/CategoryServiceImpl.java index b167a55..d03d4f8 100644 --- a/src/main/java/dev/naman/productservice/services/CategoryServiceImpl.java +++ b/src/main/java/dev/naman/productservice/services/CategoryServiceImpl.java @@ -1,5 +1,7 @@ package dev.naman.productservice.services; +import dev.naman.productservice.dtos.CategoryDto; +import dev.naman.productservice.dtos.ProductDto; import dev.naman.productservice.models.Category; import dev.naman.productservice.models.Product; import dev.naman.productservice.repositories.CategoryRepository; @@ -11,6 +13,7 @@ import java.util.List; import java.util.Optional; import java.util.UUID; +import java.util.stream.Collectors; @Service public class CategoryServiceImpl implements CategoryService { @@ -25,18 +28,19 @@ public CategoryServiceImpl(CategoryRepository categoryRepository, @Override public Category getCategory(String uuid) { - Optional categoryOptional = categoryRepository.findById(UUID.fromString(uuid)); + // Optional categoryOptional = categoryRepository.findById(UUID.fromString(uuid)); - if (categoryOptional.isEmpty()) { - return null; - } + // if (categoryOptional.isEmpty()) { + // return null; + // } - Category category = categoryOptional.get(); + // Category category = categoryOptional.get(); - List products = category.getProducts(); + // List products = category.getProducts(); - return category; + // return category; + return null; } public List getProductTitles(List categoryUUIDs) { @@ -64,16 +68,54 @@ public List getProductTitles(List categoryUUIDs) { // // return titles; - List categories = categoryRepository.findAllById(uuids); + // List categories = categoryRepository.findAllById(UUID.fromString(" ")); - List products = productRepository.findAllByCategoryIn(categories); + // List products = productRepository.findAllByCategoryIn(categories); List titles = new ArrayList<>(); - for (Product p: products) { - titles.add(p.getTitle()); - } + // for (Product p: products) { + // titles.add(p.getTitle()); + // } return titles; } + + @Override + public List getAllCategory() { + + List categoty = categoryRepository.findAll(); + + List result = categoty.stream().map(category -> category.getName()).collect(Collectors.toList()); + return result; + } + + @Override + public CategoryDto findCategoryById(Long id) { + Category category = null; + CategoryDto categoryDto = new CategoryDto(); + try { + category= categoryRepository.findById(id).get(); + }catch (Exception ex){ + System.out.println(ex.getMessage()); + } + return convert(category); + } + + private CategoryDto convert(Category category){ + CategoryDto categoryDto= new CategoryDto(); + ProductDto productDto= new ProductDto(); + List products= new ArrayList<>(); + categoryDto.setName(category.getName()); + for (Product product: category.getProducts()){ + productDto.setDescription(product.getDescription()); + productDto.setImage(product.getImage()); + productDto.setPrice(product.getPrice()); + productDto.setTitle(product.getTitle()); + products.add(productDto); + } + + categoryDto.setProducts(products); + return categoryDto; + } } diff --git a/src/main/java/dev/naman/productservice/services/FakeStoreProductService.java b/src/main/java/dev/naman/productservice/services/FakeStoreProductService.java index ceb58af..14f6f78 100644 --- a/src/main/java/dev/naman/productservice/services/FakeStoreProductService.java +++ b/src/main/java/dev/naman/productservice/services/FakeStoreProductService.java @@ -60,4 +60,9 @@ public List getAllProducts() { public GenericProductDto deleteProduct(Long id) { return convertFakeStoreProductIntoGenericProduct(fakeStoryProductServiceClient.deleteProduct(id)); } + + @Override + public GenericProductDto updateProductById(GenericProductDto genericProductDto) { + return null; + } } diff --git a/src/main/java/dev/naman/productservice/services/ProductService.java b/src/main/java/dev/naman/productservice/services/ProductService.java index bc5eb10..14ab1a9 100644 --- a/src/main/java/dev/naman/productservice/services/ProductService.java +++ b/src/main/java/dev/naman/productservice/services/ProductService.java @@ -14,4 +14,6 @@ public interface ProductService { List getAllProducts(); GenericProductDto deleteProduct(Long id); + + GenericProductDto updateProductById(GenericProductDto genericProductDto); } diff --git a/src/main/java/dev/naman/productservice/services/SelfProductServiceImpl.java b/src/main/java/dev/naman/productservice/services/SelfProductServiceImpl.java index 260a45b..d2571d8 100644 --- a/src/main/java/dev/naman/productservice/services/SelfProductServiceImpl.java +++ b/src/main/java/dev/naman/productservice/services/SelfProductServiceImpl.java @@ -1,12 +1,16 @@ package dev.naman.productservice.services; import dev.naman.productservice.dtos.GenericProductDto; +import dev.naman.productservice.models.Category; +import dev.naman.productservice.models.Price; import dev.naman.productservice.models.Product; import dev.naman.productservice.repositories.ProductRepository; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Service; import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; @Primary @Service("selfProductServiceImpl") @@ -19,21 +23,71 @@ public SelfProductServiceImpl(ProductRepository productRepository) { @Override public GenericProductDto getProductById(Long id) { - return null; + return convertGenericProductDtoToProduct(productRepository.findById(id).get()); } @Override - public GenericProductDto createProduct(GenericProductDto product) { - return null; + public GenericProductDto createProduct(GenericProductDto genericProductDto) { + + Product product = new Product(); + Category category = new Category(); + Price price= new Price(); + price.setCurrency("INR"); + price.setPrice(genericProductDto.getPrice()); + category.setName(genericProductDto.getCategory()); + product.setTitle(genericProductDto.getTitle()); + product.setDescription(genericProductDto.getDescription()); + product.setImage(genericProductDto.getImage()); + product.setCategory(category); + product.setPrice(price); + Product in = productRepository.save(product); + return convertGenericProductDtoToProduct(in); + } + + private GenericProductDto convertGenericProductDtoToProduct(Product product) { + GenericProductDto genericProductDto= new GenericProductDto(); + genericProductDto.setId(product.getId()); + genericProductDto.setCategory(product.getCategory().getName()); + genericProductDto.setPrice(product.getPrice().getPrice()); + genericProductDto.setTitle(product.getTitle()); + genericProductDto.setDescription(product.getDescription()); + genericProductDto.setImage(product.getImage()); + return genericProductDto; } @Override public List getAllProducts() { - return null; + List allProducts = productRepository.findAll(); + return allProducts.stream().map(product -> convertGenericProductDtoToProduct(product)) + .collect(Collectors.toList()); } @Override public GenericProductDto deleteProduct(Long id) { - return null; + Optional product = productRepository.findById(id); + if(product.isEmpty()){ + return null; + } + productRepository.deleteById(id); + return convertGenericProductDtoToProduct(product.get()); + } + + @Override + public GenericProductDto updateProductById(GenericProductDto genericProductDto) { + Product product = new Product(); + Category category = new Category(); + Price price= new Price(); + price.setCurrency("INR"); + price.setPrice(genericProductDto.getPrice()); + category.setName(genericProductDto.getCategory()); + product.setId(genericProductDto.getId()); + product.setTitle(genericProductDto.getTitle()); + product.setDescription(genericProductDto.getDescription()); + product.setImage(genericProductDto.getImage()); + product.setCategory(category); + product.setPrice(price); + Product in = productRepository.save(product); + return convertGenericProductDtoToProduct(in); } -} + } + diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 1f3ba82..5b5f0f3 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -4,7 +4,7 @@ naman.bhalla=abc server.port=3000 # hashmap key:value - +// # Fakestore Config Values fakestore.api.url=https://fakestoreapi.com fakestore.api.paths.product=/products