diff --git a/src/main/java/ssu/eatssu/domain/admin/controller/ManageReviewController.java b/src/main/java/ssu/eatssu/domain/admin/controller/ManageReviewController.java new file mode 100644 index 0000000..b0aa1c0 --- /dev/null +++ b/src/main/java/ssu/eatssu/domain/admin/controller/ManageReviewController.java @@ -0,0 +1,24 @@ +package ssu.eatssu.domain.admin.controller; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import ssu.eatssu.domain.admin.service.ManageReviewService; +import ssu.eatssu.global.handler.response.BaseResponse; + +@Controller +@RequestMapping("/admin/reviews") +@RequiredArgsConstructor +public class ManageReviewController { + private final ManageReviewService manageReviewService; + + @ResponseBody + @DeleteMapping("/{reviewId}") + public BaseResponse delete(@PathVariable Long reviewId) { + manageReviewService.delete(reviewId); + return BaseResponse.success(); + } +} diff --git a/src/main/java/ssu/eatssu/domain/admin/listener/ReportEventListener.java b/src/main/java/ssu/eatssu/domain/admin/listener/ReportEventListener.java new file mode 100644 index 0000000..d357cdc --- /dev/null +++ b/src/main/java/ssu/eatssu/domain/admin/listener/ReportEventListener.java @@ -0,0 +1,19 @@ +package ssu.eatssu.domain.admin.listener; + +import lombok.RequiredArgsConstructor; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; +import ssu.eatssu.domain.admin.event.ReviewDeleteEvent; +import ssu.eatssu.domain.admin.service.ManageReportService; + +@Component +@RequiredArgsConstructor +public class ReportEventListener { + + private final ManageReportService manageReportService; + + @EventListener + public void deleteReport(ReviewDeleteEvent event) { + manageReportService.deleteAllByReviewId(event.reviewId()); + } +} diff --git a/src/main/java/ssu/eatssu/domain/admin/persistence/LoadReportRepository.java b/src/main/java/ssu/eatssu/domain/admin/persistence/LoadReportRepository.java index ec0afe0..c5b9825 100644 --- a/src/main/java/ssu/eatssu/domain/admin/persistence/LoadReportRepository.java +++ b/src/main/java/ssu/eatssu/domain/admin/persistence/LoadReportRepository.java @@ -42,4 +42,12 @@ private List fetchReportLines(Pageable pageable) { .limit(pageable.getPageSize()) .fetch(); } + + public List findAllByReviewId(Long reviewId) { + return queryFactory + .select(report.id) + .from(report) + .where(report.review.id.eq(reviewId)) + .fetch(); + } } diff --git a/src/main/java/ssu/eatssu/domain/admin/persistence/ManageReviewRepository.java b/src/main/java/ssu/eatssu/domain/admin/persistence/ManageReviewRepository.java new file mode 100644 index 0000000..598c487 --- /dev/null +++ b/src/main/java/ssu/eatssu/domain/admin/persistence/ManageReviewRepository.java @@ -0,0 +1,8 @@ +package ssu.eatssu.domain.admin.persistence; + +import org.springframework.data.jpa.repository.JpaRepository; +import ssu.eatssu.domain.review.entity.Review; + +public interface ManageReviewRepository extends JpaRepository { + +} \ No newline at end of file diff --git a/src/main/java/ssu/eatssu/domain/admin/service/ManageReportService.java b/src/main/java/ssu/eatssu/domain/admin/service/ManageReportService.java index eb28d0e..dff28a1 100644 --- a/src/main/java/ssu/eatssu/domain/admin/service/ManageReportService.java +++ b/src/main/java/ssu/eatssu/domain/admin/service/ManageReportService.java @@ -9,6 +9,8 @@ import ssu.eatssu.domain.admin.persistence.LoadReportRepository; import ssu.eatssu.domain.admin.persistence.ManageReportRepository; +import java.util.List; + @Service @RequiredArgsConstructor public class ManageReportService { @@ -24,4 +26,9 @@ public PageWrapper getReportBoard(Pageable pageable) { public void delete(Long reportId) { manageReportRepository.deleteById(reportId); } + + public void deleteAllByReviewId(Long reviewId) { + List reportIds = loadReportRepository.findAllByReviewId(reviewId); + manageReportRepository.deleteAllByIdInBatch(reportIds); + } } diff --git a/src/main/java/ssu/eatssu/domain/admin/service/ManageReviewService.java b/src/main/java/ssu/eatssu/domain/admin/service/ManageReviewService.java new file mode 100644 index 0000000..fc3b92f --- /dev/null +++ b/src/main/java/ssu/eatssu/domain/admin/service/ManageReviewService.java @@ -0,0 +1,23 @@ +package ssu.eatssu.domain.admin.service; + +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.stereotype.Service; +import ssu.eatssu.domain.admin.event.ReviewDeleteEvent; +import ssu.eatssu.domain.admin.persistence.ManageReviewRepository; + +@Service +@Transactional +@RequiredArgsConstructor +public class ManageReviewService { + private final ManageReviewRepository manageReviewRepository; + private final ApplicationEventPublisher publisher; + + public void delete(Long reviewId) { + // 리뷰 삭제하기 전에 해당 리뷰를 참조하는 신고들을 모두 삭제한다. + publisher.publishEvent(new ReviewDeleteEvent(reviewId)); + + manageReviewRepository.deleteById(reviewId); + } +}