From 10405609684f406eec95b4fd41af8c51cb5c1269 Mon Sep 17 00:00:00 2001 From: Somnath More Date: Mon, 5 Feb 2024 17:55:36 +0530 Subject: [PATCH] Pair demo --- backend/HELP.md | 5 +- backend/README.md | 1 - backend/pom.xml | 21 +------ .../demo/DemoApplication.java | 9 +-- .../demo/controller/ProductController.java | 42 ++++++++++++++ .../com/pairdemo/demo/dto/ProductDto.java | 16 ++++++ .../com/pairdemo/demo/entity/Product.java | 18 ++++++ .../demo/exceptions/ErrorResponse.java | 11 ++++ .../exceptions/GlobalExceptionHandler.java | 39 +++++++++++++ .../exceptions/ResourceNotFoundException.java | 7 +++ .../demo/repository/ProductRepository.java | 10 ++++ .../pairdemo/demo/service/ProductService.java | 12 ++++ .../demo/service/ProductServiceImpl.java | 54 ++++++++++++++++++ .../com/pairdemo/demo/utils/Constants.java | 7 +++ .../src/main/resources/application.properties | 1 + .../demo/DemoApplicationTests.java | 2 +- backend/target/classes/application.properties | 1 + .../com/pairdemo/demo/DemoApplication.class | Bin 0 -> 945 bytes .../demo/controller/ProductController.class | Bin 0 -> 2246 bytes .../com/pairdemo/demo/dto/ProductDto.class | Bin 0 -> 3058 bytes .../com/pairdemo/demo/entity/Product.class | Bin 0 -> 2915 bytes .../ErrorResponse$ErrorResponseBuilder.class | Bin 0 -> 1615 bytes .../demo/exceptions/ErrorResponse.class | Bin 0 -> 2563 bytes .../exceptions/GlobalExceptionHandler.class | Bin 0 -> 4398 bytes .../ResourceNotFoundException.class | Bin 0 -> 462 bytes .../demo/repository/ProductRepository.class | Bin 0 -> 533 bytes .../demo/service/ProductService.class | Bin 0 -> 457 bytes .../demo/service/ProductServiceImpl.class | Bin 0 -> 3021 bytes .../com/pairdemo/demo/utils/Constants.class | Bin 0 -> 385 bytes .../reactpairdemo/demo/DemoApplication.class | Bin 745 -> 0 bytes .../demo/DemoApplicationTests.class | Bin 543 -> 0 bytes 31 files changed, 230 insertions(+), 26 deletions(-) delete mode 100644 backend/README.md rename backend/src/main/java/com/{reactpairdemo => pairdemo}/demo/DemoApplication.java (77%) create mode 100644 backend/src/main/java/com/pairdemo/demo/controller/ProductController.java create mode 100644 backend/src/main/java/com/pairdemo/demo/dto/ProductDto.java create mode 100644 backend/src/main/java/com/pairdemo/demo/entity/Product.java create mode 100644 backend/src/main/java/com/pairdemo/demo/exceptions/ErrorResponse.java create mode 100644 backend/src/main/java/com/pairdemo/demo/exceptions/GlobalExceptionHandler.java create mode 100644 backend/src/main/java/com/pairdemo/demo/exceptions/ResourceNotFoundException.java create mode 100644 backend/src/main/java/com/pairdemo/demo/repository/ProductRepository.java create mode 100644 backend/src/main/java/com/pairdemo/demo/service/ProductService.java create mode 100644 backend/src/main/java/com/pairdemo/demo/service/ProductServiceImpl.java create mode 100644 backend/src/main/java/com/pairdemo/demo/utils/Constants.java rename backend/src/test/java/com/{reactpairdemo => pairdemo}/demo/DemoApplicationTests.java (84%) create mode 100644 backend/target/classes/com/pairdemo/demo/DemoApplication.class create mode 100644 backend/target/classes/com/pairdemo/demo/controller/ProductController.class create mode 100644 backend/target/classes/com/pairdemo/demo/dto/ProductDto.class create mode 100644 backend/target/classes/com/pairdemo/demo/entity/Product.class create mode 100644 backend/target/classes/com/pairdemo/demo/exceptions/ErrorResponse$ErrorResponseBuilder.class create mode 100644 backend/target/classes/com/pairdemo/demo/exceptions/ErrorResponse.class create mode 100644 backend/target/classes/com/pairdemo/demo/exceptions/GlobalExceptionHandler.class create mode 100644 backend/target/classes/com/pairdemo/demo/exceptions/ResourceNotFoundException.class create mode 100644 backend/target/classes/com/pairdemo/demo/repository/ProductRepository.class create mode 100644 backend/target/classes/com/pairdemo/demo/service/ProductService.class create mode 100644 backend/target/classes/com/pairdemo/demo/service/ProductServiceImpl.class create mode 100644 backend/target/classes/com/pairdemo/demo/utils/Constants.class delete mode 100644 backend/target/classes/com/reactpairdemo/demo/DemoApplication.class delete mode 100644 backend/target/test-classes/com/reactpairdemo/demo/DemoApplicationTests.class diff --git a/backend/HELP.md b/backend/HELP.md index a9596dd..5d85555 100644 --- a/backend/HELP.md +++ b/backend/HELP.md @@ -7,8 +7,8 @@ For further reference, please consider the following sections: * [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.2.2/maven-plugin/reference/html/) * [Create an OCI image](https://docs.spring.io/spring-boot/docs/3.2.2/maven-plugin/reference/html/#build-image) * [Spring Web](https://docs.spring.io/spring-boot/docs/3.2.2/reference/htmlsingle/index.html#web) -* [Spring Boot DevTools](https://docs.spring.io/spring-boot/docs/3.2.2/reference/htmlsingle/index.html#using.devtools) * [Spring Data JPA](https://docs.spring.io/spring-boot/docs/3.2.2/reference/htmlsingle/index.html#data.sql.jpa-and-spring-data) +* [Validation](https://docs.spring.io/spring-boot/docs/3.2.2/reference/htmlsingle/index.html#io.validation) ### Guides The following guides illustrate how to use some features concretely: @@ -16,6 +16,7 @@ The following guides illustrate how to use some features concretely: * [Building a RESTful Web Service](https://spring.io/guides/gs/rest-service/) * [Serving Web Content with Spring MVC](https://spring.io/guides/gs/serving-web-content/) * [Building REST services with Spring](https://spring.io/guides/tutorials/rest/) -* [Accessing data with MySQL](https://spring.io/guides/gs/accessing-data-mysql/) * [Accessing Data with JPA](https://spring.io/guides/gs/accessing-data-jpa/) +* [Accessing data with MySQL](https://spring.io/guides/gs/accessing-data-mysql/) +* [Validation](https://spring.io/guides/gs/validating-form-input/) diff --git a/backend/README.md b/backend/README.md deleted file mode 100644 index c0a4bbb..0000000 --- a/backend/README.md +++ /dev/null @@ -1 +0,0 @@ -# Backend directory \ No newline at end of file diff --git a/backend/pom.xml b/backend/pom.xml index 7da3b2e..83635ba 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -8,7 +8,7 @@ 3.2.2 - com.reactpairdemo + com.pairdemo demo 0.0.1-SNAPSHOT demo @@ -22,34 +22,19 @@ modelmapper 3.1.1 - - org.slf4j - jul-to-slf4j - - - - - - org.springframework.boot - spring-boot-starter-validation + spring-boot-starter-data-jpa org.springframework.boot - spring-boot-starter-data-jpa + spring-boot-starter-validation org.springframework.boot spring-boot-starter-web - - org.springframework.boot - spring-boot-devtools - runtime - true - com.mysql mysql-connector-j diff --git a/backend/src/main/java/com/reactpairdemo/demo/DemoApplication.java b/backend/src/main/java/com/pairdemo/demo/DemoApplication.java similarity index 77% rename from backend/src/main/java/com/reactpairdemo/demo/DemoApplication.java rename to backend/src/main/java/com/pairdemo/demo/DemoApplication.java index b6ead96..ed1b59f 100644 --- a/backend/src/main/java/com/reactpairdemo/demo/DemoApplication.java +++ b/backend/src/main/java/com/pairdemo/demo/DemoApplication.java @@ -1,4 +1,4 @@ -package com.reactpairdemo.demo; +package com.pairdemo.demo; import org.modelmapper.ModelMapper; import org.springframework.boot.SpringApplication; @@ -11,9 +11,10 @@ public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } + @Bean - public ModelMapper modelMapper() { - return new ModelMapper(); - } + public ModelMapper modelMapper(){ + return new ModelMapper(); + } } diff --git a/backend/src/main/java/com/pairdemo/demo/controller/ProductController.java b/backend/src/main/java/com/pairdemo/demo/controller/ProductController.java new file mode 100644 index 0000000..22212e4 --- /dev/null +++ b/backend/src/main/java/com/pairdemo/demo/controller/ProductController.java @@ -0,0 +1,42 @@ +package com.pairdemo.demo.controller; + +import com.pairdemo.demo.dto.ProductDto; +import com.pairdemo.demo.entity.Product; +import com.pairdemo.demo.service.ProductService; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +import static com.pairdemo.demo.utils.Constants.BASE_URL; + +@RestController +@RequestMapping(BASE_URL) +public class ProductController { + + private final ProductService productService; + + @Autowired + public ProductController(ProductService productService) { + this.productService = productService; + } + @GetMapping("/search") + public ResponseEntity> searchProductByName(@RequestParam("name") String name) { + return new ResponseEntity<>(productService.searchProductByName(name), HttpStatus.OK) ; + } + + @PostMapping + public ResponseEntity createProduct(@Valid @RequestBody ProductDto productDto) { + + return new ResponseEntity<>(productService.createProduct(productDto), HttpStatus.CREATED); + } + @DeleteMapping("/{id}") + public ResponseEntity createProduct(@PathVariable Long id) { + + return new ResponseEntity<>(productService.deleteProduct(id), HttpStatus.CREATED) ; + } + +} diff --git a/backend/src/main/java/com/pairdemo/demo/dto/ProductDto.java b/backend/src/main/java/com/pairdemo/demo/dto/ProductDto.java new file mode 100644 index 0000000..e238572 --- /dev/null +++ b/backend/src/main/java/com/pairdemo/demo/dto/ProductDto.java @@ -0,0 +1,16 @@ +package com.pairdemo.demo.dto; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; + +@Data +public class ProductDto { + private Long id; + @NotBlank(message = "Please enter a name") + @Size(min = 3,message = "") + private String name; + @NotNull(message = "Please enter a price") + private Double Price; +} diff --git a/backend/src/main/java/com/pairdemo/demo/entity/Product.java b/backend/src/main/java/com/pairdemo/demo/entity/Product.java new file mode 100644 index 0000000..787119a --- /dev/null +++ b/backend/src/main/java/com/pairdemo/demo/entity/Product.java @@ -0,0 +1,18 @@ +package com.pairdemo.demo.entity; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.Data; + +@Entity +@Data +public class Product { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + + private Long id; + private String name; + private Double Price; +} diff --git a/backend/src/main/java/com/pairdemo/demo/exceptions/ErrorResponse.java b/backend/src/main/java/com/pairdemo/demo/exceptions/ErrorResponse.java new file mode 100644 index 0000000..c802290 --- /dev/null +++ b/backend/src/main/java/com/pairdemo/demo/exceptions/ErrorResponse.java @@ -0,0 +1,11 @@ +package com.pairdemo.demo.exceptions; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class ErrorResponse { + String message; + String title; +} diff --git a/backend/src/main/java/com/pairdemo/demo/exceptions/GlobalExceptionHandler.java b/backend/src/main/java/com/pairdemo/demo/exceptions/GlobalExceptionHandler.java new file mode 100644 index 0000000..17c4f95 --- /dev/null +++ b/backend/src/main/java/com/pairdemo/demo/exceptions/GlobalExceptionHandler.java @@ -0,0 +1,39 @@ +package com.pairdemo.demo.exceptions; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.FieldError; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import java.util.HashMap; +import java.util.Map; + +@RestControllerAdvice +public class GlobalExceptionHandler { + + @ExceptionHandler(ResourceNotFoundException.class) + public ResponseEntity handleResourceNotFound(Exception e){ + ErrorResponse errorResponse=ErrorResponse.builder().message(e.getMessage()).title(HttpStatus.NOT_FOUND.getReasonPhrase()).build(); + return new ResponseEntity<>(errorResponse,HttpStatus.NOT_FOUND); + } + + @ExceptionHandler(MethodArgumentNotValidException.class) + public ResponseEntity> handleResourceNotFound(MethodArgumentNotValidException e){ + Map resp=new HashMap<>(); + e.getBindingResult().getAllErrors().forEach(objectError -> { + resp.put(((FieldError)objectError).getField(),objectError.getDefaultMessage()); + }); + + + return new ResponseEntity<>(resp,HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(IllegalArgumentException.class) + public ResponseEntity handleIllegalArgumentException(IllegalArgumentException e){ + ErrorResponse errorResponse=ErrorResponse.builder().message(e.getMessage()).title(HttpStatus.NOT_ACCEPTABLE.getReasonPhrase()).build(); + return new ResponseEntity<>(errorResponse,HttpStatus.NOT_ACCEPTABLE); + } + +} diff --git a/backend/src/main/java/com/pairdemo/demo/exceptions/ResourceNotFoundException.java b/backend/src/main/java/com/pairdemo/demo/exceptions/ResourceNotFoundException.java new file mode 100644 index 0000000..504aa53 --- /dev/null +++ b/backend/src/main/java/com/pairdemo/demo/exceptions/ResourceNotFoundException.java @@ -0,0 +1,7 @@ +package com.pairdemo.demo.exceptions; + +public class ResourceNotFoundException extends RuntimeException{ + public ResourceNotFoundException(String message) { + super(message); + } +} diff --git a/backend/src/main/java/com/pairdemo/demo/repository/ProductRepository.java b/backend/src/main/java/com/pairdemo/demo/repository/ProductRepository.java new file mode 100644 index 0000000..62bbcf1 --- /dev/null +++ b/backend/src/main/java/com/pairdemo/demo/repository/ProductRepository.java @@ -0,0 +1,10 @@ +package com.pairdemo.demo.repository; + +import com.pairdemo.demo.entity.Product; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface ProductRepository extends JpaRepository { + public List findByName(String name); +} diff --git a/backend/src/main/java/com/pairdemo/demo/service/ProductService.java b/backend/src/main/java/com/pairdemo/demo/service/ProductService.java new file mode 100644 index 0000000..2bbfeed --- /dev/null +++ b/backend/src/main/java/com/pairdemo/demo/service/ProductService.java @@ -0,0 +1,12 @@ +package com.pairdemo.demo.service; + +import com.pairdemo.demo.dto.ProductDto; + +import java.util.List; + +public interface ProductService { + List searchProductByName(String name); + + ProductDto createProduct(ProductDto productDto); + String deleteProduct(Long id); +} diff --git a/backend/src/main/java/com/pairdemo/demo/service/ProductServiceImpl.java b/backend/src/main/java/com/pairdemo/demo/service/ProductServiceImpl.java new file mode 100644 index 0000000..d84e4be --- /dev/null +++ b/backend/src/main/java/com/pairdemo/demo/service/ProductServiceImpl.java @@ -0,0 +1,54 @@ +package com.pairdemo.demo.service; + +import com.pairdemo.demo.dto.ProductDto; +import com.pairdemo.demo.entity.Product; +import com.pairdemo.demo.repository.ProductRepository; +import org.modelmapper.ModelMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import static com.pairdemo.demo.utils.Constants.ID_NOT_FOUND; +import static com.pairdemo.demo.utils.Constants.SUCESS_DELETE; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +@Service +public class ProductServiceImpl implements ProductService{ + + private final ProductRepository productRepository; + + private final ModelMapper modelMapper; + + @Autowired + public ProductServiceImpl(ProductRepository productRepository, ModelMapper modelMapper) { + this.productRepository = productRepository; + this.modelMapper = modelMapper; + } + + @Override + public List searchProductByName(String name) { + List productList = productRepository.findByName(name); +// System.out.println(productList); +// return productList.stream().map(product -> modelMapper.map(product,ProductDto.class)).collect(Collectors.toList()); + return productList.stream().map(product -> modelMapper.map(product, ProductDto.class)).filter(productDto -> productDto.getName().equalsIgnoreCase(name)).collect(Collectors.toList()); + } + + @Override + public ProductDto createProduct(ProductDto productDto) { + Product product = modelMapper.map(productDto, Product.class); + Product product1 = productRepository.save(product); + return modelMapper.map(product, ProductDto.class); + } + + @Override + public String deleteProduct(Long id) { + Optional productOptional = productRepository.findById(id); + if (productOptional.isEmpty()) { + throw new ResourceNotFoundException(ID_NOT_FOUND); + } + productRepository.deleteById(id); + return SUCESS_DELETE; + } +} diff --git a/backend/src/main/java/com/pairdemo/demo/utils/Constants.java b/backend/src/main/java/com/pairdemo/demo/utils/Constants.java new file mode 100644 index 0000000..c937904 --- /dev/null +++ b/backend/src/main/java/com/pairdemo/demo/utils/Constants.java @@ -0,0 +1,7 @@ +package com.pairdemo.demo.utils; + +public class Constants { + public static final String BASE_URL = "/api/v1/product"; + public static final String ID_NOT_FOUND= "Given Id Not Found!!"; + public static final String SUCESS_DELETE= "Success to Delete"; +} diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index 89eef6b..66b7a72 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -1,4 +1,5 @@ + spring.datasource.url=jdbc:mysql://localhost:3306/pairdemo?useSSL=false&ServerTimeZone=UTC spring.datasource.username=root spring.datasource.password=root diff --git a/backend/src/test/java/com/reactpairdemo/demo/DemoApplicationTests.java b/backend/src/test/java/com/pairdemo/demo/DemoApplicationTests.java similarity index 84% rename from backend/src/test/java/com/reactpairdemo/demo/DemoApplicationTests.java rename to backend/src/test/java/com/pairdemo/demo/DemoApplicationTests.java index 823b938..ba7faf6 100644 --- a/backend/src/test/java/com/reactpairdemo/demo/DemoApplicationTests.java +++ b/backend/src/test/java/com/pairdemo/demo/DemoApplicationTests.java @@ -1,4 +1,4 @@ -package com.reactpairdemo.demo; +package com.pairdemo.demo; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; diff --git a/backend/target/classes/application.properties b/backend/target/classes/application.properties index 89eef6b..66b7a72 100644 --- a/backend/target/classes/application.properties +++ b/backend/target/classes/application.properties @@ -1,4 +1,5 @@ + spring.datasource.url=jdbc:mysql://localhost:3306/pairdemo?useSSL=false&ServerTimeZone=UTC spring.datasource.username=root spring.datasource.password=root diff --git a/backend/target/classes/com/pairdemo/demo/DemoApplication.class b/backend/target/classes/com/pairdemo/demo/DemoApplication.class new file mode 100644 index 0000000000000000000000000000000000000000..60dab7bb1ec759d67d4841ca3f6740e30adccbf4 GIT binary patch literal 945 zcmah|QEw7K5dOA6k5ZJD)@rRpQTSV zn)n0!QO4PW%4tw9xtY0dX1<-Bnfw0Z%Qpazuvftn3IU2$l(5XOb}rrt9tl0>&xhwS zbPUT6l~(SEq0rnP1Sm5!LKE{uC_9p|;hA_s*5f3JR4AM>x`GN;15~THf~yQIW5;}w zSf$6OR>bnXv2Xd%7{~h=n9HPNY^oWC&F;LEP9!Fi_M05icb=@h-(AEU8tvo<$2&%! zs&Q(?Fp{|=2=?xFfHj64PY|1tjAD@_((<0SdzoE94F!f`haiSpS84eyjfc{{@{A1i zt_ejn5LWr`8CY~@YQnJB{cn@nL>&u7m)&YEy4!&K!j6e-V}YAy)sybbj9v)eQYS41 zu4XrxR?o28oc8B0*Q4{dU#8lrSPs-g`6g*?TsA=BI{0UA#jj9)EQKbnO5db5luwm! z&E_8qap;H1aI}y!+XRt1Lxal(CTDwbOe>NbTpJApw6FdtfccFjS*I^fnvpKGF2FvK zv4jnh-VLl^lVo)ofNR*wuO(!`Eu5Oqneg;hhluOyIJhrOg3L@l%>aET#r1qP?h#2L?Y`bj>kiCX(~)#;M) zzXFDt4lu(H;72j6&R54y&c!qELDH>GyZh|3yV75O|NbX{HEb1;!$cmFB}`$O;lc}X zBzRi{2mDF%h4d}M^r{M!tujnh78`lI!*E-h10ID&1qaWK=*VMjUh+e0L%t`YPzRCR z4y>}>0*aW)qg28o8os)K-f zx$?#_vZ-6rTWmOfu9R>U*BH+EMhYv_h#4MLGI(xT{f6T$t10%gjGj8;*tk)`O-Dt3 zb8mZne|w8zVK1iQ=*WhORI@GDgFq7zimHZTB{P7g6hXwF3*Tzf<)W{^*JG=Xm60uv zVbaCLFk4fBd>nV0((DT|&rq&uU$h&-C?}_zllD-Nzq=Vhysae3&)OjE{W=(#yy1p$ zID@2|%4e&Inr}ziL*3dHuBogvgs@Oo2LaWIp-7_t;(GN|t*&N-eky-euS$ULXXfNs zHhEJ8t-*ABC+&_1L)RG$Q%9m56X-newG+ej;l%f&9IAkaV|&|^uVNY5#0>e{8LMW; z&r>nId#Kh4`oELK@aq3WFjjgP9*j-bu8sz>b9p!y``vK35ie1-ycEU?PH9xFq(6DX zeG=8tb(@k6&6(RoJiz?Xz~6rPVA zp6eNSu8hF5g0IMEif5&d=j%R+9__8tD1gn=vPQ$fnsIbHp-Ll%Z<6`jM5|2lI>{Rj IbP~ztKUaW^pa1{> literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/pairdemo/demo/dto/ProductDto.class b/backend/target/classes/com/pairdemo/demo/dto/ProductDto.class new file mode 100644 index 0000000000000000000000000000000000000000..d14e08dd4cc15d1f13590aaa5c26974e3dff04cf GIT binary patch literal 3058 zcma)8U31h_7=F%fvPrioEiDCB0ShkLPgd~@cU!&+rK@eJ6p8{Wr@OHY-A!teMe#py z@Aw1ch6|lhoZ-UJ8=UbsiTIo(-Db;ZD!R;a%|D^@`%zW1$}d0-7tEw!mNtvl9AFf*Q0igna_~vhUP( z!7g~MwT4~ElWf0*12`yP)}(v!>y~T?43DN5V{a;BHx&343$Nl3IoIv5O7jLs$5PP9 zKoyrG7G6`FIa?71O7p0NV|bm{P%|-TUx#waq~jLez?%XFu}hJQozTQdb<>!IaZHeQ zLk1hOUY&k2+SNhkXv)F~lmrem<)%IBxiuMHcS3^PAe3$x2+XJbjEqk?lU$OLBo?MU zPCx>MD=jy4n)a#_IE?H$*Y!dfI=o9jDQrqVl%>0};nX8>siw^Er9(qXOI~=Mm9tr) z%S}57dVq+oiI>jHK-6*O-CIksZvTN5lIbpK(-T1h+qSz`zq-I zn&X8Vw$EFX3q{qUW+aK0`AC>h_r~&M*ApGZNzBJ5@uqJjl(o%8xs}95U%paZyhsbG z>>u9_S`ChpY($?cCS-as)-^*fc1s|?;;|l{{sz$jjP}~_cj(gYJv`aC0+&go!7JB|Yf$!6aNPscvymadgJ18!A-ezm7 zl4_kK_$f(;qAJKP@S7?8_83Zu5{g;bXskG)T`{pHaCFD@QKvp5CZont?)ulGHJ2LtsEF;h9x?Sr5~TcpnUiQ=2%4czo_9?T=e5*|4#wUJ-(cS6&F(PqV1w`dc;5_wo!OZ|Sv$)WWvhQUn zRr=eM@#Z4tx>4?ZSxQw0ZOWmDpP$~CQk>$uhYsAI82=Hv_Hg1)m_Ino3oYt|F-%NjE^;J#iuFZAWyPuN+AVsT!q-|FclU+7u^9kt5Nyfy%Tt z6D8u%KxKnzFb5_cz?gc3(c4NsQr6T#K}$|dm7MsfSk|K><|R@x3wm^PsC%eS#}_6R zW^o0d@TZ2vGFG_CAkXk#rPW#X-$`8KN+bFJR=H9r;2Y$gQJ^uHLNI_3;u+yP`-~C{ zL*E8$W3*0D0?VafJILKqf@$XU_C%THjcRNSs<81_RAG9INnrPcNDsEbw&R~h3H%H< V_%_LOlRwGY0s|mW$5+@u;XmpOTPgqm literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/pairdemo/demo/entity/Product.class b/backend/target/classes/com/pairdemo/demo/entity/Product.class new file mode 100644 index 0000000000000000000000000000000000000000..765d787907ccec2b137987e4c4f71164fbbe1b62 GIT binary patch literal 2915 zcma)8ZBr9h6n<{9n_a>pA&Q!oTC}kR0;aWZngCS+H5HHoVtr}rlI*}r*rmH0TYrS# zJN*Imiy!PvYiIn>X}{Q+{-#>{+}#aqFjJi&_vPH@oO{l5&OOWD|33X4z!a=3Qb=o1 z45-Km>VORA^r2F=dz*`0TtjjFVBz(7B80*Yg9TLSq6W+m|K7?n405QhZR zCC{$!gU!0F^`=$L(%4}GM{ra?uba-?w=J_NFgTL17)4VZy(z(O73{ZEjgJu2VOI>vlkp;|Hb__yU)cafZ$(f{8Cl zNMa9@5yv2b!g7o0+qTwh-zKx?9mfsKz~)^7M`>fr^a8WIV|l*q2bNQ}%C$ySpxE{3 zlI2*Q8CZ=qv)Qr;)BQm1H}1begZHi8-w8EpvvZ59wbdJ}l8Bc6dE2oTTiffFw`$Tw zSvPLoY_6G}E%&id2{vu|d}97p1xmM6KdOR*FY!3K#?oD|f=#!vWO__tz{r_UDntqG zD6yDDsiYGTmq!Pr%{?K)?JW7YK~ks%c2>(N6=xXgya*mQ3sk9R%cQS_Fw z(Mh!FTM5ki)`GbcbE7UT*B0jJL5-#DS$?a@XPOSpXNs{gwHWE@fg6P-kX>x=T41Pa0nCN1fDGp@xNabmzY~$^_h;~B7B_HH!!23gw^Rn$t1G)>>Pd<~@TX#AJEB>j_aS2#=RGGnD*p>+@XaD<41mV`tkPf<@5+~nxVG(PKQvhQ_G z%ESnMp+l3=<{Zvd30W*wj5Z_}q%wQ2V<|s?^vs%YR zt`uD2e2FU+3pj_%TxHPYQ>k&K!DH!u&XtZUyt4#D)BnK%4f=B&){x?#E}r9PwCqVP z+c~;GLKXQ>NSvdy^hj2cDw&jlBp*N&NK{De*CXH2EM3@5(QKF^{$oH9Yg3$}i3|;0 z%T*_psW1^kx#}jykt|;=Lpu{J-OipxEtf=7;^AalQ1vNYx>Q41^ zbYV<&8q1g`eX>a`VUep8`@j`krPpb`ztfaTs;5cA7hI_!ncpGvf&ztP3PA!P#0$dr z_9-bCgxUtQF-oT>hGi14J>-5V!E|$Zx1&t*M%k+Jk~aQ|lBTB^2ljV}WMj+6fh$-E g6Sx{SQrQ5nalgi&&h>TvzQQ-$Wx2Y8bu>`;4}V8Fg#Z8m literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/pairdemo/demo/exceptions/ErrorResponse$ErrorResponseBuilder.class b/backend/target/classes/com/pairdemo/demo/exceptions/ErrorResponse$ErrorResponseBuilder.class new file mode 100644 index 0000000000000000000000000000000000000000..cc80c1474d2b19df631ff487ddf217f3f0bb92a1 GIT binary patch literal 1615 zcmb_c|4tJ@5dOBby;2K3D}wj~QH!(%Ie#LtqLD^|Nkt=wG5)n}H*j#hZSJ;2-o(ey z1Ve&}58y)?XYVSs>4nt9TyA$}ZswbrZ+Gt3@8h2Umhm`^7={eQGe{uGVD9pLZaLiD zw%*isMO`r@pW3dio-qs+id(}-Vc0-AgLB9*Jg>{9)#A3-5KUujSLWOb^9vXvtYoM$Kvo;3{< z7j$o946}v)4E>hkR*sk%&tL+V7$%y0PgJB^=jwy4c1ZFSca_huG#FZc0)}`+HmKoj z)po^tyIB+7Ca*aG1+vbaE$-P`?-=81$EJKQs)KhO$#t3GeMHU0|A1@07HUT}-g1vO zg%Tc>o2cm%W>_fvO9HAfrDS;e3}Y1AcPALq8?x=y#i|`p)^n{Ev^!y}3tz2CpKh8YRpbnAeAVharEO#CG@Pp0L6S!gF8cbtSz6hA-XhbsR&`HSRVX z;peMT?zLOx{-V1qJ%O7CEfL}Vsmnhc!*Vwh9f%5doDExvatap1VlNRrT4&k{ompFE z^V7jJEwds+=9TLTui|ju7j$rAQIQ57FwFGP6xF?fM+{SEyV6f3qzX4^!ecaVF?#5a z5=b=ev?qc$35H3MEZUj2l#al@kr2aWTJ>kZz!h3Ep#!es8flE+rpQYNmjih6E6shU z{p~7%2>3SHhlQp5yOj5GZm?HyY>fTN;vjOHbkq|cd1aXo8^9Rh2r9&$9 z5FvMNEkd){!liYjmx#vFT+~=Hg_m6*`{Q_VX8yTdK zHlbyq!w|^bw;$N0hV5>b?rh$dwNSvg=D1FHT_8O^vC#tyJti_)oIqBfSo3yEP22Ie z3V9gB;QsVxP)l5JLi1&2|^Q-m@D5gX3*s#J8&2JBUV|NG9YPs}4p85CALZ)dMrIa-QsnvR3(51X=!`Il|>tzK+X zB@pv=qp{|MvSMLXV620S@gzU9Vrn!ZaaK$)b<3_R{rQF+1d`mG>Nt`-5+?2moIAou zw~Lxs7Z~|}Q)V`11!H^)QfzPa=X=Q!>V@N&;a|rDcZ!s%oYQKr_!Ocz`50z#>M?qM zq$-6;js^rr6H^>VV^d7y0#^!9L96}#2t0)n<(?GPIVy7K!9~1F1LbKniUqKKM(*>c z82EuY(cwa3@h6zdv^|=hD4N)_osD{uP$(@JLC~={|i#3OGJzkQn4x2W1mF%7iW{+>XXIq zp=*yOe}nZM^z@_2Utv|Jicj!bw4^Y+I>n)^P5+J)dF?q)?jt*$*Ph@^%VMOg(`2M< zeTXc=jb=qufptvKkVIEDir>bQPR3?aD_#ZLIF21LtUEOUdL5R z8g8*V%an9h-x*XW8MsFLQGVa8ztLyHdVwJmDgG?+0;glK=YWjMBtugl)r5?zbg5FN zD;89w?ZwhgZ>v~T2V9}w1H>y4z5GT}rHbHBLg<{!xym(dHX`wCu2Lt3R&H`1=JXSc zeWmmxWle45wPeRq#B%Fwcfu~ks0m?d1~E%o_}r7Y8zzMw1}MB z&|XrZksKjN2!wb^qr-JdDF&gp3|cl?r;29uH+Rr0GYX0~?NgUj7kY+sz^hFYlNfhg qUlP5B`H1S9Sm3M?C5J^y7NuMKS8<1{0pjPVyUWMm6PCrN$o~syEC?Y0 literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/pairdemo/demo/exceptions/GlobalExceptionHandler.class b/backend/target/classes/com/pairdemo/demo/exceptions/GlobalExceptionHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..620b98d5afc4e035d457113c7bf478da923b35ed GIT binary patch literal 4398 zcmcgvYj+b>6y3M4q3KXUTM7k)N{ghWc2Go-)Iyu46iFZS5kyp&B-3Q*WG2o`id9j3 zzu)i22Y-V4p$M$y^0Uj|L_=uB4gp~i zJJH6_UI892Az%n)6?;;#EICX5JIHHg)|_psdX~&|V3&YS5xcR6;q(?^(Ju2Pe+!Yd z?zX<~X6(g20sBSVhXV{fhMASD0^iG`Dd&~zhPfo=Y`Y*$&|}V)?V`odJT*OkWqf*J zYK-AC8) z738RZeug9KLMzEAu9L%+5c)8{CHo-5u%BjEw9$=hF=k|xXkSu*#IV!RMbTC@X+pMg zlX4-1LDYxvFpdj&M8pX^$}kj!?z)naQmUSjCKWqpWJb(vF|X+Mlwl`jP0jek7$zD= zX(ok=c2m?Sw~i4*rMH@wzRUy_S`Lc}?)^p??)u`9Fj3k&hN`4Gh)aCD{~p#{g*xU)cVuKtS(Hf(UYTmaWjrI`SrO0S3d8mac|<(b;6jlY zJQ*bU3K3os_^X{aBtT|3UbDuX)r^#^mC2is^^C@Ab_35Bss#yESEh>jlw!`yDUC+j z5=L6qlCr7tcW9i6O==-=@x zTOt!`q&9$il+#Uxe0XcFNc<+9Vz~IL(vf!2SuOsRLMZ`GR8Jl93C=rttR3MY`|1Cp z#Y0r8=^F&dAs%p(bG>rQFzwg*deb%)z+N9&>l$RZ@!vY$biN(b4swYT&_K&U<$;pi zrrvLx2K8TaB(toh6;erf)G%zzHsykw$<~f0yc@!McwfK=B0j`NRn1$~myIPwN;m}4 z3VBgZ+lIM9JEl@vdHc&BVsDY_z^zVJZ^AH^iiN08F>4d9YT-O(t$+H)e{@~eUhD6| zp5>UVX>+QrM8o)mdXaxerPiG!wmu8tDn1wSDsG1HC4&@P8rF$67mIjK*A+9S$(E&1 z$?vG@SKdWRz_)ZKs2m=uc3;h@fbS{$Yfq(PqZw)L7-m@0L_iOgqMTqeA1zF zat)o60d)2dUA;c6J!Pz%&Ku;W2A!`2AiEI`ajDZnu9EXa3XfWQ|It4%vx-@wbKy3g zuE)iSX57H;rO@tkkaW6B9ENBuh5I$UP6iwB2EEncO~)-)+FSJgHhnmQ?~tpH@hQH* VS2WT_^E!ytuhEQe@Ev|Y*FUiVF`fVb literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/pairdemo/demo/exceptions/ResourceNotFoundException.class b/backend/target/classes/com/pairdemo/demo/exceptions/ResourceNotFoundException.class new file mode 100644 index 0000000000000000000000000000000000000000..a462123b915004ca59a4bfc7508c36b8ecc6c9d9 GIT binary patch literal 462 zcmbVJO-lnY5Phj_S8KJkq6ZIxH$T9=6`|UT*wb31mEP0cVH?>^N;WJ0El+|6e}F$q zoUDq1crk&=yy5ZQ%;fd$`31lQwp*xSB|yE62ATqUck*6_nbc`GDYa8MT|LCKbjoOf z=DE_!4Fz@%qi^2SS*6p#(Ja8KKtDElxRlB!l$)>$^rcXQ6Dmw;V;UPbGNn#_h}SPo zLIRygX&RULob0WfXI$w;CYISuTIKO)vF;YC5IBqeXEzWCaw-a$RtCR@5$Il%TbSfV zTA7n0%Vw=<)%!^KuJ->N<?!kY8VK9-llxJaSe;i=+PsFwZmB dIothUp^Xhj%*Q4=tkmVaAsBe!Esizx-T^Z5cHaO1 literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/pairdemo/demo/repository/ProductRepository.class b/backend/target/classes/com/pairdemo/demo/repository/ProductRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..32ab222e255ba401e47ef89cba237d5ed10cda84 GIT binary patch literal 533 zcmbV}Jx;?w5QS$=f=T#G#R({&$yQVb3JQdfArU^oVsFeEd)FF|K`FRc3J$=b5Mx_P zETxGkW`9Q7@6Fry^Sk;6fE$?j;0c(Zult44@4RssgL1&kt-T17Q7>|qDkb-4Wj+LEEQ z`QVlXzj|YJo`djTes|F8NrjI6H~Qnq)fnr0le4e0tyrebr*Q@X_PBb->w?i%uj<~whF`TrW(?1kcrf~oO literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/pairdemo/demo/service/ProductService.class b/backend/target/classes/com/pairdemo/demo/service/ProductService.class new file mode 100644 index 0000000000000000000000000000000000000000..54103e868ef2e28515f98679c3375b36d7259e58 GIT binary patch literal 457 zcma)3K~BRk5FCfLp@l-Fet|=J!4C*uVkUB zTt2^SjV6J4ZIsuWo_zoMq)H=j6(v8^l)SC-c+r&_vV}}+O)=}O3~gMtR-U`a_*!64 zwF2YR=9Qwxv)JQ5#BP$mhh*fwk9Z&#-|@hy_C}HEw-s1M$NLt?DFTyS=N1p*Bz29~ zW@!uFe*W9X>w_;N0f7_#1|VQthZrG1$k|Zfl*9M{V8YND&Y9XnQ!Wc!wBY3zl3&$hKN78mI!5QcWll#JhD!23Xka#N7!s)$jft z^?0iEgQuT8{w9y_>@H!GEIsr?c6Mjp%kw_(W%AE|&;AB5kDt>>q02zGi5~PaWcK(0 zw;b;7SP!@ML|HNP&e^W5?lN>uPHpz15B&zxCI(RSG{JRBH~y*;=@{E^5-ZmGl}6Hw&FMyyp3lnPZLo00uE+AYYim)?N|ldSNVRtg7XH3O^o2x7LG~{Ux_MFBkRP} z`B2f8gxYo$nG?L4PvbRQG%#vn43`+r1^!xP7>t_Ma9lDHM-=8DKeai4aa=KQ)x_(V zU>FRHG!asg{JO}v3gh8|w4IYfVPGJ*e-bJ#-8cHJ#2Te{YA z^g_AG;f8@}6K`UMVdNNQ3lbu%%4-a>QLI5Aoz_l{B#oQ6W#BCnZ{s!v-Qj0RIu2E@ z^nBt*Nu5T9OG(@`B?Iv9nz(~m%11dgK=m2N7)5cc6G4nM3{^`X-ZzoQ9K%3WR)kX| zu7$@iR*>F~6>L%Xv}F~KkMjno$HqIWS-8qpjiW|L<3lVMSkw$JQRFYM$Z#j2mSXk3 z2`zplZ~Z=x>S!Js+wp_hEK}yL_`L|a?M>cojU|S@Nc5(%?};>A@EN`Zr!6ky7Yjg}W6;_!9*w_v^KMXSK(6S`;@3cwGGShoQ?C>&7Qn zWO<1@PRUjxpTYg19{6b*F_pq! zunzG~3ePeAE2(rryBQ4B&lB=tGCC5t8xKuJ?li&;d`4~uFo8{cPAyZRk)3~v51wPbs8JKndm7aIsy>^}t^{W* z8e%F2ag3l|!YD2W5OblmCd3>b;d}BpND>@dq&Z6OWqRv6g7yf=q;z$Vn1-}SM=4qd zLr5KN!vutk42P0UcY}cwx{t6Oz}#u(e3!m$`e}Cd$ioltP{#r7q-p0d8u$qp{s%p{ BRb~JH literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/pairdemo/demo/utils/Constants.class b/backend/target/classes/com/pairdemo/demo/utils/Constants.class new file mode 100644 index 0000000000000000000000000000000000000000..20e04d5ab30c5a69d5ed6ad9523f2aacbfb6efd8 GIT binary patch literal 385 zcmah_yH3ME5S(>hCgg>If-<533Qp8KB#5B0K*Hb_o$XV&$njbBIsZk4M8OB}QHZ^W zh>~XZW_E99v|ryJp8zhg--m}*5A6Xu=n^IixsoE6#auij3zb?z_d*xiUJ+VH$8irn zVVatyD5b74wKQT4jn#QAW~QjEENo5iZ?2=;m*>Zj5QKkABU|ZWeoh!}W@DK*%Eyo} z7P8c0btcNnWR0_K&rGJc5$ZzSH_Jp-Pcq3_2||;~JeHMq{8wz-SIy3c;lJ_NzaN>V zO4Xfq>qeU}^{I=BDSCVsfN+2<^to;`^Dy8SxkE9ISP^RubWYwuZ|jjUqiX{#Oc>o4 O9>5L)u7q7i4|_k@G*|=x literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/reactpairdemo/demo/DemoApplication.class b/backend/target/classes/com/reactpairdemo/demo/DemoApplication.class deleted file mode 100644 index 5662ef54f3b7e5d2df63f6832edc4998dbd1e8ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 745 zcma)4OHbQC5dJnKIE0i(c$7yua6usl_QoX?34%DeEo!Q8;IwuYvtaK=>vhZD;zZR$ ze*izK>a0P+LOEc`GrRNnX7-zT`uFEAfX~=zp@x|N^)?!qWmviuKLt;PPWZRzR>qED z_DE^vju~dU`=bC&hP~Ki+)5FBvr9+%IFqam=Dly;{z5Ldd4O^ zpID`nYb!GO%h)>}8RPh{G*&XHmMt_x)D2(z8Kff5`&Sjq(0Q=_emD&|HrmO1#|K7V ztE8|ZN@b-4nZ3KuP#>7FWLON9mS2l3lJW$1(^7U@V>}xy#plzo4K^3NT;6Xkr~7$-Y5< TgUBUS!)7VBuua;R{RI36)!V_m diff --git a/backend/target/test-classes/com/reactpairdemo/demo/DemoApplicationTests.class b/backend/target/test-classes/com/reactpairdemo/demo/DemoApplicationTests.class deleted file mode 100644 index fca0906864fa10a6c174ca28153b316866bb0e83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 543 zcmb7AyH3L}6g^H$18t$DuvB7T1S;^x!b2(`rU)cjb$3!zToOBS9N@Q@kQn#?J_>Oi zDufUVgYWa)<9pBh$Lkw_6KsYE7zT;SxRoMtxlnd0Gs7!$LD4YJQ-QB5zVL$rEN=FRs#AqjeUa}25Cg%0|7nKhVqaiPM-P7-V2tWt9FyDZ-W3Wvh6Pb`Bln*HR=ZFP~=fv d@}6iw&(E;mB&{DLBw0lgV4a`=dfzk~z$bwnfffJ&