diff --git a/src/main/java/com/wayble/server/user/controller/UserController.java b/src/main/java/com/wayble/server/user/controller/UserController.java index dea97996..8d38d29d 100644 --- a/src/main/java/com/wayble/server/user/controller/UserController.java +++ b/src/main/java/com/wayble/server/user/controller/UserController.java @@ -4,6 +4,7 @@ import com.wayble.server.common.exception.ApplicationException; import com.wayble.server.common.response.CommonResponse; import com.wayble.server.user.dto.UserInfoRegisterRequestDto; +import com.wayble.server.user.dto.UserInfoUpdateRequestDto; import com.wayble.server.user.dto.UserLoginRequestDto; import com.wayble.server.user.dto.UserRegisterRequestDto; import com.wayble.server.user.dto.token.TokenResponseDto; @@ -136,4 +137,28 @@ public CommonResponse registerUserInfo( userInfoService.registerUserInfo(userId, req); return CommonResponse.success("내 정보 등록 완료"); } + + @PatchMapping("/info") + @Operation( + summary = "내 정보 수정", + description = "유저가 자신의 정보를 수정합니다." + ) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "내 정보 수정 완료"), + @ApiResponse(responseCode = "400", description = "잘못된 요청입니다."), + @ApiResponse(responseCode = "403", description = "권한이 없습니다."), + @ApiResponse(responseCode = "404", description = "유저를 찾을 수 없음") + }) + public CommonResponse updateUserInfo( + @RequestBody @Valid UserInfoUpdateRequestDto dto + ) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (!(authentication.getPrincipal() instanceof Long)) { + throw new ApplicationException(UserErrorCase.FORBIDDEN); + } + Long userId = (Long) authentication.getPrincipal(); + + userInfoService.updateUserInfo(userId, dto); + return CommonResponse.success("내 정보 수정 완료"); + } } diff --git a/src/main/java/com/wayble/server/user/dto/UserInfoUpdateRequestDto.java b/src/main/java/com/wayble/server/user/dto/UserInfoUpdateRequestDto.java new file mode 100644 index 00000000..9264a72b --- /dev/null +++ b/src/main/java/com/wayble/server/user/dto/UserInfoUpdateRequestDto.java @@ -0,0 +1,15 @@ +package com.wayble.server.user.dto; + +import com.wayble.server.user.entity.Gender; +import com.wayble.server.user.entity.UserType; +import lombok.Getter; + +@Getter +public class UserInfoUpdateRequestDto { + private String nickname; // 변경할 닉네임 (nullable) + private String birthDate; // YYYY-MM-DD (nullable) + private Gender gender; // MALE, FEMALE, UNKNOWN (nullable) + private UserType userType; // GENERAL, DISABLED, COMPANION (nullable) + private String disabilityType; // userType이 DISABLED일 때만 값, 아니면 null + private String mobilityAid; // userType이 DISABLED일 때만 값, 아니면 null +} diff --git a/src/main/java/com/wayble/server/user/entity/User.java b/src/main/java/com/wayble/server/user/entity/User.java index 18189869..15810fb8 100644 --- a/src/main/java/com/wayble/server/user/entity/User.java +++ b/src/main/java/com/wayble/server/user/entity/User.java @@ -95,19 +95,13 @@ public void setNickname(String nickname) { this.nickname = nickname; } - public void setDisabilityType(String disabilityType) { - this.disabilityType = disabilityType; - } - public void setMobilityAid(String mobilityAid) { - this.mobilityAid = mobilityAid; - } - public void setBirthDate(LocalDate birthDate) { - this.birthDate = birthDate; - } - public void setGender(Gender gender) { - this.gender = gender; - } - public void setUserType(UserType userType) { - this.userType = userType; - } + public void setDisabilityType(String disabilityType) { this.disabilityType = disabilityType; } + + public void setMobilityAid(String mobilityAid) { this.mobilityAid = mobilityAid; } + + public void setBirthDate(LocalDate birthDate) { this.birthDate = birthDate; } + + public void setGender(Gender gender) { this.gender = gender; } + + public void setUserType(UserType userType) { this.userType = userType;} } diff --git a/src/main/java/com/wayble/server/user/service/UserInfoService.java b/src/main/java/com/wayble/server/user/service/UserInfoService.java index 9bfe9746..2794f944 100644 --- a/src/main/java/com/wayble/server/user/service/UserInfoService.java +++ b/src/main/java/com/wayble/server/user/service/UserInfoService.java @@ -3,6 +3,7 @@ import com.wayble.server.common.exception.ApplicationException; import com.wayble.server.user.dto.UserInfoRegisterRequestDto; +import com.wayble.server.user.dto.UserInfoUpdateRequestDto; import com.wayble.server.user.entity.User; import com.wayble.server.user.entity.UserType; import com.wayble.server.user.exception.UserErrorCase; @@ -49,4 +50,49 @@ public void registerUserInfo(Long userId, UserInfoRegisterRequestDto dto) { userRepository.save(user); } + + @Transactional + public void updateUserInfo(Long userId, UserInfoUpdateRequestDto dto) { + User user = userRepository.findById(userId) + .orElseThrow(() -> new ApplicationException(UserErrorCase.USER_NOT_FOUND)); + + if (dto.getNickname() != null) { + user.setNickname(dto.getNickname()); + } + + // 생년월일 수정 + if (dto.getBirthDate() != null) { + try { + user.setBirthDate(LocalDate.parse(dto.getBirthDate())); + } catch (DateTimeParseException e) { + throw new ApplicationException(UserErrorCase.INVALID_BIRTH_DATE); + } + } + + // 성별 수정 + if (dto.getGender() != null) { + user.setGender(dto.getGender()); + } + + // 유저 타입 수정 + if (dto.getUserType() != null) { + user.setUserType(dto.getUserType()); + } + + UserType finalUserType = dto.getUserType() != null ? dto.getUserType() : user.getUserType(); + if (finalUserType == UserType.DISABLED) { + if (dto.getDisabilityType() != null) { + user.setDisabilityType(dto.getDisabilityType()); + } + if (dto.getMobilityAid() != null) { + user.setMobilityAid(dto.getMobilityAid()); + } + } else if (dto.getUserType() != null) { + // userType이 DISABLED가 아닌 값으로 변경된 경우에만 null로 설정 + user.setDisabilityType(null); + user.setMobilityAid(null); + } + + userRepository.save(user); + } }