-
Notifications
You must be signed in to change notification settings - Fork 0
[FEAT] 찜한 챌린지, 종료한 챌린지 조회 API 구현 #172
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
8f7d6ab
f084cd7
94e51a8
d00d680
cbf0e49
a4777f7
b423c2f
445eebe
b06dc90
746d4a6
8a9105c
4c772dc
bdf11b4
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,6 +1,7 @@ | ||
| package com.hrr.backend.domain.user.repository; | ||
|
|
||
| import com.hrr.backend.domain.challenge.entity.QChallenge; | ||
| import com.hrr.backend.domain.challenge.entity.QChallengeLike; | ||
| import com.hrr.backend.domain.round.entity.QRound; | ||
| import com.hrr.backend.domain.round.entity.QRoundRecord; | ||
| import com.hrr.backend.domain.user.dto.UserResponseDto; | ||
|
|
@@ -65,4 +66,70 @@ public Slice<UserResponseDto.OngoingChallengeDto> findOngoingChallengesByUser(Us | |
|
|
||
| return new SliceImpl<>(content, pageable, hasNext); | ||
| } | ||
|
|
||
| @Override | ||
| public Slice<UserResponseDto.LikedChallengeDto> findMarkedChallengesByUser(User user, Pageable pageable) { | ||
| QChallengeLike qChallengeLike = QChallengeLike.challengeLike; | ||
| QChallenge qChallenge = QChallenge.challenge; | ||
|
|
||
| // 찜한 챌린지 정보 조회 | ||
| List<UserResponseDto.LikedChallengeDto> content = jpaQueryFactory | ||
| .select(Projections.fields(UserResponseDto.LikedChallengeDto.class, | ||
| qChallenge.id.as("challengeId"), | ||
| qChallenge.title, | ||
| qChallenge.description, | ||
| qChallenge.imageKey.as("image") | ||
| )) | ||
| .from(qChallengeLike) | ||
| .join(qChallengeLike.challenge, qChallenge) | ||
| .where(qChallengeLike.user.eq(user)) | ||
| .orderBy(qChallengeLike.createdAt.desc()) // 찜한 순서 (최신순) | ||
| .offset(pageable.getOffset()) | ||
| .limit(pageable.getPageSize() + 1) | ||
| .fetch(); | ||
|
|
||
| // Slice 객체 생성 및 반환 | ||
| boolean hasNext = content.size() > pageable.getPageSize(); | ||
| if (hasNext) { | ||
| content.remove(pageable.getPageSize()); | ||
| } | ||
|
|
||
| return new SliceImpl<>(content, pageable, hasNext); | ||
| } | ||
|
|
||
| @Override | ||
| public Slice<UserResponseDto.CompletedChallengeDto> findCompletedChallengesByUser(User user, Pageable pageable) { | ||
| QUserChallenge qUserChallenge = QUserChallenge.userChallenge; | ||
| QChallenge qChallenge = QChallenge.challenge; | ||
|
|
||
| // 종료한 챌린지 정보 조회 | ||
| // UserChallenge status는 완주한(JOINED) 챌린지만 그룹화하여 조회 | ||
| // 한 챌린지에 여러 라운드 참여해도 챌린지는 1개만 조회 | ||
| List<UserResponseDto.CompletedChallengeDto> content = jpaQueryFactory | ||
| .select(Projections.fields(UserResponseDto.CompletedChallengeDto.class, | ||
| qChallenge.id.as("challengeId"), | ||
| qChallenge.title, | ||
| qChallenge.description, | ||
| qChallenge.imageKey.as("image") | ||
| )) | ||
| .from(qUserChallenge) | ||
| .join(qUserChallenge.challenge, qChallenge) | ||
| .where( | ||
| qUserChallenge.user.eq(user), | ||
| qUserChallenge.status.eq(ChallengeJoinStatus.DROPPED) | ||
| ) | ||
| .groupBy(qChallenge.id) | ||
| .orderBy(qUserChallenge.updatedAt.max().desc()) | ||
|
Comment on lines
+117
to
+122
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧩 Analysis chain🏁 Script executed: # First, find the Challenge entity and ChallengeStatus enum
fd -t f "Challenge.java" | grep -E "(domain|entity)" | head -20Repository: Hrr-HabbitRoutineResult/hrr-server Length of output: 214 🏁 Script executed: # Search for ChallengeStatus enum
rg "enum ChallengeStatus|class ChallengeStatus" --type java -A 10Repository: Hrr-HabbitRoutineResult/hrr-server Length of output: 636 🏁 Script executed: # Look at the complete findCompletedChallengesByUser method (context around lines 117-122)
cat -n src/main/java/com/hrr/backend/domain/user/repository/UserChallengeRepositoryCustomImpl.java | sed -n '100,130p'Repository: Hrr-HabbitRoutineResult/hrr-server Length of output: 1735 🏁 Script executed: # Search for how Challenge.status is used in queries
rg "qChallenge\.status|challenge\.status" --type java -B 2 -A 2 | head -60Repository: Hrr-HabbitRoutineResult/hrr-server Length of output: 60 🏁 Script executed: # Check other methods in the same repository to see if they filter by Challenge.status
rg "ChallengeJoinStatus\.|qChallenge\." src/main/java/com/hrr/backend/domain/user/repository/ -A 3 -B 1Repository: Hrr-HabbitRoutineResult/hrr-server Length of output: 6381 🏁 Script executed: # Find and examine ChallengeJoinStatus enum
rg "enum ChallengeJoinStatus|class ChallengeJoinStatus" --type java -A 10Repository: Hrr-HabbitRoutineResult/hrr-server Length of output: 575 🏁 Script executed: # Search for how this method is used
rg "findCompletedChallengesByUser" --type java -B 2 -A 2Repository: Hrr-HabbitRoutineResult/hrr-server Length of output: 1864 🏁 Script executed: # Check if there are other similar methods for dropped challenges
rg "DROPPED|JOINED" src/main/java/com/hrr/backend/domain/user/ --type java -B 1 -A 1 | grep -E "(def|public|DROPPED|JOINED)" | head -40Repository: Hrr-HabbitRoutineResult/hrr-server Length of output: 1373 🏁 Script executed: # Look for PR or commit comments explaining the logic
git log --oneline --all --grep="completed\|DROPPED\|JOINED" 2>/dev/null | head -10Repository: Hrr-HabbitRoutineResult/hrr-server Length of output: 176 라인 106의 인라인 주석이 실제 코드와 맞지 않습니다. 주석에는 "완주한(JOINED) 챌린지만"이라고 명시되어 있으나, 실제 코드는 권장 수정: // 종료한 챌린지 정보 조회
// UserChallenge status는 완주하거나 하차한(JOINED, DROPPED) 챌린지를 그룹화하여 조회
// 한 챌린지에 여러 라운드 참여해도 챌린지는 1개만 조회Challenge.status 필터링은 필요하지 않습니다. 사용자가 챌린지를 하차했더라도 아직 진행 중인 챌린지를 표시하는 것이 올바른 비즈니스 로직입니다. 🤖 Prompt for AI Agents |
||
| .offset(pageable.getOffset()) | ||
| .limit(pageable.getPageSize() + 1) | ||
| .fetch(); | ||
|
|
||
| // Slice 객체 생성 및 반환 | ||
| boolean hasNext = content.size() > pageable.getPageSize(); | ||
| if (hasNext) { | ||
| content.remove(pageable.getPageSize()); | ||
| } | ||
|
|
||
| return new SliceImpl<>(content, pageable, hasNext); | ||
| } | ||
| } | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
주석과 코드가 불일치합니다.
주석에는 "완주한(JOINED) 챌린지만"이라고 적혀 있지만, 실제 코드(Line 119)는
ChallengeJoinStatus.DROPPED로 필터링하고 있습니다.문제점:
권장 수정:
PR 목표와 yc3697님의 코멘트를 고려할 때 DROPPED 필터링이 의도된 동작인 것으로 보입니다. 주석을 아래와 같이 수정하세요:
🔎 수정 제안
🤖 Prompt for AI Agents