package com.example.projectback.controllers; import com.example.projectback.message.request.LoginForm; import com.example.projectback.message.request.SignUpForm; import com.example.projectback.message.response.JwtResponse; import com.example.projectback.message.response.ResponseMessage; import com.example.projectback.model.Role; import com.example.projectback.model.RoleName; import com.example.projectback.model.User; import com.example.projectback.repository.RoleRepository; import com.example.projectback.repository.UserRepository; import com.example.projectback.security.jwt.JwtProvider; 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.core.userdetails.UserDetails; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; import java.util.HashSet; import java.util.Set; @RestController @CrossOrigin(origins = "http://localhost:4200") @RequestMapping("/auth") public class AuthController { AuthenticationManager authenticationManager; UserRepository userRepository; RoleRepository roleRepository; PasswordEncoder passwordEncoder; JwtProvider jwtProvider; public AuthController(AuthenticationManager authenticationManager, UserRepository userRepository, RoleRepository roleRepository, PasswordEncoder passwordEncoder, JwtProvider jwtProvider) { this.authenticationManager = authenticationManager; this.userRepository = userRepository; this.roleRepository = roleRepository; this.passwordEncoder = passwordEncoder; this.jwtProvider = jwtProvider; } @PostMapping("/login") public ResponseEntity authenticateUser(@Valid @RequestBody LoginForm loginRequest) { Authentication authentication = authenticationManager.authenticate( new UsernamePasswordAuthenticationToken(loginRequest.getEmail(), loginRequest.getPassword())); SecurityContextHolder.getContext().setAuthentication(authentication); String jwt = jwtProvider.generateJwtToken(authentication); UserDetails userDetails = (UserDetails) authentication.getPrincipal(); return ResponseEntity.ok(new JwtResponse(jwt, userDetails.getUsername(), userDetails.getAuthorities())); } @PostMapping("/signup") public ResponseEntity registerUser(@Valid @RequestBody SignUpForm signUpRequest) { if (userRepository.existsByEmail(signUpRequest.getEmail())) { return new ResponseEntity<>(new ResponseMessage("Fail -> Email is already taken"), HttpStatus.BAD_REQUEST); } User user = new User(signUpRequest.getEmail(), passwordEncoder.encode(signUpRequest.getPassword())); Set strRoles = signUpRequest.getRole(); Set roles = new HashSet<>(); strRoles.forEach(role -> { if ("admin".equals(role)) { Role adminRole = roleRepository.findByName(RoleName.ROLE_ADMIN) .orElseThrow(() -> new RuntimeException("Fail -> Cause: Admin Role not found.")); roles.add(adminRole); } if ("user".equals(role)) { Role userRole = roleRepository.findByName(RoleName.ROLE_USER) .orElseThrow(() -> new RuntimeException("Fail -> Cause: User Role not found")); roles.add(userRole); } }); user.setRoles(roles); userRepository.save(user); return new ResponseEntity<>(new ResponseMessage("User registered successfully"), HttpStatus.OK); } }