Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,7 @@ Optional<ZoomAttendance> findActiveSessionByParticipantUuidAndMeetingDate(
@Param("meetingDate") LocalDate meetingDate);

/** participantUuid로 활성 세션 조회 (날짜 경계 문제 해결을 위해 날짜 조건 제외) */
@Query(
"SELECT z FROM ZoomAttendance z WHERE z.participantUuid = :participantUuid AND z.leaveTime IS NULL")
@Query("SELECT z FROM ZoomAttendance z WHERE z.participantUuid = :participantUuid")
Optional<ZoomAttendance> findActiveSessionByParticipantUuid(
@Param("participantUuid") String participantUuid);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,9 @@ public void handleParticipantJoined(WebhookParticipant participant) {
LocalDateTime joinTime = parseZoomDateTime(joinTimeStr);
LocalDate meetingDate = joinTime.toLocalDate();

// 활성 세션 조회 (leaveTime이 null인 기록)
// 활성 세션 조회 (소회의실 이동과 줌 나가는 이벤트가 동일해서 leaveTime이 존재할 수 있음)
// participant_uuid는 링크 접속 시 생성되고, 완전히 나갔다 다시 들어오면 새로 할당됨
// 따라서 같은 participant_uuid로 활성 세션이 있으면 = 소회의실에서 메인으로 복귀한 경우
// 따라서 같은 participant_uuid로 활성 세션이 있으면 소회의실, 메인 간 이동한 상황으로 관리
Optional<ZoomAttendance> activeSession =
zoomAttendanceRepository.findActiveSessionByParticipantUuid(participantUuid);

Expand Down Expand Up @@ -92,7 +92,10 @@ public void handleParticipantLeft(WebhookParticipant participant) {
log.warn("leaveTimeStr 정보가 누락되었습니다. uuid: {}", participantUuid);
return;
}

log.debug(
"LeaveReason: participantUuid: {}, leaveReason: {}",
participantUuid,
leaveReason);
// 완전히 나간 케이스만 처리 (소회의실 이동, 대기실 관련 등은 제외)
if (!ZoomLeaveReason.isCompleteExit(leaveReason)) {
log.debug(
Expand All @@ -105,19 +108,19 @@ public void handleParticipantLeft(WebhookParticipant participant) {
// 시간 파싱
LocalDateTime leaveTime = parseZoomDateTime(leaveTimeStr);

// 활성 세션 조회 (leaveTime이 null인 기록만)
// 활성 세션 조회 (소회의실 이동과 줌 나가는 이벤트가 동일해서 leaveTime이 존재할 수 있음)
// participantUuid만으로 조회하여 날짜 경계 문제 해결 (밤 11시 입장 → 다음 날 새벽 퇴장 케이스)
Optional<ZoomAttendance> activeSession =
zoomAttendanceRepository.findActiveSessionByParticipantUuid(participantUuid);

if (activeSession.isEmpty()) {
log.debug(
log.error(
"활성 세션을 찾을 수 없습니다. participantUuid: {} (이미 완료된 세션이거나 소회의실 퇴장)",
participantUuid);
return; // 활성 세션이 없으면 무시 (이미 완료된 세션이거나 소회의실 퇴장)
return; // 활성 세션이 없으면 무시
}

// 활성 세션의 퇴장 시간 업데이트 (완전히 나간 경우)
// 활성 세션의 퇴장 시간 업데이트
ZoomAttendance attendance = activeSession.get();
attendance.updateLeaveTime(leaveTime);

Expand Down
Loading