-
Notifications
You must be signed in to change notification settings - Fork 2
Open
Labels
bugSomething isn't workingSomething isn't working
Description
[Bug] 팀 액티비티 날짜별 해결 현황이 과거 날짜에도 소급 표시되는 문제
설명
팀 액티비티 API(GET /api/teams/{teamId}/activity)에서 날짜별 해결 현황을 보여줄 때, 과거에 추천받았지만 풀지 못한 문제를 나중에 다시 추천받아 해결하면, 과거 날짜에도 "해결"로 표시된다.
재현 시나리오
- 2월 6일: 팀에 Problem A가 추천됨
- 2월 6일: 사용자가 Problem A를 풀지 않음
- 2월 10일: Problem A가 다시 추천됨
- 2월 10일: 사용자가 Problem A를 해결하고 인증함
기대 결과:
- 2월 6일 활동: Problem A → 미해결
- 2월 10일 활동: Problem A → 해결
실제 결과:
- 2월 6일 활동: Problem A →
해결(잘못된 표시) - 2월 10일 활동: Problem A → 해결
원인 분석
TeamActivityService.loadMemberSolvedStatuses()에서 MemberSolvedProblem을 조회할 때 solvedAt 시간을 고려하지 않고, 단순히 Set<Long> (풀었는지 여부만)으로 변환한다.
// MemberSolvedStatus - 현재 구조
public record MemberSolvedStatus(
Long memberId,
Set<Long> solvedProblemIds // ← 날짜 정보 없음
) {
public boolean hasSolved(Long problemId) {
return solvedProblemIds.contains(problemId); // ← "한 번이라도 풀었으면 true"
}
}// loadMemberSolvedStatuses() - 현재 로직
Map<Long, Set<Long>> memberSolvedMap = solvedRecords.stream()
.collect(Collectors.groupingBy(
msp -> msp.getMember().getId(),
Collectors.mapping(msp -> msp.getProblem().getId(), Collectors.toSet())
// ← solvedAt 정보가 여기서 유실됨
));이렇게 생성된 MemberSolvedStatus가 모든 날짜의 DailyActivity에서 동일하게 사용되므로, 한 번이라도 풀었으면 모든 추천일에서 "해결"로 표시된다.
해결 방안
solvedAt을 활용하여, 각 추천일의 미션 사이클(06:00~다음날 06:00) 내에 풀었을 때만 "해결"로 표시하도록 변경.
변경 대상
| 파일 | 변경 내용 |
|---|---|
MemberSolvedStatus |
Set<Long> → Map<Long, LocalDateTime>, hasSolvedDuring() 메서드 추가 |
TeamActivityService |
미션 사이클 구간 계산 후 hasSolvedDuring()으로 판단하도록 수정 |
변경하지 않는 것
- 리더보드: "언제 풀었든 풀었으면 1개" 카운트가 맞으므로 현행 유지
- 엔티티/Repository: 이미
solvedAt필드가 존재하므로 변경 불필요
알려진 제약사항
solvedAt은 사용자가 앱에서 "인증" 버튼을 누른 시각이며, BOJ 실제 풀이 시각과 다를 수 있음
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
bugSomething isn't workingSomething isn't working