Chore: 회의 종료 API 이벤트 발행 로직 추가

This commit is contained in:
cyjadela
2025-10-28 14:52:50 +09:00
parent 6bfd041e77
commit ba4dfe2d99
2 changed files with 985 additions and 3 deletions
@@ -17,6 +17,7 @@ import com.unicorn.hgzero.meeting.biz.usecase.out.MinutesWriter;
import com.unicorn.hgzero.meeting.biz.usecase.out.SessionReader;
import com.unicorn.hgzero.meeting.biz.usecase.out.SessionWriter;
import com.unicorn.hgzero.meeting.infra.cache.CacheService;
import com.unicorn.hgzero.meeting.infra.event.dto.MeetingEndedEvent;
import com.unicorn.hgzero.meeting.infra.event.dto.MeetingStartedEvent;
import com.unicorn.hgzero.meeting.infra.event.dto.NotificationRequestEvent;
import com.unicorn.hgzero.meeting.infra.event.publisher.EventPublisher;
@@ -28,6 +29,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;
@@ -344,10 +346,53 @@ public class MeetingService implements
log.info("Created new analysis data for meeting: {}", meetingId);
}
// TODO: AI 서비스에 비동기 분석 요청 전송
// aiAnalysisClient.requestAnalysis(meeting.getMeetingId(), minutes.getMinutesId());
// 6. AI 서비스에 회의 종료 이벤트 발행
try {
MeetingEndedEvent meetingEndedEvent = MeetingEndedEvent.builder()
.meetingId(meetingId)
.title(meeting.getTitle())
.endTime(meeting.getEndedAt())
.organizer(meeting.getOrganizerId())
.participants(meeting.getParticipants())
.minutesId(minutes.getMinutesId())
.todoCount(0) // AI 분석으로 추후 업데이트될 예정
.eventTime(LocalDateTime.now())
.build();
// 6. 결과 DTO 구성
eventPublisher.publishMeetingEnded(meetingEndedEvent);
log.info("MeetingEnded event published: meetingId={}, minutesId={}",
meetingId, minutes.getMinutesId());
} catch (Exception e) {
log.error("Failed to publish MeetingEnded event: meetingId={}", meetingId, e);
// 이벤트 발행 실패는 비즈니스 로직에 영향을 주지 않으므로 계속 진행
}
// 7. 참석자에게 회의 종료 알림 이벤트 발행
try {
for (String participantEmail : meeting.getParticipants()) {
NotificationRequestEvent notificationEvent = NotificationRequestEvent.builder()
.notificationType("MEETING_ENDED")
.recipientEmail(participantEmail)
.recipientId(participantEmail)
.recipientName(participantEmail)
.title("회의 종료")
.message(String.format("'%s' 회의가 종료되었습니다. 회의록을 확인해 주세요.", meeting.getTitle()))
.relatedEntityId(meetingId)
.relatedEntityType("MEETING")
.requestedBy(meeting.getOrganizerId())
.eventTime(LocalDateTime.now())
.build();
eventPublisher.publishNotificationRequest(notificationEvent);
}
log.info("Meeting end notification events published: meetingId={}, participants={}",
meetingId, meeting.getParticipants().size());
} catch (Exception e) {
log.error("Failed to publish meeting end notification events: meetingId={}", meetingId, e);
// 이벤트 발행 실패는 비즈니스 로직에 영향을 주지 않으므로 계속 진행
}
// 8. 결과 DTO 구성
MeetingEndDTO result = buildMeetingEndDTO(meeting, analysis);
log.info("Meeting ended successfully: {}", meetingId);