Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.List;
import java.util.UUID;
Expand Down Expand Up @@ -50,16 +51,17 @@ public AttendanceCheckInResponse checkInByRound(AttendanceCheckInRequest request
user.getName(), request.getRoundId(), round.getRoundDate());

// 1. 라운드 시간 검증 - 통일된 로직
LocalDate checkDate = LocalDate.now();
LocalTime checkTime = LocalTime.now();
LocalDateTime now = LocalDateTime.now();
LocalDate checkDate = now.toLocalDate();
LocalTime checkTime = now.toLocalTime();
LocalTime startTime = round.getStartTime();
LocalTime endTime = round.getEndTime();
LocalTime lateThreshold = startTime.plusMinutes(5);

// 날짜 검증
if (!checkDate.equals(round.getRoundDate())) {
log.warn("❌ 출석 날짜 불일치: 라운드ID={}, 사용자={}, 현재날짜={}, 라운드날짜={}",
request.getRoundId(), user.getName(), checkDate, round.getRoundDate());
log.warn("❌ 출석 날짜 불일치: 라운드ID={}, 사용자={}, 현재시간={}, 라운드날짜={}",
request.getRoundId(), user.getName(), now, round.getRoundDate());
return AttendanceCheckInResponse.builder()
.roundId(request.getRoundId())
.success(false)
Expand All @@ -71,16 +73,16 @@ public AttendanceCheckInResponse checkInByRound(AttendanceCheckInRequest request
boolean isWithinTimeWindow = !checkTime.isBefore(startTime) && checkTime.isBefore(endTime);
if (!isWithinTimeWindow) {
log.warn("❌ 출석 시간 초과: 라운드ID={}, 사용자={}, 현재시간={}, 시작={}, 종료={}",
request.getRoundId(), user.getName(), checkTime, startTime, endTime);
request.getRoundId(), user.getName(), now, startTime, endTime);
return AttendanceCheckInResponse.builder()
.roundId(request.getRoundId())
.success(false)
.failureReason("출석 시간 초과")
.build();
}

log.info("✅ 시간 검증 성공: 라운드ID={}, 사용자={}, 시간={}, 범위=[{}~{}]",
request.getRoundId(), user.getName(), checkTime, startTime, endTime);
log.info("✅ 시간 검증 성공: 라운드ID={}, 사용자={}, 현재시간={}, 범위=[{}~{}]",
request.getRoundId(), user.getName(), now, startTime, endTime);

// 2. 기존 출석 기록 확인 (PENDING 제외하고 실제 체크인한 기록만 중복으로 취급)
Attendance existingAttendance = attendanceRepository.findByAttendanceRound_RoundIdAndUser(request.getRoundId(), user)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,7 @@ private String generateRandomCode() {
/**
* AttendanceSession 엔티티를 Response DTO로 변환
* - 기본 세션 정보: 제목, 기본 시작 시간, 출석 인정 시간, 보상 포인트
* - 위치 정보: location 객체 (lat, lng)
* - 위치 정보: location 객체 (lat, lng, radiusMeters)
*/
private AttendanceSessionResponse convertToResponse(AttendanceSession session) {
// 위치 정보 변환 (location이 존재하면 LocationInfo 객체 생성, 없으면 null)
Expand All @@ -279,6 +279,7 @@ private AttendanceSessionResponse convertToResponse(AttendanceSession session) {
location = AttendanceSessionResponse.LocationInfo.builder()
.lat(session.getLocation().getLat())
.lng(session.getLocation().getLng())
.radiusMeters(session.getLocation().getRadiusMeters())
.build();
}

Expand Down