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
1 change: 1 addition & 0 deletions backend/.idea/compiler.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

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 Down
Original file line number Diff line number Diff line change
@@ -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<List<UserDto>> getAllUsers() {

return new ResponseEntity<>(userService.getAllUsers(), HttpStatus.OK);
}
@PostMapping
public ResponseEntity<UserDto> createUser(@Valid @RequestBody UserDto user) {
return new ResponseEntity<>(userService.createUser(user), 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,@Valid @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);
}
}
27 changes: 27 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,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;
}
19 changes: 19 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,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;

}
Original file line number Diff line number Diff line change
@@ -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;

}
Original file line number Diff line number Diff line change
@@ -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<ErrorResponse> 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<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 new ResponseEntity<>(resp, HttpStatus.BAD_REQUEST);
}

@ExceptionHandler(NoResourceFoundException.class)
@ResponseBody
public ResponseEntity<ErrorResponse> handleNoResourceFoundException(NoResourceFoundException ex) {

return new ResponseEntity<>(new ErrorResponse(ex.getMessage(), HttpStatus.NOT_FOUND.toString()), HttpStatus.NOT_FOUND);
}

@ExceptionHandler(IllegalAccessException.class)
@ResponseBody
public ResponseEntity<ErrorResponse> handleIllegalAccessException(IllegalAccessException ex) {

return new ResponseEntity<>(new ErrorResponse(ex.getMessage(), HttpStatus.BAD_REQUEST.toString()), HttpStatus.NOT_FOUND);
}

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

public class UserException extends RuntimeException{
public UserException(String message) {
super(message);
}
}
Original file line number Diff line number Diff line change
@@ -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<User,Long> {
Optional<User> findByEmail(String email);
}
Original file line number Diff line number Diff line change
@@ -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<UserDto> getAllUsers();
}
Original file line number Diff line number Diff line change
@@ -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<User> 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<User> 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<User> userOptional=userRepository.findById(id);
if(userOptional.isEmpty()){
throw new UserException(ID_NOT_FOUND);
}
userRepository.deleteById(id);
return DELETE_SUCCESS;
}

@Override
public List<UserDto> getAllUsers() {
List<User> userList=userRepository.findAll();
return userList.stream().map(mapper::entityToDto).collect(Collectors.toList());
}
}
Original file line number Diff line number Diff line change
@@ -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";

}
19 changes: 19 additions & 0 deletions backend/src/main/java/com/reactpairdemo/demo/utils/Mapper.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
3 changes: 2 additions & 1 deletion backend/src/main/resources/application.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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
spring.jpa.hibernate.ddl-auto=update
# make demo user email ,password and name with validations and secure password followed naming convention
3 changes: 2 additions & 1 deletion backend/target/classes/application.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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
spring.jpa.hibernate.ddl-auto=update
# make demo user email ,password and name with validations and secure password followed naming convention
Binary file modified backend/target/classes/com/reactpairdemo/demo/DemoApplication.class
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.