From cb1b2414054a22fbd0a00a8d82817c6f65b2d223 Mon Sep 17 00:00:00 2001 From: LeeShinHeang Date: Mon, 16 Feb 2026 22:12:13 +0900 Subject: [PATCH 1/3] =?UTF-8?q?refactor:=20fromReportToReportRevivedSummar?= =?UTF-8?q?yResponse=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../report/application/ReportConverter.java | 7 +++---- .../report/application/ReportService.java | 20 ++++++++++++++++++- .../application/ReportConverterTest.java | 9 +++++---- .../report/application/ReportServiceTest.java | 4 ++-- 4 files changed, 29 insertions(+), 11 deletions(-) diff --git a/src/main/java/until/the/eternity/dcs/domain/report/application/ReportConverter.java b/src/main/java/until/the/eternity/dcs/domain/report/application/ReportConverter.java index ff82218f..22dae690 100644 --- a/src/main/java/until/the/eternity/dcs/domain/report/application/ReportConverter.java +++ b/src/main/java/until/the/eternity/dcs/domain/report/application/ReportConverter.java @@ -57,14 +57,13 @@ public ReportRevivedDetailResponse fromReportToReportRevivedDetailResponse( .build(); } - public ReportRevivedSummaryResponse fromReportToReportRevivedSummaryResponse(Report report) { - Long targetUserId = report.getTargetUserId(); - UserSummaryDetailResponse userSummary = userSummaryService.findUserSummary(targetUserId); + public ReportRevivedSummaryResponse fromReportToReportRevivedSummaryResponse( + Report report, String targetUserName) { return ReportRevivedSummaryResponse.builder() .Id(report.getId()) .targetType(report.getTargetType().getCode()) .targetUserId(report.getTargetUserId()) - .targetUsername(userSummary.nickname()) + .targetUsername(targetUserName) .categoryCd(report.getCategoryCd().getCode()) .revivedAt(report.getRevivedAt()) .revivedBy(report.getRevivedBy()) diff --git a/src/main/java/until/the/eternity/dcs/domain/report/application/ReportService.java b/src/main/java/until/the/eternity/dcs/domain/report/application/ReportService.java index 2a7da1c6..31cfaa65 100644 --- a/src/main/java/until/the/eternity/dcs/domain/report/application/ReportService.java +++ b/src/main/java/until/the/eternity/dcs/domain/report/application/ReportService.java @@ -5,6 +5,9 @@ import static until.the.eternity.dcs.domain.notice.enums.NoticeType.REPORT_RESULT; import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -27,6 +30,7 @@ import until.the.eternity.dcs.domain.report.infrastructure.ReportRepository; import until.the.eternity.dcs.domain.user.application.UserSummaryService; import until.the.eternity.dcs.domain.user.dto.response.UserSummaryDetailResponse; +import until.the.eternity.dcs.domain.user.entity.UserSummary; @Service @RequiredArgsConstructor @@ -85,7 +89,21 @@ public Page findRevivedReports(CustomPageRequest r Page revivedReports = reportRepository.findAllByStatusCd(ReportStatus.REJECT, pageable); - return revivedReports.map(reportConverter::fromReportToReportRevivedSummaryResponse); + System.out.println("revivedReports" + revivedReports.stream().toList().size()); + + List userIdList = + revivedReports.stream().map(Report::getTargetUserId).distinct().toList(); + Map userSummaryMap = + userSummaryService.findByIdIn(userIdList).stream() + .collect(Collectors.toMap(UserSummary::getId, u -> u)); + + return revivedReports.map( + report -> { + UserSummary userSummary = userSummaryMap.get(report.getTargetUserId()); + String nickname = (userSummary != null) ? userSummary.getNickname() : "알수없음"; + return reportConverter.fromReportToReportRevivedSummaryResponse( + report, nickname); + }); } @PreAuthorize("@reportPermissionEvaluator.isAuthorized(authentication)") diff --git a/src/test/java/until/the/eternity/dcs/domain/report/application/ReportConverterTest.java b/src/test/java/until/the/eternity/dcs/domain/report/application/ReportConverterTest.java index f09b89ba..a4abf550 100644 --- a/src/test/java/until/the/eternity/dcs/domain/report/application/ReportConverterTest.java +++ b/src/test/java/until/the/eternity/dcs/domain/report/application/ReportConverterTest.java @@ -124,12 +124,10 @@ void fromReportToReportRevivedDetailResponse_WithNullInput() { @Test @DisplayName("Report를 ReportRevivedSummaryResponse로 변환 - 정상 케이스") void fromReportToReportRevivedSummaryResponse_Success() { - // given - when(userSummaryService.findUserSummary(anyLong())).thenReturn(userSummaryDetailResponse); // when ReportRevivedSummaryResponse result = - reportConverter.fromReportToReportRevivedSummaryResponse(report); + reportConverter.fromReportToReportRevivedSummaryResponse(report, username); // then assertThat(result).isNotNull(); @@ -145,7 +143,10 @@ void fromReportToReportRevivedSummaryResponse_Success() { @DisplayName("Report를 ReportRevivedSummaryResponse로 변환 - null 입력값") void fromReportToReportRevivedSummaryResponse_WithNullInput() { // when & then - assertThatThrownBy(() -> reportConverter.fromReportToReportRevivedSummaryResponse(null)) + assertThatThrownBy( + () -> + reportConverter.fromReportToReportRevivedSummaryResponse( + null, username)) .isInstanceOf(NullPointerException.class); } diff --git a/src/test/java/until/the/eternity/dcs/domain/report/application/ReportServiceTest.java b/src/test/java/until/the/eternity/dcs/domain/report/application/ReportServiceTest.java index 75297bb9..be444033 100644 --- a/src/test/java/until/the/eternity/dcs/domain/report/application/ReportServiceTest.java +++ b/src/test/java/until/the/eternity/dcs/domain/report/application/ReportServiceTest.java @@ -58,7 +58,7 @@ class ReportServiceTest { @BeforeEach void setUp() { - mockReport = Report.builder().id(1L).build(); + mockReport = Report.builder().id(1L).targetUserId(userId).build(); mockUser = UserSummary.builder().id(userId).nickname(username).grade(UserGrade.USER).build(); mockAdmin = UserSummary.builder().id(adminId).grade(UserGrade.ADMIN).build(); @@ -217,7 +217,7 @@ void findRevivedReports_Success() { given(reportRepository.findAllByStatusCd(ReportStatus.REJECT, pageable)) .willReturn(reportPage); - given(reportConverter.fromReportToReportRevivedSummaryResponse(mockReport)) + given(reportConverter.fromReportToReportRevivedSummaryResponse(mockReport, "알수없음")) .willReturn(summaryResponse); // when From d770214fb87b5af619d36d4de11461c2e6020e99 Mon Sep 17 00:00:00 2001 From: LeeShinHeang Date: Mon, 16 Feb 2026 22:32:26 +0900 Subject: [PATCH 2/3] =?UTF-8?q?refactor:=20=EB=82=98=EB=A8=B8=EC=A7=80=20R?= =?UTF-8?q?eportDTO=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../report/application/ReportConverter.java | 36 +++++--------- .../report/application/ReportService.java | 43 ++++++++++++++--- .../application/ReportConverterTest.java | 48 ++++++++----------- .../report/application/ReportServiceTest.java | 23 ++++++--- 4 files changed, 87 insertions(+), 63 deletions(-) diff --git a/src/main/java/until/the/eternity/dcs/domain/report/application/ReportConverter.java b/src/main/java/until/the/eternity/dcs/domain/report/application/ReportConverter.java index 22dae690..f75d52e0 100644 --- a/src/main/java/until/the/eternity/dcs/domain/report/application/ReportConverter.java +++ b/src/main/java/until/the/eternity/dcs/domain/report/application/ReportConverter.java @@ -9,14 +9,10 @@ import until.the.eternity.dcs.domain.report.enums.ReportTargetType; import until.the.eternity.dcs.domain.report.exception.CategoryNotFoundException; import until.the.eternity.dcs.domain.report.exception.TargetNotFoundException; -import until.the.eternity.dcs.domain.user.application.UserSummaryService; -import until.the.eternity.dcs.domain.user.dto.response.UserSummaryDetailResponse; @Component @RequiredArgsConstructor public class ReportConverter { - private final UserSummaryService userSummaryService; - public Report fromReportCreateRequestToReport( ReportCreateRequest reportCreateRequest, Long userId) { ReportTargetType targetType = @@ -70,15 +66,14 @@ public ReportRevivedSummaryResponse fromReportToReportRevivedSummaryResponse( .build(); } - public ReportRepliedDetailResponse fromReportToReportRepliedDetailResponse(Report report) { - Long targetUserId = report.getTargetUserId(); - UserSummaryDetailResponse userSummary = userSummaryService.findUserSummary(targetUserId); + public ReportRepliedDetailResponse fromReportToReportRepliedDetailResponse( + Report report, String targetUserName) { return ReportRepliedDetailResponse.builder() .Id(report.getId()) .targetType(report.getTargetType().getCode()) .targetId(report.getTargetId()) .targetUserId(report.getTargetUserId()) - .targetUsername(userSummary.nickname()) + .targetUsername(targetUserName) .userId(report.getUserId()) .categoryCd(report.getCategoryCd().getCode()) .reason(report.getReason()) @@ -87,46 +82,41 @@ public ReportRepliedDetailResponse fromReportToReportRepliedDetailResponse(Repor .build(); } - public ReportRepliedSummaryResponse fromReportToReportRepliedSummaryResponse(Report report) { - // todo usersummaryservice 사용 부분 N+1 문제 발생 가능 -> 해결 예정 - Long targetUserId = report.getTargetUserId(); - UserSummaryDetailResponse userSummary = userSummaryService.findUserSummary(targetUserId); + public ReportRepliedSummaryResponse fromReportToReportRepliedSummaryResponse( + Report report, String targetUserName) { return ReportRepliedSummaryResponse.builder() .Id(report.getId()) .targetType(report.getTargetType().getCode()) .targetUserId(report.getTargetUserId()) - .targetUsername(userSummary.nickname()) + .targetUsername(targetUserName) .categoryCd(report.getCategoryCd().getCode()) .repliedAt(report.getRepliedAt()) .repliedBy(report.getRepliedBy()) .build(); } - public ReportReportedDetailResponse fromReportToReportReportedDetailResponse(Report report) { - Long targetUserId = report.getTargetUserId(); - UserSummaryDetailResponse userSummary = userSummaryService.findUserSummary(targetUserId); - + public ReportReportedDetailResponse fromReportToReportReportedDetailResponse( + Report report, String targetUserName) { return ReportReportedDetailResponse.builder() .Id(report.getId()) .targetType(report.getTargetType().getCode()) .targetId(report.getTargetId()) - .targetUserId(targetUserId) - .targetUsername(userSummary.nickname()) + .targetUserId(report.getTargetUserId()) + .targetUsername(targetUserName) .userId(report.getUserId()) .categoryCd(report.getCategoryCd().getCode()) .reason(report.getReason()) .build(); } - public ReportReportedSummaryResponse fromReportToReportReportedSummaryResponse(Report report) { - Long targetUserId = report.getTargetUserId(); - UserSummaryDetailResponse userSummary = userSummaryService.findUserSummary(targetUserId); + public ReportReportedSummaryResponse fromReportToReportReportedSummaryResponse( + Report report, String targetUserName) { return ReportReportedSummaryResponse.builder() .Id(report.getId()) .targetType(report.getTargetType().getCode()) .targetUserId(report.getTargetUserId()) - .targetUsername(userSummary.nickname()) + .targetUsername(targetUserName) .categoryCd(report.getCategoryCd().getCode()) .build(); } diff --git a/src/main/java/until/the/eternity/dcs/domain/report/application/ReportService.java b/src/main/java/until/the/eternity/dcs/domain/report/application/ReportService.java index 31cfaa65..1ec6d596 100644 --- a/src/main/java/until/the/eternity/dcs/domain/report/application/ReportService.java +++ b/src/main/java/until/the/eternity/dcs/domain/report/application/ReportService.java @@ -53,7 +53,12 @@ public ReportPersistResponse createReport(ReportCreateRequest request) { @PreAuthorize("@reportPermissionEvaluator.isAuthorized(authentication)") public ReportRepliedDetailResponse getRepliedReport(Long id) { Report report = findById(id); - return reportConverter.fromReportToReportRepliedDetailResponse(report); + + Long targetUserId = report.getTargetUserId(); + UserSummaryDetailResponse userSummary = userSummaryService.findUserSummary(targetUserId); + + return reportConverter.fromReportToReportRepliedDetailResponse( + report, userSummary.nickname()); } @PreAuthorize("@reportPermissionEvaluator.isAuthorized(authentication)") @@ -69,7 +74,11 @@ public ReportRevivedDetailResponse getRevivedReport(Long id) { @PreAuthorize("@reportPermissionEvaluator.isAuthorized(authentication)") public ReportReportedDetailResponse getReportedReport(Long id) { Report report = findById(id); - return reportConverter.fromReportToReportReportedDetailResponse(report); + UserSummaryDetailResponse userSummary = + userSummaryService.findUserSummary(report.getTargetUserId()); + + return reportConverter.fromReportToReportReportedDetailResponse( + report, userSummary.nickname()); } @PreAuthorize("@reportPermissionEvaluator.isAuthorized(authentication)") @@ -79,7 +88,19 @@ public Page findRepliedReports(CustomPageRequest r Page repliedReports = reportRepository.findAllByStatusCd(ReportStatus.ACCEPT, pageable); - return repliedReports.map(reportConverter::fromReportToReportRepliedSummaryResponse); + List userIdList = + repliedReports.stream().map(Report::getTargetUserId).distinct().toList(); + Map userSummaryMap = + userSummaryService.findByIdIn(userIdList).stream() + .collect(Collectors.toMap(UserSummary::getId, u -> u)); + + return repliedReports.map( + report -> { + UserSummary userSummary = userSummaryMap.get(report.getTargetUserId()); + String nickname = (userSummary != null) ? userSummary.getNickname() : "알수없음"; + return reportConverter.fromReportToReportRepliedSummaryResponse( + report, nickname); + }); } @PreAuthorize("@reportPermissionEvaluator.isAuthorized(authentication)") @@ -89,8 +110,6 @@ public Page findRevivedReports(CustomPageRequest r Page revivedReports = reportRepository.findAllByStatusCd(ReportStatus.REJECT, pageable); - System.out.println("revivedReports" + revivedReports.stream().toList().size()); - List userIdList = revivedReports.stream().map(Report::getTargetUserId).distinct().toList(); Map userSummaryMap = @@ -113,7 +132,19 @@ public Page findReportedReports(CustomPageRequest Page reportedReports = reportRepository.findAllByStatusCd(ReportStatus.REPORTED, pageable); - return reportedReports.map(reportConverter::fromReportToReportReportedSummaryResponse); + List userIdList = + reportedReports.stream().map(Report::getTargetUserId).distinct().toList(); + Map userSummaryMap = + userSummaryService.findByIdIn(userIdList).stream() + .collect(Collectors.toMap(UserSummary::getId, u -> u)); + + return reportedReports.map( + report -> { + UserSummary userSummary = userSummaryMap.get(report.getTargetUserId()); + String nickname = (userSummary != null) ? userSummary.getNickname() : "알수없음"; + return reportConverter.fromReportToReportReportedSummaryResponse( + report, nickname); + }); } @Transactional diff --git a/src/test/java/until/the/eternity/dcs/domain/report/application/ReportConverterTest.java b/src/test/java/until/the/eternity/dcs/domain/report/application/ReportConverterTest.java index a4abf550..452cbf44 100644 --- a/src/test/java/until/the/eternity/dcs/domain/report/application/ReportConverterTest.java +++ b/src/test/java/until/the/eternity/dcs/domain/report/application/ReportConverterTest.java @@ -2,8 +2,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.Mockito.when; import java.time.LocalDateTime; import org.junit.jupiter.api.BeforeEach; @@ -11,28 +9,23 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; -import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import until.the.eternity.dcs.domain.report.dto.request.ReportCreateRequest; import until.the.eternity.dcs.domain.report.dto.response.*; import until.the.eternity.dcs.domain.report.entitiy.Report; import until.the.eternity.dcs.domain.report.enums.ReportCategory; import until.the.eternity.dcs.domain.report.enums.ReportTargetType; -import until.the.eternity.dcs.domain.user.application.UserSummaryService; -import until.the.eternity.dcs.domain.user.dto.response.UserSummaryDetailResponse; import until.the.eternity.dcs.domain.user.entity.UserSummary; @ExtendWith(MockitoExtension.class) @DisplayName("ReportConverter 테스트") class ReportConverterTest { - @Mock private UserSummaryService userSummaryService; @InjectMocks private ReportConverter reportConverter; private ReportCreateRequest reportCreateRequest; private Report report; Long userId = 1L; String username = "userName"; - private UserSummaryDetailResponse userSummaryDetailResponse; @BeforeEach void setUp() { @@ -63,7 +56,6 @@ void setUp() { .build(); UserSummary userSummary = UserSummary.builder().id(userId).nickname("username").build(); - userSummaryDetailResponse = UserSummaryDetailResponse.from(userSummary); } @Test @@ -153,12 +145,9 @@ void fromReportToReportRevivedSummaryResponse_WithNullInput() { @Test @DisplayName("Report를 ReportRepliedDetailResponse로 변환 - 정상 케이스") void fromReportToReportRepliedDetailResponse_Success() { - // given - when(userSummaryService.findUserSummary(anyLong())).thenReturn(userSummaryDetailResponse); - // when ReportRepliedDetailResponse result = - reportConverter.fromReportToReportRepliedDetailResponse(report); + reportConverter.fromReportToReportRepliedDetailResponse(report, username); // then assertThat(result).isNotNull(); @@ -177,19 +166,19 @@ void fromReportToReportRepliedDetailResponse_Success() { @DisplayName("Report를 ReportRepliedDetailResponse로 변환 - null 입력값") void fromReportToReportRepliedDetailResponse_WithNullInput() { // when & then - assertThatThrownBy(() -> reportConverter.fromReportToReportRepliedDetailResponse(null)) + assertThatThrownBy( + () -> + reportConverter.fromReportToReportRepliedDetailResponse( + null, username)) .isInstanceOf(NullPointerException.class); } @Test @DisplayName("Report를 ReportRepliedSummaryResponse로 변환 - 정상 케이스") void fromReportToReportRepliedSummaryResponse_Success() { - // given - when(userSummaryService.findUserSummary(anyLong())).thenReturn(userSummaryDetailResponse); - // when ReportRepliedSummaryResponse result = - reportConverter.fromReportToReportRepliedSummaryResponse(report); + reportConverter.fromReportToReportRepliedSummaryResponse(report, username); // then assertThat(result).isNotNull(); @@ -205,19 +194,19 @@ void fromReportToReportRepliedSummaryResponse_Success() { @DisplayName("Report를 ReportRepliedSummaryResponse로 변환 - null 입력값") void fromReportToReportRepliedSummaryResponse_WithNullInput() { // when & then - assertThatThrownBy(() -> reportConverter.fromReportToReportRepliedSummaryResponse(null)) + assertThatThrownBy( + () -> + reportConverter.fromReportToReportRepliedSummaryResponse( + null, username)) .isInstanceOf(NullPointerException.class); } @Test @DisplayName("Report를 ReportReportedDetailResponse로 변환 - 정상 케이스") void fromReportToReportReportedDetailResponse_Success() { - // given - when(userSummaryService.findUserSummary(anyLong())).thenReturn(userSummaryDetailResponse); - // when ReportReportedDetailResponse result = - reportConverter.fromReportToReportReportedDetailResponse(report); + reportConverter.fromReportToReportReportedDetailResponse(report, username); // then assertThat(result).isNotNull(); @@ -234,19 +223,19 @@ void fromReportToReportReportedDetailResponse_Success() { @DisplayName("Report를 ReportReportedDetailResponse로 변환 - null 입력값") void fromReportToReportReportedDetailResponse_WithNullInput() { // when & then - assertThatThrownBy(() -> reportConverter.fromReportToReportReportedDetailResponse(null)) + assertThatThrownBy( + () -> + reportConverter.fromReportToReportReportedDetailResponse( + null, username)) .isInstanceOf(NullPointerException.class); } @Test @DisplayName("Report를 ReportReportedSummaryResponse로 변환 - 정상 케이스") void fromReportToReportReportedSummaryResponse_Success() { - // given - when(userSummaryService.findUserSummary(anyLong())).thenReturn(userSummaryDetailResponse); - // when ReportReportedSummaryResponse result = - reportConverter.fromReportToReportReportedSummaryResponse(report); + reportConverter.fromReportToReportReportedSummaryResponse(report, username); // then assertThat(result).isNotNull(); @@ -260,7 +249,10 @@ void fromReportToReportReportedSummaryResponse_Success() { @DisplayName("Report를 ReportReportedSummaryResponse로 변환 - null 입력값") void fromReportToReportReportedSummaryResponse_WithNullInput() { // when & then - assertThatThrownBy(() -> reportConverter.fromReportToReportReportedSummaryResponse(null)) + assertThatThrownBy( + () -> + reportConverter.fromReportToReportReportedSummaryResponse( + null, username)) .isInstanceOf(NullPointerException.class); } diff --git a/src/test/java/until/the/eternity/dcs/domain/report/application/ReportServiceTest.java b/src/test/java/until/the/eternity/dcs/domain/report/application/ReportServiceTest.java index be444033..1ea4de51 100644 --- a/src/test/java/until/the/eternity/dcs/domain/report/application/ReportServiceTest.java +++ b/src/test/java/until/the/eternity/dcs/domain/report/application/ReportServiceTest.java @@ -55,6 +55,7 @@ class ReportServiceTest { Long userId = 1L; Long adminId = 2L; String username = "username"; + String unknownUsername = "알수없음"; @BeforeEach void setUp() { @@ -113,8 +114,10 @@ void getRepliedReport_Success() { Long reportId = 1L; ReportRepliedDetailResponse expectedResponse = mock(ReportRepliedDetailResponse.class); + given(userSummaryService.findUserSummary(anyLong())) + .willReturn(UserSummaryDetailResponse.from(mockUser)); given(reportRepository.findById(reportId)).willReturn(Optional.of(mockReport)); - given(reportConverter.fromReportToReportRepliedDetailResponse(mockReport)) + given(reportConverter.fromReportToReportRepliedDetailResponse(mockReport, username)) .willReturn(expectedResponse); // when @@ -123,7 +126,7 @@ void getRepliedReport_Success() { // then assertThat(result).isEqualTo(expectedResponse); verify(reportRepository).findById(reportId); - verify(reportConverter).fromReportToReportRepliedDetailResponse(mockReport); + verify(reportConverter).fromReportToReportRepliedDetailResponse(mockReport, username); } @Test @@ -168,8 +171,10 @@ void getReportedReport_Success() { ReportReportedDetailResponse expectedResponse = mock(ReportReportedDetailResponse.class); + given(userSummaryService.findUserSummary(anyLong())) + .willReturn(UserSummaryDetailResponse.from(mockUser)); given(reportRepository.findById(reportId)).willReturn(Optional.of(mockReport)); - given(reportConverter.fromReportToReportReportedDetailResponse(mockReport)) + given(reportConverter.fromReportToReportReportedDetailResponse(mockReport, username)) .willReturn(expectedResponse); // when @@ -195,7 +200,9 @@ void findRepliedReports_Success() { given(reportRepository.findAllByStatusCd(ReportStatus.ACCEPT, pageable)) .willReturn(reportPage); - given(reportConverter.fromReportToReportRepliedSummaryResponse(mockReport)) + given( + reportConverter.fromReportToReportRepliedSummaryResponse( + mockReport, unknownUsername)) .willReturn(summaryResponse); // when @@ -217,7 +224,9 @@ void findRevivedReports_Success() { given(reportRepository.findAllByStatusCd(ReportStatus.REJECT, pageable)) .willReturn(reportPage); - given(reportConverter.fromReportToReportRevivedSummaryResponse(mockReport, "알수없음")) + given( + reportConverter.fromReportToReportRevivedSummaryResponse( + mockReport, unknownUsername)) .willReturn(summaryResponse); // when @@ -240,7 +249,9 @@ void findReportedReports_Success() { given(reportRepository.findAllByStatusCd(ReportStatus.REPORTED, pageable)) .willReturn(reportPage); - given(reportConverter.fromReportToReportReportedSummaryResponse(mockReport)) + given( + reportConverter.fromReportToReportReportedSummaryResponse( + mockReport, unknownUsername)) .willReturn(summaryResponse); // when From 00d7041278660036770cdf9bbabd01cca938dabf Mon Sep 17 00:00:00 2001 From: LeeShinHeang Date: Mon, 16 Feb 2026 22:54:16 +0900 Subject: [PATCH 3/3] =?UTF-8?q?refactor:=20API=20=EB=B3=84=20Report=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/report/application/ReportService.java | 15 ++++++++++++--- .../report/exception/ReportExceptionCode.java | 4 +++- .../exception/ReportStatusNotMatchException.java | 14 ++++++++++++++ .../report/application/ReportConverterTest.java | 3 --- .../report/application/ReportServiceTest.java | 2 ++ 5 files changed, 31 insertions(+), 7 deletions(-) create mode 100644 src/main/java/until/the/eternity/dcs/domain/report/exception/ReportStatusNotMatchException.java diff --git a/src/main/java/until/the/eternity/dcs/domain/report/application/ReportService.java b/src/main/java/until/the/eternity/dcs/domain/report/application/ReportService.java index 1ec6d596..94497bb6 100644 --- a/src/main/java/until/the/eternity/dcs/domain/report/application/ReportService.java +++ b/src/main/java/until/the/eternity/dcs/domain/report/application/ReportService.java @@ -26,6 +26,7 @@ import until.the.eternity.dcs.domain.report.enums.ReportStatus; import until.the.eternity.dcs.domain.report.enums.ReportTargetType; import until.the.eternity.dcs.domain.report.exception.ReportNotFoundException; +import until.the.eternity.dcs.domain.report.exception.ReportStatusNotMatchException; import until.the.eternity.dcs.domain.report.exception.StatusNotFoundException; import until.the.eternity.dcs.domain.report.infrastructure.ReportRepository; import until.the.eternity.dcs.domain.user.application.UserSummaryService; @@ -53,9 +54,9 @@ public ReportPersistResponse createReport(ReportCreateRequest request) { @PreAuthorize("@reportPermissionEvaluator.isAuthorized(authentication)") public ReportRepliedDetailResponse getRepliedReport(Long id) { Report report = findById(id); - - Long targetUserId = report.getTargetUserId(); - UserSummaryDetailResponse userSummary = userSummaryService.findUserSummary(targetUserId); + reportStatusValid(report, ReportStatus.ACCEPT); + UserSummaryDetailResponse userSummary = + userSummaryService.findUserSummary(report.getTargetUserId()); return reportConverter.fromReportToReportRepliedDetailResponse( report, userSummary.nickname()); @@ -64,6 +65,7 @@ public ReportRepliedDetailResponse getRepliedReport(Long id) { @PreAuthorize("@reportPermissionEvaluator.isAuthorized(authentication)") public ReportRevivedDetailResponse getRevivedReport(Long id) { Report report = findById(id); + reportStatusValid(report, ReportStatus.REJECT); UserSummaryDetailResponse userSummary = userSummaryService.findUserSummary(report.getTargetUserId()); @@ -74,6 +76,7 @@ public ReportRevivedDetailResponse getRevivedReport(Long id) { @PreAuthorize("@reportPermissionEvaluator.isAuthorized(authentication)") public ReportReportedDetailResponse getReportedReport(Long id) { Report report = findById(id); + reportStatusValid(report, ReportStatus.REPORTED); UserSummaryDetailResponse userSummary = userSummaryService.findUserSummary(report.getTargetUserId()); @@ -198,4 +201,10 @@ private Long getCurrentUserId() { Authentication auth = SecurityContextHolder.getContext().getAuthentication(); return reportPermissionEvaluator.getCurrentUserId(auth); } + + private void reportStatusValid(Report report, ReportStatus status) { + if (!report.getStatusCd().equals(status)) { + throw new ReportStatusNotMatchException(report.getStatusCd()); + } + } } diff --git a/src/main/java/until/the/eternity/dcs/domain/report/exception/ReportExceptionCode.java b/src/main/java/until/the/eternity/dcs/domain/report/exception/ReportExceptionCode.java index 8efb0b25..7472dc4e 100644 --- a/src/main/java/until/the/eternity/dcs/domain/report/exception/ReportExceptionCode.java +++ b/src/main/java/until/the/eternity/dcs/domain/report/exception/ReportExceptionCode.java @@ -15,7 +15,9 @@ public enum ReportExceptionCode implements ExceptionCode { STATUS_NOT_FOUND_EXCEPTION(NOT_FOUND, "해당 상태를 찾을 수 없습니다."), REPORT_MODIFY_FORBIDDEN_EXCEPTION(FORBIDDEN, "수정 권한이 부족합니다."), TARGET_NOT_FOUND_EXCEPTION(NOT_FOUND, "해당 대상을 찾을 수 없습니다."), - CATEGORY_NOT_FOUND_EXCEPTION(NOT_FOUND, "해당 카테고리를 찾을 수 없습니다"); + CATEGORY_NOT_FOUND_EXCEPTION(NOT_FOUND, "해당 카테고리를 찾을 수 없습니다"), + STATUS_NOT_MATCH_EXCEPTION(NOT_FOUND, "요청한 API와 현재 신고의 상태가 일치하지 않습니다"); + private final HttpStatus status; private final String message; diff --git a/src/main/java/until/the/eternity/dcs/domain/report/exception/ReportStatusNotMatchException.java b/src/main/java/until/the/eternity/dcs/domain/report/exception/ReportStatusNotMatchException.java new file mode 100644 index 00000000..581e73a2 --- /dev/null +++ b/src/main/java/until/the/eternity/dcs/domain/report/exception/ReportStatusNotMatchException.java @@ -0,0 +1,14 @@ +package until.the.eternity.dcs.domain.report.exception; + +import static until.the.eternity.dcs.domain.report.exception.ReportExceptionCode.STATUS_NOT_MATCH_EXCEPTION; + +import until.the.eternity.dcs.common.exception.CustomException; +import until.the.eternity.dcs.domain.report.enums.ReportStatus; + +public class ReportStatusNotMatchException extends CustomException { + public ReportStatusNotMatchException(ReportStatus reportStatus) { + super( + STATUS_NOT_MATCH_EXCEPTION, + STATUS_NOT_MATCH_EXCEPTION.getMessage() + " - 요청한 신고의 상태: " + reportStatus); + } +} diff --git a/src/test/java/until/the/eternity/dcs/domain/report/application/ReportConverterTest.java b/src/test/java/until/the/eternity/dcs/domain/report/application/ReportConverterTest.java index 452cbf44..0ec400bc 100644 --- a/src/test/java/until/the/eternity/dcs/domain/report/application/ReportConverterTest.java +++ b/src/test/java/until/the/eternity/dcs/domain/report/application/ReportConverterTest.java @@ -15,7 +15,6 @@ import until.the.eternity.dcs.domain.report.entitiy.Report; import until.the.eternity.dcs.domain.report.enums.ReportCategory; import until.the.eternity.dcs.domain.report.enums.ReportTargetType; -import until.the.eternity.dcs.domain.user.entity.UserSummary; @ExtendWith(MockitoExtension.class) @DisplayName("ReportConverter 테스트") @@ -54,8 +53,6 @@ void setUp() { .repliedAt(testDateTime.plusDays(1)) .repliedBy(2L) .build(); - - UserSummary userSummary = UserSummary.builder().id(userId).nickname("username").build(); } @Test diff --git a/src/test/java/until/the/eternity/dcs/domain/report/application/ReportServiceTest.java b/src/test/java/until/the/eternity/dcs/domain/report/application/ReportServiceTest.java index 1ea4de51..ab535b46 100644 --- a/src/test/java/until/the/eternity/dcs/domain/report/application/ReportServiceTest.java +++ b/src/test/java/until/the/eternity/dcs/domain/report/application/ReportServiceTest.java @@ -114,6 +114,7 @@ void getRepliedReport_Success() { Long reportId = 1L; ReportRepliedDetailResponse expectedResponse = mock(ReportRepliedDetailResponse.class); + mockReport.update(ReportStatus.ACCEPT, null, null, null, null); given(userSummaryService.findUserSummary(anyLong())) .willReturn(UserSummaryDetailResponse.from(mockUser)); given(reportRepository.findById(reportId)).willReturn(Optional.of(mockReport)); @@ -148,6 +149,7 @@ void getRevivedReport_Success() { Long reportId = 1L; ReportRevivedDetailResponse expectedResponse = mock(ReportRevivedDetailResponse.class); + mockReport.update(ReportStatus.REJECT, null, null, null, null); given(reportRepository.findById(reportId)).willReturn(Optional.of(mockReport)); given( reportConverter.fromReportToReportRevivedDetailResponse(