From 7d6aecfb22e0be8b5089296e5d4103cf46ffb54e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EC=A7=80=EB=AF=BC?= Date: Mon, 16 Dec 2024 20:08:56 +0900 Subject: [PATCH] =?UTF-8?q?Feat:=20=ED=9A=8C=EC=9B=90=20=EC=A0=95=EB=B3=B4?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - UserUpdateRequest DTO 생성 - UserController에 회원 정보 수정 API 추가 - UserService에 updateUser 메서드 구현 - 로그인된 사용자 본인의 정보만 수정 가능 - 이메일, 닉네임 중 선택적으로 수정 가능 Resolves: #43 --- .../controller/user/UserController.java | 15 ++++--- .../dto/user/request/UserUpdateRequest.java | 9 +++++ .../moja/refrigerator/jwt/LoginFilter.java | 2 +- .../service/user/UserService.java | 3 +- .../service/user/UserServiceImpl.java | 39 ++++++++++++++++--- 5 files changed, 56 insertions(+), 12 deletions(-) create mode 100644 refrigerator/src/main/java/moja/refrigerator/dto/user/request/UserUpdateRequest.java diff --git a/refrigerator/src/main/java/moja/refrigerator/controller/user/UserController.java b/refrigerator/src/main/java/moja/refrigerator/controller/user/UserController.java index 97692a3..cbd031e 100644 --- a/refrigerator/src/main/java/moja/refrigerator/controller/user/UserController.java +++ b/refrigerator/src/main/java/moja/refrigerator/controller/user/UserController.java @@ -2,12 +2,10 @@ import jakarta.servlet.http.HttpServletRequest; import moja.refrigerator.dto.user.request.UserCreateRequest; +import moja.refrigerator.dto.user.request.UserUpdateRequest; import moja.refrigerator.service.user.UserService; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RestController public class UserController { @@ -27,6 +25,13 @@ public String getMainPage() { @PostMapping("/auth/join") public ResponseEntity join(@RequestBody UserCreateRequest request) { userService.createUser(request); - return ResponseEntity.ok().body("회원가입이 완료되었습니다."); + return ResponseEntity.ok().body("회원 가입이 완료되었습니다."); + } + + // 회원 정보 수정 + @PutMapping("/update") + public ResponseEntity update(@RequestBody UserUpdateRequest request) { + userService.updateUser(request); + return ResponseEntity.ok().body("회원 정보가 수정되었습니다."); } } diff --git a/refrigerator/src/main/java/moja/refrigerator/dto/user/request/UserUpdateRequest.java b/refrigerator/src/main/java/moja/refrigerator/dto/user/request/UserUpdateRequest.java new file mode 100644 index 0000000..22289eb --- /dev/null +++ b/refrigerator/src/main/java/moja/refrigerator/dto/user/request/UserUpdateRequest.java @@ -0,0 +1,9 @@ +package moja.refrigerator.dto.user.request; + +import lombok.Data; + +@Data +public class UserUpdateRequest { + private String userEmail; + private String userNickname; +} diff --git a/refrigerator/src/main/java/moja/refrigerator/jwt/LoginFilter.java b/refrigerator/src/main/java/moja/refrigerator/jwt/LoginFilter.java index 622aac9..17f3ed5 100644 --- a/refrigerator/src/main/java/moja/refrigerator/jwt/LoginFilter.java +++ b/refrigerator/src/main/java/moja/refrigerator/jwt/LoginFilter.java @@ -50,7 +50,7 @@ protected void successfulAuthentication(HttpServletRequest request, HttpServletR String role = auth.getAuthority(); - String token = jwtUtil.createJwt(username, role, 60*60*10L); + String token = jwtUtil.createJwt(username, role, 60*60*10*1000L); response.addHeader("Authorization", "Bearer " + token); } diff --git a/refrigerator/src/main/java/moja/refrigerator/service/user/UserService.java b/refrigerator/src/main/java/moja/refrigerator/service/user/UserService.java index a3cc1fa..9109d98 100644 --- a/refrigerator/src/main/java/moja/refrigerator/service/user/UserService.java +++ b/refrigerator/src/main/java/moja/refrigerator/service/user/UserService.java @@ -1,8 +1,9 @@ package moja.refrigerator.service.user; -import jakarta.servlet.http.HttpServletRequest; import moja.refrigerator.dto.user.request.UserCreateRequest; +import moja.refrigerator.dto.user.request.UserUpdateRequest; public interface UserService { void createUser(UserCreateRequest request); + void updateUser(UserUpdateRequest request); } diff --git a/refrigerator/src/main/java/moja/refrigerator/service/user/UserServiceImpl.java b/refrigerator/src/main/java/moja/refrigerator/service/user/UserServiceImpl.java index 0bbb720..5309804 100644 --- a/refrigerator/src/main/java/moja/refrigerator/service/user/UserServiceImpl.java +++ b/refrigerator/src/main/java/moja/refrigerator/service/user/UserServiceImpl.java @@ -1,13 +1,15 @@ package moja.refrigerator.service.user; -import jakarta.servlet.http.HttpServletRequest; -import moja.refrigerator.aggregate.user.TokenBlacklist; import moja.refrigerator.aggregate.user.User; import moja.refrigerator.dto.user.request.UserCreateRequest; +import moja.refrigerator.dto.user.request.UserUpdateRequest; import moja.refrigerator.exception.user.DuplicateUserException; import moja.refrigerator.repository.user.TokenBlacklistRepository; import moja.refrigerator.repository.user.UserRepository; import org.modelmapper.ModelMapper; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -20,13 +22,11 @@ public class UserServiceImpl implements UserService { private final UserRepository userRepository; private final BCryptPasswordEncoder passwordEncoder; private final ModelMapper modelMapper; - private final TokenBlacklistRepository tokenBlacklistRepository; - public UserServiceImpl(UserRepository userRepository, BCryptPasswordEncoder passwordEncoder, ModelMapper modelMapper, TokenBlacklistRepository tokenBlacklistRepository) { + public UserServiceImpl(UserRepository userRepository, BCryptPasswordEncoder passwordEncoder, ModelMapper modelMapper) { this.userRepository = userRepository; this.passwordEncoder = passwordEncoder; this.modelMapper = modelMapper; - this.tokenBlacklistRepository = tokenBlacklistRepository; } @Override @@ -45,6 +45,35 @@ public void createUser(UserCreateRequest request) { userRepository.save(user); } + @Override + @Transactional + public void updateUser(UserUpdateRequest request) { + // 현재 로그인한 사용자 정보 가져오기 + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + String userId = authentication.getName(); + + User user = userRepository.findByUserId(userId) + .orElseThrow(() -> new UsernameNotFoundException("사용자를 찾을 수 없습니다.")); + + // 이메일 변경 요청이 있는 경우 + if (request.getUserEmail() != null) { + if (!request.getUserEmail().equals(user.getUserEmail()) + && userRepository.existsByUserEmail(request.getUserEmail())) { + throw new DuplicateUserException("이미 사용 중인 이메일입니다."); + } + user.setUserEmail(request.getUserEmail()); + } + + // 닉네임 변경 요청이 있는 경우 + if (request.getUserNickname() != null) { + if (!request.getUserNickname().equals(user.getUserNickname()) + && userRepository.existsByUserNickname(request.getUserNickname())) { + throw new DuplicateUserException("이미 사용 중인 닉네임입니다."); + } + user.setUserNickname(request.getUserNickname()); + } + } + private void checkDuplicateUser(UserCreateRequest request) { List errors = new ArrayList<>(); if (userRepository.existsByUserId(request.getUserId())) {