From dbd31f99685391ea9e2f41dfadf306cb375664d8 Mon Sep 17 00:00:00 2001 From: Somnath More Date: Sun, 4 Feb 2024 20:04:12 +0530 Subject: [PATCH] feat: One to Many mappings --- .../reactpairdemo/demo/DemoApplication.java | 5 +- .../demo/controller/EducationController.java | 50 +++++++++++ .../demo/controller/UserController.java | 51 +++++++++++ .../reactpairdemo/demo/dto/EducationDto.java | 28 ++++++ .../com/reactpairdemo/demo/dto/UserDto.java | 31 +++++++ .../reactpairdemo/demo/entity/Education.java | 25 ++++++ .../com/reactpairdemo/demo/entity/User.java | 22 +++++ .../demo/exceptions/ErrorResponse.java | 11 +++ .../exceptions/GlobalHandleException.java | 50 +++++++++++ .../exceptions/ResourceNotFoundException.java | 7 ++ .../demo/repo/EducationRepository.java | 14 +++ .../demo/repo/UserRepository.java | 12 +++ .../demo/service/EducationService.java | 14 +++ .../demo/service/UserService.java | 14 +++ .../service/impl/EducationServiceImpl.java | 80 ++++++++++++++++++ .../demo/service/impl/UserServiceImpl.java | 80 ++++++++++++++++++ .../reactpairdemo/demo/utils/Constants.java | 6 ++ .../com/reactpairdemo/demo/utils/Mapper.java | 22 +++++ .../reactpairdemo/demo/DemoApplication.class | Bin 745 -> 955 bytes .../demo/controller/EducationController.class | Bin 0 -> 3817 bytes .../demo/controller/UserController.class | Bin 0 -> 3425 bytes .../reactpairdemo/demo/dto/EducationDto.class | Bin 0 -> 3634 bytes .../com/reactpairdemo/demo/dto/UserDto.class | Bin 0 -> 5046 bytes .../reactpairdemo/demo/entity/Education.class | Bin 0 -> 4331 bytes .../com/reactpairdemo/demo/entity/User.class | Bin 0 -> 4677 bytes .../ErrorResponse$ErrorResponseBuilder.class | Bin 0 -> 1640 bytes .../demo/exceptions/ErrorResponse.class | Bin 0 -> 2583 bytes .../exceptions/GlobalHandleException.class | Bin 0 -> 5544 bytes .../ResourceNotFoundException.class | Bin 0 -> 472 bytes .../demo/repo/EducationRepository.class | Bin 0 -> 570 bytes .../demo/repo/UserRepository.class | Bin 0 -> 703 bytes .../demo/service/EducationService.class | Bin 0 -> 808 bytes .../demo/service/UserService.class | Bin 0 -> 689 bytes .../service/impl/EducationServiceImpl.class | Bin 0 -> 5266 bytes .../demo/service/impl/UserServiceImpl.class | Bin 0 -> 4767 bytes .../reactpairdemo/demo/utils/Constants.class | Bin 0 -> 446 bytes .../com/reactpairdemo/demo/utils/Mapper.class | Bin 0 -> 1171 bytes 37 files changed, 521 insertions(+), 1 deletion(-) create mode 100644 backend/src/main/java/com/reactpairdemo/demo/controller/EducationController.java create mode 100644 backend/src/main/java/com/reactpairdemo/demo/controller/UserController.java create mode 100644 backend/src/main/java/com/reactpairdemo/demo/dto/EducationDto.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/Education.java create mode 100644 backend/src/main/java/com/reactpairdemo/demo/entity/User.java create mode 100644 backend/src/main/java/com/reactpairdemo/demo/exceptions/ErrorResponse.java create mode 100644 backend/src/main/java/com/reactpairdemo/demo/exceptions/GlobalHandleException.java create mode 100644 backend/src/main/java/com/reactpairdemo/demo/exceptions/ResourceNotFoundException.java create mode 100644 backend/src/main/java/com/reactpairdemo/demo/repo/EducationRepository.java create mode 100644 backend/src/main/java/com/reactpairdemo/demo/repo/UserRepository.java create mode 100644 backend/src/main/java/com/reactpairdemo/demo/service/EducationService.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/EducationServiceImpl.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/EducationController.class create mode 100644 backend/target/classes/com/reactpairdemo/demo/controller/UserController.class create mode 100644 backend/target/classes/com/reactpairdemo/demo/dto/EducationDto.class create mode 100644 backend/target/classes/com/reactpairdemo/demo/dto/UserDto.class create mode 100644 backend/target/classes/com/reactpairdemo/demo/entity/Education.class create mode 100644 backend/target/classes/com/reactpairdemo/demo/entity/User.class create mode 100644 backend/target/classes/com/reactpairdemo/demo/exceptions/ErrorResponse$ErrorResponseBuilder.class create mode 100644 backend/target/classes/com/reactpairdemo/demo/exceptions/ErrorResponse.class create mode 100644 backend/target/classes/com/reactpairdemo/demo/exceptions/GlobalHandleException.class create mode 100644 backend/target/classes/com/reactpairdemo/demo/exceptions/ResourceNotFoundException.class create mode 100644 backend/target/classes/com/reactpairdemo/demo/repo/EducationRepository.class create mode 100644 backend/target/classes/com/reactpairdemo/demo/repo/UserRepository.class create mode 100644 backend/target/classes/com/reactpairdemo/demo/service/EducationService.class create mode 100644 backend/target/classes/com/reactpairdemo/demo/service/UserService.class create mode 100644 backend/target/classes/com/reactpairdemo/demo/service/impl/EducationServiceImpl.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/src/main/java/com/reactpairdemo/demo/DemoApplication.java b/backend/src/main/java/com/reactpairdemo/demo/DemoApplication.java index 0108661..9713c2b 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 { @@ -13,5 +15,6 @@ public static void main(String[] args) { public ModelMapper modelMapper() { return new ModelMapper(); } - +// user have crud application + // user can have many education id,degree ,percentage, passing date ,shoolName pagination should work } diff --git a/backend/src/main/java/com/reactpairdemo/demo/controller/EducationController.java b/backend/src/main/java/com/reactpairdemo/demo/controller/EducationController.java new file mode 100644 index 0000000..9b1dced --- /dev/null +++ b/backend/src/main/java/com/reactpairdemo/demo/controller/EducationController.java @@ -0,0 +1,50 @@ +package com.reactpairdemo.demo.controller; + +import com.reactpairdemo.demo.dto.EducationDto; +import com.reactpairdemo.demo.dto.EducationDto; +import com.reactpairdemo.demo.entity.Education; +import com.reactpairdemo.demo.service.EducationService; +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; + +@RestController +@RequestMapping("/api/v1/education") +public class EducationController { + + @Autowired + private EducationService educationService; + @GetMapping + public ResponseEntity> getAllEducations() { + return new ResponseEntity<>(educationService.getAllEducations(), HttpStatus.OK); + } + + + @PostMapping("/user/{userId}") + public ResponseEntity createEducation(@Valid @RequestBody Education educationDto, @PathVariable Long userId) { + return new ResponseEntity<>(educationService.createEducation(educationDto,userId), HttpStatus.CREATED); + } + + + @GetMapping("/{id}") + public ResponseEntity getEducationById(@PathVariable Long id) { + return new ResponseEntity<>(educationService.getEducationById(id), HttpStatus.OK); + + } + + + @PutMapping("/{id}/user/{userId}") + public ResponseEntity updateEducation(@PathVariable Long id, @PathVariable Long userId,@Valid @RequestBody EducationDto educationDto) { + return new ResponseEntity<>(educationService.updateEducation(id,userId,educationDto), HttpStatus.OK); + } + + + @DeleteMapping("/{id}") + public ResponseEntity deleteEducation(@PathVariable Long id) { + return new ResponseEntity<>(educationService.deleteEducation(id), HttpStatus.OK); + } +} 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..ba5dd94 --- /dev/null +++ b/backend/src/main/java/com/reactpairdemo/demo/controller/UserController.java @@ -0,0 +1,51 @@ +package com.reactpairdemo.demo.controller; + +import com.reactpairdemo.demo.dto.UserDto; +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 static com.reactpairdemo.demo.utils.Constants.BASE_URL; + +@RestController +@RequestMapping(BASE_URL) +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 userDto) { + return new ResponseEntity<>(userService.createUser(userDto), 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, @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/EducationDto.java b/backend/src/main/java/com/reactpairdemo/demo/dto/EducationDto.java new file mode 100644 index 0000000..cbe6f6e --- /dev/null +++ b/backend/src/main/java/com/reactpairdemo/demo/dto/EducationDto.java @@ -0,0 +1,28 @@ +package com.reactpairdemo.demo.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.reactpairdemo.demo.entity.User; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Builder; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDate; + +@Data +public class EducationDto { + + private Long id; + @NotNull(message = "Please Enter courseName") + @Size(min = 4,message = "Please Enter valid courseName") + private String courseName; + @NotNull(message = "Please Enter courseName") + private String percentage; + + @NotNull(message = "Please Enter courseName") + private LocalDate passingYear; + +} 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..da71c46 --- /dev/null +++ b/backend/src/main/java/com/reactpairdemo/demo/dto/UserDto.java @@ -0,0 +1,31 @@ +package com.reactpairdemo.demo.dto; + +import com.reactpairdemo.demo.entity.Education; +import jakarta.persistence.CascadeType; +import jakarta.persistence.OneToMany; + +import jakarta.validation.constraints.*; +import lombok.Builder; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + + +@Data +public class UserDto { + private Long id; + @NotNull(message = "Please enter email") + @Email(message = "Invalid email format") + private String email; + @NotNull(message = "Please enter password") + @Pattern(regexp = "^(?=.*[A-Z])(?=.*[a-z])(?=.*\\d)(?=.*[@#$%^&+=])[A-Za-z\\d@#$%^&+=]{8,}$",message = "Invalid password format") + private String password; + @NotNull(message = "Please enter name") + @Size(min = 4,message = "Please enter a valid name") + private String name; + @NotNull(message = "Please enter age") + private Long age; + + private List education= new ArrayList<>(); +} diff --git a/backend/src/main/java/com/reactpairdemo/demo/entity/Education.java b/backend/src/main/java/com/reactpairdemo/demo/entity/Education.java new file mode 100644 index 0000000..511dabd --- /dev/null +++ b/backend/src/main/java/com/reactpairdemo/demo/entity/Education.java @@ -0,0 +1,25 @@ +package com.reactpairdemo.demo.entity; + +import com.fasterxml.jackson.annotation.JsonFormat; +import jakarta.persistence.*; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDate; + +@Data +@Entity +public class Education { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String courseName; + private String percentage; + @JsonFormat(pattern = "dd/MM/yyyy") + @DateTimeFormat(pattern = "dd/MM/yyyy") + private LocalDate passingYear; + + @ManyToOne + @JoinColumn(name = "user_id") + private User user; +} 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..b8aab32 --- /dev/null +++ b/backend/src/main/java/com/reactpairdemo/demo/entity/User.java @@ -0,0 +1,22 @@ +package com.reactpairdemo.demo.entity; + +import jakarta.persistence.*; +import lombok.Data; + +import java.util.List; + +@Data +@Entity(name = "student_edu") +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String email; + private String password; + private String name; + private Long age; + + @OneToMany(mappedBy = "user",cascade = CascadeType.ALL,orphanRemoval = true) + private List education; +} diff --git a/backend/src/main/java/com/reactpairdemo/demo/exceptions/ErrorResponse.java b/backend/src/main/java/com/reactpairdemo/demo/exceptions/ErrorResponse.java new file mode 100644 index 0000000..f7e75d8 --- /dev/null +++ b/backend/src/main/java/com/reactpairdemo/demo/exceptions/ErrorResponse.java @@ -0,0 +1,11 @@ +package com.reactpairdemo.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/reactpairdemo/demo/exceptions/GlobalHandleException.java b/backend/src/main/java/com/reactpairdemo/demo/exceptions/GlobalHandleException.java new file mode 100644 index 0000000..656cc53 --- /dev/null +++ b/backend/src/main/java/com/reactpairdemo/demo/exceptions/GlobalHandleException.java @@ -0,0 +1,50 @@ +package com.reactpairdemo.demo.exceptions; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.SpringBootApplication; +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 org.springframework.web.servlet.resource.NoResourceFoundException; + + +import java.util.HashMap; +import java.util.Map; + +@RestControllerAdvice +@Slf4j +public class GlobalHandleException { + @ExceptionHandler(ResourceNotFoundException.class) + public ResponseEntity handleResourceNotFoundException( + ResourceNotFoundException ex + ) { + log.warn(String.format(">>> {}", ex.getMessage())); + return new ResponseEntity<>(new ErrorResponse(ex.getMessage(), HttpStatus.NOT_FOUND.toString()), HttpStatus.NOT_FOUND); + } + @ExceptionHandler(NoResourceFoundException.class) + public ResponseEntity handleNoResourceFoundException(NoResourceFoundException ex) { + log.warn(String.format(">>> {}", ex.getMessage())); + return new ResponseEntity<>(new ErrorResponse(ex.getMessage(), HttpStatus.BAD_REQUEST.toString()),HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(IllegalArgumentException.class) + public ResponseEntity handleIllegalArgumentException(IllegalArgumentException ex) { + log.warn(String.format(">>> {}", ex.getMessage())); + return new ResponseEntity<>(new ErrorResponse(ex.getMessage(), HttpStatus.BAD_REQUEST.toString()),HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(MethodArgumentNotValidException.class) + 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 ResponseEntity.status(HttpStatus.NOT_ACCEPTABLE).body(resp); + } + +} diff --git a/backend/src/main/java/com/reactpairdemo/demo/exceptions/ResourceNotFoundException.java b/backend/src/main/java/com/reactpairdemo/demo/exceptions/ResourceNotFoundException.java new file mode 100644 index 0000000..053893f --- /dev/null +++ b/backend/src/main/java/com/reactpairdemo/demo/exceptions/ResourceNotFoundException.java @@ -0,0 +1,7 @@ +package com.reactpairdemo.demo.exceptions; + +public class ResourceNotFoundException extends RuntimeException{ + public ResourceNotFoundException(String message) { + super(message); + } +} diff --git a/backend/src/main/java/com/reactpairdemo/demo/repo/EducationRepository.java b/backend/src/main/java/com/reactpairdemo/demo/repo/EducationRepository.java new file mode 100644 index 0000000..cc66f49 --- /dev/null +++ b/backend/src/main/java/com/reactpairdemo/demo/repo/EducationRepository.java @@ -0,0 +1,14 @@ +package com.reactpairdemo.demo.repo; + +import com.reactpairdemo.demo.entity.Education; +import com.reactpairdemo.demo.entity.User; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + + +public interface EducationRepository extends JpaRepository { + Optional findByCourseName(String courseName); +} + + diff --git a/backend/src/main/java/com/reactpairdemo/demo/repo/UserRepository.java b/backend/src/main/java/com/reactpairdemo/demo/repo/UserRepository.java new file mode 100644 index 0000000..5658eff --- /dev/null +++ b/backend/src/main/java/com/reactpairdemo/demo/repo/UserRepository.java @@ -0,0 +1,12 @@ +package com.reactpairdemo.demo.repo; + +import com.reactpairdemo.demo.entity.User; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; +import java.util.Optional; + +public interface UserRepository extends JpaRepository { + Optional findByEmail(String email); + List findByName(String name); +} diff --git a/backend/src/main/java/com/reactpairdemo/demo/service/EducationService.java b/backend/src/main/java/com/reactpairdemo/demo/service/EducationService.java new file mode 100644 index 0000000..9a75f2f --- /dev/null +++ b/backend/src/main/java/com/reactpairdemo/demo/service/EducationService.java @@ -0,0 +1,14 @@ +package com.reactpairdemo.demo.service; + +import com.reactpairdemo.demo.dto.EducationDto; +import com.reactpairdemo.demo.entity.Education; + +import java.util.List; + +public interface EducationService { + List getAllEducations(); + EducationDto createEducation(Education educationDto, Long userId); + EducationDto getEducationById(Long id); + EducationDto updateEducation(Long id ,Long userId, EducationDto educationDto); + String deleteEducation(Long id); +} 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..bbfc11e --- /dev/null +++ b/backend/src/main/java/com/reactpairdemo/demo/service/UserService.java @@ -0,0 +1,14 @@ +package com.reactpairdemo.demo.service; + +import com.reactpairdemo.demo.dto.UserDto; + +import java.util.List; + +public interface UserService { + List getAllUsers(); + UserDto createUser(UserDto userDto); + UserDto getUserById(Long id); + UserDto updateUser(Long id , UserDto userDto); + String deleteUser(Long id); + +} diff --git a/backend/src/main/java/com/reactpairdemo/demo/service/impl/EducationServiceImpl.java b/backend/src/main/java/com/reactpairdemo/demo/service/impl/EducationServiceImpl.java new file mode 100644 index 0000000..97148ad --- /dev/null +++ b/backend/src/main/java/com/reactpairdemo/demo/service/impl/EducationServiceImpl.java @@ -0,0 +1,80 @@ +package com.reactpairdemo.demo.service.impl; + +import com.reactpairdemo.demo.dto.EducationDto; +import com.reactpairdemo.demo.dto.UserDto; +import com.reactpairdemo.demo.entity.Education; +import com.reactpairdemo.demo.entity.User; +import com.reactpairdemo.demo.exceptions.ResourceNotFoundException; +import com.reactpairdemo.demo.repo.EducationRepository; +import com.reactpairdemo.demo.repo.UserRepository; +import com.reactpairdemo.demo.service.EducationService; +import org.modelmapper.ModelMapper; +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.NOT_FOUND; + +@Service +public class EducationServiceImpl implements EducationService { + + @Autowired + private EducationRepository educationRepository; + @Autowired + private UserRepository userRepository; + + + @Autowired + private ModelMapper modelMapper; + @Override + public List getAllEducations() { + List educationList=educationRepository.findAll(); + + return educationList.stream().map(user -> modelMapper.map(user, EducationDto.class)).collect(Collectors.toList()); + } + + @Override + public EducationDto createEducation(Education educationDto,Long userId) { + + User user = userRepository.findById(userId).orElseThrow(() -> new ResourceNotFoundException("User NOT FOUND ")); + educationDto.setUser(user); + Education education = educationRepository.save(educationDto); + return modelMapper.map(education,EducationDto.class); + } + + @Override + public EducationDto getEducationById(Long id) { + Optional educationOptional=educationRepository.findById(id); + if(educationOptional.isEmpty()){ + throw new ResourceNotFoundException(NOT_FOUND); + } + + return modelMapper.map(educationOptional.get(),EducationDto.class); + } + + @Override + public EducationDto updateEducation(Long id,Long userId, EducationDto educationDto) { + Optional educationOptional=educationRepository.findById(id); + if(educationOptional.isEmpty()){ + throw new ResourceNotFoundException(NOT_FOUND); + } + educationOptional.get().setCourseName(educationDto.getCourseName()); + educationOptional.get().setPercentage(educationDto.getPercentage()); + educationOptional.get().setPassingYear(educationDto.getPassingYear()); + Education education= educationRepository.save(educationOptional.get()); + return modelMapper.map(education, EducationDto.class); + } + + @Override + public String deleteEducation(Long id) { + Optional educationOptional=educationRepository.findById(id); + if(educationOptional.isEmpty()){ + throw new ResourceNotFoundException(NOT_FOUND); + } + educationRepository.deleteById(id); + return "Sucessfully Deleted"; + } +} 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..78c0e36 --- /dev/null +++ b/backend/src/main/java/com/reactpairdemo/demo/service/impl/UserServiceImpl.java @@ -0,0 +1,80 @@ +package com.reactpairdemo.demo.service.impl; + +import com.reactpairdemo.demo.dto.UserDto; +import com.reactpairdemo.demo.entity.User; +import com.reactpairdemo.demo.exceptions.ResourceNotFoundException; +import com.reactpairdemo.demo.repo.UserRepository; +import com.reactpairdemo.demo.service.UserService; +import com.reactpairdemo.demo.utils.Mapper; +import org.modelmapper.ModelMapper; +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.NOT_FOUND; + +@Service +public class UserServiceImpl implements UserService { + + @Autowired + private Mapper mapper; + @Autowired + private UserRepository userRepository; + + @Autowired + private ModelMapper modelMapper; + + @Override + public List getAllUsers() { + List userList=userRepository.findAll(); + + return userList.stream().map(user -> mapper.entityToDto(user)).collect(Collectors.toList()); + } + + @Override + public UserDto createUser(UserDto userDto) { + User isExistingUser=userRepository.findByEmail(userDto.getEmail()).orElse(null); + if(isExistingUser!=null){ + throw new IllegalArgumentException("User Already Existed !!"); + } + User user=userRepository.save(mapper.dtoToEntity(userDto)); + return mapper.entityToDto(user); + } + + @Override + public UserDto getUserById(Long id) { + Optional userOptional=userRepository.findById(id); + if(userOptional.isEmpty()){ + throw new ResourceNotFoundException(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 ResourceNotFoundException(NOT_FOUND); + } + userOptional.get().setName(userDto.getName()); + userOptional.get().setEmail(userDto.getEmail()); + userOptional.get().setPassword(userDto.getPassword()); + userOptional.get().setAge(userDto.getAge()); + User user=userRepository.save(userOptional.get()); + return mapper.entityToDto(user) ; + } + + @Override + public String deleteUser(Long id) { + Optional userOptional=userRepository.findById(id); + if(userOptional.isEmpty()){ + throw new ResourceNotFoundException(NOT_FOUND); + } + userRepository.deleteById(id); + return "Sucessfully Deleted"; + } +} 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..561030e --- /dev/null +++ b/backend/src/main/java/com/reactpairdemo/demo/utils/Constants.java @@ -0,0 +1,6 @@ +package com.reactpairdemo.demo.utils; + +public class Constants { + public static final String BASE_URL="/api/v1/user"; + public static final String NOT_FOUND="Give Id Not Found !!"; +} 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..1fefa14 --- /dev/null +++ b/backend/src/main/java/com/reactpairdemo/demo/utils/Mapper.java @@ -0,0 +1,22 @@ +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 mapper; + + public UserDto entityToDto(User user){ + return mapper.map(user, UserDto.class); + } + + public User dtoToEntity(UserDto user){ + return mapper.map(user, User.class); + } +} 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/EducationController.class b/backend/target/classes/com/reactpairdemo/demo/controller/EducationController.class new file mode 100644 index 0000000000000000000000000000000000000000..a187ebd170f4f10589bd6e56f924fd5ecdcdf876 GIT binary patch literal 3817 zcmb`K>v9`46vvNjCno8(P10Q2LLhBga&6T>+Y~l6|n%tBualPyeHHr2O;mpML|uLwGR=DM)7_ zV?ZDD6Bv4F9a*$yIaRt{e#t6=K>rGNxX2Mm&(4*y@E(B~*Q-*$?s2EO?^%cJ*!5n~ z10m{km-%(q@mbyxT$~KRAe_sBVZeE~K;T}*J)|D9Dxz+2&t``%RX-Ki5uRJCF^}f$ zpkfK`I_vryGO@F-Mdlsx3L~&oi1FozBN~n(6Z0Gl!EhEv47dcN1Za=;NKs{CwN}%F zK7o}Tfl6JO@Y?Jf};nDyy{^3c*t{*+;XKYVOQdC zJN9bM%;B_myCNR5GA(n*ZdUR!6I)ij9!BV$vMISJhOU&DT?AscVMhvMl@G9V$^;u~ z-}U%ui-`l*-mzq{7tF&j|NJiHA>o30i4C4Ei6gV)`c0wfJF;p4ZlViRDnMU{I{ZXn zvNfyrPU@|hbrpqrWqHD)=z(J~!GxnF`HK7GdaJRPt|d2c;&tI=*C8T~55AH`Ec?D6E4;H}ER#5trxE zWqns@Tpw@C3FD5zZgm?^8qqLExb7!tcT<(64Z2}!)j2&{qPi}_HM|q2@am1}ByYvo zE@7`9+fSkv@8Q_{6nhj~f^FaY8z8^oOA78rg8+u%9=;pl0Jsm!*dutkeE?}?oP&(| z+vs1AeLnvO44lG60>8u98+iZMHeVA>zD6TopQ$mQYdll=pMn*{lW==@2~A@=e&&B+ z@f1Ex;|$lk%rL2Dm-_pWzg`key9@2z;e}XW%KKO5{zHL~1{#kx$`fDn^rOMLZrFXyP#_ zASY3reFQsaj9Z$~)Qry*R8|HtL|K6CNWCAh&7kpwMp?Xd3Uiqln0W;=ADU>Gi3kSW zMDoeEhp>Y(OCisv6`&MS3L1*}wFceQphYbv%5x^>L|Su8`etG2TP3{}C+VHuB;C`b a-)Pb{NmEc#Xy2-#BMA8&_MhwF-~R_%ph5ru literal 0 HcmV?d00001 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..06853bf3d8e56ecc18e5a7f9523379fb9233af98 GIT binary patch literal 3425 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 WbGT1jj?PmQ`2!5%As%4?<9`9aFq(=0 literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/reactpairdemo/demo/exceptions/ErrorResponse.class b/backend/target/classes/com/reactpairdemo/demo/exceptions/ErrorResponse.class new file mode 100644 index 0000000000000000000000000000000000000000..c5dde4ff8b431d082ae1fb8f553eb80626af8ce3 GIT binary patch literal 2583 zcmb7FZF3V<6n<{9Zw+Z1Y70cLwi={OTLKCK2}SK2Ej9&dt)qT%o8D=brn_->%g8@* z`~mWX4>}_-12c|(!5M#pKf{kAK6iK1CT(==OmgqJ=brnVbDwk0-QWLy_A`KKtY?ry z+Ju&c4nrV!&%SS$8n(Mty1j8v)b1 zP22G|<&Ia12Kh}*HbcjAgVMb3d;VP+G`Wxh=8g;kdyCS*^1iRt(0AOeibC(pqF+Jl zp%XTwiQ@uuNAyzY@Hw;VG&ZH5K@RB*9SmkMgcAZ*&35O%-nAP7Lt|~R#P_a@f1!*| zWs%400+}rtR$Gw|j*Yk3C$TFc&t&n2f;ObW4HUqeS&S$EivVltM#}E3EZ#O5U8v2uJF>^9hS);^R`NDf+|7YEDh zta`hCO)fZ5PCDxSylN}@T#*4wR;7-d=4L!E3_{;-#(W3;1{O0|!YvaYtCCw5DD3y6 z zt*&fSB@nZAqp|9QvSMLHV6=mau_Qm!Vsa!RaaxQsbxW=*{n>^c1d`kgb{t8b3lnz* z&K_c<+eJ;R2@LAySDK@(L^9|()_26;L@ULT>J4H%W&S|w*dl-o+|~Ypw)hV1fD{Pa!-ot92GhA-~ukvKzSO8Vgan@ z$bJ4413yqFI$Q|#2qxAg&I(vB{sdE*wnx(wMH740lV}7TbUWO8@NlN<;dk*KU8p$A zoE2+E#Ku7)jOg@<*kX?eBOyXvUuRSB>H?R#LmuMx-yl`G`0a}!6`Mjm`$?34ayGeD zpD2D0U3)a~E3EIJryouH0;@V%e1g}aC54kKlN`$0)NeSJ*IwZGLu9A&+7p~^SqztT znhckXysm7F7Z`Ym-n^bST1MI<`bxKDD-L=wj$x07IxgdV#yNylTw#%3YeL2~ zx>PCC6$>iT_F`$Lw^b~v1Fq2T9^#dVUVbg9Qbq6wA#~2=T;;kp9g%n@SE-XiD>v~F z=F}66ex>xoWle45wPeRq#B%FQcfu~ks0m?d1~E-q_}r7Y4=APBo)_>TLre49eG(s0 z(jszhL3>4oMskE8ArRsfjrP|mr5J+VGHBUoohq8q-^^aGTvbrKX`i~Jy3jM61r9b% uOk&(|eM$5hW+STSFwa>dN)8K@EJ`=|ui`dW1H{i!cZZL`CoGFkk^cv|G7xb9 literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/reactpairdemo/demo/exceptions/GlobalHandleException.class b/backend/target/classes/com/reactpairdemo/demo/exceptions/GlobalHandleException.class new file mode 100644 index 0000000000000000000000000000000000000000..5f275f7b66494fcbf86cf246d12f7e6c679e6c19 GIT binary patch literal 5544 zcmcgw`*+jU9sgV>phOWN%~~kkN}&Xrgf!|_ItmWioZu8TC!r*y%h*a~TX95W$&=+! z)^%OGt=;?4?%h4wz29r;MhKkk?B|{RO*{KsNyakBiPP_wl*k_tn4tbNwFx zPT;zV6gm`iYS@PD0(}>aRYSK8r=-v3FPa5kVEdTmSpK*`$KcRHH@eWRK-JI#P2gz3 zE$g0X6#R-|c}27A>cN-!Y{9Jfmg`jYCu}!w*ryDqXq(ykGKJZ0NuWRHdL_MTFCDq4 z=iE}s^wM4ErOxs3@qN!duc8lkDd^Ym9^5UE-dx*Rv+CBof;r>*Q*O;E#x$xW)1Nl0 zRik7I+&wsyYixDS_bjKBR zNw;XGrKrbbynRq0leFtgW?rwF-l}c-4Eiw8^clAvbIk!K&G@*6W738_6Pc42&SsxH zmz|qek(N5f1RiVz;Az`7ONO2CO0}}-_&1|g0rT#zfUf3SwtmW}E>9a3m6_Y2B7+G9 zlNwGUD=^jyao%!@`n2gUyT!VEX2*hITk-7ZV|GlCk|D+Y)NIE1Bg~N`p{tVBklC#_ zain|j1WqY9t>Gj1sKCfpm<2Q<$k=uei;SrLdWHrY&skMJ-OrLWtzibU%tWIgON_v1 z<+NTy4n;wr0dbF-2@gkI@Za! zwn^KlRvEjua;E7K84?0JbCzSy)XI6&n>X?{SJ*uZhP_~Tmb{M^JN;#g>2oZ%dD%~F z%~bfna?q{obuFQnE)TXLz9oNsn@Js_IW!3-WzwK0{wH|vgNkg?!VmMn|BoUyK`=2`&I*hz-+uq zv?AM*aR*{0t))PLm;S$s-<^35hM~FX_+qtobvyIVmh2~(GUF`+v@LZk>K-R`S=5^v z5rcMDb5XxssTcOgnn}lEUW{hp+gD`yc;il)CPGvn#M%TXA&%NcIbSpe+H&>)&j$55 zzpg8t=#JQ|5t|M;=W`-=gVSv^E{tr2ovmX@PA)TSC9($x4h&ArksCNfmh0!tuCan0 z9iP>?;AA>w$<}>eV(%T5vNjE_SW#!U^f}u4p34J-mnp7V1(Wvdn{Zvf>U%~dOq}Y@ z?fA8d-{7|jey8F0_(Rj_!*W*L6;sazP9TS|R3BG**ex4(|BhFLh$&PM_LS;C&UII6 zmGtd4iLEp-&NIH_RKDnVOT!QG zqdr{WAv!sUHi$6owBwjwFxHuD)IG65UBOjOe~q|l+H|ui6UgKFx3W7<|R@9KW@Y0H4A0yc75=UO;ES zY?Dq3KXL_1|BlYTBemFZ_$qeJUBf-=cy9_fuz&Fe4lK&WD>!%+hu1L5i#5FeE%JrB zV~Jw%Dqf?)E(Yp%@LekV9{FX&g)86ZO62!f`5^TB4-!zn)~CwM zB%_S#6{_jv@9x9@MByq-iF$cvc;w-AlsoWLBhLE+vcuFif*pMGvNzUUiW7jhpGTpEUBXyT9uis_#INszfZMq{273mcq}2UC2cH l1@C{!kKFdJDDaQ?Gv3BKT(=^Rrw|C=jSfjP~{1}f61O7H3J&_=pR$!5jB43&S{;h*!Ido>&(;vM@V`0|z+Z7>>e_Wkhm>Q9ARm2MHQd`L4g8`$O#6=8ypflaweekoQi@2a45uNBa{>% zttiI!j5P1PdE?Ko_YVL#gING00aCd_dX0)oG(ORVldHq)(#fl&R!GL#2hJ)(&Nl&U z3Yca1f-*;&%Ee=*6$P**;KcbPdi|Y9DCEsn8rM{($^;ENe_Qn-EnIv?@7Q0 h$Cy8X;9Ul=4I`LvHf9XIb~r|`%hA2|V1HFP_y(>5wL1U+ literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/reactpairdemo/demo/repo/UserRepository.class b/backend/target/classes/com/reactpairdemo/demo/repo/UserRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..558f5b957e0d09151f322793b69fb61e9f24e727 GIT binary patch literal 703 zcmbVKJ5Iwu5S(}-NJ*W zfbJCMC=)cX96d}`NFJ;UIJGX8dFHftTkJYinz?TD^cj+CSz1v4Wz45K+hp*6a|sq}j5a2)&v=Jb;H1CuvNn zp`iFDVcyQidyn_=`SuO~6F6;yBfyKy%(EyXnoDgJ&Wu-l7HD5}gx;;nB1zh$;R;uw^QBTs!84_9+ z+rw|8n4N%D#s=Q2l`j>+>tzo4qyOA?G_P>8x!P1twWU9g{94~%oNyH;>_DYZz*&t* znS#RVkgR621$0A`*$D4+!a*2T^JU7;^W3xq2xxFt0h%1TCbYP2bLGG;*B$6`y~lOO pfgb<*kY{rr+!AiG`vr6egA(dDawzZ2C%F3vjyJlw81kb7CtpC?>}UW0 literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/reactpairdemo/demo/service/UserService.class b/backend/target/classes/com/reactpairdemo/demo/service/UserService.class new file mode 100644 index 0000000000000000000000000000000000000000..5f6031f9012d895b5d68afe2a3cd192014a436c1 GIT binary patch literal 689 zcma)4O-sW-5PchMV^TkA{rCkQQV-@PLaLyMphOgc7jJ8_#4TyJY&Qk}ng@S?KT4e4 z6h(@V%d&6w&AfR#^ZE7u0pJ{mK0JowTuovvcy4A~>OxFZ?2ft63z>`fi7r`l_p#2< zAM*u|D?TmbhnKO)4MVRK=CZ0RbIve`hN>jX*nh5A~RZ&59%&cwa&$jtY}bu zo0>JVKd~e2GBB*s@&FxLg$}xeeL@~K2nPrW_v|afChWFsVf#0<<3fGxE<=F_3N4uf N?EPU9*mso=z5(`C!RP=0 literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/reactpairdemo/demo/service/impl/EducationServiceImpl.class b/backend/target/classes/com/reactpairdemo/demo/service/impl/EducationServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..c5904c87ced83c66a5ab726cd70a1568e140792a GIT binary patch literal 5266 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 BCu{%! 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..1780b432d1be7e8a7313c59b4d964765355c4aa5 GIT binary patch literal 446 zcma)&%SyvQ6o&uPYg*Hbwcd8=Myd-3*Iq!Y6(OWxFWWLrhdL$Alw{KPawWL%0emQN z5-hrOF+cO28~-_YeMNthEm@U^4-%( z85ZHhS1T3??&~#|(Oj$)%Oue|Bbo9~u%KV0G1qnfw}$aq9jYYqMPH^f>s!4pd7tzMPA;N*t91gz$ Df8k_! 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..1d2dfc53088e0c439f71eaf02ac2c73f3f106558 GIT binary patch literal 1171 zcmaKrO>fgc5Qg8)Cr#2egtkyh`DzPEkk}(g0i+V(fD))6~%7cw0V-WkuOR5R@r%?ied9ZM6M^tDpV6!?)$#B!Yb{D3{R7`!@wwic4&kr zPqg{WCsOz!Kcv}dGw0%T1K*FVK2b(GJ%&=B2E?#BP`-Q@c@t?yg76Hjfu0I?ER2f% zMX+R#6xG`s(H!nMjq+2(X_DDMi zA|8&FhI*(IZ=_!*Bfd;qwrsApv(<7%Wmychk2*3_`9{U#uBUhOaeRvyx)&a3NXn(Q z^FZ>x_5$rw*&goEiz(1sW3v?!f