diff --git a/src/main/java/org/cotato/csquiz/api/attendance/dto/MemberAttendResponse.java b/src/main/java/org/cotato/csquiz/api/attendance/dto/MemberAttendResponse.java index c1fb67cc..0c6675b0 100644 --- a/src/main/java/org/cotato/csquiz/api/attendance/dto/MemberAttendResponse.java +++ b/src/main/java/org/cotato/csquiz/api/attendance/dto/MemberAttendResponse.java @@ -30,29 +30,30 @@ public record MemberAttendResponse( @Schema(description = "마감된 출석에 대한 출결 결과", nullable = true) AttendanceResult attendanceResult ) { - public static MemberAttendResponse closedAttendanceResponse(Session session, AttendanceRecord attendanceRecord) { + public static MemberAttendResponse unrecordedAttendance(Session session, Attendance attendance, Long memberId) { return new MemberAttendResponse( session.getId(), - attendanceRecord.getAttendance().getId(), - attendanceRecord.getMemberId(), + attendance.getId(), + memberId, session.getTitle(), session.getSessionDateTime(), - AttendanceOpenStatus.CLOSED, - attendanceRecord.getAttendanceType(), - attendanceRecord.getAttendanceResult() + AttendanceUtil.getAttendanceOpenStatus(session.getSessionDateTime(), attendance, LocalDateTime.now()), + null, + null ); } - public static MemberAttendResponse openedAttendanceResponse(Attendance attendance, Session session, Long memberId) { + public static MemberAttendResponse recordedAttendance(Session session, Attendance attendance, + AttendanceRecord attendanceRecord) { return new MemberAttendResponse( session.getId(), - attendance.getId(), - memberId, + attendanceRecord.getAttendanceId(), + attendanceRecord.getMemberId(), session.getTitle(), session.getSessionDateTime(), AttendanceUtil.getAttendanceOpenStatus(session.getSessionDateTime(), attendance, LocalDateTime.now()), - null, - null + attendanceRecord.getAttendanceType(), + attendanceRecord.getAttendanceResult() ); } } diff --git a/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceRecordService.java b/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceRecordService.java index 5b1c86ed..6840944e 100644 --- a/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceRecordService.java +++ b/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceRecordService.java @@ -96,28 +96,27 @@ public MemberAttendanceRecordsResponse findAllRecordsBy(final Long generationId, List sessionIds = sessions.stream() .map(Session::getId) .toList(); - // 세션에 해당하는 모든 출결을 찾아 - LocalDateTime currentTime = LocalDateTime.now(); - Map> isClosedAttendance = attendanceRepository.findAllBySessionIdsInQuery(sessionIds) - .stream() - .collect(Collectors.partitioningBy(attendance -> - getAttendanceOpenStatus(sessionMap.get(attendance.getSessionId()).getSessionDateTime(), - attendance, currentTime) == AttendanceOpenStatus.CLOSED)); + List attendances = attendanceRepository.findAllBySessionIdsInQuery(sessionIds); - List closedAttendanceIds = isClosedAttendance.get(true).stream() + List attendanceIds = attendances.stream() .map(Attendance::getId) .toList(); - List responses = attendanceRecordRepository.findAllByAttendanceIdsInQueryAndMemberId( - closedAttendanceIds, memberId).stream() - .map(ar -> MemberAttendResponse.closedAttendanceResponse( - sessionMap.get(ar.getAttendance().getSessionId()), ar)) + Map attendanceRecordMap = attendanceRecordRepository.findAllByAttendanceIdsInQueryAndMemberId( + attendanceIds, memberId).stream() + .collect(Collectors.toUnmodifiableMap(AttendanceRecord::getAttendanceId, Function.identity())); + + Map> recordedAttendance = attendances.stream() + .collect(Collectors.partitioningBy(at -> attendanceRecordMap.containsKey(at.getId()))); + + List responses = recordedAttendance.get(true).stream() + .map(at -> MemberAttendResponse.recordedAttendance(sessionMap.get(at.getSessionId()), at, + attendanceRecordMap.get(at.getId()))) .collect(Collectors.toList()); - responses.addAll(isClosedAttendance.get(false).stream() - .map(attendance -> MemberAttendResponse.openedAttendanceResponse(attendance, - sessionMap.get(attendance.getSessionId()), memberId)) + responses.addAll(recordedAttendance.get(false).stream() + .map(at -> MemberAttendResponse.unrecordedAttendance(sessionMap.get(at.getSessionId()), at, memberId)) .toList()); return MemberAttendanceRecordsResponse.of(generationId, responses);