diff --git a/src/main/java/com/example/bankcards/service/AuthController.java b/src/main/java/com/example/bankcards/service/AuthController.java new file mode 100644 index 0000000..045a336 --- /dev/null +++ b/src/main/java/com/example/bankcards/service/AuthController.java @@ -0,0 +1,32 @@ +package com.example.bankcards.controller; + +import com.example.bankcards.dto.AuthResponse; +import com.example.bankcards.dto.LoginRequest; +import com.example.bankcards.dto.RegisterRequest; +import com.example.bankcards.service.AuthService; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/auth") +@RequiredArgsConstructor +public class AuthController { + + private final AuthService authService; + + @PostMapping("/register") + public ResponseEntity register( + @Valid @RequestBody RegisterRequest request + ) { + return ResponseEntity.ok(authService.register(request)); + } + + @PostMapping("/login") + public ResponseEntity login( + @Valid @RequestBody LoginRequest request + ) { + return ResponseEntity.ok(authService.login(request)); + } +} diff --git a/src/main/java/com/example/bankcards/service/AuthService.java b/src/main/java/com/example/bankcards/service/AuthService.java new file mode 100644 index 0000000..a901ac9 --- /dev/null +++ b/src/main/java/com/example/bankcards/service/AuthService.java @@ -0,0 +1,76 @@ +package com.example.bankcards.service; + +import com.example.bankcards.dto.AuthResponse; +import com.example.bankcards.dto.LoginRequest; +import com.example.bankcards.dto.RegisterRequest; +import com.example.bankcards.entity.Role; +import com.example.bankcards.entity.User; +import com.example.bankcards.exception.BadRequestException; +import com.example.bankcards.repository.UserRepository; +import com.example.bankcards.security.JwtService; +import lombok.RequiredArgsConstructor; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class AuthService { + + private final UserRepository userRepository; + private final PasswordEncoder passwordEncoder; + private final JwtService jwtService; + private final AuthenticationManager authenticationManager; + private final UserDetailsService userDetailsService; + + public AuthResponse register(RegisterRequest request) { + if (userRepository.existsByUsername(request.getUsername())) { + throw new BadRequestException("Username already taken"); + } + if (userRepository.existsByEmail(request.getEmail())) { + throw new BadRequestException("Email already registered"); + } + + User user = User.builder() + .username(request.getUsername()) + .email(request.getEmail()) + .password(passwordEncoder.encode(request.getPassword())) + .role(Role.ROLE_USER) + .build(); + userRepository.save(user); + + UserDetails userDetails = userDetailsService.loadUserByUsername( + user.getUsername() + ); + String token = jwtService.generateToken(userDetails); + return new AuthResponse( + token, + user.getUsername(), + user.getRole().name() + ); + } + + public AuthResponse login(LoginRequest request) { + authenticationManager.authenticate( + new UsernamePasswordAuthenticationToken( + request.getUsername(), + request.getPassword() + ) + ); + UserDetails userDetails = userDetailsService.loadUserByUsername( + request.getUsername() + ); + String token = jwtService.generateToken(userDetails); + User user = userRepository + .findByUsername(request.getUsername()) + .orElseThrow(); + return new AuthResponse( + token, + user.getUsername(), + user.getRole().name() + ); + } +}