package co.jp.app.controller; import co.jp.app.common.ApiResponse; import co.jp.app.common.ResultCode; import co.jp.app.dto.LoginDto; import co.jp.app.dto.RegistrationDto; import co.jp.app.service.JwtService; import jakarta.validation.Valid; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.BadCredentialsException; 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.web.bind.annotation.*; import co.jp.app.entity.UserEntity; import co.jp.app.service.UserService; import java.util.HashMap; import java.util.Map; @RestController @RequestMapping("/api/user") public class UserController { private final UserService userService; private final AuthenticationManager authenticationManager; private final JwtService jwtService; public UserController(UserService userService, AuthenticationManager authenticationManager, JwtService jwtService) { this.userService = userService; this.authenticationManager = authenticationManager; this.jwtService = jwtService; } @PostMapping("/register") public ResponseEntity registerUser(@Valid @RequestBody RegistrationDto registrationDto) { UserEntity registeredUser = userService.registerNewUser(registrationDto); return ResponseEntity.status(HttpStatus.CREATED).body(ApiResponse.success(registeredUser.getEmail())); } @PostMapping("/login") public ResponseEntity authenticateUser(@Valid @RequestBody LoginDto loginDto) { Authentication authentication = authenticationManager.authenticate( new UsernamePasswordAuthenticationToken(loginDto.getEmail(), loginDto.getPassword()) ); SecurityContextHolder.getContext().setAuthentication(authentication); UserDetails userDetails = (UserDetails) authentication.getPrincipal(); String jwtToken = jwtService.generateToken(userDetails); Map tokenResponse = new HashMap<>(); tokenResponse.put("token", jwtToken); return ResponseEntity.ok(ApiResponse.success(tokenResponse)); } }