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 @@ -39,8 +39,7 @@ public void validateDailyStreaks() {
LocalDate today = LocalDate.now(KST);
LocalDate yesterday = today.minusDays(1);

log.info("[Streak Validation] Starting daily streak validation at {} for date: {}",
startTime, yesterday);
log.info("[Streak Validation] Starting daily streak validation for date: {}", yesterday);

int processedCount = 0;
int freezeUsedCount = 0;
Expand All @@ -61,8 +60,6 @@ public void validateDailyStreaks() {

if (wasReset) {
streakResetCount++;
// TODO: FCM 알림 전송 (Phase 2)
// notificationService.sendStreakResetNotification(report.getUserId());
} else {
// 스트릭 유지됨 (어제 완료 또는 프리즈 소진)
long daysSinceLastCompletion = ChronoUnit.DAYS.between(
Expand All @@ -71,10 +68,7 @@ public void validateDailyStreaks() {
if (daysSinceLastCompletion == 1) {
maintainedCount++;
} else if (daysSinceLastCompletion > 1) {
// 프리즈 소진으로 스트릭 유지
freezeUsedCount++;
// TODO: FCM 알림 전송 (Phase 2)
// notificationService.sendFreezeConsumedNotification(report.getUserId());
}
}

Expand Down
71 changes: 24 additions & 47 deletions src/main/java/com/linglevel/api/streak/service/StreakService.java
Original file line number Diff line number Diff line change
Expand Up @@ -379,62 +379,39 @@ public boolean processMissedDays(UserStudyReport report, LocalDate today) {
int daysMissed = (int) daysSinceLastCompletion - 1;
log.warn("User {} missed {} days. Processing gap.", report.getUserId(), daysMissed);

// 각 누락일에 대해 배치가 이미 처리했는지 확인
int unprocessedDays = 0;
int consumed = 0;

for (int i = 1; i <= daysMissed; i++) {
LocalDate missedDate = report.getLastCompletionDate().plusDays(i);

if (wasFreezeProcessedForDate(report.getUserId(), missedDate)) {
unprocessedDays++;
continue;
}
}

if (unprocessedDays == 0) {
log.info("All missed days already processed for user {}", report.getUserId());
return false;
}

log.info("User {} has {} unprocessed missed days.", report.getUserId(), unprocessedDays);

if (report.getAvailableFreezes() >= unprocessedDays) {
// 프리즈 충분 -> 소진하고 스트릭 유지
report.setAvailableFreezes(report.getAvailableFreezes() - unprocessedDays);

// 각 누락일에 대해 FreezeTransaction 기록
for (int i = 1; i <= daysMissed; i++) {
LocalDate missedDate = report.getLastCompletionDate().plusDays(i);
if (wasFreezeProcessedForDate(report.getUserId(), missedDate)) {
consumeFreezeForDate(report, missedDate);
}
if (consumed < report.getAvailableFreezes()) {
consumeFreezeForDate(report, missedDate);
consumed++;
} else {
resetStreak(report, consumed);
return true;
}
}

log.info("Consumed {} freezes for user {}. Streak maintained at {}.",
unprocessedDays, report.getUserId(), report.getCurrentStreak());
return false;
} else {
// 프리즈 부족 -> 남은 프리즈 모두 소진하고 스트릭 리셋
int remainingFreezes = report.getAvailableFreezes();
report.setAvailableFreezes(0);

// 소진 가능한 프리즈에 대해 트랜잭션 기록
int processedDays = 0;
for (int i = 1; i <= daysMissed && processedDays < remainingFreezes; i++) {
LocalDate missedDate = report.getLastCompletionDate().plusDays(i);
if (wasFreezeProcessedForDate(report.getUserId(), missedDate)) {
consumeFreezeForDate(report, missedDate);
processedDays++;
}
}
report.setAvailableFreezes(report.getAvailableFreezes() - consumed);
log.info("Consumed {} freezes for user {}. Streak maintained at {}.",
consumed, report.getUserId(), report.getCurrentStreak());
return false;
}

// 스트릭 리셋
int previousStreak = report.getCurrentStreak();
report.setCurrentStreak(0);
report.setLastCompletionDate(null);
report.setStreakStartDate(null);
private void resetStreak(UserStudyReport report, int freezesConsumed) {
int previousStreak = report.getCurrentStreak();
report.setCurrentStreak(0);
report.setLastCompletionDate(null);
report.setStreakStartDate(null);
report.setAvailableFreezes(0);

log.warn("Insufficient freezes for user {}. Streak reset from {} to 0. Consumed {} freezes.",
report.getUserId(), previousStreak, remainingFreezes);
return true;
}
log.warn("Insufficient freezes for user {}. Streak reset from {} to 0. Consumed {} freezes.",
report.getUserId(), previousStreak, freezesConsumed);
}

private boolean wasFreezeProcessedForDate(String userId, LocalDate date) {
Expand Down
Loading