diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/.DS_Store differ diff --git a/pom.xml b/pom.xml index 19a39f7..9d2f850 100644 --- a/pom.xml +++ b/pom.xml @@ -1,87 +1,85 @@ - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 3.1.3 - - - dev.naman - productservice - 0.0.1-SNAPSHOT - productservice - productservice - - 17 - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-devtools - runtime - true - + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.1.3 + + + dev.bhanu + productservice + 0.0.1-SNAPSHOT + productservice + Demo project for Spring Boot + + 17 + + + + org.springframework.boot + spring-boot-starter-web + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + - org.springframework.boot - spring-boot-configuration-processor - true - - - org.projectlombok - lombok - true - - - org.springframework.boot - spring-boot-starter-test - test + org.hibernate + hibernate-core + 6.2.7.Final - - org.springframework.boot - spring-boot-starter-actuator - - - - org.springframework.boot - spring-boot-starter-data-jpa - - - com.mysql - mysql-connector-j - runtime - - - - org.flywaydb - flyway-mysql - 9.22.2 - - - + + org.springframework + spring-core + 6.0.11 + + + org.springframework.boot + spring-boot-starter-data-jpa + + + com.mysql + mysql-connector-j + runtime + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-oauth2-resource-server + + + org.springframework.data + spring-data-elasticsearch + + - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + diff --git a/queries.sql b/queries.sql deleted file mode 100644 index 50d245f..0000000 --- a/queries.sql +++ /dev/null @@ -1,82 +0,0 @@ -select u1_0.id, u1_0.clazz_, u1_0.email, u1_0.name, u1_0.average_rating, u1_0.attendance, u1_0.psp -from (select id, email, name, null as average_rating, null as attendance, null as psp, 0 as clazz_ - from tpc_user - union all - select id, email, name, average_rating, null as attendance, null as psp, 1 as clazz_ - from tpc_mentor - union all - select id, email, name, null as average_rating, attendance, psp, 2 as clazz_ - from tpc_student - union all - select id, email, name, average_rating, null as attendance, null as psp, 3 as clazz_ - from tpc_ta) u1_0 - - -select c1_0.id, - c1_0.name, - p1_0.category_id, - p1_0.id, - p1_0.description, - p1_0.image, - p1_0.price, - p1_0.title -from category c1_0 - left join product p1_0 on c1_0.id = p1_0.category_id -where c1_0.id = ? - -select c1_0.id, c1_0.name -from category c1_0 -where c1_0.id = ? - -select p1_0.category, - p1_0.id, - p1_0.description, - p1_0.image, - p2_0.id, - p2_0.currency, - p2_0.price, - p1_0.title -from product p1_0 - left join price p2_0 on p2_0.id = p1_0.price_id -where p1_0.category = ? - -select p1_0.category, - p1_0.id, - p1_0.description, - p1_0.image, - p2_0.id, - p2_0.currency, - p2_0.price, - p1_0.title -from product p1_0 - left join price p2_0 on p2_0.id = p1_0.price_id -where p1_0.category = ? - -select c1_0.id, - c1_0.name, - p1_0.category, - p1_0.id, - p1_0.description, - p1_0.image, - p2_0.id, - p2_0.currency, - p2_0.price, - p1_0.title -from category c1_0 - left join product p1_0 on c1_0.id = p1_0.category - left join price p2_0 on p2_0.id = p1_0.price_id -where c1_0.id = ? Hibernate: -select c1_0.id, - c1_0.name, - p1_0.category, - p1_0.id, - p1_0.description, - p1_0.image, - p2_0.id, - p2_0.currency, - p2_0.price, - p1_0.title -from category c1_0 - left join product p1_0 on c1_0.id = p1_0.category - left join price p2_0 on p2_0.id = p1_0.price_id -where c1_0.id = ? \ No newline at end of file diff --git a/src/main/java/dev/.DS_Store b/src/main/java/dev/.DS_Store new file mode 100644 index 0000000..ca7a8e6 Binary files /dev/null and b/src/main/java/dev/.DS_Store differ diff --git a/src/main/java/dev/bhanu/productservice/ElasticSearchRepository/ProductElasticSearchRepository.java b/src/main/java/dev/bhanu/productservice/ElasticSearchRepository/ProductElasticSearchRepository.java new file mode 100644 index 0000000..8cbd792 --- /dev/null +++ b/src/main/java/dev/bhanu/productservice/ElasticSearchRepository/ProductElasticSearchRepository.java @@ -0,0 +1,14 @@ +package dev.bhanu.productservice.ElasticSearchRepository; + +import dev.bhanu.productservice.models.Product; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; +import org.springframework.stereotype.Repository; + +import java.util.UUID; + +@Repository +public interface ProductElasticSearchRepository extends ElasticsearchRepository { + Page findByTitleOrDescriptionContainingIgnoreCase(String title, String description, Pageable pageable); +} diff --git a/src/main/java/dev/bhanu/productservice/Exception/NotFoundException.java b/src/main/java/dev/bhanu/productservice/Exception/NotFoundException.java new file mode 100644 index 0000000..5273573 --- /dev/null +++ b/src/main/java/dev/bhanu/productservice/Exception/NotFoundException.java @@ -0,0 +1,7 @@ +package dev.bhanu.productservice.Exception; + +public class NotFoundException extends Exception{ + public NotFoundException(String msg){ + super(msg); + } +} diff --git a/src/main/java/dev/bhanu/productservice/ProductserviceApplication.java b/src/main/java/dev/bhanu/productservice/ProductserviceApplication.java new file mode 100644 index 0000000..b52c8d0 --- /dev/null +++ b/src/main/java/dev/bhanu/productservice/ProductserviceApplication.java @@ -0,0 +1,17 @@ +package dev.bhanu.productservice; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; + +@SpringBootApplication +@EnableElasticsearchRepositories(basePackages = "dev.bhanu.productservice.ElasticSearchRepository") +@EnableJpaRepositories(basePackages = "dev.bhanu.productservice.Repository") +public class ProductserviceApplication { + + public static void main(String[] args) { + SpringApplication.run(ProductserviceApplication.class, args); + } + +} diff --git a/src/main/java/dev/bhanu/productservice/Repository/CategoryRepository.java b/src/main/java/dev/bhanu/productservice/Repository/CategoryRepository.java new file mode 100644 index 0000000..9fcba9b --- /dev/null +++ b/src/main/java/dev/bhanu/productservice/Repository/CategoryRepository.java @@ -0,0 +1,18 @@ +package dev.bhanu.productservice.Repository; + +import dev.bhanu.productservice.models.Category; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +import java.util.Optional; +import java.util.UUID; +import java.util.List; + +public interface CategoryRepository extends JpaRepository { + + @Query(value = CustomQuery.FIND_ALL_CATEGORY, nativeQuery = true) + List getAllCategory(); + + Optional getCategoryByName(String name); + +} diff --git a/src/main/java/dev/bhanu/productservice/Repository/CustomQuery.java b/src/main/java/dev/bhanu/productservice/Repository/CustomQuery.java new file mode 100644 index 0000000..e6849c3 --- /dev/null +++ b/src/main/java/dev/bhanu/productservice/Repository/CustomQuery.java @@ -0,0 +1,8 @@ +package dev.bhanu.productservice.Repository; + +public interface CustomQuery { + String FIND_ALL_PRODUCT = "SELECT p FROM Product p JOIN FETCH p.category"; + String FIND_ALL_CATEGORY = "select * from category"; + + +} diff --git a/src/main/java/dev/bhanu/productservice/Repository/ProductRepository.java b/src/main/java/dev/bhanu/productservice/Repository/ProductRepository.java new file mode 100644 index 0000000..47f16a3 --- /dev/null +++ b/src/main/java/dev/bhanu/productservice/Repository/ProductRepository.java @@ -0,0 +1,27 @@ +package dev.bhanu.productservice.Repository; + +import dev.bhanu.productservice.models.Category; +import dev.bhanu.productservice.models.Product; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +@Repository +public interface ProductRepository extends JpaRepository { + public Optional findById(UUID id); + + @Query(value = CustomQuery.FIND_ALL_PRODUCT) + public List findAllProducts(); + + public List findProductByCategory(Category category); + + public Page findByTitleContainingIgnoreCase(String title, Pageable pageable); + + +} diff --git a/src/main/java/dev/bhanu/productservice/certificate/http_ca.crt b/src/main/java/dev/bhanu/productservice/certificate/http_ca.crt new file mode 100644 index 0000000..87fce59 --- /dev/null +++ b/src/main/java/dev/bhanu/productservice/certificate/http_ca.crt @@ -0,0 +1,31 @@ +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIVAMpWmp31K/EpedW9bbfiOE1eHAE3MA0GCSqGSIb3DQEB +CwUAMDwxOjA4BgNVBAMTMUVsYXN0aWNzZWFyY2ggc2VjdXJpdHkgYXV0by1jb25m +aWd1cmF0aW9uIEhUVFAgQ0EwHhcNMjMxMTI2MTIxNTE2WhcNMjYxMTI1MTIxNTE2 +WjA8MTowOAYDVQQDEzFFbGFzdGljc2VhcmNoIHNlY3VyaXR5IGF1dG8tY29uZmln +dXJhdGlvbiBIVFRQIENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA +zgcDVb4KbfzVkmCf0kbLs14tOUMekFh1m4nOmOJ7SF1DssJIsCcp0n/+w6RJbOn3 +/QMeVtqpa7s2stxLQ0dw2qvwwrYGjEKCPYfqeIp40Bi3c7gMSdcryx6WwIhBjno8 +MHRWUOCLc3FjvBfENvaVvXHpcLgfThqAnX3J6xeK7OrKoebgCxBhY5Kelh0zWL0N +SdaUIO6/si5fyZtpw6MLBMNlSx94RiqTKgkgpNG6PmbRap1EYq+bCjGMcukzKHhe +lomUaF/07maOOfH/9m9WC6Ut7KKQ3ph3iAa3HyT/nGf0clgxwwKt99ls6VWvnUjc +RYgczpa+EiSECzEazVmpG++WmFHuZBgxfUD5dnKVZcIWNA0oIZURvNhClH4NSHUX +rRG8eCg6dIhinjPBG/+bI7WgFqnS8387HsbxyXRRYA2GPVrEBVt87+82cPYoP0j3 +fLQ+gXLcK5opQqX04d0k6qcat7MXSQ+CuuyzV8eKOomguZjdq5RGGodkpOoSmZDt +vbh4FNtaMF/EAOWtrrsF0COBfGfY/q9WxTzCCYSm6bymp3FcoV2DrGp0fKQwlGbR +BE15PIgWnYnLlS8bkKMD685k3IMqcnwKxGhRAhBlN06bsy9Tba05pCghRjqmJfEq +g67vZnPdPh9JEOUMi6B0q3SsRZ4Y3KVzyUI+Ihaz5AkCAwEAAaNTMFEwHQYDVR0O +BBYEFAsPscwGwEYDw6QCgdsXTLD99iW5MB8GA1UdIwQYMBaAFAsPscwGwEYDw6QC +gdsXTLD99iW5MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggIBAIG+ +Q4iFIXzvrcAzjzqaK7ZxjRaomsjgZKd8PC1MxK3Z2LSzOdEMy2Q9etTOiQByepe+ +c1Nrf+fIa0L79hb9ABmDqFyy3G3zk9MUVlXvn3FZhhgPCirrqkMF3o3iBcu02daO +Q4g15VEeZ6HaT4AnSgVG82xi5GGT58EyGNO7wFJNJEEd06IHOrG9zrY4iVY3q8LS +D1ckvLuJdlp2XMuH/G3KpoDxyvKE37j6uPzNSsO2a0/U4lY9wgA8Lq24SWriLAU9 +J7MkbR+qNygyZB9Dw9yFovcuqYU2ekVrqUe462u22IQ3b3iWpupSWcQSxmMd9hzj +UgcYDK5bQ/B7dt4/Sz/D4CGATraev3925aCGivbG3lM+QNsGWfYeF5ion+4RUDoE +EzS7gimi/58oGd5HIY2YovV0naXaNQ4v6h/oq4eoyrlT/cAq+mNVZDCryxL4Xr5q +5fvqDRkDVYeO8ZPbw4uh5ElkwgwNkhDruSAYFvM5G0WtMA352LAxy3clczTuPDy9 +jt0KLqXJ+lameCA+y4TXuLc/BVvpIUXJRv5ASAbZfhLoRrHxXHqZDrvvi3nVSxlF +jMskMdj9ojmWnBkUcKQ/7oEHvyXEslcSnNTGPrVSsEkQkdEgj2FD6/Ce3H7JgKki +DS+9SADHT5rxfo5ClMrSt8WRIdvl5oCy3TBXmn0y +-----END CERTIFICATE----- diff --git a/src/main/java/dev/bhanu/productservice/controllers/CategoryController.java b/src/main/java/dev/bhanu/productservice/controllers/CategoryController.java new file mode 100644 index 0000000..305e221 --- /dev/null +++ b/src/main/java/dev/bhanu/productservice/controllers/CategoryController.java @@ -0,0 +1,25 @@ +package dev.bhanu.productservice.controllers; + +import dev.bhanu.productservice.services.DBCategoryService; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import dev.bhanu.productservice.dtos.SelfCategoryDto; + +import java.util.List; + +@RestController +@RequestMapping("/categories") +public class CategoryController { + private DBCategoryService dbCategoryService; + + public CategoryController(@Qualifier("DBCategoryService") DBCategoryService dbCategoryService){ + this.dbCategoryService = dbCategoryService; + } + + @GetMapping + public List getAllCategory(){ + return dbCategoryService.getAllCategory(); + } +} diff --git a/src/main/java/dev/bhanu/productservice/controllers/ProductController.java b/src/main/java/dev/bhanu/productservice/controllers/ProductController.java new file mode 100644 index 0000000..00028b5 --- /dev/null +++ b/src/main/java/dev/bhanu/productservice/controllers/ProductController.java @@ -0,0 +1,59 @@ +package dev.bhanu.productservice.controllers; + + +import dev.bhanu.productservice.Exception.NotFoundException; +import dev.bhanu.productservice.dtos.ExceptionDto; +import dev.bhanu.productservice.dtos.GenericProductDto; +import dev.bhanu.productservice.services.DbProductService; +import dev.bhanu.productservice.services.ProductService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/products") +public class ProductController { + + private ProductService productService; + private DbProductService dbProductService; + + + + @Autowired + public ProductController(@Qualifier("fakeStoreProductService") ProductService productService, DbProductService dbProductService){ + this.productService = productService; + this.dbProductService = dbProductService; + } + + @GetMapping("{id}") + public GenericProductDto getProductByid(@PathVariable("id") Long id) throws NotFoundException { + return productService.getProductById(id); + } + + @PostMapping + public GenericProductDto createProduct(@RequestBody GenericProductDto product){ + return productService.createProduct(product); +// return dbProductService.createProduct(product); + } + + @PutMapping("{id}") + public GenericProductDto updateProductById(@PathVariable("id") Long id, @RequestBody GenericProductDto product){ + return productService.updateProductById(id, product); + + } + + @GetMapping + public List getAllProducts(){ + return productService.getAllProduct(); + } + + @ExceptionHandler(NotFoundException.class) + public ResponseEntity handleNotFoundException(NotFoundException notFoundException){ + return new ResponseEntity(new ExceptionDto(notFoundException.getMessage(), HttpStatus.NOT_FOUND), HttpStatus.NOT_FOUND); + } + +} diff --git a/src/main/java/dev/bhanu/productservice/controllers/SearchController.java b/src/main/java/dev/bhanu/productservice/controllers/SearchController.java new file mode 100644 index 0000000..d4646c1 --- /dev/null +++ b/src/main/java/dev/bhanu/productservice/controllers/SearchController.java @@ -0,0 +1,35 @@ +package dev.bhanu.productservice.controllers; + +import dev.bhanu.productservice.dtos.SearchElasticDTO; +import dev.bhanu.productservice.dtos.SearchRequestDTO; +import dev.bhanu.productservice.dtos.SelfGenericProductDto; +import dev.bhanu.productservice.services.SearchService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/search") +public class SearchController { + private SearchService searchService; + + @Autowired + public SearchController(SearchService searchService){ + this.searchService = searchService; + } + + @PostMapping + @ResponseStatus(HttpStatus.OK) + public Page searchProducts(@RequestBody SearchRequestDTO searchRequestDTO){ + return searchService.searchProducts(searchRequestDTO); + } + + @PostMapping("/elastic") + @ResponseStatus(HttpStatus.OK) + public Page searchProductsByElastic(@RequestBody SearchElasticDTO searchRequestDTO){ + return searchService.SearchProductsByElastic(searchRequestDTO); + } + + +} diff --git a/src/main/java/dev/bhanu/productservice/controllers/SelfProductController.java b/src/main/java/dev/bhanu/productservice/controllers/SelfProductController.java new file mode 100644 index 0000000..c02cb6f --- /dev/null +++ b/src/main/java/dev/bhanu/productservice/controllers/SelfProductController.java @@ -0,0 +1,77 @@ +package dev.bhanu.productservice.controllers; + +import dev.bhanu.productservice.Exception.NotFoundException; +import dev.bhanu.productservice.dtos.SelfGenericProductDto; +import dev.bhanu.productservice.dtos.ProductDto; +import dev.bhanu.productservice.dtos.ExceptionDto; +import dev.bhanu.productservice.services.DbProductService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + + +@RestController +@RequestMapping("/dbproducts") +public class SelfProductController { + private DbProductService dbProductService; + + @Autowired + public SelfProductController(DbProductService dbProductService){ + this.dbProductService = dbProductService; + } + + @GetMapping("{uuid}") + public ProductDto getProductByid(@PathVariable("uuid") String uuid) throws NotFoundException { + return dbProductService.getProductById(uuid); + } + + @PostMapping + public ProductDto createProduct(@RequestBody SelfGenericProductDto product){ + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + Set roles = authentication.getAuthorities().stream() + .map(r -> r.getAuthority()).collect(Collectors.toSet()); + System.out.println(roles); + return dbProductService.createProduct(product); + } + + @PutMapping("{id}") + public ProductDto updateProductById(@PathVariable("id") String id, @RequestBody ProductDto product) throws NotFoundException { + return dbProductService.updateProductById(id, product); + + } + + @GetMapping + public ResponseEntity> getAllProducts(){ + + List productDtos = dbProductService.getAllProduct(); + return new ResponseEntity<>( + productDtos, + HttpStatus.OK + ); + } + + @GetMapping("/category/{name}") + public List getAllProductInCategory(@PathVariable("name") String categoryname) throws NotFoundException { + return dbProductService.getAllProductByCategory(categoryname); + } + + @DeleteMapping("{id}") + public void deleteProductById(@PathVariable("id") String id) throws NotFoundException { + dbProductService.deleteProductById(id); + } + + + + @ExceptionHandler(NotFoundException.class) + public ResponseEntity handleNotFoundException(NotFoundException notFoundException){ + return new ResponseEntity(new ExceptionDto(notFoundException.getMessage(), HttpStatus.NOT_FOUND), HttpStatus.NOT_FOUND); + } +} diff --git a/src/main/java/dev/naman/productservice/dtos/ExceptionDto.java b/src/main/java/dev/bhanu/productservice/dtos/ExceptionDto.java similarity index 54% rename from src/main/java/dev/naman/productservice/dtos/ExceptionDto.java rename to src/main/java/dev/bhanu/productservice/dtos/ExceptionDto.java index 8fe5a05..f396219 100644 --- a/src/main/java/dev/naman/productservice/dtos/ExceptionDto.java +++ b/src/main/java/dev/bhanu/productservice/dtos/ExceptionDto.java @@ -1,17 +1,18 @@ -package dev.naman.productservice.dtos; +package dev.bhanu.productservice.dtos; import lombok.Getter; import lombok.Setter; import org.springframework.http.HttpStatus; + @Getter @Setter public class ExceptionDto { - private HttpStatus errorCode; private String message; + private HttpStatus status; - public ExceptionDto(HttpStatus status, String message) { - this.errorCode = status; + public ExceptionDto(String message, HttpStatus status){ this.message = message; + this.status = status; } } diff --git a/src/main/java/dev/naman/productservice/thirdpartyclients/productsservice/fakestore/FakeStoreProductDto.java b/src/main/java/dev/bhanu/productservice/dtos/FakeStoreProductDto.java similarity index 57% rename from src/main/java/dev/naman/productservice/thirdpartyclients/productsservice/fakestore/FakeStoreProductDto.java rename to src/main/java/dev/bhanu/productservice/dtos/FakeStoreProductDto.java index 67846c9..9b1b186 100644 --- a/src/main/java/dev/naman/productservice/thirdpartyclients/productsservice/fakestore/FakeStoreProductDto.java +++ b/src/main/java/dev/bhanu/productservice/dtos/FakeStoreProductDto.java @@ -1,18 +1,15 @@ -package dev.naman.productservice.thirdpartyclients.productsservice.fakestore; +package dev.bhanu.productservice.dtos; -import dev.naman.productservice.models.Category; import lombok.Getter; import lombok.Setter; -@Setter @Getter +@Setter public class FakeStoreProductDto { private Long id; private String title; - private double price; + private String price; private String category; private String description; private String image; } - -// Break till 10:35 \ No newline at end of file diff --git a/src/main/java/dev/naman/productservice/dtos/GenericProductDto.java b/src/main/java/dev/bhanu/productservice/dtos/GenericProductDto.java similarity index 66% rename from src/main/java/dev/naman/productservice/dtos/GenericProductDto.java rename to src/main/java/dev/bhanu/productservice/dtos/GenericProductDto.java index ea81d6c..9e138b6 100644 --- a/src/main/java/dev/naman/productservice/dtos/GenericProductDto.java +++ b/src/main/java/dev/bhanu/productservice/dtos/GenericProductDto.java @@ -1,6 +1,6 @@ -package dev.naman.productservice.dtos; +package dev.bhanu.productservice.dtos; + -import dev.naman.productservice.models.Category; import lombok.Getter; import lombok.Setter; @@ -9,8 +9,8 @@ public class GenericProductDto { private Long id; private String title; + private String price; + private String category; private String description; private String image; - private String category; - private double price; } diff --git a/src/main/java/dev/bhanu/productservice/dtos/ProductDto.java b/src/main/java/dev/bhanu/productservice/dtos/ProductDto.java new file mode 100644 index 0000000..e13f6c5 --- /dev/null +++ b/src/main/java/dev/bhanu/productservice/dtos/ProductDto.java @@ -0,0 +1,17 @@ +package dev.bhanu.productservice.dtos; + +import dev.bhanu.productservice.models.Category; +import lombok.Getter; +import lombok.Setter; + +import java.util.UUID; + +@Getter +@Setter +public class ProductDto { + UUID uuid; + String title; + String image; + String price; + String category; +} diff --git a/src/main/java/dev/bhanu/productservice/dtos/SearchElasticDTO.java b/src/main/java/dev/bhanu/productservice/dtos/SearchElasticDTO.java new file mode 100644 index 0000000..97838a8 --- /dev/null +++ b/src/main/java/dev/bhanu/productservice/dtos/SearchElasticDTO.java @@ -0,0 +1,12 @@ +package dev.bhanu.productservice.dtos; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class SearchElasticDTO { + private String query; + private int pageNumber; + private int pageSize; +} diff --git a/src/main/java/dev/bhanu/productservice/dtos/SearchRequestDTO.java b/src/main/java/dev/bhanu/productservice/dtos/SearchRequestDTO.java new file mode 100644 index 0000000..88274d8 --- /dev/null +++ b/src/main/java/dev/bhanu/productservice/dtos/SearchRequestDTO.java @@ -0,0 +1,16 @@ +package dev.bhanu.productservice.dtos; + + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class SearchRequestDTO { + private String query; + private int pageNumber; + private int pageSize; + private List sortParameters; +} diff --git a/src/main/java/dev/naman/productservice/models/Price.java b/src/main/java/dev/bhanu/productservice/dtos/SelfCategoryDto.java similarity index 51% rename from src/main/java/dev/naman/productservice/models/Price.java rename to src/main/java/dev/bhanu/productservice/dtos/SelfCategoryDto.java index 2b0d1a3..b53188e 100644 --- a/src/main/java/dev/naman/productservice/models/Price.java +++ b/src/main/java/dev/bhanu/productservice/dtos/SelfCategoryDto.java @@ -1,17 +1,18 @@ -package dev.naman.productservice.models; +package dev.bhanu.productservice.dtos; + -import jakarta.persistence.Entity; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -@Entity +import java.util.UUID; + @Getter @Setter -@AllArgsConstructor @NoArgsConstructor -public class Price extends BaseModel { - String currency; - double price; +@AllArgsConstructor +public class SelfCategoryDto { + private UUID id; + private String name; } diff --git a/src/main/java/dev/bhanu/productservice/dtos/SelfGenericProductDto.java b/src/main/java/dev/bhanu/productservice/dtos/SelfGenericProductDto.java new file mode 100644 index 0000000..174b04f --- /dev/null +++ b/src/main/java/dev/bhanu/productservice/dtos/SelfGenericProductDto.java @@ -0,0 +1,23 @@ +package dev.bhanu.productservice.dtos; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.UUID; + + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class SelfGenericProductDto { + UUID uuid; + String title; + String description; + String image; + String price; + int inventory; + String category; +} diff --git a/src/main/java/dev/bhanu/productservice/dtos/SortParameter.java b/src/main/java/dev/bhanu/productservice/dtos/SortParameter.java new file mode 100644 index 0000000..8d17749 --- /dev/null +++ b/src/main/java/dev/bhanu/productservice/dtos/SortParameter.java @@ -0,0 +1,11 @@ +package dev.bhanu.productservice.dtos; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class SortParameter { + private String parameter; + private SortType sortType; +} diff --git a/src/main/java/dev/bhanu/productservice/dtos/SortType.java b/src/main/java/dev/bhanu/productservice/dtos/SortType.java new file mode 100644 index 0000000..0131b3a --- /dev/null +++ b/src/main/java/dev/bhanu/productservice/dtos/SortType.java @@ -0,0 +1,5 @@ +package dev.bhanu.productservice.dtos; + +public enum SortType { + ASC, DESC +} diff --git a/src/main/java/dev/bhanu/productservice/models/BaseModel.java b/src/main/java/dev/bhanu/productservice/models/BaseModel.java new file mode 100644 index 0000000..3953453 --- /dev/null +++ b/src/main/java/dev/bhanu/productservice/models/BaseModel.java @@ -0,0 +1,20 @@ +package dev.bhanu.productservice.models; + + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.GenericGenerator; + +import java.util.UUID; + +@Getter +@Setter +@MappedSuperclass +public class BaseModel { + @Id + @GeneratedValue(generator = "bhanu") + @GenericGenerator(name = "bhanu", strategy = "uuid2") + @Column(name="id", columnDefinition="binary(16)", nullable = false, updatable = false) + private UUID id; +} diff --git a/src/main/java/dev/bhanu/productservice/models/Category.java b/src/main/java/dev/bhanu/productservice/models/Category.java new file mode 100644 index 0000000..b631512 --- /dev/null +++ b/src/main/java/dev/bhanu/productservice/models/Category.java @@ -0,0 +1,34 @@ +package dev.bhanu.productservice.models; + +import jakarta.annotation.Nullable; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.OneToMany; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.hibernate.annotations.Fetch; +import org.springframework.data.annotation.Transient; +import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.annotations.Field; +import org.springframework.data.elasticsearch.annotations.FieldType; + +import java.util.List; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Entity +@Document(indexName = "products") +public class Category extends BaseModel{ + @Column + private String name; + + @Nullable + @OneToMany(mappedBy = "category", fetch = FetchType.LAZY) + @Transient + private List products; +} diff --git a/src/main/java/dev/bhanu/productservice/models/Product.java b/src/main/java/dev/bhanu/productservice/models/Product.java new file mode 100644 index 0000000..df92315 --- /dev/null +++ b/src/main/java/dev/bhanu/productservice/models/Product.java @@ -0,0 +1,34 @@ +package dev.bhanu.productservice.models; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.hibernate.annotations.Fetch; +import org.hibernate.annotations.FetchMode; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.data.annotation.Transient; +import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.annotations.Field; +import org.springframework.data.elasticsearch.annotations.FieldType; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Document(indexName = "products") +public class Product extends BaseModel{ + private String title; + private String price; + + @ManyToOne(cascade = {CascadeType.PERSIST}, fetch = FetchType.LAZY) + @JoinColumn(name = "category_id") + private Category category; + + private String description; + private String image; + + private int inventory; +} diff --git a/src/main/java/dev/bhanu/productservice/security/SpringSecurityConfig.java b/src/main/java/dev/bhanu/productservice/security/SpringSecurityConfig.java new file mode 100644 index 0000000..3e89179 --- /dev/null +++ b/src/main/java/dev/bhanu/productservice/security/SpringSecurityConfig.java @@ -0,0 +1,42 @@ +package dev.bhanu.productservice.security; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; +import org.springframework.security.config.Customizer; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; +import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationConverter; +import org.springframework.security.oauth2.server.resource.authentication.JwtGrantedAuthoritiesConverter; +import org.springframework.security.web.SecurityFilterChain; + +@Configuration +@EnableWebSecurity +public class SpringSecurityConfig { + @Bean + public SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) + throws Exception { + http + .csrf(AbstractHttpConfigurer::disable) + .authorizeHttpRequests((authorize) -> authorize +// .requestMatchers("/dbproducts").hasAuthority("ROLE_admin") + .anyRequest().permitAll() + ).oauth2ResourceServer((oauth2) -> oauth2 + .jwt(jwt -> jwt + .jwtAuthenticationConverter(jwtAuthenticationConverter()))); + + return http.build(); + } + + @Bean + public JwtAuthenticationConverter jwtAuthenticationConverter() { + JwtGrantedAuthoritiesConverter grantedAuthoritiesConverter = new JwtGrantedAuthoritiesConverter(); + grantedAuthoritiesConverter.setAuthoritiesClaimName("roles"); + grantedAuthoritiesConverter.setAuthorityPrefix("ROLE_"); + + JwtAuthenticationConverter jwtAuthenticationConverter = new JwtAuthenticationConverter(); + jwtAuthenticationConverter.setJwtGrantedAuthoritiesConverter(grantedAuthoritiesConverter); + return jwtAuthenticationConverter; + } +} \ No newline at end of file diff --git a/src/main/java/dev/bhanu/productservice/services/CategoryService.java b/src/main/java/dev/bhanu/productservice/services/CategoryService.java new file mode 100644 index 0000000..3cf6bd8 --- /dev/null +++ b/src/main/java/dev/bhanu/productservice/services/CategoryService.java @@ -0,0 +1,9 @@ +package dev.bhanu.productservice.services; + +import dev.bhanu.productservice.dtos.SelfCategoryDto; + +import java.util.List; + +public interface CategoryService { + public List getAllCategory(); +} diff --git a/src/main/java/dev/bhanu/productservice/services/DBCategoryService.java b/src/main/java/dev/bhanu/productservice/services/DBCategoryService.java new file mode 100644 index 0000000..53f68a7 --- /dev/null +++ b/src/main/java/dev/bhanu/productservice/services/DBCategoryService.java @@ -0,0 +1,40 @@ +package dev.bhanu.productservice.services; + +import dev.bhanu.productservice.Repository.CategoryRepository; +import dev.bhanu.productservice.dtos.SelfCategoryDto; +import dev.bhanu.productservice.models.Category; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service("DBCategoryService") +public class DBCategoryService implements CategoryService{ + + private CategoryRepository categoryRepository; + + @Autowired + public DBCategoryService(CategoryRepository categoryRepository){ + this.categoryRepository = categoryRepository; + } + @Override + public List getAllCategory() { + List categories = categoryRepository.getAllCategory(); + + List dbCategories = new ArrayList<>(); + + for(Category category: categories){ + dbCategories.add(convertCategoryToDBCategory(category)); + } + + return dbCategories; + } + + SelfCategoryDto convertCategoryToDBCategory(Category category){ + SelfCategoryDto selfCategoryDto = new SelfCategoryDto(); + selfCategoryDto.setName(category.getName()); + selfCategoryDto.setId(category.getId()); + return selfCategoryDto; + } +} diff --git a/src/main/java/dev/bhanu/productservice/services/DbProductService.java b/src/main/java/dev/bhanu/productservice/services/DbProductService.java new file mode 100644 index 0000000..59ce8c0 --- /dev/null +++ b/src/main/java/dev/bhanu/productservice/services/DbProductService.java @@ -0,0 +1,148 @@ +package dev.bhanu.productservice.services; + +import dev.bhanu.productservice.ElasticSearchRepository.ProductElasticSearchRepository; +import dev.bhanu.productservice.Exception.NotFoundException; +import dev.bhanu.productservice.Repository.CategoryRepository; +import dev.bhanu.productservice.Repository.ProductRepository; +import dev.bhanu.productservice.dtos.SelfGenericProductDto; +import dev.bhanu.productservice.dtos.ProductDto; +import dev.bhanu.productservice.models.Category; +import dev.bhanu.productservice.models.Product; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +@Service +public class DbProductService implements SelfProductService { + + private ProductRepository productRepository; + private CategoryRepository categoryRepository; + + private ProductElasticSearchRepository productElasticSearchRepository; + + @Autowired + DbProductService(ProductRepository productRepository, CategoryRepository categoryRepository, ProductElasticSearchRepository productElasticSearchRepository){ + this.productRepository = productRepository; + this.categoryRepository = categoryRepository; + this.productElasticSearchRepository = productElasticSearchRepository; + } + @Override + @Transactional + public ProductDto createProduct(SelfGenericProductDto product) { + Product product1 = new Product(); + + Optional optionalCategory = categoryRepository.getCategoryByName(product.getCategory()); + + if(!optionalCategory.isEmpty()){ + Category category = optionalCategory.get(); + product1.setCategory(category); + }else{ + Category category = new Category(); + category.setName(product.getCategory()); + product1.setCategory(category); + } + + + product1.setTitle(product.getTitle()); + product1.setDescription(product.getDescription()); + product1.setPrice(product.getPrice()); + product1.setImage(product.getImage()); +// product1.setCategory(category); + + + Product savedProduct = productRepository.save(product1); + productElasticSearchRepository.save(savedProduct); + return convertToDBProductDTO(savedProduct); + } + + @Override + public ProductDto getProductById(String uuid) throws NotFoundException { + return fetchProductByID(uuid); + } + + @Transactional + public ProductDto fetchProductByID(String uuid) throws NotFoundException { + Optional product = productRepository.findById(UUID.fromString(uuid)); + if(product.isEmpty()) throw new NotFoundException("product not found"); + Product product1 = product.get(); + Category category = product1.getCategory(); + product1.setCategory(category); + return convertToDBProductDTO(product1); + } + + @Override + public ProductDto updateProductById(String id, ProductDto product) throws NotFoundException { + Optional optionalProduct = productRepository.findById(UUID.fromString(id)); + if(optionalProduct.isEmpty()) throw new NotFoundException("product not found"); + + Product product1 = optionalProduct.get(); + + product1.setTitle(product.getTitle()); + product1.setPrice(product.getPrice()); + product1.setImage(product.getImage()); + + Product savedProduct = productRepository.save(product1); + return convertToDBProductDTO(savedProduct); + + } + + @Override + public List getAllProduct() { + List products = productRepository.findAllProducts(); + List productDtos = new ArrayList<>(); + + for(Product product1: products){ + productDtos.add(convertToDBProductDTO(product1)); + } + + + return productDtos; + } + + @Override + public List getAllProductByCategory(String name) throws NotFoundException{ + Optional optionalCategory = categoryRepository.getCategoryByName(name); + if(optionalCategory.isEmpty()) new NotFoundException("category not found"); + + Category category = optionalCategory.get(); + + List products = productRepository.findProductByCategory(category); + + List productDtos = new ArrayList<>(); + + for(Product product1: products){ + productDtos.add(convertToDBProductDTO(product1)); + } + + + return productDtos; + + + } + + @Override + public void deleteProductById(String id) throws NotFoundException { + Optional optionalProduct = productRepository.findById(UUID.fromString(id)); + if(optionalProduct.isEmpty()) throw new NotFoundException("product not found"); + productRepository.delete(optionalProduct.get()); + } + + private + + + ProductDto convertToDBProductDTO(Product product1){ + ProductDto productDto = new ProductDto(); + productDto.setTitle(product1.getTitle()); + productDto.setUuid(product1.getId()); + productDto.setPrice(product1.getPrice()); + productDto.setImage(product1.getImage()); + productDto.setCategory(product1.getCategory().getName()); + return productDto; + } + +} diff --git a/src/main/java/dev/bhanu/productservice/services/FakeStoreProductService.java b/src/main/java/dev/bhanu/productservice/services/FakeStoreProductService.java new file mode 100644 index 0000000..ac88972 --- /dev/null +++ b/src/main/java/dev/bhanu/productservice/services/FakeStoreProductService.java @@ -0,0 +1,128 @@ +package dev.bhanu.productservice.services; + +import dev.bhanu.productservice.Exception.NotFoundException; +import dev.bhanu.productservice.dtos.FakeStoreProductDto; +import dev.bhanu.productservice.dtos.GenericProductDto; +import dev.bhanu.productservice.models.Product; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.http.*; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +@Service("fakeStoreProductService") +public class FakeStoreProductService implements ProductService{ + + private RestTemplateBuilder restTemplateBuilder; + +// @Value("${fakestore.api.url}") + private String fakeStoreBaseURL; + +// @Value("${fakestore.product.url") + private String fakeStoreProductBaseURL; + + private String fakeStoreProductURL; + + private String fakeStoreSpecificProductURL; + + @Autowired + public FakeStoreProductService(@Value("${fakestore.api.url}") String fakeStoreBaseURL, @Value("${fakestore.product.api.url}") String fakeStoreProductBaseURL, RestTemplateBuilder restTemplateBuilder){ + this.fakeStoreProductURL = fakeStoreBaseURL + fakeStoreProductBaseURL; + this.fakeStoreSpecificProductURL = fakeStoreBaseURL + fakeStoreProductBaseURL + "/{id}"; + this.restTemplateBuilder = restTemplateBuilder; + } + @Override + public GenericProductDto getProductById(Long id) throws NotFoundException { + RestTemplate restTemplate = restTemplateBuilder.build(); + ResponseEntity response = restTemplate.getForEntity(fakeStoreSpecificProductURL, FakeStoreProductDto.class, id); + + FakeStoreProductDto fakeStoreProductDto = response.getBody(); + + if(fakeStoreProductDto == null) throw new NotFoundException("Product not found!!"); + + GenericProductDto product = new GenericProductDto(); + + product.setCategory(fakeStoreProductDto.getCategory()); + product.setTitle(fakeStoreProductDto.getTitle()); + product.setDescription(fakeStoreProductDto.getDescription()); + product.setImage(fakeStoreProductDto.getImage()); + product.setPrice(fakeStoreProductDto.getPrice()); + product.setId(fakeStoreProductDto.getId()); + + + return product; + } + + @Override + public GenericProductDto createProduct(GenericProductDto product){ + RestTemplate restTemplate = restTemplateBuilder.build(); + ResponseEntity response = restTemplate.postForEntity(fakeStoreSpecificProductURL, product, GenericProductDto.class); + return response.getBody(); + } + + @Override + public GenericProductDto updateProductById(Long id, GenericProductDto data){ + RestTemplate restTemplate = restTemplateBuilder.build(); + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + FakeStoreProductDto fakeStoreproduct = new FakeStoreProductDto(); + + fakeStoreproduct.setCategory(data.getCategory()); + fakeStoreproduct.setTitle(data.getTitle()); + fakeStoreproduct.setDescription(data.getDescription()); + fakeStoreproduct.setImage(data.getImage()); + fakeStoreproduct.setPrice(data.getPrice()); + fakeStoreproduct.setId(data.getId()); + + + HttpEntity requestEntity = new HttpEntity<>(fakeStoreproduct, headers); + + + ResponseEntity response = + restTemplate.exchange(fakeStoreSpecificProductURL, HttpMethod.PUT, requestEntity, FakeStoreProductDto.class, id); + + + FakeStoreProductDto fakeStoreProductDto = response.getBody(); + GenericProductDto product = new GenericProductDto(); + + product.setCategory(fakeStoreProductDto.getCategory()); + product.setTitle(fakeStoreProductDto.getTitle()); + product.setDescription(fakeStoreProductDto.getDescription()); + product.setImage(fakeStoreProductDto.getImage()); + product.setPrice(fakeStoreProductDto.getPrice()); + product.setId(fakeStoreProductDto.getId()); + + + return product; + } + + @Override + public List getAllProduct(){ + RestTemplate restTemplate = restTemplateBuilder.build(); + ResponseEntity response = restTemplate.getForEntity(fakeStoreProductURL, FakeStoreProductDto[].class); + + ArrayList product = new ArrayList<>(); + + for(FakeStoreProductDto fakeStoreProductDto: Arrays.stream(response.getBody()).toList()){ + GenericProductDto genericProductDto = new GenericProductDto(); + genericProductDto.setCategory(fakeStoreProductDto.getCategory()); + genericProductDto.setTitle(fakeStoreProductDto.getTitle()); + genericProductDto.setDescription(fakeStoreProductDto.getDescription()); + genericProductDto.setImage(fakeStoreProductDto.getImage()); + genericProductDto.setPrice(fakeStoreProductDto.getPrice()); + genericProductDto.setId(fakeStoreProductDto.getId()); + + product.add(genericProductDto); + } + + return product; + + } +} diff --git a/src/main/java/dev/bhanu/productservice/services/ProductService.java b/src/main/java/dev/bhanu/productservice/services/ProductService.java new file mode 100644 index 0000000..4e4a4db --- /dev/null +++ b/src/main/java/dev/bhanu/productservice/services/ProductService.java @@ -0,0 +1,22 @@ +package dev.bhanu.productservice.services; + +import dev.bhanu.productservice.Exception.NotFoundException; +import dev.bhanu.productservice.dtos.FakeStoreProductDto; +import dev.bhanu.productservice.dtos.GenericProductDto; +import dev.bhanu.productservice.models.Product; +import lombok.Getter; +import lombok.Setter; +import org.springframework.stereotype.Service; + +import java.util.List; + +public interface ProductService { + GenericProductDto createProduct(GenericProductDto product); + GenericProductDto getProductById(Long id) throws NotFoundException; + + GenericProductDto updateProductById(Long id, GenericProductDto product); + + List getAllProduct(); + + +} diff --git a/src/main/java/dev/bhanu/productservice/services/SearchService.java b/src/main/java/dev/bhanu/productservice/services/SearchService.java new file mode 100644 index 0000000..376b68d --- /dev/null +++ b/src/main/java/dev/bhanu/productservice/services/SearchService.java @@ -0,0 +1,78 @@ +package dev.bhanu.productservice.services; + +import dev.bhanu.productservice.ElasticSearchRepository.ProductElasticSearchRepository; +import dev.bhanu.productservice.Repository.ProductRepository; +import dev.bhanu.productservice.dtos.*; +import dev.bhanu.productservice.models.Product; +import org.hibernate.boot.model.source.spi.Sortable; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class SearchService { + private ProductRepository productRepository; + private ProductElasticSearchRepository productElasticSearchRepository; + + @Autowired + public SearchService(ProductRepository productRepository, ProductElasticSearchRepository productElasticSearchRepository) { + this.productRepository = productRepository; + this.productElasticSearchRepository = productElasticSearchRepository; + } + + public Page searchProducts(SearchRequestDTO searchRequestDTO) { + String query = searchRequestDTO.getQuery(); + int pageNumber = searchRequestDTO.getPageNumber(); + int pageSize = searchRequestDTO.getPageSize(); + List sortParameters = searchRequestDTO.getSortParameters(); + + Sort sort = null; + + for (SortParameter sortParameter : sortParameters) { + Sort curSort = Sort.by(Sort.Direction.fromString(String.valueOf(sortParameter.getSortType())), sortParameter.getParameter()); + if (sort == null) sort = curSort; + else sort.and(curSort); + } + + + Page products = productRepository.findByTitleContainingIgnoreCase(query, PageRequest.of(pageNumber, pageSize, sort)); + Page selfGenericProductDtos = products.map(product -> { + SelfGenericProductDto selfGenericProductDto = new SelfGenericProductDto(); + selfGenericProductDto.setUuid(product.getId()); + selfGenericProductDto.setInventory(product.getInventory()); + selfGenericProductDto.setDescription(product.getDescription()); + selfGenericProductDto.setTitle(product.getTitle()); + selfGenericProductDto.setPrice(product.getPrice()); + selfGenericProductDto.setCategory(product.getCategory().getName()); + return selfGenericProductDto; + }); + + return selfGenericProductDtos; + } + + public Page SearchProductsByElastic(SearchElasticDTO searchRequestDTO) { + String query = searchRequestDTO.getQuery(); + int pageNumber = searchRequestDTO.getPageNumber(); + int pageSize = searchRequestDTO.getPageSize(); + + Page products = productElasticSearchRepository.findByTitleOrDescriptionContainingIgnoreCase(query, query, PageRequest.of(pageNumber, pageSize)); + + Page selfGenericProductDtos = products.map(product -> { + SelfGenericProductDto selfGenericProductDto = new SelfGenericProductDto(); + selfGenericProductDto.setUuid(product.getId()); + selfGenericProductDto.setInventory(product.getInventory()); + selfGenericProductDto.setDescription(product.getDescription()); + selfGenericProductDto.setTitle(product.getTitle()); + selfGenericProductDto.setPrice(product.getPrice()); + selfGenericProductDto.setCategory(product.getCategory().getName()); + return selfGenericProductDto; + }); + + return selfGenericProductDtos; + } +} diff --git a/src/main/java/dev/bhanu/productservice/services/SelfProductService.java b/src/main/java/dev/bhanu/productservice/services/SelfProductService.java new file mode 100644 index 0000000..b7cf361 --- /dev/null +++ b/src/main/java/dev/bhanu/productservice/services/SelfProductService.java @@ -0,0 +1,20 @@ +package dev.bhanu.productservice.services; + +import dev.bhanu.productservice.Exception.NotFoundException; +import dev.bhanu.productservice.dtos.SelfGenericProductDto; +import dev.bhanu.productservice.dtos.ProductDto; + +import java.util.List; + +public interface SelfProductService { + ProductDto createProduct(SelfGenericProductDto product); + ProductDto getProductById(String id) throws NotFoundException; + + ProductDto updateProductById(String id, ProductDto product) throws NotFoundException; + + List getAllProduct(); + + List getAllProductByCategory(String name) throws NotFoundException; + + void deleteProductById(String id) throws NotFoundException; +} diff --git a/src/main/java/dev/naman/productservice/ProductserviceApplication.java b/src/main/java/dev/naman/productservice/ProductserviceApplication.java deleted file mode 100644 index 1620741..0000000 --- a/src/main/java/dev/naman/productservice/ProductserviceApplication.java +++ /dev/null @@ -1,119 +0,0 @@ -package dev.naman.productservice; - -import dev.naman.productservice.inheritancedemo.joinedtable.Mentor; -import dev.naman.productservice.inheritancedemo.joinedtable.MentorRepository; -import dev.naman.productservice.inheritancedemo.joinedtable.User; -import dev.naman.productservice.inheritancedemo.joinedtable.UserRepository; -import dev.naman.productservice.models.Category; -import dev.naman.productservice.models.Price; -import dev.naman.productservice.models.Product; -import dev.naman.productservice.repositories.CategoryRepository; -import dev.naman.productservice.repositories.PriceRepository; -import dev.naman.productservice.repositories.ProductRepository; -import jakarta.transaction.Transactional; -import org.hibernate.Hibernate; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -import java.util.List; -import java.util.Optional; -import java.util.UUID; - -@SpringBootApplication -public class ProductserviceApplication {// implements CommandLineRunner { - -// private MentorRepository mentorRepository; -// -// -// private UserRepository userRepository; -// private final ProductRepository productRepository; -// private final CategoryRepository categoryRepository; -// private final PriceRepository priceRepository; -// -// public ProductserviceApplication(@Qualifier("jt_mr") MentorRepository mentorRepository, -// @Qualifier("jt_ur") UserRepository userRepository, -// ProductRepository productRepository, -// CategoryRepository categoryRepository, -// PriceRepository priceRepository) { -// this.mentorRepository = mentorRepository; -// this.userRepository = userRepository; -// this.productRepository = productRepository; -// this.categoryRepository = categoryRepository; -// this.priceRepository = priceRepository; -// } - - public static void main(String[] args) { - SpringApplication.run(ProductserviceApplication.class, args); - } - -// @Transactional() -// @Override -// public void run(String... args) throws Exception { -//// Mentor mentor = new Mentor(); -//// mentor.setName("Naman"); -//// mentor.setEmail("Naman@scaler.com"); -//// mentor.setAverageRating(4.65); -//// mentorRepository.save(mentor); -//// -//// User user = new User(); -//// user.setName("Sarath"); -//// user.setEmail("sarathcool@yopmail.com"); -//// userRepository.save(user); -//// -//// List users = userRepository.findAll(); -//// for (User user1: users) { -//// System.out.println(user1); -//// } -// -// Category category = new Category(); -// category.setName("Apple Devices"); -//// Category savedCategory = categoryRepository.save(category); -// -// Price price = new Price("Rupee", 10); -//// Price savedPrice = priceRepository.save(price); -// -// Product product = new Product(); -// product.setTitle("iPhone 15 Pro"); -// product.setDescription("The best iPhone Ever"); -// product.setCategory(category); -// product.setPrice(price); -// -// productRepository.save(product); -// -// productRepository.deleteById(UUID.fromString("95672ed6-3127-4248-ae33-97a261c0a6f4")); -// -// System.out.println(productRepository.countAllByPrice_Currency("Rupee")); -// List products = productRepository.findAllByPrice_Currency("Rupee"); -//// Category category1 = categoryRepository.findById(UUID.fromString("5e6f679e-f326-44ae-b220-544b3822ab00")).get(); -//// System.out.println("Category name is: " + category1.getName()); -//// System.out.println("Printing all products in the category"); -////// Thread.sleep(1000); -//// -//// System.out.println(category1.getProducts().size()); -//// category1.getProducts().forEach( -//// product1 -> System.out.println(product1.getTitle()) -//// ); -//// -//// for (Product product1: category1.getProducts()) { -//// try { -//// System.out.println(product1.getTitle()); -//// } catch (Exception e) { -//// System.out.println(e.getMessage()); -//// } -//// } -// -// List products1 = productRepository.findAllByTitle("iPhone 15 Pro"); -// -// System.out.println("Fetching category b8f1f459-f9e9-4d3d-b115-f1f5267bd54f"); -// Thread.sleep(1000); -// Category category1 = categoryRepository.findById(UUID.fromString("b8f1f459-f9e9-4d3d-b115-f1f5267bd54f")).get(); -//// Category category1 = category1Optional.get(); -// -// System.out.println("Fetching products for category"); -// Thread.sleep(1000); -// List products11 = category1.getProducts(); -// } - -} diff --git a/src/main/java/dev/naman/productservice/controllers/CategoryController.java b/src/main/java/dev/naman/productservice/controllers/CategoryController.java deleted file mode 100644 index be875bb..0000000 --- a/src/main/java/dev/naman/productservice/controllers/CategoryController.java +++ /dev/null @@ -1,49 +0,0 @@ -package dev.naman.productservice.controllers; - -import dev.naman.productservice.dtos.GetProductTitlesRequestDto; -import dev.naman.productservice.dtos.ProductDto; -import dev.naman.productservice.models.Category; -import dev.naman.productservice.models.Product; -import dev.naman.productservice.services.CategoryService; -import org.springframework.web.bind.annotation.*; - -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -@RestController -@RequestMapping("/categories") -public class CategoryController { - private CategoryService categoryService; - - public CategoryController(CategoryService categoryService) { - this.categoryService = categoryService; - } - - @GetMapping("/{uuid}") - public List getCategory(@PathVariable("uuid") String uuid) { - List products = categoryService.getCategory(uuid).getProducts(); - - List productDtos = new ArrayList<>(); - - for (Product product: products) { - ProductDto productDto = new ProductDto(); - productDto.setDescription(product.getDescription()); - productDto.setTitle(product.getTitle()); - productDto.setImage(product.getImage()); - productDto.setPrice(product.getPrice()); - productDtos.add(productDto); -// productDto.se - } - - return productDtos; - } - - @GetMapping("/titles/") - public List getProductTitles(@RequestBody GetProductTitlesRequestDto requestDto) { - - List uuids = requestDto.getUuids(); - - return categoryService.getProductTitles(uuids); - } -} diff --git a/src/main/java/dev/naman/productservice/controllers/ProductController.java b/src/main/java/dev/naman/productservice/controllers/ProductController.java deleted file mode 100644 index 2602c25..0000000 --- a/src/main/java/dev/naman/productservice/controllers/ProductController.java +++ /dev/null @@ -1,73 +0,0 @@ -package dev.naman.productservice.controllers; - -import dev.naman.productservice.dtos.ExceptionDto; -import dev.naman.productservice.dtos.GenericProductDto; -import dev.naman.productservice.exceptions.NotFoundException; -import dev.naman.productservice.services.ProductService; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@RestController -@RequestMapping("/products") -public class ProductController { -// @Autowired - // field injection - private ProductService productService; - // ....; - // ...; - - - - // constructor injection -// @Autowired - public ProductController(ProductService productService) { - this.productService = productService; - } -// - - // setter injection -// @Autowired -// public void setProductService(ProductService productService) { -// this.productService = productService; -// } - - // GET /products {} - @GetMapping - public List getAllProducts() { - return productService.getAllProducts(); - } - - // localhost:8080/products/{id} - // localhost:8080/products/123 - @GetMapping("{id}") - public GenericProductDto getProductById(@PathVariable("id") Long id) throws NotFoundException { - GenericProductDto productDto = productService.getProductById(id); - if (productDto == null) { - // throw NotFoundException - } - return productDto; - } - - @DeleteMapping("{id}") - public ResponseEntity deleteProductById(@PathVariable("id") Long id) { - return new ResponseEntity<>( - productService.deleteProduct(id), - HttpStatus.OK - ); - } - - @PostMapping - public GenericProductDto createProduct(@RequestBody GenericProductDto product) { -// System.out.println(product.name); - return productService.createProduct(product); - } - - @PutMapping("{id}") - public void updateProductById() { - - } -} diff --git a/src/main/java/dev/naman/productservice/dtos/CategoryDto.java b/src/main/java/dev/naman/productservice/dtos/CategoryDto.java deleted file mode 100644 index fabb541..0000000 --- a/src/main/java/dev/naman/productservice/dtos/CategoryDto.java +++ /dev/null @@ -1,14 +0,0 @@ -package dev.naman.productservice.dtos; - -import lombok.Getter; -import lombok.Setter; - -import java.util.List; - -@Getter -@Setter -public class CategoryDto { - private String name; - - private List products; -} diff --git a/src/main/java/dev/naman/productservice/dtos/GetProductTitlesRequestDto.java b/src/main/java/dev/naman/productservice/dtos/GetProductTitlesRequestDto.java deleted file mode 100644 index bb61e86..0000000 --- a/src/main/java/dev/naman/productservice/dtos/GetProductTitlesRequestDto.java +++ /dev/null @@ -1,12 +0,0 @@ -package dev.naman.productservice.dtos; - -import lombok.Getter; -import lombok.Setter; - -import java.util.List; - -@Getter -@Setter -public class GetProductTitlesRequestDto { - private List uuids; -} diff --git a/src/main/java/dev/naman/productservice/dtos/ProductDto.java b/src/main/java/dev/naman/productservice/dtos/ProductDto.java deleted file mode 100644 index 9f2d39f..0000000 --- a/src/main/java/dev/naman/productservice/dtos/ProductDto.java +++ /dev/null @@ -1,25 +0,0 @@ -package dev.naman.productservice.dtos; - -import dev.naman.productservice.models.Category; -import dev.naman.productservice.models.Price; -import jakarta.persistence.CascadeType; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.OneToOne; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -public class ProductDto { - private String title; - - private String description; - - private String image; - // P : C - // => L to R: 1 : 1 - // => R to L: m : 1 - // => Ans: m : 1 - private Price price; -} diff --git a/src/main/java/dev/naman/productservice/exceptions/ControllerAdvices.java b/src/main/java/dev/naman/productservice/exceptions/ControllerAdvices.java deleted file mode 100644 index a1c2361..0000000 --- a/src/main/java/dev/naman/productservice/exceptions/ControllerAdvices.java +++ /dev/null @@ -1,32 +0,0 @@ -package dev.naman.productservice.exceptions; - -import dev.naman.productservice.dtos.ExceptionDto; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; - -@ControllerAdvice -public class ControllerAdvices { -// @ExceptionHandler(NotFoundException.class) -// private ResponseEntity handleNotFoundException( -// NotFoundException notFoundException -// ) { -// -// return new ResponseEntity( -// new ExceptionDto(HttpStatus.NOT_FOUND, notFoundException.getMessage()), -// HttpStatus.NOT_FOUND -// ); -// } -// -// @ExceptionHandler(ArrayIndexOutOfBoundsException.class) -// private ResponseEntity handleArrayIndexOutOfBound( -// ArrayIndexOutOfBoundsException notFoundException -// ) { -// -// return new ResponseEntity( -// new ExceptionDto(HttpStatus.NOT_FOUND, notFoundException.getMessage()), -// HttpStatus.NOT_FOUND -// ); -// } -} diff --git a/src/main/java/dev/naman/productservice/exceptions/NotFoundException.java b/src/main/java/dev/naman/productservice/exceptions/NotFoundException.java deleted file mode 100644 index 0986b0e..0000000 --- a/src/main/java/dev/naman/productservice/exceptions/NotFoundException.java +++ /dev/null @@ -1,12 +0,0 @@ -package dev.naman.productservice.exceptions; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(value = HttpStatus.NOT_FOUND) -public class NotFoundException extends Exception { - - public NotFoundException(String message) { - super(message); - } -} diff --git a/src/main/java/dev/naman/productservice/inheritancedemo/joinedtable/Mentor.java b/src/main/java/dev/naman/productservice/inheritancedemo/joinedtable/Mentor.java deleted file mode 100644 index 2e06842..0000000 --- a/src/main/java/dev/naman/productservice/inheritancedemo/joinedtable/Mentor.java +++ /dev/null @@ -1,14 +0,0 @@ -package dev.naman.productservice.inheritancedemo.joinedtable; - -import jakarta.persistence.Entity; -import jakarta.persistence.PrimaryKeyJoinColumn; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@Entity(name = "jt_mentor") -@PrimaryKeyJoinColumn(name = "user_id") -public class Mentor extends User { - private double averageRating; -} diff --git a/src/main/java/dev/naman/productservice/inheritancedemo/joinedtable/MentorRepository.java b/src/main/java/dev/naman/productservice/inheritancedemo/joinedtable/MentorRepository.java deleted file mode 100644 index 567c201..0000000 --- a/src/main/java/dev/naman/productservice/inheritancedemo/joinedtable/MentorRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package dev.naman.productservice.inheritancedemo.joinedtable; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository("jt_mr") -public interface MentorRepository -extends JpaRepository { - @Override - S save(S entity); -} diff --git a/src/main/java/dev/naman/productservice/inheritancedemo/joinedtable/Student.java b/src/main/java/dev/naman/productservice/inheritancedemo/joinedtable/Student.java deleted file mode 100644 index d327d8f..0000000 --- a/src/main/java/dev/naman/productservice/inheritancedemo/joinedtable/Student.java +++ /dev/null @@ -1,15 +0,0 @@ -package dev.naman.productservice.inheritancedemo.joinedtable; - -import jakarta.persistence.Entity; -import jakarta.persistence.PrimaryKeyJoinColumn; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@Entity(name = "jt_student") -@PrimaryKeyJoinColumn(name = "user_id") -public class Student extends User { - private double psp; - private double attendance; -} diff --git a/src/main/java/dev/naman/productservice/inheritancedemo/joinedtable/TA.java b/src/main/java/dev/naman/productservice/inheritancedemo/joinedtable/TA.java deleted file mode 100644 index 7e34534..0000000 --- a/src/main/java/dev/naman/productservice/inheritancedemo/joinedtable/TA.java +++ /dev/null @@ -1,14 +0,0 @@ -package dev.naman.productservice.inheritancedemo.joinedtable; - -import jakarta.persistence.Entity; -import jakarta.persistence.PrimaryKeyJoinColumn; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@Entity(name = "jt_ta") -@PrimaryKeyJoinColumn(name = "user_id") -public class TA extends User { - private double averageRating; -} diff --git a/src/main/java/dev/naman/productservice/inheritancedemo/joinedtable/User.java b/src/main/java/dev/naman/productservice/inheritancedemo/joinedtable/User.java deleted file mode 100644 index 5c1e921..0000000 --- a/src/main/java/dev/naman/productservice/inheritancedemo/joinedtable/User.java +++ /dev/null @@ -1,19 +0,0 @@ -package dev.naman.productservice.inheritancedemo.joinedtable; - -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; -import lombok.ToString; - -@Getter -@Setter -@ToString -@Entity(name = "jt_user") -@Inheritance(strategy = InheritanceType.JOINED) -public class User { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - private String name; - private String email; -} diff --git a/src/main/java/dev/naman/productservice/inheritancedemo/joinedtable/UserRepository.java b/src/main/java/dev/naman/productservice/inheritancedemo/joinedtable/UserRepository.java deleted file mode 100644 index 581462b..0000000 --- a/src/main/java/dev/naman/productservice/inheritancedemo/joinedtable/UserRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package dev.naman.productservice.inheritancedemo.joinedtable; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository("jt_ur") -public interface UserRepository -extends JpaRepository { - - @Override - S save(S entity); -} diff --git a/src/main/java/dev/naman/productservice/inheritancedemo/mappedsuperclass/Mentor.java b/src/main/java/dev/naman/productservice/inheritancedemo/mappedsuperclass/Mentor.java deleted file mode 100644 index 0a08459..0000000 --- a/src/main/java/dev/naman/productservice/inheritancedemo/mappedsuperclass/Mentor.java +++ /dev/null @@ -1,12 +0,0 @@ -package dev.naman.productservice.inheritancedemo.mappedsuperclass; - -import jakarta.persistence.Entity; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@Entity(name = "ms_mentor") -public class Mentor extends User { - private double averageRating; -} diff --git a/src/main/java/dev/naman/productservice/inheritancedemo/mappedsuperclass/Student.java b/src/main/java/dev/naman/productservice/inheritancedemo/mappedsuperclass/Student.java deleted file mode 100644 index a7b2989..0000000 --- a/src/main/java/dev/naman/productservice/inheritancedemo/mappedsuperclass/Student.java +++ /dev/null @@ -1,13 +0,0 @@ -package dev.naman.productservice.inheritancedemo.mappedsuperclass; - -import jakarta.persistence.Entity; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@Entity(name = "ms_student") -public class Student extends User { - private double psp; - private double attendance; -} diff --git a/src/main/java/dev/naman/productservice/inheritancedemo/mappedsuperclass/TA.java b/src/main/java/dev/naman/productservice/inheritancedemo/mappedsuperclass/TA.java deleted file mode 100644 index 735d058..0000000 --- a/src/main/java/dev/naman/productservice/inheritancedemo/mappedsuperclass/TA.java +++ /dev/null @@ -1,12 +0,0 @@ -package dev.naman.productservice.inheritancedemo.mappedsuperclass; - -import jakarta.persistence.Entity; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@Entity(name = "ms_ta") -public class TA extends User { - private double averageRating; -} diff --git a/src/main/java/dev/naman/productservice/inheritancedemo/mappedsuperclass/User.java b/src/main/java/dev/naman/productservice/inheritancedemo/mappedsuperclass/User.java deleted file mode 100644 index bd1bdfb..0000000 --- a/src/main/java/dev/naman/productservice/inheritancedemo/mappedsuperclass/User.java +++ /dev/null @@ -1,19 +0,0 @@ -package dev.naman.productservice.inheritancedemo.mappedsuperclass; - -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.MappedSuperclass; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@MappedSuperclass -public class User { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - private String name; - private String email; -} diff --git a/src/main/java/dev/naman/productservice/inheritancedemo/singletable/Mentor.java b/src/main/java/dev/naman/productservice/inheritancedemo/singletable/Mentor.java deleted file mode 100644 index 20424a3..0000000 --- a/src/main/java/dev/naman/productservice/inheritancedemo/singletable/Mentor.java +++ /dev/null @@ -1,14 +0,0 @@ -package dev.naman.productservice.inheritancedemo.singletable; - -import jakarta.persistence.DiscriminatorValue; -import jakarta.persistence.Entity; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@Entity(name = "st_mentor") -@DiscriminatorValue(value = "3") -public class Mentor extends User { - private double averageRating; -} diff --git a/src/main/java/dev/naman/productservice/inheritancedemo/singletable/MentorRepository.java b/src/main/java/dev/naman/productservice/inheritancedemo/singletable/MentorRepository.java deleted file mode 100644 index 1402125..0000000 --- a/src/main/java/dev/naman/productservice/inheritancedemo/singletable/MentorRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package dev.naman.productservice.inheritancedemo.singletable; - -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository("st_mr") -public interface MentorRepository -extends JpaRepository { - @Override - S save(S entity); -} diff --git a/src/main/java/dev/naman/productservice/inheritancedemo/singletable/Student.java b/src/main/java/dev/naman/productservice/inheritancedemo/singletable/Student.java deleted file mode 100644 index f711c1b..0000000 --- a/src/main/java/dev/naman/productservice/inheritancedemo/singletable/Student.java +++ /dev/null @@ -1,15 +0,0 @@ -package dev.naman.productservice.inheritancedemo.singletable; - -import jakarta.persistence.DiscriminatorValue; -import jakarta.persistence.Entity; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@Entity(name = "st_student") -@DiscriminatorValue(value = "1") -public class Student extends User { - private double psp; - private double attendance; -} diff --git a/src/main/java/dev/naman/productservice/inheritancedemo/singletable/TA.java b/src/main/java/dev/naman/productservice/inheritancedemo/singletable/TA.java deleted file mode 100644 index 6950eaa..0000000 --- a/src/main/java/dev/naman/productservice/inheritancedemo/singletable/TA.java +++ /dev/null @@ -1,14 +0,0 @@ -package dev.naman.productservice.inheritancedemo.singletable; - -import jakarta.persistence.DiscriminatorValue; -import jakarta.persistence.Entity; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@Entity(name = "st_ta") -@DiscriminatorValue(value = "2") -public class TA extends User { - private double averageRating; -} diff --git a/src/main/java/dev/naman/productservice/inheritancedemo/singletable/User.java b/src/main/java/dev/naman/productservice/inheritancedemo/singletable/User.java deleted file mode 100644 index d596463..0000000 --- a/src/main/java/dev/naman/productservice/inheritancedemo/singletable/User.java +++ /dev/null @@ -1,22 +0,0 @@ -package dev.naman.productservice.inheritancedemo.singletable; - -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@Entity(name = "st_user") -@Inheritance(strategy = InheritanceType.SINGLE_TABLE) -@DiscriminatorColumn( - name = "userType", - discriminatorType = DiscriminatorType.INTEGER -) -@DiscriminatorValue(value = "0") -public class User { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - private String name; - private String email; -} diff --git a/src/main/java/dev/naman/productservice/inheritancedemo/singletable/UserRepository.java b/src/main/java/dev/naman/productservice/inheritancedemo/singletable/UserRepository.java deleted file mode 100644 index cd4604e..0000000 --- a/src/main/java/dev/naman/productservice/inheritancedemo/singletable/UserRepository.java +++ /dev/null @@ -1,13 +0,0 @@ -package dev.naman.productservice.inheritancedemo.singletable; - -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository("st_ur") -public interface UserRepository -extends JpaRepository { - - @Override - S save(S entity); -} diff --git a/src/main/java/dev/naman/productservice/inheritancedemo/tableperclass/Mentor.java b/src/main/java/dev/naman/productservice/inheritancedemo/tableperclass/Mentor.java deleted file mode 100644 index df47423..0000000 --- a/src/main/java/dev/naman/productservice/inheritancedemo/tableperclass/Mentor.java +++ /dev/null @@ -1,13 +0,0 @@ -package dev.naman.productservice.inheritancedemo.tableperclass; - -import jakarta.persistence.DiscriminatorValue; -import jakarta.persistence.Entity; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@Entity(name = "tpc_mentor") -public class Mentor extends User { - private double averageRating; -} diff --git a/src/main/java/dev/naman/productservice/inheritancedemo/tableperclass/MentorRepository.java b/src/main/java/dev/naman/productservice/inheritancedemo/tableperclass/MentorRepository.java deleted file mode 100644 index 9c7dbe3..0000000 --- a/src/main/java/dev/naman/productservice/inheritancedemo/tableperclass/MentorRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package dev.naman.productservice.inheritancedemo.tableperclass; - -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository("tpc_mr") -public interface MentorRepository -extends JpaRepository { - @Override - S save(S entity); -} diff --git a/src/main/java/dev/naman/productservice/inheritancedemo/tableperclass/Student.java b/src/main/java/dev/naman/productservice/inheritancedemo/tableperclass/Student.java deleted file mode 100644 index ce25676..0000000 --- a/src/main/java/dev/naman/productservice/inheritancedemo/tableperclass/Student.java +++ /dev/null @@ -1,14 +0,0 @@ -package dev.naman.productservice.inheritancedemo.tableperclass; - -import jakarta.persistence.DiscriminatorValue; -import jakarta.persistence.Entity; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@Entity(name = "tpc_student") -public class Student extends User { - private double psp; - private double attendance; -} diff --git a/src/main/java/dev/naman/productservice/inheritancedemo/tableperclass/TA.java b/src/main/java/dev/naman/productservice/inheritancedemo/tableperclass/TA.java deleted file mode 100644 index da42ce9..0000000 --- a/src/main/java/dev/naman/productservice/inheritancedemo/tableperclass/TA.java +++ /dev/null @@ -1,13 +0,0 @@ -package dev.naman.productservice.inheritancedemo.tableperclass; - -import jakarta.persistence.DiscriminatorValue; -import jakarta.persistence.Entity; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@Entity(name = "tpc_ta") -public class TA extends User { - private double averageRating; -} diff --git a/src/main/java/dev/naman/productservice/inheritancedemo/tableperclass/User.java b/src/main/java/dev/naman/productservice/inheritancedemo/tableperclass/User.java deleted file mode 100644 index 3d9b3d4..0000000 --- a/src/main/java/dev/naman/productservice/inheritancedemo/tableperclass/User.java +++ /dev/null @@ -1,21 +0,0 @@ -package dev.naman.productservice.inheritancedemo.tableperclass; - -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; -import lombok.ToString; - -import java.util.UUID; - -@Getter -@Setter -@ToString -@Entity(name = "tpc_user") -@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) -public class User { - @Id -// @GeneratedValue(strategy = GenerationType.TABLE, generator="course") - private UUID id; - private String name; - private String email; -} diff --git a/src/main/java/dev/naman/productservice/inheritancedemo/tableperclass/UserRepository.java b/src/main/java/dev/naman/productservice/inheritancedemo/tableperclass/UserRepository.java deleted file mode 100644 index 397d9ca..0000000 --- a/src/main/java/dev/naman/productservice/inheritancedemo/tableperclass/UserRepository.java +++ /dev/null @@ -1,13 +0,0 @@ -package dev.naman.productservice.inheritancedemo.tableperclass; - -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository("tpc_ur") -public interface UserRepository -extends JpaRepository { - - @Override - S save(S entity); -} diff --git a/src/main/java/dev/naman/productservice/models/BaseModel.java b/src/main/java/dev/naman/productservice/models/BaseModel.java deleted file mode 100644 index c8ada58..0000000 --- a/src/main/java/dev/naman/productservice/models/BaseModel.java +++ /dev/null @@ -1,16 +0,0 @@ -package dev.naman.productservice.models; - -import jakarta.persistence.*; -import org.hibernate.annotations.GenericGenerator; -import org.hibernate.id.factory.spi.GenerationTypeStrategy; - -import java.util.UUID; - -@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; -} diff --git a/src/main/java/dev/naman/productservice/models/Category.java b/src/main/java/dev/naman/productservice/models/Category.java deleted file mode 100644 index 4fd8f7f..0000000 --- a/src/main/java/dev/naman/productservice/models/Category.java +++ /dev/null @@ -1,36 +0,0 @@ -package dev.naman.productservice.models; - -import jakarta.persistence.*; -import lombok.*; -import org.hibernate.annotations.Fetch; -import org.hibernate.annotations.FetchMode; - -import java.util.ArrayList; -import java.util.List; - -@Entity -@Getter -@Setter -@AllArgsConstructor -@NoArgsConstructor -public class Category extends BaseModel { - @Column - private String name; - - @OneToMany(mappedBy = "category") - @Fetch(FetchMode.SELECT) - private List products = new ArrayList<>(); - - // this is the same relation being mapped by category attribute in the other (Product) class -} -// class Group { -// m:m -// List members; -// m:m -// List admins; -// -// 1----> 1 -// m<---- 1 -// m : 1 -// User creator; -// } \ No newline at end of file diff --git a/src/main/java/dev/naman/productservice/models/Order.java b/src/main/java/dev/naman/productservice/models/Order.java deleted file mode 100644 index 9ec7d46..0000000 --- a/src/main/java/dev/naman/productservice/models/Order.java +++ /dev/null @@ -1,21 +0,0 @@ -package dev.naman.productservice.models; - -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; - -import java.util.List; - -@Entity(name = "orders") -@Getter -@Setter -public class Order extends BaseModel { - - @ManyToMany() - @JoinTable( - name = "product_orders", - joinColumns = @JoinColumn(name = "order_id"), - inverseJoinColumns = @JoinColumn(name = "product_id") - ) - private List product; -} diff --git a/src/main/java/dev/naman/productservice/models/Product.java b/src/main/java/dev/naman/productservice/models/Product.java deleted file mode 100644 index ad6621b..0000000 --- a/src/main/java/dev/naman/productservice/models/Product.java +++ /dev/null @@ -1,34 +0,0 @@ -package dev.naman.productservice.models; - -import jakarta.annotation.Nullable; -import jakarta.persistence.*; -import lombok.*; -import org.hibernate.annotations.Fetch; -import org.hibernate.annotations.FetchMode; - -@Entity -@Getter -@Setter -@NoArgsConstructor -@AllArgsConstructor -public class Product extends BaseModel { - - private String title; - - private String description; - - private String image; - // P : C - // => L to R: 1 : 1 - // => R to L: m : 1 - // => Ans: m : 1 - @ManyToOne(cascade = {CascadeType.PERSIST}) - @JoinColumn(name = "category") - private Category category; - - @OneToOne(cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, fetch = FetchType.LAZY) -// @Fetch(FetchMode.JOIN) - private Price price; - private int inventoryCount; -// 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 deleted file mode 100644 index 6521d4a..0000000 --- a/src/main/java/dev/naman/productservice/repositories/CategoryRepository.java +++ /dev/null @@ -1,19 +0,0 @@ -package dev.naman.productservice.repositories; - -import dev.naman.productservice.models.Category; -import org.springframework.context.annotation.Lazy; -import org.springframework.data.jpa.repository.JpaRepository; - -import java.util.List; -import java.util.Optional; -import java.util.UUID; - -@Lazy -public interface CategoryRepository -extends JpaRepository { - - Optional findById(UUID uuid); - - @Override - List findAllById(Iterable uuids); -} diff --git a/src/main/java/dev/naman/productservice/repositories/CustomQueries.java b/src/main/java/dev/naman/productservice/repositories/CustomQueries.java deleted file mode 100644 index 161151e..0000000 --- a/src/main/java/dev/naman/productservice/repositories/CustomQueries.java +++ /dev/null @@ -1,6 +0,0 @@ -package dev.naman.productservice.repositories; - -public interface CustomQueries { - String FIND_ALL_BY_TITLE = "select * from product join product_orders " + - "on product.id = product_orders.product_id where title = :naman"; -} diff --git a/src/main/java/dev/naman/productservice/repositories/PriceRepository.java b/src/main/java/dev/naman/productservice/repositories/PriceRepository.java deleted file mode 100644 index bd06799..0000000 --- a/src/main/java/dev/naman/productservice/repositories/PriceRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package dev.naman.productservice.repositories; - -import dev.naman.productservice.models.Price; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface PriceRepository -extends JpaRepository { -} diff --git a/src/main/java/dev/naman/productservice/repositories/ProductRepository.java b/src/main/java/dev/naman/productservice/repositories/ProductRepository.java deleted file mode 100644 index c2bd45c..0000000 --- a/src/main/java/dev/naman/productservice/repositories/ProductRepository.java +++ /dev/null @@ -1,47 +0,0 @@ -package dev.naman.productservice.repositories; - -import dev.naman.productservice.models.Category; -import dev.naman.productservice.models.Product; -import org.springframework.data.domain.Example; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.FluentQuery; -import org.springframework.stereotype.Repository; - -import java.util.List; -import java.util.UUID; -import java.util.function.Function; - -@Repository -public interface ProductRepository -extends JpaRepository { - - Product findByTitleEquals(String title); - - Product findByTitleEqualsAndPrice_PriceOrderByPrice_price(String title, double price); - - List findAllByPrice_Currency(String currency); - - @Override - void delete(Product entity); - - long countAllByPrice_Currency(String currency); - - - List findAllByTitleLike(String titleRegex); - - List readAllByTitleLike(String titleRegex); - - - List findAllByCategoryIn(List categories); - - // @Query("select Product from Product where Product .category.uuid in :uuids") -// List findAllByCategoryIn(List uuids); - - - @Query(value = CustomQueries.FIND_ALL_BY_TITLE, nativeQuery = true) - List findAllByTitle(String naman); - -// @Query("select Product from Product where Product.price.currency = :currency and Product.title = :naman") -// List doSomething(String naman, String currency); -} diff --git a/src/main/java/dev/naman/productservice/services/CategoryService.java b/src/main/java/dev/naman/productservice/services/CategoryService.java deleted file mode 100644 index 91d2912..0000000 --- a/src/main/java/dev/naman/productservice/services/CategoryService.java +++ /dev/null @@ -1,10 +0,0 @@ -package dev.naman.productservice.services; - -import dev.naman.productservice.models.Category; - -import java.util.List; - -public interface CategoryService { - Category getCategory(String uuid); - List getProductTitles(List categoryUUIDs); -} diff --git a/src/main/java/dev/naman/productservice/services/CategoryServiceImpl.java b/src/main/java/dev/naman/productservice/services/CategoryServiceImpl.java deleted file mode 100644 index b167a55..0000000 --- a/src/main/java/dev/naman/productservice/services/CategoryServiceImpl.java +++ /dev/null @@ -1,79 +0,0 @@ -package dev.naman.productservice.services; - -import dev.naman.productservice.models.Category; -import dev.naman.productservice.models.Product; -import dev.naman.productservice.repositories.CategoryRepository; -import dev.naman.productservice.repositories.ProductRepository; -import org.springframework.stereotype.Service; -import org.springframework.web.bind.annotation.RequestBody; - -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.UUID; - -@Service -public class CategoryServiceImpl implements CategoryService { - private CategoryRepository categoryRepository; - private final ProductRepository productRepository; - - public CategoryServiceImpl(CategoryRepository categoryRepository, - ProductRepository productRepository) { - this.categoryRepository = categoryRepository; - this.productRepository = productRepository; - } - - @Override - public Category getCategory(String uuid) { - Optional categoryOptional = categoryRepository.findById(UUID.fromString(uuid)); - - if (categoryOptional.isEmpty()) { - return null; - } - - Category category = categoryOptional.get(); - - List products = category.getProducts(); - - - return category; - } - - public List getProductTitles(List categoryUUIDs) { - List uuids = new ArrayList<>(); - - for (String uuid: categoryUUIDs) { - uuids.add(UUID.fromString(uuid)); - } -// -// List categories = categoryRepository.findAllById(uuids); -// -// -// List titles = new ArrayList<>(); -// -// categories.forEach( -// category -> { -// category.getProducts().forEach( -// product -> { -// titles.add(product.getTitle()); -// } -// ); -// } -// ); -// -// -// return titles; - - List categories = categoryRepository.findAllById(uuids); - - List products = productRepository.findAllByCategoryIn(categories); - - List titles = new ArrayList<>(); - - for (Product p: products) { - titles.add(p.getTitle()); - } - - return titles; - } -} diff --git a/src/main/java/dev/naman/productservice/services/FakeStoreProductService.java b/src/main/java/dev/naman/productservice/services/FakeStoreProductService.java deleted file mode 100644 index ceb58af..0000000 --- a/src/main/java/dev/naman/productservice/services/FakeStoreProductService.java +++ /dev/null @@ -1,63 +0,0 @@ -package dev.naman.productservice.services; - -import dev.naman.productservice.dtos.GenericProductDto; -import dev.naman.productservice.exceptions.NotFoundException; -import dev.naman.productservice.thirdpartyclients.productsservice.fakestore.FakeStoreProductDto; -import dev.naman.productservice.thirdpartyclients.productsservice.fakestore.FakeStoryProductServiceClient; -import org.springframework.context.annotation.Primary; -import org.springframework.stereotype.Component; -import org.springframework.stereotype.Repository; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; - - -@Repository("fakeStoreProductService") -public class FakeStoreProductService implements ProductService { - - private FakeStoryProductServiceClient fakeStoryProductServiceClient; - - private GenericProductDto convertFakeStoreProductIntoGenericProduct(FakeStoreProductDto fakeStoreProductDto) { - - GenericProductDto product = new GenericProductDto(); - product.setId(fakeStoreProductDto.getId()); - product.setImage(fakeStoreProductDto.getImage()); - product.setDescription(fakeStoreProductDto.getDescription()); - product.setTitle(fakeStoreProductDto.getTitle()); - product.setPrice(fakeStoreProductDto.getPrice()); - product.setCategory(fakeStoreProductDto.getCategory()); - - return product; - } - - public FakeStoreProductService(FakeStoryProductServiceClient fakeStoryProductServiceClient) { - this.fakeStoryProductServiceClient = fakeStoryProductServiceClient; - } - - - @Override - public GenericProductDto createProduct(GenericProductDto product) { - return convertFakeStoreProductIntoGenericProduct(fakeStoryProductServiceClient.createProduct(product)); - } - - @Override - public GenericProductDto getProductById(Long id) throws NotFoundException { - return convertFakeStoreProductIntoGenericProduct(fakeStoryProductServiceClient.getProductById(id)); - } - - @Override - public List getAllProducts() { - List genericProductDtos = new ArrayList<>(); - - for (FakeStoreProductDto fakeStoreProductDto: fakeStoryProductServiceClient.getAllProducts()) { - genericProductDtos.add(convertFakeStoreProductIntoGenericProduct(fakeStoreProductDto)); - } - return genericProductDtos; - } - - @Override - public GenericProductDto deleteProduct(Long id) { - return convertFakeStoreProductIntoGenericProduct(fakeStoryProductServiceClient.deleteProduct(id)); - } -} diff --git a/src/main/java/dev/naman/productservice/services/ProductService.java b/src/main/java/dev/naman/productservice/services/ProductService.java deleted file mode 100644 index bc5eb10..0000000 --- a/src/main/java/dev/naman/productservice/services/ProductService.java +++ /dev/null @@ -1,17 +0,0 @@ -package dev.naman.productservice.services; - -import dev.naman.productservice.dtos.GenericProductDto; -import dev.naman.productservice.exceptions.NotFoundException; - -import java.util.List; - -public interface ProductService { - - GenericProductDto createProduct(GenericProductDto product); - - GenericProductDto getProductById(Long id) throws NotFoundException; - - List getAllProducts(); - - GenericProductDto deleteProduct(Long id); -} diff --git a/src/main/java/dev/naman/productservice/services/SelfProductServiceImpl.java b/src/main/java/dev/naman/productservice/services/SelfProductServiceImpl.java deleted file mode 100644 index a50d666..0000000 --- a/src/main/java/dev/naman/productservice/services/SelfProductServiceImpl.java +++ /dev/null @@ -1,42 +0,0 @@ -package dev.naman.productservice.services; - -import dev.naman.productservice.dtos.GenericProductDto; -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; - - -@Primary -@Service("selfProductServiceImpl") -public class SelfProductServiceImpl implements ProductService { - private ProductRepository productRepository; - - public SelfProductServiceImpl(ProductRepository productRepository) { - this.productRepository = productRepository; - } - - @Override - public GenericProductDto getProductById(Long id) { - - - return new GenericProductDto(); - } - - @Override - public GenericProductDto createProduct(GenericProductDto product) { - return null; - } - - @Override - public List getAllProducts() { - return null; - } - - @Override - public GenericProductDto deleteProduct(Long id) { - return null; - } -} diff --git a/src/main/java/dev/naman/productservice/thirdpartyclients/productsservice/fakestore/FakeStoryProductServiceClient.java b/src/main/java/dev/naman/productservice/thirdpartyclients/productsservice/fakestore/FakeStoryProductServiceClient.java deleted file mode 100644 index 6af4a08..0000000 --- a/src/main/java/dev/naman/productservice/thirdpartyclients/productsservice/fakestore/FakeStoryProductServiceClient.java +++ /dev/null @@ -1,97 +0,0 @@ -package dev.naman.productservice.thirdpartyclients.productsservice.fakestore; - -import dev.naman.productservice.dtos.GenericProductDto; -import dev.naman.productservice.exceptions.NotFoundException; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.web.client.RestTemplateBuilder; -import org.springframework.http.HttpMethod; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; -import org.springframework.web.client.RequestCallback; -import org.springframework.web.client.ResponseExtractor; -import org.springframework.web.client.RestTemplate; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -/*** - * Wrapper over FakeStore API - */ -@Service -public class FakeStoryProductServiceClient { - private RestTemplateBuilder restTemplateBuilder; - - - @Value("${fakestore.api.url}") - private String fakeStoreApiUrl; - - @Value("${fakestore.api.paths.product}") - private String fakeStoreProductsApiPath; - - private String specificProductRequestUrl ; - private String productRequestsBaseUrl ; - - public FakeStoryProductServiceClient(RestTemplateBuilder restTemplateBuilder, - @Value("${fakestore.api.url}") String fakeStoreApiUrl, - @Value("${fakestore.api.paths.product}") String fakeStoreProductsApiPath) { - this.restTemplateBuilder = restTemplateBuilder; - this.productRequestsBaseUrl = fakeStoreApiUrl + fakeStoreProductsApiPath; - this.specificProductRequestUrl = fakeStoreApiUrl + fakeStoreProductsApiPath + "/{id}"; - } - - - public FakeStoreProductDto createProduct(GenericProductDto product) { - RestTemplate restTemplate = restTemplateBuilder.build(); - ResponseEntity response = restTemplate.postForEntity( - productRequestsBaseUrl, product, FakeStoreProductDto.class - ); - - return response.getBody(); - } - - public FakeStoreProductDto getProductById(Long id) throws NotFoundException { -// FakeStoreProductService fakeStoreProductService = new FakeStoreProductService(); - RestTemplate restTemplate = restTemplateBuilder.build(); - ResponseEntity response = - restTemplate.getForEntity(specificProductRequestUrl, FakeStoreProductDto.class, id); - - FakeStoreProductDto fakeStoreProductDto = response.getBody(); - - if (fakeStoreProductDto == null) { - throw new NotFoundException("Product with id: " + id + " doesn't exist."); -// return null; - } - -// null == null - -// response.getStatusCode() - - return fakeStoreProductDto; -// return null; - } - - public List getAllProducts() { - RestTemplate restTemplate = restTemplateBuilder.build(); - - ResponseEntity response = - restTemplate.getForEntity(productRequestsBaseUrl, FakeStoreProductDto[].class); - - List answer = new ArrayList<>(); - - return Arrays.stream(response.getBody()).toList(); - } - - public FakeStoreProductDto deleteProduct(Long id) { - RestTemplate restTemplate = restTemplateBuilder.build(); - - - RequestCallback requestCallback = restTemplate.acceptHeaderRequestCallback(FakeStoreProductDto.class); - ResponseExtractor> responseExtractor = - restTemplate.responseEntityExtractor(FakeStoreProductDto.class); - ResponseEntity response = restTemplate.execute(specificProductRequestUrl, HttpMethod.DELETE, - requestCallback, responseExtractor, id); - - return response.getBody(); - } -} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index d032b9b..e889503 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,20 +1,12 @@ -productservice.type=fakeStoreProductService -ayush.goyal=fakeStoreProductService -naman.bhalla=abc -server.port=3000 -# hashmap key:value - - -# Fakestore Config Values fakestore.api.url=https://fakestoreapi.com -fakestore.api.paths.product=/products - -server.error.include-stacktrace=never - -spring.jpa.hibernate.ddl-auto=validate -spring.datasource.url=jdbc:mysql://localhost:3306/sep23productservice -spring.datasource.username=sep23productservice +fakestore.product.api.url=/products +spring.jpa.hibernate.ddl-auto=update +spring.datasource.url=jdbc:mysql://localhost:3306/dbtest +spring.datasource.username=root +spring.datasource.password=Root@0123 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.show-sql=true -#logging.level.org.hibernate.SQL=DEBUG -#logging.level.org.hibernate.type=TRACE +spring.security.oauth2.resourceserver.jwt.issuer-uri=http://localhost:9000 +logging.level.org.springframework.security=trace +spring.elasticsearch.uris=http://localhost:9200 +spring.data.elasticsearch.repositories.enabled=true diff --git a/src/main/resources/db/migration/V1__init_db.sql b/src/main/resources/db/migration/V1__init_db.sql deleted file mode 100644 index 4056c0f..0000000 --- a/src/main/resources/db/migration/V1__init_db.sql +++ /dev/null @@ -1,164 +0,0 @@ -CREATE TABLE category -( - id BINARY(16) NOT NULL, - name VARCHAR(255) NULL, - CONSTRAINT pk_category PRIMARY KEY (id) -); - -CREATE TABLE jt_mentor -( - user_id BIGINT NOT NULL, - average_rating DOUBLE NOT NULL, - CONSTRAINT pk_jt_mentor PRIMARY KEY (user_id) -); - -CREATE TABLE jt_student -( - user_id BIGINT NOT NULL, - psp DOUBLE NOT NULL, - attendance DOUBLE NOT NULL, - CONSTRAINT pk_jt_student PRIMARY KEY (user_id) -); - -CREATE TABLE jt_ta -( - user_id BIGINT NOT NULL, - average_rating DOUBLE NOT NULL, - CONSTRAINT pk_jt_ta PRIMARY KEY (user_id) -); - -CREATE TABLE jt_user -( - id BIGINT AUTO_INCREMENT NOT NULL, - name VARCHAR(255) NULL, - email VARCHAR(255) NULL, - CONSTRAINT pk_jt_user PRIMARY KEY (id) -); - -CREATE TABLE ms_mentor -( - id BIGINT AUTO_INCREMENT NOT NULL, - name VARCHAR(255) NULL, - email VARCHAR(255) NULL, - average_rating DOUBLE NOT NULL, - CONSTRAINT pk_ms_mentor PRIMARY KEY (id) -); - -CREATE TABLE ms_student -( - id BIGINT AUTO_INCREMENT NOT NULL, - name VARCHAR(255) NULL, - email VARCHAR(255) NULL, - psp DOUBLE NOT NULL, - attendance DOUBLE NOT NULL, - CONSTRAINT pk_ms_student PRIMARY KEY (id) -); - -CREATE TABLE ms_ta -( - id BIGINT AUTO_INCREMENT NOT NULL, - name VARCHAR(255) NULL, - email VARCHAR(255) NULL, - average_rating DOUBLE NOT NULL, - CONSTRAINT pk_ms_ta PRIMARY KEY (id) -); - -CREATE TABLE orders -( - id BINARY(16) NOT NULL, - CONSTRAINT pk_orders PRIMARY KEY (id) -); - -CREATE TABLE price -( - id BINARY(16) NOT NULL, - currency VARCHAR(255) NULL, - price DOUBLE NOT NULL, - CONSTRAINT pk_price PRIMARY KEY (id) -); - -CREATE TABLE product -( - id BINARY(16) NOT NULL, - title VARCHAR(255) NULL, - `description` VARCHAR(255) NULL, - image VARCHAR(255) NULL, - category BINARY(16) NULL, - price_id BINARY(16) NULL, - CONSTRAINT pk_product PRIMARY KEY (id) -); - -CREATE TABLE product_orders -( - order_id BINARY(16) NOT NULL, - product_id BINARY(16) NOT NULL -); - -CREATE TABLE st_user -( - id BIGINT AUTO_INCREMENT NOT NULL, - user_type INT NULL, - name VARCHAR(255) NULL, - email VARCHAR(255) NULL, - average_rating DOUBLE NOT NULL, - psp DOUBLE NOT NULL, - attendance DOUBLE NOT NULL, - CONSTRAINT pk_st_user PRIMARY KEY (id) -); - -CREATE TABLE tpc_mentor -( - id BINARY(16) NOT NULL, - name VARCHAR(255) NULL, - email VARCHAR(255) NULL, - average_rating DOUBLE NOT NULL, - CONSTRAINT pk_tpc_mentor PRIMARY KEY (id) -); - -CREATE TABLE tpc_student -( - id BINARY(16) NOT NULL, - name VARCHAR(255) NULL, - email VARCHAR(255) NULL, - psp DOUBLE NOT NULL, - attendance DOUBLE NOT NULL, - CONSTRAINT pk_tpc_student PRIMARY KEY (id) -); - -CREATE TABLE tpc_ta -( - id BINARY(16) NOT NULL, - name VARCHAR(255) NULL, - email VARCHAR(255) NULL, - average_rating DOUBLE NOT NULL, - CONSTRAINT pk_tpc_ta PRIMARY KEY (id) -); - -CREATE TABLE tpc_user -( - id BINARY(16) NOT NULL, - name VARCHAR(255) NULL, - email VARCHAR(255) NULL, - CONSTRAINT pk_tpc_user PRIMARY KEY (id) -); - -ALTER TABLE jt_mentor - ADD CONSTRAINT FK_JT_MENTOR_ON_USER FOREIGN KEY (user_id) REFERENCES jt_user (id); - -ALTER TABLE jt_student - ADD CONSTRAINT FK_JT_STUDENT_ON_USER FOREIGN KEY (user_id) REFERENCES jt_user (id); - -ALTER TABLE jt_ta - ADD CONSTRAINT FK_JT_TA_ON_USER FOREIGN KEY (user_id) REFERENCES jt_user (id); - -ALTER TABLE product - ADD CONSTRAINT FK_PRODUCT_ON_CATEGORY FOREIGN KEY (category) REFERENCES category (id); - -ALTER TABLE product - ADD CONSTRAINT FK_PRODUCT_ON_PRICE FOREIGN KEY (price_id) REFERENCES price (id); - -ALTER TABLE product_orders - ADD CONSTRAINT fk_proord_on_order FOREIGN KEY (order_id) REFERENCES orders (id); - -ALTER TABLE product_orders - ADD CONSTRAINT fk_proord_on_product FOREIGN KEY (product_id) REFERENCES product (id); \ No newline at end of file diff --git a/src/main/resources/db/migration/V2__add_something_add_column_inventory_count.sql b/src/main/resources/db/migration/V2__add_something_add_column_inventory_count.sql deleted file mode 100644 index 4f4fe1a..0000000 --- a/src/main/resources/db/migration/V2__add_something_add_column_inventory_count.sql +++ /dev/null @@ -1,11 +0,0 @@ -CREATE TABLE something -( - id BINARY(16) NOT NULL, - CONSTRAINT pk_something PRIMARY KEY (id) -); - -ALTER TABLE product - ADD inventory_count INT NULL; - -ALTER TABLE product - MODIFY inventory_count INT NOT NULL; \ No newline at end of file diff --git a/src/main/resources/db/migration/V3__go_away_something.sql b/src/main/resources/db/migration/V3__go_away_something.sql deleted file mode 100644 index e69de29..0000000 diff --git a/src/notes b/src/notes new file mode 100644 index 0000000..94ad669 --- /dev/null +++ b/src/notes @@ -0,0 +1,26 @@ +When a [product is save,d it should be saved in ES as well +When someone searches for product, you return all products where either the title contains that string or description contains that string via ElasticSearch + + + Elasticsearch security features have been automatically configured! +✅ Authentication is enabled and cluster connections are encrypted. + +ℹ️ Password for the elastic user (reset with `bin/elasticsearch-reset-password -u elastic`): + zPhDRyIWG80lLFRKC3yY + +ℹ️ HTTP CA certificate SHA-256 fingerprint: + bdb3d325a9ef9d97bff32ca725191821702cd1a46ca6e2cbdfbc85e8f0464995 + +ℹ️ Configure Kibana to use this cluster: +• Run Kibana and click the configuration link in the terminal when Kibana starts. +• Copy the following enrollment token and paste it into Kibana in your browser (valid for the next 30 minutes): + eyJ2ZXIiOiI4LjExLjEiLCJhZHIiOlsiMTcyLjE4LjAuMjo5MjAwIl0sImZnciI6ImJkYjNkMzI1YTllZjlkOTdiZmYzMmNhNzI1MTkxODIxNzAyY2QxYTQ2Y2E2ZTJjYmRmYmM4NWU4ZjA0NjQ5OTUiLCJrZXkiOiJzaWlPQzR3QnBNYmVZM3d5cEtNYTppN0s5djBUalQxU1ZTcUtwcTdhTFBRIn0= + +ℹ️ Configure other nodes to join this cluster: +• Copy the following enrollment token and start new Elasticsearch nodes with `bin/elasticsearch --enrollment-token ` (valid for the next 30 minutes): + eyJ2ZXIiOiI4LjExLjEiLCJhZHIiOlsiMTcyLjE4LjAuMjo5MjAwIl0sImZnciI6ImJkYjNkMzI1YTllZjlkOTdiZmYzMmNhNzI1MTkxODIxNzAyY2QxYTQ2Y2E2ZTJjYmRmYmM4NWU4ZjA0NjQ5OTUiLCJrZXkiOiJ0Q2lPQzR3QnBNYmVZM3d5cEtOSToxZkFzY2dPdFM1S09TeG5hVVFmNHlRIn0= + + If you're running in Docker, copy the enrollment token and run: + `docker run -e "ENROLLMENT_TOKEN=" docker.elastic.co/elasticsearch/elasticsearch:8.11.1` + + diff --git a/src/test/java/dev/naman/productservice/ProductserviceApplicationTests.java b/src/test/java/dev/bhanu/productservice/ProductserviceApplicationTests.java similarity index 67% rename from src/test/java/dev/naman/productservice/ProductserviceApplicationTests.java rename to src/test/java/dev/bhanu/productservice/ProductserviceApplicationTests.java index a149efa..77216d6 100644 --- a/src/test/java/dev/naman/productservice/ProductserviceApplicationTests.java +++ b/src/test/java/dev/bhanu/productservice/ProductserviceApplicationTests.java @@ -1,4 +1,4 @@ -package dev.naman.productservice; +package dev.bhanu.productservice; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @@ -6,8 +6,8 @@ @SpringBootTest class ProductserviceApplicationTests { - @Test - void contextLoads() { - } + @Test + void contextLoads() { + } } diff --git a/src/test/java/dev/naman/productservice/RandomTest.java b/src/test/java/dev/naman/productservice/RandomTest.java deleted file mode 100644 index eb71d20..0000000 --- a/src/test/java/dev/naman/productservice/RandomTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package dev.naman.productservice; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -import java.util.Random; - -@SpringBootTest -public class RandomTest { -// @Test -// void testLessThan3() { -// Random random = new Random(); -// int number = random.nextInt(); -// -// assert(number < 10000000); -// } -} diff --git a/src/test/java/dev/naman/productservice/controllers/ProductControllerTest.java b/src/test/java/dev/naman/productservice/controllers/ProductControllerTest.java deleted file mode 100644 index 800e736..0000000 --- a/src/test/java/dev/naman/productservice/controllers/ProductControllerTest.java +++ /dev/null @@ -1,70 +0,0 @@ -package dev.naman.productservice.controllers; - -import dev.naman.productservice.exceptions.NotFoundException; -import dev.naman.productservice.thirdpartyclients.productsservice.fakestore.FakeStoryProductServiceClient; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import java.util.Random; - -import static org.junit.jupiter.api.Assertions.*; - -@SpringBootTest -public class ProductControllerTest { - - @Autowired - private FakeStoryProductServiceClient fakeStoryProductServiceClient; - - - @Test - @DisplayName("1 + 1 equals 2") - void onePlusOneEqualsTrue() throws NotFoundException { -// System.out.println("It is true"); -// assertEquals(11, 1 + 1, "one plus is not coming to be 11"); - -// assert - -// assertNull(fakeStoryProductServiceClient.getProductById(101L)); - -// Exception e; -// -// try { -// fakeStoryProductServiceClient.getProductById(101L); -// } catch (Exception ex) { -// e = ex; -// } -// -// assertNotNull(e); -// assertEquals(NotFoundException.class, e.getClass()); - -// assertEquals(null, fakeStoryProductServiceClient.getProductById(101L)); -// assertThrows(NotFoundException.class, () -> fakeStoryProductServiceClient.getProductById(101L)); -// -// assertEquals(true, 1 + 1 == 2); - assertTrue(returnSomething()); - } - - boolean returnSomething() { - Random random = new Random(); - return random.nextInt() % 2 == 0; - } - - @Test - void additionShouldBeCorrect() { - assertTrue(-1 + -1 == -2, "adding 2 negatives is not correct"); - - assertTrue(-1 + 0 == -1, "adding a negative and a zero is giving wrong answer"); - - assertTrue(-1 + 1 == 0); - - assert 1 + 0 == 1; - - assert 1 + 1 == 2; - } -} - -// Assertion Framework -// -> allows you to make assertions -// -> allows you to make checks \ No newline at end of file diff --git a/src/test/java/dev/naman/productservice/thirdpartyclients/productsservice/fakestore/FakeStoryProductServiceClientTest.java b/src/test/java/dev/naman/productservice/thirdpartyclients/productsservice/fakestore/FakeStoryProductServiceClientTest.java deleted file mode 100644 index d79b07f..0000000 --- a/src/test/java/dev/naman/productservice/thirdpartyclients/productsservice/fakestore/FakeStoryProductServiceClientTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package dev.naman.productservice.thirdpartyclients.productsservice.fakestore; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.web.client.RestTemplateBuilder; -import org.springframework.http.ResponseEntity; -import org.springframework.web.client.RestTemplate; - -import static org.junit.jupiter.api.Assertions.*; - -@SpringBootTest -class FakeStoryProductServiceClientTest { - @Autowired - private RestTemplateBuilder restTemplateBuilder; - - @Test - void testNonExistingProductReturnsNull() { -// RestTemplate restTemplate = restTemplateBuilder.build(); -// ResponseEntity response = -// restTemplate.getForEntity(specificProductRequestUrl, FakeStoreProductDto.class, id); -// -// FakeStoreProductDto fakeStoreProductDto = response.getBody(); -// -// assertNull(fakeStoreProductDto); - } -} \ No newline at end of file