From 6cb103bc3cce90bc3ccc98106f45b141769ce6c6 Mon Sep 17 00:00:00 2001 From: Somnath More Date: Sun, 4 Feb 2024 14:25:08 +0530 Subject: [PATCH] Please add Encryption --- backend/.idea/compiler.xml | 1 + .../reactpairdemo/demo/DemoApplication.java | 2 + .../demo/controller/UserController.java | 44 ++++++++++ .../com/reactpairdemo/demo/dto/UserDto.java | 27 ++++++ .../com/reactpairdemo/demo/entity/User.java | 19 +++++ .../demo/exception/ErrorResponse.java | 12 +++ .../exception/GlobalExceptionHandler.java | 53 ++++++++++++ .../demo/exception/UserException.java | 7 ++ .../demo/repository/UserRepository.java | 10 +++ .../demo/service/UserService.java | 15 ++++ .../demo/service/impl/UserServiceImpl.java | 78 ++++++++++++++++++ .../reactpairdemo/demo/utils/Constants.java | 8 ++ .../com/reactpairdemo/demo/utils/Mapper.java | 19 +++++ .../src/main/resources/application.properties | 3 +- backend/target/classes/application.properties | 3 +- .../reactpairdemo/demo/DemoApplication.class | Bin 745 -> 955 bytes .../demo/controller/UserController.class | Bin 0 -> 3451 bytes .../com/reactpairdemo/demo/dto/UserDto.class | Bin 0 -> 3806 bytes .../com/reactpairdemo/demo/entity/User.class | Bin 0 -> 3389 bytes .../ErrorResponse$ErrorResponseBuilder.class | Bin 0 -> 1635 bytes .../demo/exception/ErrorResponse.class | Bin 0 -> 2579 bytes .../exception/GlobalExceptionHandler.class | Bin 0 -> 5503 bytes .../demo/exception/UserException.class | Bin 0 -> 434 bytes .../demo/repository/UserRepository.class | Bin 0 -> 546 bytes .../demo/service/UserService.class | Bin 0 -> 696 bytes .../demo/service/impl/UserServiceImpl.class | Bin 0 -> 4684 bytes .../reactpairdemo/demo/utils/Constants.class | Bin 0 -> 576 bytes .../com/reactpairdemo/demo/utils/Mapper.class | Bin 0 -> 1176 bytes 28 files changed, 299 insertions(+), 2 deletions(-) create mode 100644 backend/src/main/java/com/reactpairdemo/demo/controller/UserController.java create mode 100644 backend/src/main/java/com/reactpairdemo/demo/dto/UserDto.java create mode 100644 backend/src/main/java/com/reactpairdemo/demo/entity/User.java create mode 100644 backend/src/main/java/com/reactpairdemo/demo/exception/ErrorResponse.java create mode 100644 backend/src/main/java/com/reactpairdemo/demo/exception/GlobalExceptionHandler.java create mode 100644 backend/src/main/java/com/reactpairdemo/demo/exception/UserException.java create mode 100644 backend/src/main/java/com/reactpairdemo/demo/repository/UserRepository.java create mode 100644 backend/src/main/java/com/reactpairdemo/demo/service/UserService.java create mode 100644 backend/src/main/java/com/reactpairdemo/demo/service/impl/UserServiceImpl.java create mode 100644 backend/src/main/java/com/reactpairdemo/demo/utils/Constants.java create mode 100644 backend/src/main/java/com/reactpairdemo/demo/utils/Mapper.java create mode 100644 backend/target/classes/com/reactpairdemo/demo/controller/UserController.class create mode 100644 backend/target/classes/com/reactpairdemo/demo/dto/UserDto.class create mode 100644 backend/target/classes/com/reactpairdemo/demo/entity/User.class create mode 100644 backend/target/classes/com/reactpairdemo/demo/exception/ErrorResponse$ErrorResponseBuilder.class create mode 100644 backend/target/classes/com/reactpairdemo/demo/exception/ErrorResponse.class create mode 100644 backend/target/classes/com/reactpairdemo/demo/exception/GlobalExceptionHandler.class create mode 100644 backend/target/classes/com/reactpairdemo/demo/exception/UserException.class create mode 100644 backend/target/classes/com/reactpairdemo/demo/repository/UserRepository.class create mode 100644 backend/target/classes/com/reactpairdemo/demo/service/UserService.class create mode 100644 backend/target/classes/com/reactpairdemo/demo/service/impl/UserServiceImpl.class create mode 100644 backend/target/classes/com/reactpairdemo/demo/utils/Constants.class create mode 100644 backend/target/classes/com/reactpairdemo/demo/utils/Mapper.class diff --git a/backend/.idea/compiler.xml b/backend/.idea/compiler.xml index 07e72e7..bfc71e1 100644 --- a/backend/.idea/compiler.xml +++ b/backend/.idea/compiler.xml @@ -2,6 +2,7 @@ + diff --git a/backend/src/main/java/com/reactpairdemo/demo/DemoApplication.java b/backend/src/main/java/com/reactpairdemo/demo/DemoApplication.java index 0108661..b6ead96 100644 --- a/backend/src/main/java/com/reactpairdemo/demo/DemoApplication.java +++ b/backend/src/main/java/com/reactpairdemo/demo/DemoApplication.java @@ -1,7 +1,9 @@ package com.reactpairdemo.demo; +import org.modelmapper.ModelMapper; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; @SpringBootApplication public class DemoApplication { diff --git a/backend/src/main/java/com/reactpairdemo/demo/controller/UserController.java b/backend/src/main/java/com/reactpairdemo/demo/controller/UserController.java new file mode 100644 index 0000000..7bce010 --- /dev/null +++ b/backend/src/main/java/com/reactpairdemo/demo/controller/UserController.java @@ -0,0 +1,44 @@ +package com.reactpairdemo.demo.controller; + +import com.reactpairdemo.demo.dto.UserDto; +import com.reactpairdemo.demo.entity.User; +import com.reactpairdemo.demo.service.UserService; +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 java.util.stream.Collectors; + +@RestController +@RequestMapping("/api/v1/user") +public class UserController { + @Autowired + private UserService userService; + @GetMapping() + public ResponseEntity> getAllUsers() { + + return new ResponseEntity<>(userService.getAllUsers(), HttpStatus.OK); + } + @PostMapping + public ResponseEntity createUser(@Valid @RequestBody UserDto user) { + return new ResponseEntity<>(userService.createUser(user), HttpStatus.CREATED); + } + + @GetMapping("/{id}") + public ResponseEntity getUserById(@PathVariable Long id) { + return new ResponseEntity<>(userService.getUserById(id), HttpStatus.OK); + } + + @PutMapping("/{id}") + public ResponseEntity updateUser(@PathVariable Long id,@Valid @RequestBody UserDto userDto) { + return new ResponseEntity<>(userService.updateUser(id,userDto), HttpStatus.OK); + } + + @DeleteMapping("/{id}") + public ResponseEntity deleteUser(@PathVariable Long id) { + return new ResponseEntity<>(userService.deleteUser(id), HttpStatus.OK); + } +} diff --git a/backend/src/main/java/com/reactpairdemo/demo/dto/UserDto.java b/backend/src/main/java/com/reactpairdemo/demo/dto/UserDto.java new file mode 100644 index 0000000..217e0e8 --- /dev/null +++ b/backend/src/main/java/com/reactpairdemo/demo/dto/UserDto.java @@ -0,0 +1,27 @@ +package com.reactpairdemo.demo.dto; + +import jakarta.persistence.Column; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +public class UserDto { + private Long id; + @NotNull(message = "Name must not be Null") + @Size(min=4,message = "Enter valid Name") + private String name; + @NotNull(message = "Email must not be Null") + @Email(message = "Invalid Email Format") + private String email; + @NotNull(message = "Password must not be Null") + @Pattern( + regexp = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d).{8,}$", + message = "Password must be at least 8 characters long and include at least one uppercase letter, one lowercase letter, and one digit." + ) + private String Password; +} diff --git a/backend/src/main/java/com/reactpairdemo/demo/entity/User.java b/backend/src/main/java/com/reactpairdemo/demo/entity/User.java new file mode 100644 index 0000000..dafea41 --- /dev/null +++ b/backend/src/main/java/com/reactpairdemo/demo/entity/User.java @@ -0,0 +1,19 @@ +package com.reactpairdemo.demo.entity; + +import jakarta.persistence.*; +import lombok.Data; + +@Entity +@Data +public class User { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + @Column(nullable = false) + private String name; + @Column(nullable = false) + private String email; + @Column(nullable = false) + private String Password; + +} diff --git a/backend/src/main/java/com/reactpairdemo/demo/exception/ErrorResponse.java b/backend/src/main/java/com/reactpairdemo/demo/exception/ErrorResponse.java new file mode 100644 index 0000000..b19d46e --- /dev/null +++ b/backend/src/main/java/com/reactpairdemo/demo/exception/ErrorResponse.java @@ -0,0 +1,12 @@ +package com.reactpairdemo.demo.exception; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class ErrorResponse { + public String message; + public String title; + +} diff --git a/backend/src/main/java/com/reactpairdemo/demo/exception/GlobalExceptionHandler.java b/backend/src/main/java/com/reactpairdemo/demo/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..2daf45e --- /dev/null +++ b/backend/src/main/java/com/reactpairdemo/demo/exception/GlobalExceptionHandler.java @@ -0,0 +1,53 @@ +package com.reactpairdemo.demo.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.FieldError; +import org.springframework.validation.ObjectError; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.servlet.resource.NoResourceFoundException; + +import java.util.HashMap; +import java.util.Map; + +@RestControllerAdvice +public class GlobalExceptionHandler { + @ExceptionHandler({UserException.class}) + @ResponseBody + public ResponseEntity handleException(Exception e) { + ErrorResponse errorResponse = ErrorResponse.builder().message(e.getMessage()).title(HttpStatus.NOT_FOUND.getReasonPhrase()).build(); + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(errorResponse); + } + + @ExceptionHandler(MethodArgumentNotValidException.class) + @ResponseBody + public ResponseEntity> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { + Map resp = new HashMap<>(); + e.getBindingResult().getAllErrors().forEach((objectError) ->{ + String fieldName = ((FieldError) objectError).getField(); + String message=objectError.getDefaultMessage(); + + resp.put(fieldName,message); + } ); + + return new ResponseEntity<>(resp, HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(NoResourceFoundException.class) + @ResponseBody + public ResponseEntity handleNoResourceFoundException(NoResourceFoundException ex) { + + return new ResponseEntity<>(new ErrorResponse(ex.getMessage(), HttpStatus.NOT_FOUND.toString()), HttpStatus.NOT_FOUND); + } + + @ExceptionHandler(IllegalAccessException.class) + @ResponseBody + public ResponseEntity handleIllegalAccessException(IllegalAccessException ex) { + + return new ResponseEntity<>(new ErrorResponse(ex.getMessage(), HttpStatus.BAD_REQUEST.toString()), HttpStatus.NOT_FOUND); + } + +} diff --git a/backend/src/main/java/com/reactpairdemo/demo/exception/UserException.java b/backend/src/main/java/com/reactpairdemo/demo/exception/UserException.java new file mode 100644 index 0000000..e5e5044 --- /dev/null +++ b/backend/src/main/java/com/reactpairdemo/demo/exception/UserException.java @@ -0,0 +1,7 @@ +package com.reactpairdemo.demo.exception; + +public class UserException extends RuntimeException{ + public UserException(String message) { + super(message); + } +} diff --git a/backend/src/main/java/com/reactpairdemo/demo/repository/UserRepository.java b/backend/src/main/java/com/reactpairdemo/demo/repository/UserRepository.java new file mode 100644 index 0000000..535f4e2 --- /dev/null +++ b/backend/src/main/java/com/reactpairdemo/demo/repository/UserRepository.java @@ -0,0 +1,10 @@ +package com.reactpairdemo.demo.repository; + +import com.reactpairdemo.demo.entity.User; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface UserRepository extends JpaRepository { + Optional findByEmail(String email); +} diff --git a/backend/src/main/java/com/reactpairdemo/demo/service/UserService.java b/backend/src/main/java/com/reactpairdemo/demo/service/UserService.java new file mode 100644 index 0000000..0f50a2b --- /dev/null +++ b/backend/src/main/java/com/reactpairdemo/demo/service/UserService.java @@ -0,0 +1,15 @@ +package com.reactpairdemo.demo.service; + +import com.reactpairdemo.demo.dto.UserDto; + +import java.util.List; + +public interface UserService { + public UserDto createUser(UserDto user); + public UserDto getUserById(Long id); + public UserDto updateUser(Long id,UserDto userDto); + + public String deleteUser(Long id); + + public List getAllUsers(); +} diff --git a/backend/src/main/java/com/reactpairdemo/demo/service/impl/UserServiceImpl.java b/backend/src/main/java/com/reactpairdemo/demo/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..aa5f551 --- /dev/null +++ b/backend/src/main/java/com/reactpairdemo/demo/service/impl/UserServiceImpl.java @@ -0,0 +1,78 @@ +package com.reactpairdemo.demo.service.impl; + +import com.reactpairdemo.demo.dto.UserDto; +import com.reactpairdemo.demo.entity.User; +import com.reactpairdemo.demo.exception.UserException; +import com.reactpairdemo.demo.repository.UserRepository; +import com.reactpairdemo.demo.service.UserService; +import com.reactpairdemo.demo.utils.Mapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import static com.reactpairdemo.demo.utils.Constants.DELETE_SUCCESS; +import static com.reactpairdemo.demo.utils.Constants.ID_NOT_FOUND; + +@Service +@Slf4j +public class UserServiceImpl implements UserService { + + private final UserRepository userRepository; + + private final Mapper mapper; + @Autowired + public UserServiceImpl(UserRepository userRepository, Mapper mapper) { + this.userRepository = userRepository; + this.mapper = mapper; + } + + @Override + public UserDto createUser(UserDto user) { + User userResponse=this.mapper.dtoToEntity(user); + User user1=userRepository.save(userResponse); + return mapper.entityToDto(user1); + } + + @Override + public UserDto getUserById(Long id) { + Optional userOptional=userRepository.findById(id); + if(userOptional.isEmpty()){ + throw new UserException(ID_NOT_FOUND); + } + + return mapper.entityToDto(userOptional.get()); + } + + @Override + public UserDto updateUser(Long id, UserDto userDto) { + Optional userOptional=userRepository.findById(id); + if(userOptional.isEmpty()){ + throw new UserException(ID_NOT_FOUND); + } + userOptional.get().setEmail(userDto.getEmail()); + userOptional.get().setName(userDto.getName()); + userOptional.get().setPassword(userDto.getPassword()); + User userResponse=userRepository.save(userOptional.get()); + return mapper.entityToDto(userResponse); + } + + @Override + public String deleteUser(Long id) { + Optional userOptional=userRepository.findById(id); + if(userOptional.isEmpty()){ + throw new UserException(ID_NOT_FOUND); + } + userRepository.deleteById(id); + return DELETE_SUCCESS; + } + + @Override + public List getAllUsers() { + List userList=userRepository.findAll(); + return userList.stream().map(mapper::entityToDto).collect(Collectors.toList()); + } +} diff --git a/backend/src/main/java/com/reactpairdemo/demo/utils/Constants.java b/backend/src/main/java/com/reactpairdemo/demo/utils/Constants.java new file mode 100644 index 0000000..f63f316 --- /dev/null +++ b/backend/src/main/java/com/reactpairdemo/demo/utils/Constants.java @@ -0,0 +1,8 @@ +package com.reactpairdemo.demo.utils; + +public class Constants { + public static String DELETE_SUCCESS ="User Deleted Succesfully"; + public static String ID_NOT_FOUND = "Given Id Not Found !!"; + public static String BASE_URL ="/api/v1/user"; + +} diff --git a/backend/src/main/java/com/reactpairdemo/demo/utils/Mapper.java b/backend/src/main/java/com/reactpairdemo/demo/utils/Mapper.java new file mode 100644 index 0000000..b3c53ba --- /dev/null +++ b/backend/src/main/java/com/reactpairdemo/demo/utils/Mapper.java @@ -0,0 +1,19 @@ +package com.reactpairdemo.demo.utils; + +import com.reactpairdemo.demo.dto.UserDto; +import com.reactpairdemo.demo.entity.User; +import org.modelmapper.ModelMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class Mapper { + @Autowired + private ModelMapper modelMapper; + public UserDto entityToDto(User user){ + return modelMapper.map(user, UserDto.class); + } + public User dtoToEntity(UserDto user){ + return modelMapper.map(user, User.class); + } +} diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index 89eef6b..8dd396d 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -3,4 +3,5 @@ spring.datasource.url=jdbc:mysql://localhost:3306/pairdemo?useSSL=false&ServerTi spring.datasource.username=root spring.datasource.password=root spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect -spring.jpa.hibernate.ddl-auto=update \ No newline at end of file +spring.jpa.hibernate.ddl-auto=update +# make demo user email ,password and name with validations and secure password followed naming convention \ No newline at end of file diff --git a/backend/target/classes/application.properties b/backend/target/classes/application.properties index 89eef6b..8dd396d 100644 --- a/backend/target/classes/application.properties +++ b/backend/target/classes/application.properties @@ -3,4 +3,5 @@ spring.datasource.url=jdbc:mysql://localhost:3306/pairdemo?useSSL=false&ServerTi spring.datasource.username=root spring.datasource.password=root spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect -spring.jpa.hibernate.ddl-auto=update \ No newline at end of file +spring.jpa.hibernate.ddl-auto=update +# make demo user email ,password and name with validations and secure password followed naming convention \ No newline at end of file diff --git a/backend/target/classes/com/reactpairdemo/demo/DemoApplication.class b/backend/target/classes/com/reactpairdemo/demo/DemoApplication.class index 5662ef54f3b7e5d2df63f6832edc4998dbd1e8ad..3d71273b6f3644bae2e481853c3fdc732f205a40 100644 GIT binary patch delta 346 zcmaFKx|^Nr)W2Q(7#J9A8I%`tF{-gM2rx28=NF~x=jNxR=Hw<86r>jE`-0fMU^W*6 zKLhh*F2+rI++YwvW0Ygmop?@GATcj5za+6FGe1w?DK#p^O{fIN^Yb_QM~^&AY63{pUGX&`201acUF#>g51;=g%{>beNf*XKr iCI*Dn0w_j7td;|+0Xa+_tX2U?@-s0gGQfnD7#ILF+c<9k delta 199 zcmYj~O%4G;5QV?)q|Ho|VEi+7vziSnySac1*tv?t75W5@z=n`GfSb64c+G-Ey;qg@ zQ@7;l{Nr`K12yx5H(_Z`VQb5f+am1kdS@{>8p5_r3$YQq>Wn#Rv2=t{hJ>!L^)-;w w)0NR@AXf~p#L<`LNp&IH{PJE3cr`TtI#Py|BMD=TGrHox$p@#*#PM$dZ#l;iY5)KL diff --git a/backend/target/classes/com/reactpairdemo/demo/controller/UserController.class b/backend/target/classes/com/reactpairdemo/demo/controller/UserController.class new file mode 100644 index 0000000000000000000000000000000000000000..54fe34f2aef5e6757ea6b03cb0b11bcd3ec14a67 GIT binary patch literal 3451 zcmcImX>;2|7=Bhcj1xhVG)-wsA#D?yi*8$bfr24d)3i<#;?!Ip7}?r7Y8}Z)t8_99 zANfDPFw+Ul@B{c!4DZUatTYz0W#Gelwd?nI_IZ!pKmYpe4*;Lw%OM!(E1=)R00tRG zp4kUBZ`xjiZ`GcOx?~t!bUjy=82V;rs|CElaMceQJZuH7*LWJ(`{IQkJm-5-w)l<+ zTfP^HHBY+ou!tcH7hsxr6K^qGulxHv5O!U*Y&USkzR%;Iy6?%rZ#G51pM)Y(_7#yG>AzACwG2)Wd3Dl{R(*vxD>rX`YY zlb794T18CYYyoeZIEV8LS8@q?K&(`xEhDmHY&~L_E^EkILnz=K6_Se#rJ1((Oi(Nx zBP+fmtl6sK;XM07fpLW+(nCZ-e@g_WJPrQNkv z<@bFPS25G(Q#oBe+;AA~WDivKy@s9>WpK{KJQnC6QOijW^7RROI+(Q%rhHyA!Ev2@ zI-)5$lwtFu)UB!r6Tcz zLvE)Ed?}Lt3pWrBneA7xWjIxKJ@Gi&uZdvSCi9f4WxsAWt9Ib3b+Xwn_gwOKGmn+r z`Xf*Cl>4~}d%W67x>#`=9wmD~Q0n@ci?5W|Vjj|LVwS8DdA!vV-3w9UHP>^p{H+VQ zX}4PKxNK?WzW&ksRi|Q@(t%EGc2meb-`TcR`;>8)iT+zinjA9R)@E?q4>J^AJf7OS zhppr3eV&5)+zzD85A3E()k;~-<2SQa?7f-0PG*QSj{vusV79I;CDv`A!!E z!;k;3FKzPlTfuge$zy5--8WBi8);@s(zmiLU-hKB+EH7LZ6u0TyYzyEH?$U}5j(g~fl}qT4{~P}u zg|Fs*Mezuy7=FQ-m$>lLE4I#NY>g+jK8j^NPT^Ux{YfkmJOyrp?5l&E>DZq?!n+1J zxZK0Rh1kJFTOn~ks`Q915y(%;%mAYW(DwRS>UD|smT45hCTLoru}WiD(We$`H0V){ z`}E$+Lp7~X^*Z)s4ytuL=%QLD4{cN%F)9@@i^jumz(PEV;S^My$}yCAY$gQl5~M!b zn@9;-IKpgS4wmT{%Vb+4WoQCzEMx_bi7O-Ks%X$QXrqH{D@C@QLDu1oQmDh*sF488 rvd90Cy$|x(n|nR>K2I_3WH72=rtBH0(9*zeEILMCPiS3D#lQF)@_xn` literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/reactpairdemo/demo/dto/UserDto.class b/backend/target/classes/com/reactpairdemo/demo/dto/UserDto.class new file mode 100644 index 0000000000000000000000000000000000000000..d528cb8d398032cc38f7bec43f9b8e3ecdc73b68 GIT binary patch literal 3806 zcma)8-*X#R75=WYt6eE_;yAVwwMh}FV=Vs?6ey`2w@F=x7;M*#Qx}r9^jf;LH(u?k zyQ`G8@XGMS3{No3@JeQwJV1x0Gksv-rOfniYAN5{T}dlPG?}q?&z}38@19@xTz&E1 z&;AKu757TWA#cGb!$d(~{I0ww>#p<;>aXtKRn17CaK-VQ=tY72Ty3ui8$}DHGESf@ zaIxvP>w%KZs3V=ArP_Wyc|?Bw^-u+`M7}`IX_0tyz`W^u2P>NCWErP0E?{`Ftpp}A znB6FFQq)8lXEe%GZRxn$ZmNuFt+97x7{2cZtrC^z%BbKeDx1<g)_FXII%UICL6I2e|&ta*IWz-2il;Po;-(o(P@Qn$U>3d~7hwlrVZObFI z=6g*Uz2QUzd0`~IC=|Gz4K(&X6HV&TlW4L@NX-N)H@jZswAG#yI{U7==6QZ3BZs>S z=zWi55Xt&I={l`gU2kf~0_o7T`nDf!cU^ad32Un`ln0D!O6RTG?uJp7RMmY|)ewP8 zk0aZ4K2&7Nw;eCfycle&buUsuHQv0Ml;gs%ySF~*47)rXmtw^Bvya<8Hst=38(y+u z!gSpa+L8yQ(ktf(?#Je7M@9_9BYPoG2kMs{rsM6omsXeO@5rSO->N0zwWZss_-3oN z{L$sbU(X19G`ug@?nm0qjrculw4%D{Y2RlA*z3Ys!h zG}W#wR<+jk-#@0+1bU_A95~T3&u-GIr#2l=ZFk%ID!3)tCHge`P3i8*z|r5S(ufWn zw$04u;|B**VTQ@+Jo89<*Y;TZEfpR5tsMr~RysoV7!8sx7&`iCD{CX0h`4M#ffReG z6A+wK*#VS}3p(LPhbkbqc6~hvRCQ2Nw!r(`Al8jF_(JD*He z2a2)XNH&kQWG79UxpQ-4Yn?7`#N82gU3ObO-rt-_wkyn}Fs#;{3BIQn3HLAogL-} z9|-(0Tc{M6kltY5xGJ34^!=l5XXP7*(U74&za!vxG7P=Ro>8R~YtnUhok*?NV0q`$ zxaXYKs#vV*%;|TWIW6=uw<>B((uU`$V9n(Xqe2U8fJ=|$U{q)pSe$3R8OkyydEo70 z^P1r(&pYh}>u2K1Nh&AoWE020|l_bNEF>c787ksYM?KC<7W)O4Q%jB=)0QFVdH#bGWmFQH09|hrPM9jr%XO}MpI5cDW&e(K4tR3A8|?G;#Yj1 zU`{?>nEwk*(8wWTzmjVrM|LMvl! zE2SRDctEf7kDQcF5>3DEALBLLWcX9~Gj@4;a{RUWJKUl!k9qtSuTwJEZ%5dpWU?g` z-k?-~OYWah;;h3}{G5`F-*Z6Src}fq@HFmFD&bA~@jOmh_Ln$m!Tt)<7IOTv#aB3& zh{gXS_PX&kR>;u5*3)i$fez~iH+401oY_O2OoXJr&3>FFqtkJw{kK@3`SF!QmeL+yxDRXTAr{}!`il)iFI0?l#nuH*mS!7fyu{kZMs~&Q zE!7%@c&X4|V#R57esqy;B)+81=h4Pnc$=P@EWy3}rLaN_sr$&zy>z<6Ru^ZIkVg{~kL0Dp7h5 IA-bsi5Am-4CjbBd literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/reactpairdemo/demo/entity/User.class b/backend/target/classes/com/reactpairdemo/demo/entity/User.class new file mode 100644 index 0000000000000000000000000000000000000000..ed064bb44ae15a776db429b56e3a286ddc9edd7c GIT binary patch literal 3389 zcma)8-E$LF6#w01H@iu<^aEOmRKyZW(+{GkC<#@d6o|B?(o&@O!8TdirO9qgHaN`q z?D*u2Pdd){Dl-lb$|%n8;OGm^_&168ySp2bwhMG7yZ3zj&bjBFbMD#v^WVci08GJ6 zA%?gH#ej;0K<_Q{wwbG#&RXu$>Mg6}2_#P1j_tiG5FgDhC!r&$A!VQohQM&it>)^M zS@LS8T`yZzH|M`B$FsdVxhoB;E)cWJbUfSkJnK4Z1?g#*fgbbA(P(QF6Q4^U?2pn+GV&x9o%Hl*bt0~s6^&}cdDhrMT$Z5X(O9x*T~ zp*o>6GIl8(GcYcNT@<#%k73flQRE0-Hyi8IZkhRD!i)VZ)9VI~;SGVkRdd6dcAb*x zU9~-eoQ7vQUPEA|^Pqn89j6H++KHqy389%l`f`)ytXj)oH|u4dI6cEhurl9el#3j&!))p^UY>ZWIvm(5DkB1~_1l3%;?0t@c9bf@N96wl7g zFBO-r2@FN~$FcuW-=hz3CeZEDjn?b1jm!tWb) z3&~cu2ncucWeHoGLAc(!ymFchJtOa(?n`_!=?jCamI}ln<175z#hn68$aVXw_RhNk zZClX2=$WOBIkOffO3^^)i$Fr(Es zs=$HgLs{P-2^^6+XCM~R!}&y7m6*gM^xs8yT1_W9KqGmLppm?u)+9&|L0Vex0A=$@ zg0lHkIw?V^5R^=(S|H^fqmFO8DYf7OIaLa_zH8R z6r9Hf=1HmKEnFg%K!s^vAf=&BZy%7-@eRktWl~9ei~U$6mBJF^IF24o{};P7=#Md| zA;zCB9%ElXCZ9nfEJ~5xsK`HnVK<&&z_P(rSq*v4&PyFkgrL7$6G6^~i;PCJJYMws zoBzpz`zF4m3yqFyy@iv?lwZuD-oiRdsrQcGg*N#B6E~!MIIl=WS_w6}EO4M2$*aDK zwe^kkwAxZ-^9f&-c&cK>X*CpGqzgeTVUgmf;tG}-smd~3B^6^@Z{kB9D2_uc$u&|6 zOMMJ0q*U^Iah+7cPySEPpHQG^(1l>aA;c3Jw)vP83_xuGS{P-sD1;?CU~S}9X$aOf zgWLEB1xw~f!GWC2$_+%gAHDK#d?EDZ6hM80FvELk@_}?t~!T6N? V4L&+)lg}D#aw$@`*w7Br{{uE}f_VS{ literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/reactpairdemo/demo/exception/ErrorResponse$ErrorResponseBuilder.class b/backend/target/classes/com/reactpairdemo/demo/exception/ErrorResponse$ErrorResponseBuilder.class new file mode 100644 index 0000000000000000000000000000000000000000..1038fab5ed1b5b9b436a322d0c0b2103f68fbb0c GIT binary patch literal 1635 zcmb_cZBG+H5Pr6_y;2K3D}wlfs72a>oT4JJ;s+ZDCKZhk4Dr*p-N3>1w%OYf`6vDi zO)w;w_yhb=#@V|HG;IhZ=5o6;vop`U?9BfDbNmay5?-Vc!+?c&1_>k?>|MUk9gq9l z&imS~sB4DgE7y1RYleYBadQwU3|dHMa0MBLN?kS`C3s!8xT_kXDV=Z;U+SWzUFkc^ zN=fxm1TE8`s6caH2MmiBL+f?G5UQT;_diUS`nz?O;`NCzLP^>8}qi$drA^V;lVMwpbwyKL2H!NRQo6Q+@!dMf5UX=lL zwEad(9caZ{QJg_GiDDWh%vhK;7ygJLf9k~b_vM~&q6nfMSfP%W>VV-$1gJRSssE^nltrG=*qQ$1zsm%WAO3=`+8(nAxK3ioK@V>Ej) z`skGjDH?y;6XBl(!#Gh6?aW9@M_}KHh~Xx!<`}SWi`Gn}fZMo393!|1(lW;75T5i( zGe2ngMxtKxQIZ*`$lOpS9)`OlO&Bzrm~4N{p$lW0+)gmFA?73%AxiQk;zR-VPuN?f zLkjf}Lr2K<4>-!#KFRk!9&~UPDHVe={14+8*Maj;hC3*62(3W> V93B&wqw^F+{se=V$1^No{4Z*Em_`5q literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/reactpairdemo/demo/exception/ErrorResponse.class b/backend/target/classes/com/reactpairdemo/demo/exception/ErrorResponse.class new file mode 100644 index 0000000000000000000000000000000000000000..2efc5dbf9bd405e2497de30393f6e1d9baf9dc59 GIT binary patch literal 2579 zcmb7FT~i!I6g|B=Uu*{0U`VnC5p-i>3EyvJL~skJrXdkxt<$c7s!r{ul2w}kBOX(W3UCz*Zu8sAf0;D za@=4;Zu{ls^VQ`c}=}0dU7CcV|vrQ)qCAB%xu_V1LOxzVX zdq|OP8#S>iF#O-4tZbqRMtLPbB#U<4?ypXG*kc9J3tzOHUw56OUk) zCLf{q2f8wt;M3qjz{Dh8gqL3@lddlADG zogu>&qoAu8;~55a(Ob|9#$J&2kh!vL)k;X;N;vH6(7+|UN1lUN!DTi{21VS!75cK& z_ByW8(r}aAS)rw~`_7S53p5t_4_UwysiDGE#j}MF4Y8o5JKlz$ycvw)3Jy{`D%j_TKS1x zm{X52`la#@S2Q(I(9#)83CpRW?t)!RP*WONl9;9}yzVL7`?NAVo)_=|sb%@)K7|iy zX|XuBp}n9(qc}oP5D4*tK?m;{09Py@G;xs6BPadlr|2d literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/reactpairdemo/demo/exception/GlobalExceptionHandler.class b/backend/target/classes/com/reactpairdemo/demo/exception/GlobalExceptionHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..d06e342be961037b57d6172e119fe33bfe038e2c GIT binary patch literal 5503 zcmcgwX?GLX8Gf#}!Sa9|houmQ05OSe97IXUCPQKygK2F;Y~$2TTNp{#^5D^oIx{lR zE$Nb^d(t*t(`MZSMTz?`+Mh~|Nh|b z0FGlVg%-4GXw%V-4uPIa#;TFF47-p%o4q7+zCg!_X`B8Df!2Y+g%q}+Q$tEe7j%Kc zIj5L*rIGVXhUw;I(MbpYDaG)+)Z!JO2c#PbIY#bN#(nHb@VI8wfm-T z1t<6ExE}*N2|_M#wCR9T=@1TS7}oIs4h!607icBHCTyy|%AEBgLoW_AV%@ltmzlx( zl|S?5|&@%s4^NJ61XEs?6PlK z=}E&|o;FG;97AggkK!>6866`yE-;dW^0LgPv!mDmYI)L zQxD@mMoQ)wJyW*WB#tn+NkUf@s}Xd9bsU*4JdP(cjOrM}xWI5T%mO+Qj9OOE5SY%r zm5L4wpE5l^)64cYq2m-zGaHPYYDa8Wk%I#=`i9=E`D>|c=K`SPY*jSfCB`%OxQ0*Y zn8LKcwi>Nc!SY^m+zBJMEU+&w_*OxK3#v-b>NuxLv}q&Rjl0G}O=ak)?OwTwBVDR;nQ?_d{R@MGV z9gC{kxA;!jBUSHzT4DV(OEHc$YM}`oj-WoPKwY4VYAyGSWyykJjWQ~pSIsL8hQMGF z^jH#|GNqLd!k)rK%&1dqf$5fyFB6V)=VnI9c#_?*DQo6ecjmXkHCs+T4WJ8!A^ z*`~tIUOZ*ma;99&N_XDKT0H5Ua&m^XV7R7wjt<-WWs`;S=;k9gSzm^lmIKvQBmz&w zO|PCe(Xs>t0q=;pt0sm1mg{$iBb$Q{LRsn7#M~41vU7$Sg}!vv=$kVOHm9IV&F=qb zz(})*P7u@X*)pe8Q7)LC$pDSow!>k?U5VfxORV>5XEv&|>8himgrMMd)=8OGHQ=Z7 z>;zQ_WPPY%y%p!G8A!&1VNz^5GR)*TT(xWy0Zrx9iH(ifOchIu{gL(E9UBg6SP1M~ zUs_j7mGU~ao^&LZ(RG`n%7xeeUv7yIRR&*!02Rc&VT9{V3IV&m4GqtmrsCTouW&)H z8|227Zs`BU#UyV&!H}+0OSqSQsCLm8`agMQ3QWgaSTa#l&OH!I-8$j~p1GY$Ka^Jv zTShUPH~JfDKmA8)%T=WUGKu*U+caXkL1vIkRhJXohofa-xEXd1oh7xm%y0;)`CMBC zqUOL0>Rh;mnQDUHl{|wFD?VD1sJhxoV>5!;=X06$U55*oJDOiLbCMO^Gv+wH=etHJ zY=vHT2i{2GSNOGt-{|-)-V``c!)V&8&WcP=1r8^NvBc}Xb7v zSRB0mDaTnUmom57A3IscIL{6nCvW`6Q02zF@wWhxzv+yrbjC_(>1`D3DHWfg5C#e#W+?J8l`CCpq`GuUlNAyQR7*)NYy@u5sMn5|$(n zYxpbs_Qs^V6@}rze%jK)+Y-yR`TIf{k$g(SReYX$c3~^NfG?8zOQdfXJO;iTh>3lZ?|;(HPBa}1C2 zQJ(^L6I&Jud_M5(Q`hk+eu==wV|6G1xijReg6zYKc!`iA557pDp$EU80OX|z$Pe(t z4S;-x&RRo#AV=#0c{vHlj}m~qtbp{SROOLHW!ee@(#FqShyH9e0Hb|Anr6tV}Aq8ujIPw}%LR^9kHUZLBzBE{2J0!6!z}*q_c;V7FOv>AUIZ) zvSWd*z2sXru|`$-Xnz`FSzwszGBzYryO7FcRO+}b^koy@)?|K|`lmW0fnK62x@^iB znHxDPm>DEGmBmyV^e@QHb#^6x14LQc;;!JqSEw8Ci2-SNS};SB literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/reactpairdemo/demo/repository/UserRepository.class b/backend/target/classes/com/reactpairdemo/demo/repository/UserRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..7b829409f6841cb2e66dc38cec087545ccb0cf1b GIT binary patch literal 546 zcmbVJ%TB{E5L^dBDCJR!pC}j1g;Rh75*$#Vh=>nZ5;r&`w&iR0_y9f%v1z2X z9FQswYkODn%+Ac$_s1syoWm%BK)^|6Yv~nc$K@{NE{^(cc>7Y3>IO2FNkh-b+k zW++3NdL!Zs=6zq;u-6|a|I)q|;|f_~*^F+3oz%8IQ`fp;eTTmjI_~V_I0S5Pg&elv b$RgN=00!KJ{GG2MR{*!brYpYKObx3S>Pxe)(kJ88ySu%w{qpWN? z8Chp|^>&*I9QUKeSdkuQbqzel-9b4?f98K)lBzRm%{;yvp7XP3N;xN*?d)L5bMPxq zY>nbX0xt7qp1U4iM6W+5l~(0pqzcQFcC50ow51_|lO@7gohTP96U4eS3Eilib-KHfI1blhV?nr_P`J}DtHs!zsxQ47}{ov LhaIkVt7`8XbKAqC literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/reactpairdemo/demo/service/impl/UserServiceImpl.class b/backend/target/classes/com/reactpairdemo/demo/service/impl/UserServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..1facdf6e64e5d64e3c91bee5d0f2c3b3740336c2 GIT binary patch literal 4684 zcma)A`CHu96+LfQ#0)YJ>ezK+Y`i4FfGsDnUE(2bF$@jK0Imm<+DYn)88Md8NE1ne zL$`F__a&{nq;0zI*^G_TCi%Hv|D68VuV2rTG&355sNrKIUEO!zx#w``!^iuL?#5cyK6x zXYhz%lSsinfrAOV#DGbb22~uuK{_AG7aV%Eo%6Bf$5qDeAPD{Teld>AskUKtYQSC0{wxvEh++v>E$X_88s&GB?ZR>jwQMOLeU6J z2cgN;pVByvhZQ`c;!&I+(Fv==gqd_~&)03=6HsTSF3-&`T%Ml4FgHbXv0xN@*R;#T ze-x)=>Ag?j-ni4z`y-3e!^c#dMwa-?2J3O>&=yh6u$Ip#c)yAdU?MrbG44q?&E+b( z$%<^X*#I|yNflEPT$dN=%8jN~d{FM9(7>EtF)|pyjEX0vqC&+`_Biq?W~E*?_0H*@ zcg=B2Qg>d(IjP%C-MU<6!g&=1EC^&uhGqChm7t5Dc!p?XPEAQgZ`5CtwJhCZ?7XOreiYqBhIG)y`rj)va6X&ZC3 z%97zO=t~wQgkIFGMcp;!b0lo{ub2$k$t3f2{98?Rwx_;X!@uH`&gm|Df^W#^?>S%N zsH+%@re|`W3EOsjU1lxcjfL!0Wg}dcOV}P(v?W8gJ#9G*lcqNoXcINxxyC9gai>g? zwdWg>$L+>ZtlQn)I3i*4Xd-YpiGsLEHu&%$<5lSpNljc8pNlMdx$5DtElL-{K6fgf zgn5UVMTkrop>#S z*YSpeH&xugI!_qQ5SsR?vtnp@y|Pr&xk8VsmvpiZG@t$zk3qC3+~5h_E?I_mIPW+s zwQ4q&9#Ldsl9q)F1Rhtv``vib z49rRK(RJ*9l{z7$o?z=kgmW0X`NcrO84hhU;0)rs_#XF3Q{(&i0axzk{Y$)S3xIV9 zDo7wd#E&8%FY%S6VpQ%wvVlV>%#N<(q3h^*3r8=$4(%pRz9ZpKI!0&_sP-67!*q9q zoQ;w#EymMm1K238 z;QpInJ1ARj!kr^ecfh4YLM7tyb)0QJ<<{{;^XaK|NS>8QQs@43yYzNXdyAt72@N(HL@hrvz$4`Xl8jdeVjuSCnVQge(JQGmR#x4q{#a?wm=2RHIT>;t&VmeE&Ch1iU4`DhM z!jXn2BaILaZVI84{GSm1hHi(czedCNRSSa~DC4b<$6#mFq{wb(R zS&0WImp|$Lu3Px{8~BXu0wUN*7B2X|kaql;*A)KJDCfWO`EUG_8T=|?-6YZt+@>T$ M$y@jb-oc*#0dRH-ssI20 literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/reactpairdemo/demo/utils/Constants.class b/backend/target/classes/com/reactpairdemo/demo/utils/Constants.class new file mode 100644 index 0000000000000000000000000000000000000000..08e6eb78c00b61a7e19cf18a52344e6df4ce045a GIT binary patch literal 576 zcma)3O;6iE5Ph2u;siHI4HR11;#?})153|*NHlROBrB0{!Zq613oLSMWUnLfv#K1B zIPe4bQHa?T!IjI*zM0uKZ)P5!?jHagq0>MKAC3n-3mX*S;zsfLZ(fjUQ@Uwm%amGwP6BT-KJytW z-87O6Eng*aP|T(>8;NO55ywwM5ub}p8T=Bg=qp94cm4OxcR;NU!}w*3jUX+uQ1+Ff zZ@w;J&kT$X$t%%e%BY(a(yMO9T6)qo6 w0AKNqkcIEBpZAv;pzYKas5`9%K050Qd@?)?hNnp!K!qAsNtj{XAzXs{40-W(Z2$lO literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/reactpairdemo/demo/utils/Mapper.class b/backend/target/classes/com/reactpairdemo/demo/utils/Mapper.class new file mode 100644 index 0000000000000000000000000000000000000000..195ec03ef514f7c750b541ccd4fafa877c90c48b GIT binary patch literal 1176 zcmaJ=O>fgc5Ph33((aD1iz>?i**DZn3@AdQFvo1rh>@ z1LDk&LX4eK+^X(n#xtIM^XBc&?>|3&0(gpc6$KO>l!mxZOJ_+uLV9MW)52b4v zDo<3P>@$X9t36u4B`i3o)=@*9VawG%H&VDZ6v|AbuX$=>tGtL0L>NlLQ1kUfdjF!$ zzBW^yru?*k5B~q|I%qK5&4Ha*%|Arays)~8Wvn=8)^QnE7&b1zB<9qJ;Zdu9cDimR z)AK|Wb=#TDTmhoAmQP6rR@qs~iedd-OrbAFDpF%l?goLj!YUm^43E>XqtK{ex^ILp zkF@#7$5I3l-zNdJnQ?J)fbYguA1NazU4~MR1Y%g~t3bYq{joGdLGTRCzIKH-5=JHQ zak69&6!qKb=ZKiS8v?J*Cm3oHmEm#FIc}Bk6`40AlJ_@)_Hu()y zu|YNgpaR^$CV7UNxJ6aT;pYUFG-`Cd!g