From 610be85e946fe8665d18824724594f428ee55081 Mon Sep 17 00:00:00 2001 From: kmw2378 Date: Tue, 11 Feb 2025 20:59:24 +0900 Subject: [PATCH 1/4] =?UTF-8?q?[FEAT]=20Member.updateJob()=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80=20(#108)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/ject/componote/domain/auth/domain/Member.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/ject/componote/domain/auth/domain/Member.java b/src/main/java/ject/componote/domain/auth/domain/Member.java index 668ef62e..795ff0f4 100644 --- a/src/main/java/ject/componote/domain/auth/domain/Member.java +++ b/src/main/java/ject/componote/domain/auth/domain/Member.java @@ -96,6 +96,10 @@ public void updateEmail(final Email email) { this.email = email; } + public void updateJob(final Job job) { + this.job = job; + } + public boolean hasEmail() { return this.email != null; } From a7dcba6aa38a66743e8b1419c2e66fceb9359aa7 Mon Sep 17 00:00:00 2001 From: kmw2378 Date: Tue, 11 Feb 2025 21:00:11 +0900 Subject: [PATCH 2/4] =?UTF-8?q?[REFACTOR]=20=ED=9A=8C=EC=9B=90=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EB=B3=80=EA=B2=BD=20API=20=ED=86=B5=EC=9D=BC?= =?UTF-8?q?=ED=99=94=20(#108)=20-=20=ED=94=84=EB=A1=9C=ED=95=84=20?= =?UTF-8?q?=EC=82=AC=EC=A7=84,=20=EB=8B=89=EB=84=A4=EC=9E=84,=20=EC=A7=81?= =?UTF-8?q?=EC=97=85=20=EC=88=98=EC=A0=95=20=EC=9E=91=EC=97=85=EC=9D=84=20?= =?UTF-8?q?=ED=95=98=EB=82=98=EC=9D=98=20API=EB=A1=9C=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/auth/api/MemberController.java | 19 +++----- .../auth/application/MemberService.java | 44 +++++++++++-------- 2 files changed, 31 insertions(+), 32 deletions(-) diff --git a/src/main/java/ject/componote/domain/auth/api/MemberController.java b/src/main/java/ject/componote/domain/auth/api/MemberController.java index 122c9a47..651e040b 100644 --- a/src/main/java/ject/componote/domain/auth/api/MemberController.java +++ b/src/main/java/ject/componote/domain/auth/api/MemberController.java @@ -3,9 +3,8 @@ import jakarta.validation.Valid; import ject.componote.domain.auth.application.MemberService; import ject.componote.domain.auth.dto.find.response.MemberSummaryResponse; -import ject.componote.domain.auth.dto.update.request.MemberNicknameUpdateRequest; -import ject.componote.domain.auth.dto.update.request.MemberProfileImageUpdateRequest; import ject.componote.domain.auth.dto.update.request.MemberEmailUpdateRequest; +import ject.componote.domain.auth.dto.update.request.MemberUpdateRequest; import ject.componote.domain.auth.dto.verify.request.MemberEmailVerificationRequest; import ject.componote.domain.auth.model.AuthPrincipal; import ject.componote.domain.auth.model.Authenticated; @@ -33,18 +32,10 @@ public ResponseEntity getMemberSummary(@Authenticated fin ); } - @PutMapping("/profile-image") - public ResponseEntity updateProfileImage(@Authenticated final AuthPrincipal authPrincipal, - @RequestBody @Valid final MemberProfileImageUpdateRequest request) { - memberService.updateProfileImage(authPrincipal, request); - return ResponseEntity.noContent() - .build(); - } - - @PutMapping("/nickname") - public ResponseEntity updateNickname(@Authenticated final AuthPrincipal authPrincipal, - @RequestBody @Valid final MemberNicknameUpdateRequest request) { - memberService.updateNickname(authPrincipal, request); + @PutMapping + public ResponseEntity updateMember(@Authenticated final AuthPrincipal authPrincipal, + @RequestBody @Valid final MemberUpdateRequest request) { + memberService.updateMember(authPrincipal, request); return ResponseEntity.noContent() .build(); } diff --git a/src/main/java/ject/componote/domain/auth/application/MemberService.java b/src/main/java/ject/componote/domain/auth/application/MemberService.java index 75db191a..66fe9b5d 100644 --- a/src/main/java/ject/componote/domain/auth/application/MemberService.java +++ b/src/main/java/ject/componote/domain/auth/application/MemberService.java @@ -1,12 +1,12 @@ package ject.componote.domain.auth.application; import ject.componote.domain.auth.dao.MemberRepository; +import ject.componote.domain.auth.domain.Job; import ject.componote.domain.auth.domain.Member; import ject.componote.domain.auth.dto.find.response.MemberSummaryResponse; import ject.componote.domain.auth.dto.image.event.ProfileImageMoveEvent; import ject.componote.domain.auth.dto.update.request.MemberEmailUpdateRequest; -import ject.componote.domain.auth.dto.update.request.MemberNicknameUpdateRequest; -import ject.componote.domain.auth.dto.update.request.MemberProfileImageUpdateRequest; +import ject.componote.domain.auth.dto.update.request.MemberUpdateRequest; import ject.componote.domain.auth.dto.verify.event.EmailVerificationCodeSendEvent; import ject.componote.domain.auth.dto.verify.request.MemberEmailVerificationRequest; import ject.componote.domain.auth.error.DuplicatedEmailException; @@ -38,9 +38,25 @@ public MemberSummaryResponse getMemberSummary(final AuthPrincipal authPrincipal) } @Transactional - public void updateProfileImage(final AuthPrincipal authPrincipal, final MemberProfileImageUpdateRequest request) { + public void updateMember(final AuthPrincipal authPrincipal, final MemberUpdateRequest request) { final Member member = findMemberById(authPrincipal.id()); - final ProfileImage profileImage = ProfileImage.from(request.profileImageObjectKey()); + updateProfileImage(member, request.profileImageObjectKey()); + updateJob(member, request.job()); + updateNickname(member, request.nickname()); + } + + @Transactional + public void updateEmail(final AuthPrincipal authPrincipal, final MemberEmailUpdateRequest request) { + final Member member = findMemberById(authPrincipal.id()); + final Email email = Email.from(request.email()); + validateSameEmail(member, email); + validateDuplicatedEmail(email); + verificationCodeService.verifyEmailCode(request.email(), request.verificationCode()); + member.updateEmail(email); + } + + private void updateProfileImage(final Member member, final String profileImageObjectKey) { + final ProfileImage profileImage = ProfileImage.from(profileImageObjectKey); if (member.equalsProfileImage(profileImage)) { return; } @@ -49,10 +65,12 @@ public void updateProfileImage(final AuthPrincipal authPrincipal, final MemberPr eventPublisher.publishEvent(ProfileImageMoveEvent.from(member)); } - @Transactional - public void updateNickname(final AuthPrincipal authPrincipal, final MemberNicknameUpdateRequest request) { - final Member member = findMemberById(authPrincipal.id()); - final Nickname nickname = Nickname.from(request.nickname()); + private void updateJob(final Member member, final Job job) { + member.updateJob(job); + } + + private void updateNickname(final Member member, final String nicknameValue) { + final Nickname nickname = Nickname.from(nicknameValue); if (member.equalsNickname(nickname)) { return; } @@ -64,16 +82,6 @@ public void updateNickname(final AuthPrincipal authPrincipal, final MemberNickna member.updateNickname(nickname); } - @Transactional - public void updateEmail(final AuthPrincipal authPrincipal, final MemberEmailUpdateRequest request) { - final Member member = findMemberById(authPrincipal.id()); - final Email email = Email.from(request.email()); - validateSameEmail(member, email); - validateDuplicatedEmail(email); - verificationCodeService.verifyEmailCode(request.email(), request.verificationCode()); - member.updateEmail(email); - } - public void sendVerificationCode(final AuthPrincipal authPrincipal, final MemberEmailVerificationRequest request) { final Email email = Email.from(request.email()); validateDuplicatedEmail(email); From 6b2c60e14a3495ed64b335518682d8a07dcf3858 Mon Sep 17 00:00:00 2001 From: kmw2378 Date: Tue, 11 Feb 2025 21:00:28 +0900 Subject: [PATCH 3/4] =?UTF-8?q?[TEST]=20MemberServiceTest=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20(#108)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/application/MemberServiceTest.java | 47 ++++++++----------- 1 file changed, 19 insertions(+), 28 deletions(-) diff --git a/src/test/java/ject/componote/domain/auth/application/MemberServiceTest.java b/src/test/java/ject/componote/domain/auth/application/MemberServiceTest.java index 1886f1cf..865c7181 100644 --- a/src/test/java/ject/componote/domain/auth/application/MemberServiceTest.java +++ b/src/test/java/ject/componote/domain/auth/application/MemberServiceTest.java @@ -2,11 +2,11 @@ import ject.componote.domain.auth.dao.MemberRepository; import ject.componote.domain.auth.dao.MemberSummaryDao; +import ject.componote.domain.auth.domain.Job; import ject.componote.domain.auth.domain.Member; import ject.componote.domain.auth.dto.find.response.MemberSummaryResponse; import ject.componote.domain.auth.dto.update.request.MemberEmailUpdateRequest; -import ject.componote.domain.auth.dto.update.request.MemberNicknameUpdateRequest; -import ject.componote.domain.auth.dto.update.request.MemberProfileImageUpdateRequest; +import ject.componote.domain.auth.dto.update.request.MemberUpdateRequest; import ject.componote.domain.auth.dto.verify.event.EmailVerificationCodeSendEvent; import ject.componote.domain.auth.dto.verify.request.MemberEmailVerificationRequest; import ject.componote.domain.auth.error.DuplicatedNicknameException; @@ -73,41 +73,29 @@ public void getMemberSummary() throws Exception { } @Test - @DisplayName("프로필 사진 변경") - public void updateProfileImage() throws Exception { - // given - final Long memberId = member.getId(); - final String newObjectKey = "new.jpg"; - final MemberProfileImageUpdateRequest request = new MemberProfileImageUpdateRequest(newObjectKey); - final ProfileImage newProfileImage = ProfileImage.from(newObjectKey); - - // when - doReturn(Optional.of(member)).when(memberRepository) - .findById(memberId); - memberService.updateProfileImage(authPrincipal, request); - - // then - assertThat(member.equalsProfileImage(newProfileImage)).isTrue(); - } - - @Test - @DisplayName("닉네임 변경") - public void updateNickname() throws Exception { + @DisplayName("회원 정보 변경") + public void updateMember() throws Exception { // given final Long memberId = member.getId(); + final String newProfileImageObjectKey = "new.jpg"; + final ProfileImage newProfileImage = ProfileImage.from(newProfileImageObjectKey); final String newNicknameValue = "newNick"; final Nickname newNickname = Nickname.from(newNicknameValue); - final MemberNicknameUpdateRequest request = new MemberNicknameUpdateRequest(newNicknameValue); + final Job newJob = Job.DESIGNER; + + final MemberUpdateRequest request = new MemberUpdateRequest(newNicknameValue, newJob, newProfileImageObjectKey); // when doReturn(Optional.of(member)).when(memberRepository) .findById(memberId); doReturn(false).when(memberRepository) .existsByNickname(newNickname); - memberService.updateNickname(authPrincipal, request); + memberService.updateMember(authPrincipal, request); // then + assertThat(member.equalsProfileImage(newProfileImage)).isTrue(); assertThat(member.equalsNickname(newNickname)).isTrue(); + assertThat(member.getJob() == newJob).isTrue(); } @Test @@ -157,13 +145,16 @@ public void sendVerificationCode() throws Exception { } @Test - @DisplayName("닉네임 변경 시 이미 닉네임이 존재하는 경우 예외 발생") - public void updateNicknameWhenAlreadyExist() throws Exception { + @DisplayName("회원 정보 변경 시 이미 닉네임이 존재하는 경우 예외 발생") + public void updateMemberWhenNicknameAlreadyExist() throws Exception { // given final Long memberId = member.getId(); + final String newProfileImageObjectKey = "new.jpg"; + final ProfileImage newProfileImage = ProfileImage.from(newProfileImageObjectKey); final String newNicknameValue = "newNick"; final Nickname newNickname = Nickname.from(newNicknameValue); - final MemberNicknameUpdateRequest request = new MemberNicknameUpdateRequest(newNicknameValue); + final Job newJob = Job.DESIGNER; + final MemberUpdateRequest request = new MemberUpdateRequest(newNicknameValue, newJob, newProfileImageObjectKey); // when doReturn(Optional.of(member)).when(memberRepository) @@ -172,7 +163,7 @@ public void updateNicknameWhenAlreadyExist() throws Exception { .existsByNickname(newNickname); // then - assertThatThrownBy(() -> memberService.updateNickname(authPrincipal, request)) + assertThatThrownBy(() -> memberService.updateMember(authPrincipal, request)) .isInstanceOf(DuplicatedNicknameException.class); } } \ No newline at end of file From e0f98f4b0b56caa7ca518eb156895475b3e83a53 Mon Sep 17 00:00:00 2001 From: kmw2378 Date: Tue, 11 Feb 2025 21:00:50 +0900 Subject: [PATCH 4/4] =?UTF-8?q?[FEAT]=20MemberUpdateRequest=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20(#108)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/update/request/MemberUpdateRequest.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/main/java/ject/componote/domain/auth/dto/update/request/MemberUpdateRequest.java diff --git a/src/main/java/ject/componote/domain/auth/dto/update/request/MemberUpdateRequest.java b/src/main/java/ject/componote/domain/auth/dto/update/request/MemberUpdateRequest.java new file mode 100644 index 00000000..03a9ea9b --- /dev/null +++ b/src/main/java/ject/componote/domain/auth/dto/update/request/MemberUpdateRequest.java @@ -0,0 +1,13 @@ +package ject.componote.domain.auth.dto.update.request; + +import jakarta.annotation.Nullable; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import ject.componote.domain.auth.domain.Job; + +public record MemberUpdateRequest( + @NotBlank String nickname, + @NotNull Job job, + @Nullable String profileImageObjectKey + ) { +}