Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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 {
Expand All @@ -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
}
Original file line number Diff line number Diff line change
@@ -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<List<EducationDto>> getAllEducations() {
return new ResponseEntity<>(educationService.getAllEducations(), HttpStatus.OK);
}


@PostMapping("/user/{userId}")
public ResponseEntity<EducationDto> createEducation(@Valid @RequestBody Education educationDto, @PathVariable Long userId) {
return new ResponseEntity<>(educationService.createEducation(educationDto,userId), HttpStatus.CREATED);
}


@GetMapping("/{id}")
public ResponseEntity<EducationDto> getEducationById(@PathVariable Long id) {
return new ResponseEntity<>(educationService.getEducationById(id), HttpStatus.OK);

}


@PutMapping("/{id}/user/{userId}")
public ResponseEntity<EducationDto> 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<String> deleteEducation(@PathVariable Long id) {
return new ResponseEntity<>(educationService.deleteEducation(id), HttpStatus.OK);
}
}
Original file line number Diff line number Diff line change
@@ -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<List<UserDto>> getAllUsers() {
return new ResponseEntity<>(userService.getAllUsers(), HttpStatus.OK);
}


@PostMapping
public ResponseEntity<UserDto> createUser(@Valid @RequestBody UserDto userDto) {
return new ResponseEntity<>(userService.createUser(userDto), HttpStatus.CREATED);
}


@GetMapping("/{id}")
public ResponseEntity<UserDto> getUserById(@PathVariable Long id) {
return new ResponseEntity<>(userService.getUserById(id), HttpStatus.OK);

}


@PutMapping("/{id}")
public ResponseEntity<UserDto> updateUser(@PathVariable Long id, @RequestBody UserDto userDto) {
return new ResponseEntity<>(userService.updateUser(id,userDto), HttpStatus.OK);
}


@DeleteMapping("/{id}")
public ResponseEntity<String> deleteUser(@PathVariable Long id) {
return new ResponseEntity<>(userService.deleteUser(id), HttpStatus.OK);
}
}
28 changes: 28 additions & 0 deletions backend/src/main/java/com/reactpairdemo/demo/dto/EducationDto.java
Original file line number Diff line number Diff line change
@@ -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;

}
31 changes: 31 additions & 0 deletions backend/src/main/java/com/reactpairdemo/demo/dto/UserDto.java
Original file line number Diff line number Diff line change
@@ -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<EducationDto> education= new ArrayList<>();
}
25 changes: 25 additions & 0 deletions backend/src/main/java/com/reactpairdemo/demo/entity/Education.java
Original file line number Diff line number Diff line change
@@ -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;
}
22 changes: 22 additions & 0 deletions backend/src/main/java/com/reactpairdemo/demo/entity/User.java
Original file line number Diff line number Diff line change
@@ -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> education;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.reactpairdemo.demo.exceptions;

import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class ErrorResponse {
String message;
String title;
}
Original file line number Diff line number Diff line change
@@ -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<ErrorResponse> 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<ErrorResponse> 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<ErrorResponse> 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<Map<String,String>> handleMethodArgumentNotValidException(MethodArgumentNotValidException e){
Map<String,String> 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);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.reactpairdemo.demo.exceptions;

public class ResourceNotFoundException extends RuntimeException{
public ResourceNotFoundException(String message) {
super(message);
}
}
Original file line number Diff line number Diff line change
@@ -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<Education, Long> {
Optional<Education> findByCourseName(String courseName);
}


Original file line number Diff line number Diff line change
@@ -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<User,Long> {
Optional<User> findByEmail(String email);
List<User> findByName(String name);
}
Original file line number Diff line number Diff line change
@@ -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<EducationDto> getAllEducations();
EducationDto createEducation(Education educationDto, Long userId);
EducationDto getEducationById(Long id);
EducationDto updateEducation(Long id ,Long userId, EducationDto educationDto);
String deleteEducation(Long id);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.reactpairdemo.demo.service;

import com.reactpairdemo.demo.dto.UserDto;

import java.util.List;

public interface UserService {
List<UserDto> getAllUsers();
UserDto createUser(UserDto userDto);
UserDto getUserById(Long id);
UserDto updateUser(Long id , UserDto userDto);
String deleteUser(Long id);

}
Loading