Skip to content

Commit ed72fdb

Browse files
authored
Merge pull request #249 from prgrms-web-devcourse-final-project/fix/alarm-report-async(WR9-144)
Fix/alarm report async(wr9 144)
2 parents 1f3f31c + 4da2481 commit ed72fdb

File tree

2 files changed

+41
-16
lines changed

2 files changed

+41
-16
lines changed

src/main/java/io/crops/warmletter/domain/report/service/ReportService.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import io.crops.warmletter.domain.report.dto.response.ReportsResponse;
1818
import io.crops.warmletter.domain.report.dto.response.UpdateReportResponse;
1919
import io.crops.warmletter.domain.report.entity.Report;
20+
import io.crops.warmletter.domain.report.enums.ReasonType;
2021
import io.crops.warmletter.domain.report.enums.ReportStatus;
2122
import io.crops.warmletter.domain.report.enums.ReportType;
2223
import io.crops.warmletter.domain.report.exception.DuplicateReportException;
@@ -30,20 +31,19 @@
3031
import io.crops.warmletter.domain.share.repository.ShareProposalRepository;
3132
import io.crops.warmletter.domain.timeline.dto.request.NotificationRequest;
3233
import io.crops.warmletter.domain.timeline.enums.AlarmType;
33-
import io.crops.warmletter.domain.timeline.facade.NotificationFacade;
3434
import jakarta.transaction.Transactional;
3535
import lombok.RequiredArgsConstructor;
3636
import org.springframework.context.ApplicationEventPublisher;
3737
import org.springframework.data.domain.Page;
3838
import org.springframework.data.domain.Pageable;
39+
import org.springframework.scheduling.annotation.Async;
3940
import org.springframework.stereotype.Service;
4041

4142
import java.time.LocalDateTime;
4243
import java.util.HashMap;
4344
import java.util.List;
4445
import java.util.Map;
4546
import java.util.Optional;
46-
import java.util.concurrent.CompletableFuture;
4747

