package co.jp.springp0421.dogdemo.controller; import co.jp.springp0421.dogdemo.common.ApiResponse; import co.jp.springp0421.dogdemo.dto.LoginDto; import co.jp.springp0421.dogdemo.dto.RegistrationDto; import co.jp.springp0421.dogdemo.dto.UserDto; import co.jp.springp0421.dogdemo.entity.UserEntity; import co.jp.springp0421.dogdemo.service.JwtService; import co.jp.springp0421.dogdemo.service.UserService; 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.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.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; import java.util.Map; @RestController 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("/api/user/register") public ResponseEntity> registerUser(@Valid @RequestBody RegistrationDto registrationDto) { UserEntity registeredUser = userService.registerNewUser(registrationDto); UserDto userDto = new UserDto(); userDto.setEmail(registeredUser.getEmail()); userDto.setName(registeredUser.getName()); return ResponseEntity.status(HttpStatus.CREATED).body(ApiResponse.success(userDto)); } @PostMapping("/api/user/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)); } }