diff --git a/src/main/java/com/backend/glowhouse/controller/AuthenticationController.java b/src/main/java/com/backend/glowhouse/controller/AuthenticationController.java index 56412f38b4549aef95148d7dd14fe040189b772f..80b47dc5fee9d1eb640097c1db2fe025a3533663 100644 --- a/src/main/java/com/backend/glowhouse/controller/AuthenticationController.java +++ b/src/main/java/com/backend/glowhouse/controller/AuthenticationController.java @@ -7,8 +7,9 @@ import com.backend.glowhouse.model.response.JwtAuthenticationResponse; import com.backend.glowhouse.model.Role; import com.backend.glowhouse.model.RoleType; import com.backend.glowhouse.model.User; -import com.backend.glowhouse.repository.UserRepository; +import com.backend.glowhouse.repository.user.UserRepository; import com.backend.glowhouse.security.JwtTokenProvider; +import com.backend.glowhouse.service.AuthenticationService; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Autowired; @@ -25,6 +26,7 @@ import org.springframework.web.servlet.support.ServletUriComponentsBuilder; import javax.validation.Valid; import java.net.URI; import java.util.Collections; +import java.util.Date; @RestController @RequestMapping("/api/auth") @@ -32,77 +34,15 @@ public class AuthenticationController { ObjectMapper mapper = new ObjectMapper(); @Autowired - private AuthenticationManager authenticationManager; - - @Autowired - private UserRepository userRepository; - - @Autowired - private PasswordEncoder passwordEncoder; - - @Autowired - private JwtTokenProvider tokenProvider; + private AuthenticationService authenticationService; @PostMapping("/login") public String authenticateUser(@Valid @RequestBody LoginRequest loginRequest) throws JsonProcessingException { - - Authentication authentication = authenticationManager.authenticate( - new UsernamePasswordAuthenticationToken( - loginRequest.getUsernameOrEmail(), - loginRequest.getPassword() - ) - ); - - SecurityContextHolder.getContext().setAuthentication(authentication); - String jwt = tokenProvider.generateToken(authentication); - JwtAuthenticationResponse response = new JwtAuthenticationResponse(jwt); - - return mapper.writeValueAsString(response); + return authenticationService.handleLoginRequest(loginRequest); } @PostMapping("/register") public ResponseEntity<?> registerUser(@Valid @RequestBody RegistrationRequest registrationRequest) { - if(userRepository.existsByUsername(registrationRequest.getUsername())) { - return new ResponseEntity<>( - new ApiResponse( - false, - "Username is already taken!" - ), - HttpStatus.BAD_REQUEST - ); - } - - if(userRepository.existsByEmail(registrationRequest.getEmail())) { - return new ResponseEntity<>( - new ApiResponse( - false, - "Email Address already in use!" - ), - HttpStatus.BAD_REQUEST - ); - } - - // Creating user's account - User user = new User( - registrationRequest.getName(), - registrationRequest.getUsername(), - registrationRequest.getEmail(), - registrationRequest.getPassword() - ); - - user.setPassword(passwordEncoder.encode(user.getPassword())); - - Role userRole = new Role(); - userRole.setName(RoleType.ROLE_USER); - - user.setRoles(Collections.singleton(userRole)); - - User result = userRepository.save(user); - - URI location = ServletUriComponentsBuilder - .fromCurrentContextPath().path("/api/users/{username}") - .buildAndExpand(result.getUsername()).toUri(); - - return ResponseEntity.created(location).body(new ApiResponse(true, "User registered successfully")); + return authenticationService.handleRegistrationRequest(registrationRequest); } } diff --git a/src/main/java/com/backend/glowhouse/service/AuthenticationService.java b/src/main/java/com/backend/glowhouse/service/AuthenticationService.java new file mode 100644 index 0000000000000000000000000000000000000000..3f9898e45e344c81cb5b7ada51da102b53919b2d --- /dev/null +++ b/src/main/java/com/backend/glowhouse/service/AuthenticationService.java @@ -0,0 +1,107 @@ +package com.backend.glowhouse.service; + +import com.backend.glowhouse.model.Role; +import com.backend.glowhouse.model.RoleType; +import com.backend.glowhouse.model.User; +import com.backend.glowhouse.model.request.LoginRequest; +import com.backend.glowhouse.model.request.RegistrationRequest; +import com.backend.glowhouse.model.response.ApiResponse; +import com.backend.glowhouse.model.response.JwtAuthenticationResponse; +import com.backend.glowhouse.repository.user.UserRepository; +import com.backend.glowhouse.security.JwtTokenProvider; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; + +import java.net.URI; +import java.util.Collections; +import java.util.Date; + +@Service +public class AuthenticationService { + private ObjectMapper mapper = new ObjectMapper(); + private AuthenticationManager authenticationManager; + private UserRepository userRepository; + private PasswordEncoder passwordEncoder; + private JwtTokenProvider tokenProvider; + + @Autowired + public AuthenticationService(AuthenticationManager authenticationManager, UserRepository userRepository, PasswordEncoder passwordEncoder, JwtTokenProvider tokenProvider) { + this.authenticationManager = authenticationManager; + this.userRepository = userRepository; + this.passwordEncoder = passwordEncoder; + this.tokenProvider = tokenProvider; + } + + public String handleLoginRequest(LoginRequest loginRequest) throws JsonProcessingException { + //authenticate user using spring security package + Authentication authentication = authenticationManager.authenticate( + new UsernamePasswordAuthenticationToken( + loginRequest.getUsernameOrEmail(), + loginRequest.getPassword() + ) + ); + //generate json web token for user + SecurityContextHolder.getContext().setAuthentication(authentication); + String jwt = tokenProvider.generateToken(authentication); + JwtAuthenticationResponse response = new JwtAuthenticationResponse(jwt); + //return token to user + return mapper.writeValueAsString(response); + } + + public ResponseEntity<?> handleRegistrationRequest(RegistrationRequest registrationRequest) { + //check if username already taken + if(userRepository.existsByUsername(registrationRequest.getUsername())) { + return new ResponseEntity<>( + new ApiResponse( + false, + "Username is already taken!" + ), + HttpStatus.BAD_REQUEST + ); + } + //check if email already registered + if(userRepository.existsByEmail(registrationRequest.getEmail())) { + return new ResponseEntity<>( + new ApiResponse( + false, + "Email Address already in use!" + ), + HttpStatus.BAD_REQUEST + ); + } + + //creating user object + User user = new User( + registrationRequest.getName(), + registrationRequest.getUsername(), + registrationRequest.getEmail(), + registrationRequest.getPassword() + ); + //hash password + user.setPassword(passwordEncoder.encode(user.getPassword())); + //assign user role + Role userRole = new Role(); + userRole.setName(RoleType.ROLE_USER); + user.setRoles(Collections.singleton(userRole)); + //set joined at date + user.setJoinedAt(new Date()); + //persist user to db + User result = userRepository.save(user); + + URI location = ServletUriComponentsBuilder + .fromCurrentContextPath().path("/api/users/{username}") + .buildAndExpand(result.getUsername()).toUri(); + //return response to user + return ResponseEntity.created(location).body(new ApiResponse(true, "User registered successfully")); + } +}