From 5fbd4f37947d4a37163d3ab4479b20961e9361f9 Mon Sep 17 00:00:00 2001 From: tinon1004 Date: Wed, 27 Mar 2024 00:45:11 +0900 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20#24=20=EB=82=B4=20=EB=B9=84?= =?UTF-8?q?=EB=B0=80=EB=B2=88=ED=98=B8=20=EB=B3=80=EA=B2=BD=20API=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/user/controller/UserController.java | 17 +++++++++++++++++ .../com/ajou/hertz/domain/user/entity/User.java | 4 ++++ .../domain/user/service/UserCommandService.java | 14 ++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/src/main/java/com/ajou/hertz/domain/user/controller/UserController.java b/src/main/java/com/ajou/hertz/domain/user/controller/UserController.java index e677f9a..bbee63a 100644 --- a/src/main/java/com/ajou/hertz/domain/user/controller/UserController.java +++ b/src/main/java/com/ajou/hertz/domain/user/controller/UserController.java @@ -23,6 +23,7 @@ import com.ajou.hertz.domain.user.dto.UserDto; import com.ajou.hertz.domain.user.dto.request.SignUpRequest; import com.ajou.hertz.domain.user.dto.request.UpdateContactLinkRequest; +import com.ajou.hertz.domain.user.dto.request.UpdatePasswordRequest; import com.ajou.hertz.domain.user.dto.response.UserEmailResponse; import com.ajou.hertz.domain.user.dto.response.UserExistenceResponse; import com.ajou.hertz.domain.user.dto.response.UserResponse; @@ -152,5 +153,21 @@ public UserResponse updateContactLinkV1( updateContactLinkRequest.getContactLink()); return UserResponse.from(userUpdated); } + + @Operation( + summary = "비밀번호 변경", + description = "회원의 비밀번호를 변경합니다.", + security = @SecurityRequirement(name = "access-token") + ) + @PutMapping(value = "/me/password", headers = API_VERSION_HEADER_NAME + "=" + 1) + public UserResponse updatePasswordV1( + @RequestBody @Valid UpdatePasswordRequest updatePasswordRequest, + @AuthenticationPrincipal UserPrincipal userPrincipal + ) { + UserDto userUpdated = userCommandService.updatePassword(userPrincipal.getUserId(), + updatePasswordRequest.getPassword()); + return UserResponse.from(userUpdated); + } + } diff --git a/src/main/java/com/ajou/hertz/domain/user/entity/User.java b/src/main/java/com/ajou/hertz/domain/user/entity/User.java index e1340e5..bbdf580 100644 --- a/src/main/java/com/ajou/hertz/domain/user/entity/User.java +++ b/src/main/java/com/ajou/hertz/domain/user/entity/User.java @@ -109,4 +109,8 @@ public void changeContactLink(String contactLink) { this.contactLink = contactLink; } + public void changePassword(String password) { + this.password = password; + } + } diff --git a/src/main/java/com/ajou/hertz/domain/user/service/UserCommandService.java b/src/main/java/com/ajou/hertz/domain/user/service/UserCommandService.java index 088ad6f..6f0080e 100644 --- a/src/main/java/com/ajou/hertz/domain/user/service/UserCommandService.java +++ b/src/main/java/com/ajou/hertz/domain/user/service/UserCommandService.java @@ -161,4 +161,18 @@ public UserDto updateContactLink(Long userId, String contactLink) { return UserDto.from(user); } + /** + * 유저의 비밀번호를 변경합니다. + * + * @param userId 유저의 ID + * @param password 변경할 비밀번호 + * + * @return 변경된 유저 정보 + */ + public UserDto updatePassword(Long userId, String password) { + User user = userQueryService.getById(userId); + user.changePassword(passwordEncoder.encode(password)); + return UserDto.from(user); + } + } From 18159b817b1955940bee8b98dc76691dd6a25344 Mon Sep 17 00:00:00 2001 From: tinon1004 Date: Wed, 27 Mar 2024 00:45:48 +0900 Subject: [PATCH 2/5] =?UTF-8?q?feat:=20#24=20UpdatePasswordRequest=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/request/UpdatePasswordRequest.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/main/java/com/ajou/hertz/domain/user/dto/request/UpdatePasswordRequest.java diff --git a/src/main/java/com/ajou/hertz/domain/user/dto/request/UpdatePasswordRequest.java b/src/main/java/com/ajou/hertz/domain/user/dto/request/UpdatePasswordRequest.java new file mode 100644 index 0000000..9609009 --- /dev/null +++ b/src/main/java/com/ajou/hertz/domain/user/dto/request/UpdatePasswordRequest.java @@ -0,0 +1,21 @@ +package com.ajou.hertz.domain.user.dto.request; + +import com.ajou.hertz.common.validator.Password; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@Getter +public class UpdatePasswordRequest { + + @Schema(description = "비밀 번호", example = "newpassword1234!!") + @NotBlank + @Password + private String password; +} From b76852da9928abba6f9c399846e4817da224e59e Mon Sep 17 00:00:00 2001 From: tinon1004 Date: Wed, 27 Mar 2024 01:38:50 +0900 Subject: [PATCH 3/5] =?UTF-8?q?refactor:=20#24=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ajou/hertz/domain/user/controller/UserController.java | 6 ++++-- .../domain/user/dto/request/UpdatePasswordRequest.java | 2 +- src/main/java/com/ajou/hertz/domain/user/entity/User.java | 4 ++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/ajou/hertz/domain/user/controller/UserController.java b/src/main/java/com/ajou/hertz/domain/user/controller/UserController.java index bbee63a..70496a1 100644 --- a/src/main/java/com/ajou/hertz/domain/user/controller/UserController.java +++ b/src/main/java/com/ajou/hertz/domain/user/controller/UserController.java @@ -164,8 +164,10 @@ public UserResponse updatePasswordV1( @RequestBody @Valid UpdatePasswordRequest updatePasswordRequest, @AuthenticationPrincipal UserPrincipal userPrincipal ) { - UserDto userUpdated = userCommandService.updatePassword(userPrincipal.getUserId(), - updatePasswordRequest.getPassword()); + UserDto userUpdated = userCommandService.updatePassword( + userPrincipal.getUserId(), + updatePasswordRequest.getPassword() + ); return UserResponse.from(userUpdated); } diff --git a/src/main/java/com/ajou/hertz/domain/user/dto/request/UpdatePasswordRequest.java b/src/main/java/com/ajou/hertz/domain/user/dto/request/UpdatePasswordRequest.java index 9609009..5253187 100644 --- a/src/main/java/com/ajou/hertz/domain/user/dto/request/UpdatePasswordRequest.java +++ b/src/main/java/com/ajou/hertz/domain/user/dto/request/UpdatePasswordRequest.java @@ -14,7 +14,7 @@ @Getter public class UpdatePasswordRequest { - @Schema(description = "비밀 번호", example = "newpassword1234!!") + @Schema(description = "비밀번호", example = "newpwd1234!!") @NotBlank @Password private String password; diff --git a/src/main/java/com/ajou/hertz/domain/user/entity/User.java b/src/main/java/com/ajou/hertz/domain/user/entity/User.java index bbdf580..0480d93 100644 --- a/src/main/java/com/ajou/hertz/domain/user/entity/User.java +++ b/src/main/java/com/ajou/hertz/domain/user/entity/User.java @@ -109,8 +109,8 @@ public void changeContactLink(String contactLink) { this.contactLink = contactLink; } - public void changePassword(String password) { - this.password = password; + public void changePassword(String encodedPassword) { + this.password = encodedPassword; } } From ac400aaf6b3ae667f12ed25ccb38da31c72caa74 Mon Sep 17 00:00:00 2001 From: tinon1004 Date: Wed, 27 Mar 2024 01:41:39 +0900 Subject: [PATCH 4/5] =?UTF-8?q?test:=20#24=20=EB=82=B4=20=EB=B9=84?= =?UTF-8?q?=EB=B0=80=EB=B2=88=ED=98=B8=20=EB=B3=80=EA=B2=BD=20API=20test?= =?UTF-8?q?=20=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/controller/UserControllerTest.java | 27 ++++++++++++++ .../user/service/UserCommandServiceTest.java | 35 +++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/src/test/java/com/ajou/hertz/unit/domain/user/controller/UserControllerTest.java b/src/test/java/com/ajou/hertz/unit/domain/user/controller/UserControllerTest.java index 6ea3135..6595538 100644 --- a/src/test/java/com/ajou/hertz/unit/domain/user/controller/UserControllerTest.java +++ b/src/test/java/com/ajou/hertz/unit/domain/user/controller/UserControllerTest.java @@ -268,6 +268,33 @@ public void securitySetUp() throws Exception { verifyEveryMocksShouldHaveNoMoreInteractions(); } + @Test + void 주어진_유저의_id와_새로운_비밀번호로_기존_비밀번호를_업데이트한다() throws Exception { + // given + long userId = 1L; + String newPassword = "newPwd11!!"; + UserDetails testUser = createTestUser(userId); + UserDto expectedResult = createUserDto(userId); + given(userCommandService.updatePassword(userId, newPassword)).willReturn(expectedResult); + + // when & then + mvc.perform( + put("/api/users/me/password") + .header(API_VERSION_HEADER_NAME, 1) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(newPassword)) + .with(user(testUser)) + ) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.id").value(expectedResult.getId())) + .andExpect(jsonPath("$.email").value(expectedResult.getEmail())) + .andExpect(jsonPath("$.birth").value(expectedResult.getBirth().toString())) + .andExpect(jsonPath("$.gender").value(expectedResult.getGender().name())) + .andExpect(jsonPath("$.contactLink").value(expectedResult.getContactLink())); + then(userCommandService).should().updatePassword(userId, newPassword); + verifyEveryMocksShouldHaveNoMoreInteractions(); + } + private void verifyEveryMocksShouldHaveNoMoreInteractions() { then(userCommandService).shouldHaveNoMoreInteractions(); then(userQueryService).shouldHaveNoMoreInteractions(); diff --git a/src/test/java/com/ajou/hertz/unit/domain/user/service/UserCommandServiceTest.java b/src/test/java/com/ajou/hertz/unit/domain/user/service/UserCommandServiceTest.java index 83e571b..cbe94c5 100644 --- a/src/test/java/com/ajou/hertz/unit/domain/user/service/UserCommandServiceTest.java +++ b/src/test/java/com/ajou/hertz/unit/domain/user/service/UserCommandServiceTest.java @@ -239,6 +239,41 @@ static Stream testDataForCreateNewUserWithKakao() throws Exception { assertThat(t).isInstanceOf(UserNotFoundByIdException.class); } + @Test + void 주어진_유저_ID와_새로운_비밀번호로_유저의_비밀번호를_변경한다() throws Exception { + // given + Long userId = 1L; + String newPassword = "newPwd1234!!"; + User user = createUser(userId, "$2a$abc123", "12345"); + given(userQueryService.getById(userId)).willReturn(user); + given(passwordEncoder.encode(newPassword)).willReturn(newPassword); + + // when + UserDto updatedUserDto = sut.updatePassword(userId, newPassword); + + // then + then(userQueryService).should().getById(userId); + then(passwordEncoder).should().encode(newPassword); + verifyEveryMocksShouldHaveNoMoreInteractions(); + assertThat(updatedUserDto.getPassword()).isEqualTo(newPassword); + } + + @Test + void 주어진_유저_ID와_새로운_비밀번호로_유저의_비밀번호를_변경한다_존재하지_않는_유저라면_예외가_발생한다() throws Exception { + // given + Long userId = 1L; + String newPassword = "newPwd1234!!"; + given(userQueryService.getById(userId)).willThrow(UserNotFoundByIdException.class); + + // when + Throwable t = catchThrowable(() -> sut.updatePassword(userId, newPassword)); + + // then + then(userQueryService).should().getById(userId); + verifyEveryMocksShouldHaveNoMoreInteractions(); + assertThat(t).isInstanceOf(UserNotFoundByIdException.class); + } + private void verifyEveryMocksShouldHaveNoMoreInteractions() { then(userQueryService).shouldHaveNoMoreInteractions(); then(userRepository).shouldHaveNoMoreInteractions(); From 9821467d62e2b3f700ad5084f280853df2f9462e Mon Sep 17 00:00:00 2001 From: tinon1004 Date: Wed, 27 Mar 2024 14:43:39 +0900 Subject: [PATCH 5/5] =?UTF-8?q?test:=20#24=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/service/UserCommandServiceTest.java | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/test/java/com/ajou/hertz/unit/domain/user/service/UserCommandServiceTest.java b/src/test/java/com/ajou/hertz/unit/domain/user/service/UserCommandServiceTest.java index cbe94c5..61751f1 100644 --- a/src/test/java/com/ajou/hertz/unit/domain/user/service/UserCommandServiceTest.java +++ b/src/test/java/com/ajou/hertz/unit/domain/user/service/UserCommandServiceTest.java @@ -258,22 +258,6 @@ static Stream testDataForCreateNewUserWithKakao() throws Exception { assertThat(updatedUserDto.getPassword()).isEqualTo(newPassword); } - @Test - void 주어진_유저_ID와_새로운_비밀번호로_유저의_비밀번호를_변경한다_존재하지_않는_유저라면_예외가_발생한다() throws Exception { - // given - Long userId = 1L; - String newPassword = "newPwd1234!!"; - given(userQueryService.getById(userId)).willThrow(UserNotFoundByIdException.class); - - // when - Throwable t = catchThrowable(() -> sut.updatePassword(userId, newPassword)); - - // then - then(userQueryService).should().getById(userId); - verifyEveryMocksShouldHaveNoMoreInteractions(); - assertThat(t).isInstanceOf(UserNotFoundByIdException.class); - } - private void verifyEveryMocksShouldHaveNoMoreInteractions() { then(userQueryService).shouldHaveNoMoreInteractions(); then(userRepository).shouldHaveNoMoreInteractions();