From 8bdcb57b3bd9ae46b9b46662a53721916f696b1e Mon Sep 17 00:00:00 2001 From: sunny Date: Fri, 14 Jun 2024 21:11:51 +0900 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20=EC=BB=A4=ED=94=8C=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0=20=ED=95=B4=EC=A0=9C=20service=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lovemarker/domain/couple/service/CoupleService.java | 8 ++++++++ src/main/java/com/lovemarker/domain/user/User.java | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/src/main/java/com/lovemarker/domain/couple/service/CoupleService.java b/src/main/java/com/lovemarker/domain/couple/service/CoupleService.java index 31cca3b..78de430 100644 --- a/src/main/java/com/lovemarker/domain/couple/service/CoupleService.java +++ b/src/main/java/com/lovemarker/domain/couple/service/CoupleService.java @@ -7,6 +7,7 @@ import com.lovemarker.domain.user.User; import com.lovemarker.domain.user.exception.UserNotFoundException; import com.lovemarker.domain.user.repository.UserRepository; +import com.lovemarker.global.aspect.CouplePermissionCheck; import com.lovemarker.global.constant.ErrorCode; import com.lovemarker.global.exception.BadRequestException; import com.lovemarker.global.exception.NotFoundException; @@ -40,6 +41,13 @@ public void joinCouple(Long userId, String invitationCode) { user.connectCouple(couple); } + @Transactional + @CouplePermissionCheck + public void disconnectCouple(Long userId) { + User user = getUserByUserId(userId); + user.disconnectCouple(); + } + private User getUserByUserId(Long userId) { return userRepository.findById(userId) .orElseThrow(() -> new UserNotFoundException(ErrorCode.NOT_FOUND_EXCEPTION, "존재하지 않는 유저입니다.")); diff --git a/src/main/java/com/lovemarker/domain/user/User.java b/src/main/java/com/lovemarker/domain/user/User.java index 1e4a201..021e89d 100644 --- a/src/main/java/com/lovemarker/domain/user/User.java +++ b/src/main/java/com/lovemarker/domain/user/User.java @@ -59,6 +59,10 @@ public void connectCouple(Couple couple) { this.couple = couple; } + public void disconnectCouple() { + this.couple = null; + } + public void updateUserNickname(String nickname) { this.nickname = new UserNickname(nickname); } From 2fce79eb4eddc8fab65f36ef495a1379d2e30bf5 Mon Sep 17 00:00:00 2001 From: sunny Date: Fri, 14 Jun 2024 21:15:53 +0900 Subject: [PATCH 2/5] =?UTF-8?q?feat:=20=EC=BB=A4=ED=94=8C=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0=20=ED=95=B4=EC=A0=9C=20controller=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/couple/controller/CoupleController.java | 9 +++++++++ .../java/com/lovemarker/global/constant/SuccessCode.java | 1 + 2 files changed, 10 insertions(+) diff --git a/src/main/java/com/lovemarker/domain/couple/controller/CoupleController.java b/src/main/java/com/lovemarker/domain/couple/controller/CoupleController.java index 645b319..402b78b 100644 --- a/src/main/java/com/lovemarker/domain/couple/controller/CoupleController.java +++ b/src/main/java/com/lovemarker/domain/couple/controller/CoupleController.java @@ -9,6 +9,7 @@ import com.lovemarker.global.dto.ApiResponseDto; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -38,4 +39,12 @@ public ApiResponseDto joinCouple( coupleService.joinCouple(userId, joinCoupleRequest.invitationCode()); return ApiResponseDto.success(SuccessCode.JOIN_COUPLE_SUCCESS); } + + @DeleteMapping + public ApiResponseDto disconnectCouple( + @UserId Long userId + ) { + coupleService.disconnectCouple(userId); + return ApiResponseDto.success(SuccessCode.DISCONNECT_COUPLE_SUCCESS); + } } diff --git a/src/main/java/com/lovemarker/global/constant/SuccessCode.java b/src/main/java/com/lovemarker/global/constant/SuccessCode.java index 8672a9e..8287747 100644 --- a/src/main/java/com/lovemarker/global/constant/SuccessCode.java +++ b/src/main/java/com/lovemarker/global/constant/SuccessCode.java @@ -16,6 +16,7 @@ public enum SuccessCode { FIND_MEMORY_DETAIL_SUCCESS(HttpStatus.OK, "추억 상세 조회에 성공했습니다."), FIND_MEMORY_LIST_SUCCESS(HttpStatus.OK, "추억 리스트뷰 조회에 성공했습니다."), FIND_MY_MEMORY_LIST_SUCCESS(HttpStatus.OK, "내가 올린 추억 조회에 성공했습니다."), + DISCONNECT_COUPLE_SUCCESS(HttpStatus.OK, "커플 연결 해제에 성공했습니다."), // 201 CREATE_INVITATION_CODE_SUCCESS(HttpStatus.CREATED, "초대 코드 생성을 성공했습니다."), From bf05fb62a7d3d9878cf1c641e05cc9e71ff80f53 Mon Sep 17 00:00:00 2001 From: sunny Date: Fri, 14 Jun 2024 21:18:13 +0900 Subject: [PATCH 3/5] =?UTF-8?q?test:=20=EC=BB=A4=ED=94=8C=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0=20=ED=95=B4=EC=A0=9C=20controller=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CoupleControllerTest.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/test/java/com/lovemarker/domain/couple/controller/CoupleControllerTest.java b/src/test/java/com/lovemarker/domain/couple/controller/CoupleControllerTest.java index 81d5c44..9167643 100644 --- a/src/test/java/com/lovemarker/domain/couple/controller/CoupleControllerTest.java +++ b/src/test/java/com/lovemarker/domain/couple/controller/CoupleControllerTest.java @@ -10,6 +10,7 @@ import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import com.lovemarker.base.BaseControllerTest; @@ -89,4 +90,29 @@ void joinCouple() throws Exception { ) )); } + + @Test + @DisplayName("성공: 커플 연결 해제 api 호출 시") + void disconnectCouple() throws Exception { + //given + Long userId = 1L; + + //when + ResultActions resultActions = mockMvc.perform(delete("/api/couple") + .header("userId", userId)); + + //then + resultActions + .andDo(restDocs.document( + requestHeaders( + headerWithName("userId").description("유저 아이디") + ), + responseFields( + fieldWithPath("status").type(NUMBER).description("상태 코드"), + fieldWithPath("success").type(BOOLEAN).description("성공 여부"), + fieldWithPath("message").type(STRING).description("메시지"), + fieldWithPath("data").ignored() + ) + )); + } } \ No newline at end of file From afc470821bd9fa337d2cc87ee9f9834fcdcbcb68 Mon Sep 17 00:00:00 2001 From: sunny Date: Fri, 14 Jun 2024 21:22:00 +0900 Subject: [PATCH 4/5] =?UTF-8?q?test:=20=EC=BB=A4=ED=94=8C=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0=20=ED=95=B4=EC=A0=9C=20service=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../couple/service/CoupleServiceTest.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/test/java/com/lovemarker/domain/couple/service/CoupleServiceTest.java b/src/test/java/com/lovemarker/domain/couple/service/CoupleServiceTest.java index 0236c2d..f8cd2d5 100644 --- a/src/test/java/com/lovemarker/domain/couple/service/CoupleServiceTest.java +++ b/src/test/java/com/lovemarker/domain/couple/service/CoupleServiceTest.java @@ -12,6 +12,7 @@ import com.lovemarker.domain.couple.fixture.CoupleFixture; import com.lovemarker.domain.couple.repository.CoupleRepository; import com.lovemarker.domain.user.User; +import com.lovemarker.domain.user.exception.UserNotFoundException; import com.lovemarker.domain.user.fixture.UserFixture; import com.lovemarker.domain.user.repository.UserRepository; import com.lovemarker.global.exception.BadRequestException; @@ -134,4 +135,38 @@ void exceptionWhenCoupleAlreadyConnected() { assertThat(exception).isInstanceOf(BadRequestException.class); } } + + @Nested + @DisplayName("disconnectCouple 메서드 실행 시") + class DisconnectCoupleTest { + + User user = UserFixture.user(); + Couple couple = CoupleFixture.couple(); + + @Test + @DisplayName("성공") + void disconnectCouple() { + //given + user.connectCouple(couple); + + given(userRepository.findById(anyLong())).willReturn(Optional.ofNullable(user)); + + //when + coupleService.disconnectCouple(1L); + + //then + assertThat(user.getCouple()).isEqualTo(null); + } + + @Test + @DisplayName("예외(UserNotFoundException): 존재하지 않는 유저") + void exceptionWhenUserNotFound() { + //given + //when + Exception exception = catchException(() -> coupleService.disconnectCouple(1L)); + + //then + assertThat(exception).isInstanceOf(UserNotFoundException.class); + } + } } \ No newline at end of file From a7740434447847bfa1f6db2a6c285ad5044dd6b5 Mon Sep 17 00:00:00 2001 From: sunny Date: Fri, 14 Jun 2024 21:24:15 +0900 Subject: [PATCH 5/5] =?UTF-8?q?test:=20=EC=BB=A4=ED=94=8C=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0=20=ED=95=B4=EC=A0=9C=20=EB=8F=84=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/lovemarker/domain/user/UserTest.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/test/java/com/lovemarker/domain/user/UserTest.java b/src/test/java/com/lovemarker/domain/user/UserTest.java index d53aabc..b2e03f6 100644 --- a/src/test/java/com/lovemarker/domain/user/UserTest.java +++ b/src/test/java/com/lovemarker/domain/user/UserTest.java @@ -79,4 +79,25 @@ void exceptionWhenCoupleIsNotNull() { assertThat(exception).isInstanceOf(BadRequestException.class); } } + + @Nested + @DisplayName("커플 연결 해제 시") + class DisconnectCoupleTest { + + User user = UserFixture.user(); + Couple couple = CoupleFixture.couple(); + + @Test + @DisplayName("성공") + void disconnectCouple() { + //given + user.connectCouple(couple); + + //when + user.disconnectCouple(); + + //then + assertThat(user.getCouple()).isNull(); + } + } }