diff --git a/src/main/java/com/example/betteriter/fo_domain/review/controller/ReviewController.java b/src/main/java/com/example/betteriter/fo_domain/review/controller/ReviewController.java index 1f46ae4..8180384 100644 --- a/src/main/java/com/example/betteriter/fo_domain/review/controller/ReviewController.java +++ b/src/main/java/com/example/betteriter/fo_domain/review/controller/ReviewController.java @@ -104,6 +104,15 @@ public ResponseDto reviewScrap( return ResponseDto.onSuccess(null); } + /* 리뷰 삭제 */ + @DeleteMapping("/{reviewId}") + public ResponseDto deleteReview( + @PathVariable Long reviewId + ) { + this.reviewService.deleteReview(reviewId); + return ResponseDto.onSuccess(null); + } + private void checkRequestValidation(BindingResult bindingResult) { if (bindingResult.hasErrors()) { diff --git a/src/main/java/com/example/betteriter/fo_domain/review/service/ReviewService.java b/src/main/java/com/example/betteriter/fo_domain/review/service/ReviewService.java index af86339..651898a 100644 --- a/src/main/java/com/example/betteriter/fo_domain/review/service/ReviewService.java +++ b/src/main/java/com/example/betteriter/fo_domain/review/service/ReviewService.java @@ -26,8 +26,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import static com.example.betteriter.global.common.code.status.ErrorStatus._REVIEW_IMAGE_NOT_FOUND; -import static com.example.betteriter.global.common.code.status.ErrorStatus._REVIEW_NOT_FOUND; +import static com.example.betteriter.global.common.code.status.ErrorStatus.*; @Slf4j @RequiredArgsConstructor @@ -185,6 +184,17 @@ public void reviewScrap(Long reviewId) { review.countReviewScrapedCount(); } + /* 리뷰 삭제 */ + @Transactional + public Void deleteReview(Long reviewId) { + Review review = this.findReviewById(reviewId); + if (!review.getWriter().getId().equals(this.getCurrentUser().getId())) { + throw new ReviewHandler(_REVIEW_WRITER_IS_NOT_MATCH); + } + this.reviewRepository.delete(review); + return null; + } + private Slice getReviews(String name, String sort, int page) { Slice reviews = null; Pageable pageable = PageRequest.of(page, SIZE); diff --git a/src/main/java/com/example/betteriter/global/common/code/status/ErrorStatus.java b/src/main/java/com/example/betteriter/global/common/code/status/ErrorStatus.java index a90e673..a459b7b 100644 --- a/src/main/java/com/example/betteriter/global/common/code/status/ErrorStatus.java +++ b/src/main/java/com/example/betteriter/global/common/code/status/ErrorStatus.java @@ -60,6 +60,7 @@ public enum ErrorStatus implements BaseErrorCode { _REVIEW_NOT_FOUND(HttpStatus.BAD_REQUEST, "REVIEW_NOT_FOUND_400", "일치하는 리뷰 정보를 찾을 수 없습니다."), _REVIEW_NOT_ACTIVATE(HttpStatus.BAD_REQUEST, "REVIEW_NOT_ACTIVATE_400", "삭제되었거나 비공개된 리뷰입니다."), _REVIEW_IMAGE_NOT_FOUND(HttpStatus.BAD_REQUEST, "REVIEW_IMAGE_NOT_FOUND_400", "일치하는 리뷰 이미지 정보를 찾을 수 없습니다."), + _REVIEW_WRITER_IS_NOT_MATCH(HttpStatus.BAD_REQUEST, "REVIEW_WRITER_IS_NOT_MATCH_400", "리뷰의 작성자가 아닙니다."), // News _NEWS_NOT_FOUND(HttpStatus.BAD_REQUEST, "NEWS_400", "일치하는 뉴스 정보를 찾을 수 없습니다."), diff --git a/src/test/java/com/example/betteriter/fo_domain/review/controller/ReviewControllerTest.java b/src/test/java/com/example/betteriter/fo_domain/review/controller/ReviewControllerTest.java index 9e1b03a..d043c15 100644 --- a/src/test/java/com/example/betteriter/fo_domain/review/controller/ReviewControllerTest.java +++ b/src/test/java/com/example/betteriter/fo_domain/review/controller/ReviewControllerTest.java @@ -5,9 +5,11 @@ import com.example.betteriter.fo_domain.review.domain.ReviewImage; import com.example.betteriter.fo_domain.review.dto.*; import com.example.betteriter.fo_domain.review.dto.CreateReviewRequestDto.CreateReviewImageRequestDto; +import com.example.betteriter.fo_domain.review.exception.ReviewHandler; import com.example.betteriter.fo_domain.review.service.ReviewService; import com.example.betteriter.fo_domain.user.domain.Users; import com.example.betteriter.fo_domain.user.domain.UsersDetail; +import com.example.betteriter.global.common.code.status.ErrorStatus; import com.example.betteriter.global.config.security.SecurityConfig; import com.example.betteriter.global.constant.Category; import com.example.betteriter.global.constant.Job; @@ -39,8 +41,7 @@ import static org.mockito.Mockito.verify; import static org.springframework.http.MediaType.APPLICATION_JSON; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -786,4 +787,33 @@ void getReviewDetailCommentsControllerTest() throws Exception { .andExpect(jsonPath("$.result[0].id").value(1)) .andExpect(jsonPath("$.result[0].reviewCommentUserInfo.userId").value(1)); } + + @Test + @DisplayName("리뷰을 삭제한다 - 일치하는 리뷰가 존재하지 않는다.") + void deleteReviewControllerTestInFail() throws Exception { + // given + Review review = createReview(1L); + + given(this.reviewService.deleteReview(anyLong())) + .willThrow(new ReviewHandler(ErrorStatus._REVIEW_NOT_FOUND)); + // when & then + mockMvc.perform(delete("/review/{reviewId}", 1L).with(csrf())) + .andDo(print()) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.isSuccess").value(false)) + .andExpect(jsonPath("$.code").value("REVIEW_NOT_FOUND_400")); + } + + @Test + @DisplayName("리뷰를 삭제한다 - 성공") + void deleteReviewControllerTestInSuccess() throws Exception { + // given + Review review = createReview(1L); + // when + + // then + mockMvc.perform(delete("/review/{reviewId}", 1L).with(csrf())) + .andDo(print()) + .andExpect(status().isOk()); + } } \ No newline at end of file diff --git a/src/test/java/com/example/betteriter/fo_domain/review/service/ReviewServiceTest.java b/src/test/java/com/example/betteriter/fo_domain/review/service/ReviewServiceTest.java index e6ec3e6..1366ed8 100644 --- a/src/test/java/com/example/betteriter/fo_domain/review/service/ReviewServiceTest.java +++ b/src/test/java/com/example/betteriter/fo_domain/review/service/ReviewServiceTest.java @@ -507,7 +507,7 @@ void getReviewDetailLike() { @Test @DisplayName("리뷰 상세 조회 댓글 조회를 한다.") - void test() { + void getReviewDetailCommentsServiceTest() { // given Review review = createReview(1L); @@ -526,4 +526,20 @@ void test() { System.out.println(reviewCommentResponse.isMine()); } } + + @Test + @DisplayName("") + void deleteReviewServiceTest() { + // given + Review review = createReview(1L); + + given(this.reviewRepository.findById(anyLong())) + .willReturn(Optional.of(review)); + + // when + this.reviewService.deleteReview(1L); + // then + verify(this.reviewRepository, times(1)).findById(anyLong()); + verify(this.reviewRepository, times(1)).delete(any(Review.class)); + } } \ No newline at end of file