4848
@Service
4949
@RequiredArgsConstructor
@@ -101,6 +101,7 @@ public Page<ReportsResponse> getAllReports(String reportType, String status, Pag
101101
@Transactional
102102
public ReportResponse createReport(CreateReportRequest request) {
103103
Long memberId = authFacde.getCurrentUserId();
104+
//Long memberId = 1L;
104105
Map<String, String> reportedContentMap = new HashMap<>();
105106
validateRequest(request, memberId, reportedContentMap);
106107
String reportedContent = reportedContentMap.get("content");
@@ -124,13 +125,19 @@ public ReportResponse createReport(CreateReportRequest request) {
124125
}
125126
Report report = builder.build();
126127
Report savedReport = reportRepository.save(report);
127-
CompletableFuture.runAsync(() -> {
128-
Map<String, String> moderationResult = reportModerationService.moderateText(reportedContent, request.getReasonType(), request.getReason());
129-
updateReportWithAIResult(savedReport.getId(), moderationResult);
130-
});
128+
129+
processReportInBackground(savedReport.getId(), reportedContent, request.getReasonType(), request.getReason());
130+
131131
return new ReportResponse(savedReport);
132132
}
133133

134+
// 신고 AI 판별 비동기 처리
135+
@Async
136+
public void processReportInBackground(Long reportId, String reportedContent, ReasonType reasonType, String reason) {
137+
Map<String, String> moderationResult = reportModerationService.moderateText(reportedContent, reasonType, reason);
138+
updateReportWithAIResult(reportId, moderationResult);
139+
}
140+
134141
@Transactional
135142
public void updateReportWithAIResult(Long reportId, Map<String, String> moderationResult) {
136143
Report report = reportRepository.findById(reportId)

src/test/java/io/crops/warmletter/domain/report/service/ReportServiceTest.java

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@
2828
import io.crops.warmletter.domain.share.exception.SharePostNotFoundException;
2929
import io.crops.warmletter.domain.share.repository.SharePostRepository;
3030
import io.crops.warmletter.domain.timeline.dto.request.NotificationRequest;
31-
import io.crops.warmletter.domain.timeline.enums.AlarmType;
32-
import io.crops.warmletter.domain.timeline.facade.NotificationFacade;
3331
import io.crops.warmletter.global.error.exception.BusinessException;
3432
import org.junit.jupiter.api.BeforeEach;
3533
import org.junit.jupiter.api.DisplayName;
@@ -66,6 +64,7 @@ class ReportServiceTest {
6664
private Report report;
6765
private Member reportedMember;
6866
@InjectMocks private ReportService reportService;
67+
@Mock private ReportModerationService reportModerationService;
6968

7069

7170
@BeforeEach
@@ -90,7 +89,7 @@ void setUp() {
9089

9190
@Test
9291
@DisplayName("정상적인 신고 등록 (LETTER)")
93-
void createReport_Success_Letter() {
92+
void createReport_Success_Letter() throws Exception {
9493
// Given: 신고 요청 생성
9594
CreateReportRequest request = new CreateReportRequest(
9695
ReportType.LETTER,
@@ -138,6 +137,12 @@ void createReport_Success_Letter() {
138137
when(reportRepository.existsByLetterIdAndMemberId(1L, 1003L)).thenReturn(false);
139138
when(reportRepository.save(any(Report.class))).thenReturn(report);
140139

140+
// 비동기 목 데이터 테스트 추가
141+
when(reportModerationService.moderateText(anyString(), any(), anyString()))
142+
.thenReturn(Map.of("status", "RESOLVED"));
143+
when(reportRepository.findById(report.getId())).thenReturn(Optional.of(report));
144+
when(memberRepository.findById(1003L)).thenReturn(Optional.of(reportedMember));
145+
141146
// When: 신고 생성
142147
ReportResponse response = reportService.createReport(request);
143148

@@ -150,14 +155,15 @@ void createReport_Success_Letter() {
150155
// 추가 검증 (예: repository 호출 횟수 등)
151156
verify(authFacade, times(1)).getCurrentUserId();
152157
// verify(letterRepository, times(1)).existsById(1L); // 필요없으면 제거
153-
verify(letterRepository, times(1)).findById(1L);
158+
verify(letterRepository, times(3)).findById(1L);
154159
verify(reportRepository, times(1)).existsByLetterIdAndMemberId(1L, 1003L);
155-
verify(reportRepository, times(1)).save(any(Report.class));
160+
verify(reportRepository, times(2)).save(any(Report.class));
161+
verify(reportModerationService, times(1)).moderateText(anyString(), any(), anyString()); // 비동기 메서드 호출 검증
156162
}
157163

158164
@Test
159165
@DisplayName("정상적인 신고 등록 (EVENT_COMMENT)")
160-
void createReport_Success_EventComment() {
166+
void createReport_Success_EventComment() throws Exception {
161167
// Given: 신고 요청 생성
162168
CreateReportRequest request = new CreateReportRequest(
163169
ReportType.EVENT_COMMENT,
@@ -191,6 +197,11 @@ void createReport_Success_EventComment() {
191197
when(reportRepository.existsByEventCommentIdAndMemberId(3L, 1003L)).thenReturn(false);
192198
when(reportRepository.save(any(Report.class))).thenReturn(report);
193199

200+
// 비동기 목 데이터 테스트 추가
201+
when(reportModerationService.moderateText(anyString(), any(), anyString()))
202+
.thenReturn(Map.of("status", "RESOLVED"));
203+
when(reportRepository.findById(report.getId())).thenReturn(Optional.of(report));
204+
194205
// When: 신고 생성
195206
ReportResponse response = reportService.createReport(request);
196207

@@ -201,9 +212,10 @@ void createReport_Success_EventComment() {
201212

202213
// 추가 검증: 각 의존성 호출 횟수 확인
203214
verify(authFacade, times(1)).getCurrentUserId();
204-
verify(eventCommentRepository, times(1)).findById(3L);
215+
verify(eventCommentRepository, times(2)).findById(3L);
205216
verify(reportRepository, times(1)).existsByEventCommentIdAndMemberId(3L, 1003L);
206-
verify(reportRepository, times(1)).save(any(Report.class));
217+
verify(reportRepository, times(2)).save(any(Report.class));
218+
verify(reportModerationService, times(1)).moderateText(anyString(), any(), anyString()); // 비동기 메서드 호출 검증
207219
}
208220

209221
@Test
@@ -252,6 +264,11 @@ void createReport_Success_SharePost() {
252264
when(reportRepository.existsBySharePostIdAndMemberId(2L, 1003L)).thenReturn(false);
253265
when(reportRepository.save(any(Report.class))).thenReturn(report);
254266

267+
// 비동기 목 데이터 테스트 추가
268+
when(reportModerationService.moderateText(anyString(), any(), anyString()))
269+
.thenReturn(Map.of("status", "RESOLVED"));
270+
when(reportRepository.findById(report.getId())).thenReturn(Optional.of(report));
271+
255272
// When: 신고 생성
256273
ReportResponse response = reportService.createReport(request);
257274

@@ -263,9 +280,10 @@ void createReport_Success_SharePost() {
263280

264281
// 각 의존성 호출 횟수 검증
265282
verify(authFacade, times(1)).getCurrentUserId();
266-
verify(sharePostRepository, times(1)).findById(2L);
283+
verify(sharePostRepository, times(2)).findById(2L);
267284
verify(reportRepository, times(1)).existsBySharePostIdAndMemberId(2L, 1003L);
268-
verify(reportRepository, times(1)).save(any(Report.class));
285+
verify(reportRepository, times(2)).save(any(Report.class));
286+
verify(reportModerationService, times(1)).moderateText(anyString(), any(), anyString()); // 비동기 메서드 호출 검증
269287
}
270288

271289

0 commit comments

Comments
 (0)