package com.rods.backtestingstrategies.controller; import com.rods.backtestingstrategies.dto.AuthRequest; import com.rods.backtestingstrategies.dto.AuthResponse; import com.rods.backtestingstrategies.entity.User; import com.rods.backtestingstrategies.repository.UserRepository; import com.rods.backtestingstrategies.security.JwtUtils; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; 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.web.bind.annotation.*; @RestController @RequestMapping("/api/auth") @RequiredArgsConstructor public class AuthController { private final AuthenticationManager authenticationManager; private final UserRepository userRepository; private final PasswordEncoder passwordEncoder; private final JwtUtils jwtUtils; private final UserDetailsService userDetailsService; @PostMapping("/register") public ResponseEntity register(@RequestBody AuthRequest request) { if (userRepository.findByUsername(request.getUsername()).isPresent()) { return ResponseEntity.badRequest().body("Username already exists"); } User user = User.builder() .username(request.getUsername()) .password(passwordEncoder.encode(request.getPassword())) .role("USER") .build(); userRepository.save(user); UserDetails userDetails = userDetailsService.loadUserByUsername(request.getUsername()); String jwtToken = jwtUtils.generateToken(userDetails); return ResponseEntity.ok(AuthResponse.builder().token(jwtToken).build()); } @PostMapping("/login") public ResponseEntity login(@RequestBody AuthRequest request) { authenticationManager.authenticate( new UsernamePasswordAuthenticationToken(request.getUsername(), request.getPassword()) ); UserDetails userDetails = userDetailsService.loadUserByUsername(request.getUsername()); String jwtToken = jwtUtils.generateToken(userDetails); return ResponseEntity.ok(AuthResponse.builder().token(jwtToken).build()); } }