From 58523bf0781fbd0ceff6d8adf37524e6b3f753ed Mon Sep 17 00:00:00 2001 From: oliviarla Date: Fri, 15 Dec 2023 00:32:23 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=9C=A0=EC=A0=80=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=ED=95=84=20=EC=A0=95=EB=B3=B4=20=EC=88=98=EC=A0=95=20API=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../in/http/UserSupportController.java | 39 ++++++++++++++----- .../in/http/dto/UpdateProfileRequestDto.java | 14 +++++++ .../port/in/UpdateAccountUseCase.java | 3 ++ .../port/in/dto/UpdateProfileCommand.java | 6 +++ .../service/UpdateAccountService.java | 13 +++++++ .../java/io/perfume/api/user/domain/User.java | 12 ++++++ 6 files changed, 78 insertions(+), 9 deletions(-) create mode 100644 perfume-api/src/main/java/io/perfume/api/user/adapter/in/http/dto/UpdateProfileRequestDto.java create mode 100644 perfume-api/src/main/java/io/perfume/api/user/application/port/in/dto/UpdateProfileCommand.java diff --git a/perfume-api/src/main/java/io/perfume/api/user/adapter/in/http/UserSupportController.java b/perfume-api/src/main/java/io/perfume/api/user/adapter/in/http/UserSupportController.java index 5bf50f3ac..9499de234 100644 --- a/perfume-api/src/main/java/io/perfume/api/user/adapter/in/http/UserSupportController.java +++ b/perfume-api/src/main/java/io/perfume/api/user/adapter/in/http/UserSupportController.java @@ -4,6 +4,7 @@ import io.perfume.api.user.adapter.in.http.dto.LeaveUserDto; import io.perfume.api.user.adapter.in.http.dto.UpdateEmailRequestDto; import io.perfume.api.user.adapter.in.http.dto.UpdatePasswordRequestDto; +import io.perfume.api.user.adapter.in.http.dto.UpdateProfileRequestDto; import io.perfume.api.user.adapter.in.http.dto.UserProfileDto; import io.perfume.api.user.adapter.in.http.exception.UserNotAuthenticatedException; import io.perfume.api.user.application.port.in.FindEncryptedUsernameUseCase; @@ -13,6 +14,7 @@ import io.perfume.api.user.application.port.in.UpdateAccountUseCase; import io.perfume.api.user.application.port.in.dto.UpdateEmailCommand; import io.perfume.api.user.application.port.in.dto.UpdatePasswordCommand; +import io.perfume.api.user.application.port.in.dto.UpdateProfileCommand; import io.perfume.api.user.application.port.in.dto.UserProfileResult; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; @@ -62,9 +64,8 @@ public ResponseEntity sendUsernameToUsersEmail(@RequestParam @Email Stri @GetMapping("/me") public UserProfileDto me(@AuthenticationPrincipal User user) { - if (user == null) { - throw new UserNotAuthenticatedException(); - } + checkAuthenticatedUser(user); + long userId = Long.parseLong(user.getUsername()); UserProfileResult userProfileResult = findUserUseCase.findUserProfileById(userId); return UserProfileDto.of(userProfileResult); @@ -73,6 +74,8 @@ public UserProfileDto me(@AuthenticationPrincipal User user) { @DeleteMapping("/user") @ResponseStatus(HttpStatus.ACCEPTED) public LeaveUserDto leaveUser(@AuthenticationPrincipal User user) { + checkAuthenticatedUser(user); + long userId = Long.parseLong(user.getUsername()); leaveUserUseCase.leave(userId); return new LeaveUserDto(userId); @@ -81,9 +84,10 @@ public LeaveUserDto leaveUser(@AuthenticationPrincipal User user) { @PatchMapping("/account/email") public void updateEmailByUser( @AuthenticationPrincipal User user, @RequestBody UpdateEmailRequestDto updateEmailDto) { + checkAuthenticatedUser(user); + UpdateEmailCommand updateEmailCommand = - new UpdateEmailCommand( - Long.parseLong(user.getUsername()), updateEmailDto.verified(), updateEmailDto.email()); + updateEmailDto.toCommand(Long.parseLong(user.getUsername())); updateAccountUseCase.updateUserEmail(updateEmailCommand); } @@ -92,12 +96,29 @@ public void updateEmailByUser( public void updatePasswordByUser( @AuthenticationPrincipal User user, @RequestBody UpdatePasswordRequestDto updatePasswordRequestDto) { + checkAuthenticatedUser(user); + UpdatePasswordCommand updatePasswordCommand = - new UpdatePasswordCommand( - Long.parseLong(user.getUsername()), - updatePasswordRequestDto.oldPassword(), - updatePasswordRequestDto.newPassword()); + updatePasswordRequestDto.toCommand(Long.parseLong(user.getUsername())); updateAccountUseCase.updateUserPassword(updatePasswordCommand); } + + @PatchMapping("/user/profile") + public void updateProfileByUser( + @AuthenticationPrincipal User user, + @RequestBody UpdateProfileRequestDto updateProfileRequestDto) { + checkAuthenticatedUser(user); + + UpdateProfileCommand updateProfileCommand = + updateProfileRequestDto.toCommand(Long.parseLong(user.getUsername())); + + updateAccountUseCase.updateUserProfile(updateProfileCommand); + } + + private void checkAuthenticatedUser(User user) { + if (user == null || user.getUsername() == null) { + throw new UserNotAuthenticatedException(); + } + } } diff --git a/perfume-api/src/main/java/io/perfume/api/user/adapter/in/http/dto/UpdateProfileRequestDto.java b/perfume-api/src/main/java/io/perfume/api/user/adapter/in/http/dto/UpdateProfileRequestDto.java new file mode 100644 index 000000000..c5c4db106 --- /dev/null +++ b/perfume-api/src/main/java/io/perfume/api/user/adapter/in/http/dto/UpdateProfileRequestDto.java @@ -0,0 +1,14 @@ +package io.perfume.api.user.adapter.in.http.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.perfume.api.user.adapter.out.persistence.user.Sex; +import io.perfume.api.user.application.port.in.dto.UpdateProfileCommand; +import java.time.LocalDate; + +public record UpdateProfileRequestDto( + String bio, @JsonFormat(pattern = "yyyyMMdd") LocalDate birthday, String sex) { + public UpdateProfileCommand toCommand(long userId) { + return new UpdateProfileCommand( + userId, bio, birthday, sex != null ? Sex.valueOf(sex.toUpperCase()) : null); + } +} diff --git a/perfume-api/src/main/java/io/perfume/api/user/application/port/in/UpdateAccountUseCase.java b/perfume-api/src/main/java/io/perfume/api/user/application/port/in/UpdateAccountUseCase.java index d85a4bdb7..0b66a75ca 100644 --- a/perfume-api/src/main/java/io/perfume/api/user/application/port/in/UpdateAccountUseCase.java +++ b/perfume-api/src/main/java/io/perfume/api/user/application/port/in/UpdateAccountUseCase.java @@ -2,9 +2,12 @@ import io.perfume.api.user.application.port.in.dto.UpdateEmailCommand; import io.perfume.api.user.application.port.in.dto.UpdatePasswordCommand; +import io.perfume.api.user.application.port.in.dto.UpdateProfileCommand; public interface UpdateAccountUseCase { void updateUserEmail(UpdateEmailCommand updateEmailCommand); void updateUserPassword(UpdatePasswordCommand updatePasswordCommand); + + void updateUserProfile(UpdateProfileCommand updateProfileCommand); } diff --git a/perfume-api/src/main/java/io/perfume/api/user/application/port/in/dto/UpdateProfileCommand.java b/perfume-api/src/main/java/io/perfume/api/user/application/port/in/dto/UpdateProfileCommand.java new file mode 100644 index 000000000..eec02a29b --- /dev/null +++ b/perfume-api/src/main/java/io/perfume/api/user/application/port/in/dto/UpdateProfileCommand.java @@ -0,0 +1,6 @@ +package io.perfume.api.user.application.port.in.dto; + +import io.perfume.api.user.adapter.out.persistence.user.Sex; +import java.time.LocalDate; + +public record UpdateProfileCommand(Long userId, String bio, LocalDate birthday, Sex sex) {} diff --git a/perfume-api/src/main/java/io/perfume/api/user/application/service/UpdateAccountService.java b/perfume-api/src/main/java/io/perfume/api/user/application/service/UpdateAccountService.java index 9313c57af..bb773520b 100644 --- a/perfume-api/src/main/java/io/perfume/api/user/application/service/UpdateAccountService.java +++ b/perfume-api/src/main/java/io/perfume/api/user/application/service/UpdateAccountService.java @@ -5,6 +5,7 @@ import io.perfume.api.user.application.port.in.UpdateAccountUseCase; import io.perfume.api.user.application.port.in.dto.UpdateEmailCommand; import io.perfume.api.user.application.port.in.dto.UpdatePasswordCommand; +import io.perfume.api.user.application.port.in.dto.UpdateProfileCommand; import io.perfume.api.user.application.port.out.UserQueryRepository; import io.perfume.api.user.application.port.out.UserRepository; import io.perfume.api.user.domain.User; @@ -40,4 +41,16 @@ public void updateUserPassword(UpdatePasswordCommand updatePasswordCommand) { passwordEncoder, updatePasswordCommand.oldPassword(), updatePasswordCommand.newPassword()); userRepository.save(user); } + + @Override + public void updateUserProfile(UpdateProfileCommand updateProfileCommand) { + User user = + userQueryRepository + .loadUser(updateProfileCommand.userId()) + .orElseThrow(() -> new UserNotFoundException(updateProfileCommand.userId())); + + user.updateProfile( + updateProfileCommand.bio(), updateProfileCommand.birthday(), updateProfileCommand.sex()); + userRepository.save(user); + } } diff --git a/perfume-api/src/main/java/io/perfume/api/user/domain/User.java b/perfume-api/src/main/java/io/perfume/api/user/domain/User.java index a98efa776..f347401ff 100644 --- a/perfume-api/src/main/java/io/perfume/api/user/domain/User.java +++ b/perfume-api/src/main/java/io/perfume/api/user/domain/User.java @@ -183,4 +183,16 @@ public void updatePassword( } this.password = passwordEncoder.encode(newPassword); } + + public void updateProfile(String bio, LocalDate birthday, Sex sex) { + if (bio != null) { + this.bio = bio; + } + if (birthday != null) { + this.birthday = birthday; + } + if (sex != null) { + this.sex = sex; + } + } }