Skip to content

Commit 22139b5

Browse files
authored
Merge pull request #234 from 7-umc-GrowIT/feat/#233
[#233] Feat: 챌린지 현황 페이징 기법 적용
2 parents 595755f + f422d04 commit 22139b5

File tree

7 files changed

+432
-405
lines changed

7 files changed

+432
-405
lines changed
Lines changed: 174 additions & 162 deletions
Original file line numberDiff line numberDiff line change
@@ -1,162 +1,174 @@
1-
package umc.GrowIT.Server.converter;
2-
3-
import umc.GrowIT.Server.domain.Challenge;
4-
import umc.GrowIT.Server.domain.Keyword;
5-
import umc.GrowIT.Server.domain.User;
6-
import umc.GrowIT.Server.domain.UserChallenge;
7-
import umc.GrowIT.Server.domain.enums.UserChallengeType;
8-
import umc.GrowIT.Server.web.dto.ChallengeDTO.ChallengeResponseDTO;
9-
import umc.GrowIT.Server.web.dto.KeywordDTO.KeywordResponseDTO;
10-
11-
import java.time.LocalDate;
12-
import java.util.ArrayList;
13-
import java.util.List;
14-
import java.util.stream.Collectors;
15-
16-
public class ChallengeConverter {
17-
18-
// 챌린지 1개를 ChallengeHomeDTO.RecommendedChallenge로 변환
19-
public static ChallengeResponseDTO.RecommendedChallengeDTO toRecommendedChallengeDTO(UserChallenge userChallenge) {
20-
return ChallengeResponseDTO.RecommendedChallengeDTO.builder()
21-
.id(userChallenge.getId())
22-
.title(userChallenge.getChallenge().getTitle())
23-
.content(userChallenge.getChallenge().getContent())
24-
.dtype(userChallenge.getDtype())
25-
.time(userChallenge.getChallenge().getTime())
26-
.completed(userChallenge.isCompleted())
27-
.build();
28-
}
29-
30-
// 추천 챌린지 리스트를 반환
31-
public static List<ChallengeResponseDTO.RecommendedChallengeDTO> toRecommendedChallengeListDTO(
32-
List<UserChallenge> userChallenges) {
33-
34-
LocalDate today = LocalDate.now();
35-
36-
return userChallenges.stream()
37-
.filter(userChallenge -> userChallenge.getDate().isEqual(today))
38-
.map(ChallengeConverter::toRecommendedChallengeDTO)
39-
.collect(Collectors.toList());
40-
}
41-
42-
43-
44-
45-
// 챌린지 리포트를 ChallengeHome.ChallengeReport로 변환
46-
public static ChallengeResponseDTO.ChallengeReportDTO toChallengeReportDTO(int totalCredits, int totalDiaries, String diaryDate) {
47-
return ChallengeResponseDTO.ChallengeReportDTO.builder()
48-
.totalCredits(totalCredits)
49-
.totalDiaries(totalDiaries)
50-
.diaryDate(diaryDate)
51-
.build();
52-
}
53-
54-
// 전체 챌린지 홈 데이터를 ChallengeHomeDTO로 변환
55-
public static ChallengeResponseDTO.ChallengeHomeDTO toChallengeHomeDTO(List<UserChallenge> userChallenges,
56-
int totalCredits,
57-
int totalDiaries,
58-
String diaryGoal, List<String> keywords) {
59-
60-
return ChallengeResponseDTO.ChallengeHomeDTO.builder()
61-
.challengeKeywords(keywords) // 변환된 DTO 적용
62-
.recommendedChallenges(toRecommendedChallengeListDTO(userChallenges))
63-
.challengeReport(toChallengeReportDTO(totalCredits, totalDiaries, diaryGoal))
64-
.build();
65-
}
66-
67-
// 챌린지 현황
68-
public static List<ChallengeResponseDTO.ChallengeStatusDTO> toChallengeStatusListDTO(List<UserChallenge> userChallenges) {
69-
return userChallenges.stream()
70-
.map(userChallenge -> ChallengeResponseDTO.ChallengeStatusDTO.builder()
71-
.id(userChallenge.getId())
72-
.title(userChallenge.getChallenge().getTitle())
73-
.dtype(userChallenge.getDtype())
74-
.time(userChallenge.getChallenge().getTime())
75-
.completed(userChallenge.isCompleted())
76-
.build())
77-
.collect(Collectors.toList());
78-
}
79-
80-
// 챌린지 인증 작성 결과 반환
81-
public static ChallengeResponseDTO.ProofDetailsDTO toProofDetailsDTO(Challenge challenge, UserChallenge userChallenge) {
82-
return ChallengeResponseDTO.ProofDetailsDTO.builder()
83-
.id(userChallenge.getId())
84-
.title(challenge.getTitle())
85-
.time(challenge.getTime())
86-
.certificationImageUrl(userChallenge.getCertificationImageUrl())
87-
.thoughts(userChallenge.getThoughts())
88-
.certificationDate(userChallenge.getCertificationDate())
89-
.build();
90-
}
91-
92-
// UserChallenge 생성
93-
public static UserChallenge createUserChallenge(User user, Challenge challenge, UserChallengeType dtype, LocalDate date) {
94-
return UserChallenge.builder()
95-
.user(user)
96-
.challenge(challenge)
97-
.dtype(dtype)
98-
.date(date)
99-
.completed(false)
100-
.build();
101-
}
102-
103-
// 선택한 챌린지 저장
104-
public static ChallengeResponseDTO.SelectChallengeDTO toSelectChallengeDTO(List<UserChallenge> userChallenges) {
105-
List<ChallengeResponseDTO.SelectedChallengesInfo> selectedChallenges = userChallenges.stream()
106-
.map(userChallenge -> ChallengeResponseDTO.SelectedChallengesInfo.builder()
107-
.id(userChallenge.getId())
108-
.dtype(userChallenge.getDtype())
109-
.title(userChallenge.getChallenge().getTitle())
110-
.content(userChallenge.getChallenge().getContent())
111-
.time(userChallenge.getChallenge().getTime())
112-
.build())
113-
.toList();
114-
115-
return ChallengeResponseDTO.SelectChallengeDTO.builder()
116-
.selectedChallenges(selectedChallenges) // 여러 개의 챌린지 리스트 반환
117-
.build();
118-
}
119-
120-
121-
// 챌린지 수정
122-
public static ChallengeResponseDTO.ModifyProofDTO toChallengeModifyProofDTO(UserChallenge userChallenge) {
123-
return ChallengeResponseDTO.ModifyProofDTO.builder()
124-
.certificationImageUrl(userChallenge.getCertificationImageUrl())
125-
.thoughts(userChallenge.getThoughts())
126-
.build();
127-
}
128-
129-
// 챌린지 삭제
130-
public static ChallengeResponseDTO.DeleteChallengeResponseDTO toDeletedUserChallenge(UserChallenge userChallenge) {
131-
return ChallengeResponseDTO.DeleteChallengeResponseDTO.builder()
132-
.id(userChallenge.getId())
133-
.message("챌린지를 삭제했어요")
134-
.build();
135-
}
136-
137-
public static List<ChallengeResponseDTO.ChallengeDTO> toRecommendedChallenges(List<Challenge> dailyChallenges, Challenge randomChallenge) {
138-
// daily 챌린지 변환
139-
List<ChallengeResponseDTO.ChallengeDTO> recommendedChallenges = dailyChallenges.stream()
140-
.map(challenge -> ChallengeResponseDTO.ChallengeDTO.builder()
141-
.id(challenge.getId())
142-
.title(challenge.getTitle())
143-
.content(challenge.getContent())
144-
.time(challenge.getTime())
145-
.type(UserChallengeType.DAILY)
146-
.build())
147-
.collect(Collectors.toList());
148-
149-
// random 챌린지 변환 후 리스트에 추가
150-
recommendedChallenges.add(
151-
ChallengeResponseDTO.ChallengeDTO.builder()
152-
.id(randomChallenge.getId())
153-
.title(randomChallenge.getTitle())
154-
.content(randomChallenge.getContent())
155-
.time(randomChallenge.getTime())
156-
.type(UserChallengeType.RANDOM)
157-
.build()
158-
);
159-
160-
return recommendedChallenges;
161-
}
162-
}
1+
package umc.GrowIT.Server.converter;
2+
3+
import org.springframework.data.domain.Page;
4+
import umc.GrowIT.Server.domain.Challenge;
5+
import umc.GrowIT.Server.domain.Keyword;
6+
import umc.GrowIT.Server.domain.User;
7+
import umc.GrowIT.Server.domain.UserChallenge;
8+
import umc.GrowIT.Server.domain.enums.UserChallengeType;
9+
import umc.GrowIT.Server.web.dto.ChallengeDTO.ChallengeResponseDTO;
10+
import umc.GrowIT.Server.web.dto.KeywordDTO.KeywordResponseDTO;
11+
12+
import java.time.LocalDate;
13+
import java.util.ArrayList;
14+
import java.util.List;
15+
import java.util.stream.Collectors;
16+
17+
public class ChallengeConverter {
18+
19+
// 챌린지 1개를 ChallengeHomeDTO.RecommendedChallenge로 변환
20+
public static ChallengeResponseDTO.RecommendedChallengeDTO toRecommendedChallengeDTO(UserChallenge userChallenge) {
21+
return ChallengeResponseDTO.RecommendedChallengeDTO.builder()
22+
.id(userChallenge.getId())
23+
.title(userChallenge.getChallenge().getTitle())
24+
.content(userChallenge.getChallenge().getContent())
25+
.dtype(userChallenge.getDtype())
26+
.time(userChallenge.getChallenge().getTime())
27+
.completed(userChallenge.isCompleted())
28+
.build();
29+
}
30+
31+
// 추천 챌린지 리스트를 반환
32+
public static List<ChallengeResponseDTO.RecommendedChallengeDTO> toRecommendedChallengeListDTO(
33+
List<UserChallenge> userChallenges) {
34+
35+
LocalDate today = LocalDate.now();
36+
37+
return userChallenges.stream()
38+
.filter(userChallenge -> userChallenge.getDate().isEqual(today))
39+
.map(ChallengeConverter::toRecommendedChallengeDTO)
40+
.collect(Collectors.toList());
41+
}
42+
43+
44+
45+
46+
// 챌린지 리포트를 ChallengeHome.ChallengeReport로 변환
47+
public static ChallengeResponseDTO.ChallengeReportDTO toChallengeReportDTO(int totalCredits, int totalDiaries, String diaryDate) {
48+
return ChallengeResponseDTO.ChallengeReportDTO.builder()
49+
.totalCredits(totalCredits)
50+
.totalDiaries(totalDiaries)
51+
.diaryDate(diaryDate)
52+
.build();
53+
}
54+
55+
// 전체 챌린지 홈 데이터를 ChallengeHomeDTO로 변환
56+
public static ChallengeResponseDTO.ChallengeHomeDTO toChallengeHomeDTO(List<UserChallenge> userChallenges,
57+
int totalCredits,
58+
int totalDiaries,
59+
String diaryGoal, List<String> keywords) {
60+
61+
return ChallengeResponseDTO.ChallengeHomeDTO.builder()
62+
.challengeKeywords(keywords) // 변환된 DTO 적용
63+
.recommendedChallenges(toRecommendedChallengeListDTO(userChallenges))
64+
.challengeReport(toChallengeReportDTO(totalCredits, totalDiaries, diaryGoal))
65+
.build();
66+
}
67+
68+
// 챌린지 현황
69+
public static ChallengeResponseDTO.ChallengeStatusDTO toChallengeStatusDTO(UserChallenge userChallenge) {
70+
return ChallengeResponseDTO.ChallengeStatusDTO.builder()
71+
.id(userChallenge.getId())
72+
.title(userChallenge.getChallenge().getTitle())
73+
.dtype(userChallenge.getDtype())
74+
.time(userChallenge.getChallenge().getTime())
75+
.completed(userChallenge.isCompleted())
76+
.build();
77+
}
78+
79+
public static ChallengeResponseDTO.ChallengeStatusPagedResponseDTO toChallengeStatusPagedDTO(Page<UserChallenge> userChallenges) {
80+
Page<ChallengeResponseDTO.ChallengeStatusDTO> mappedPage = userChallenges.map(ChallengeConverter::toChallengeStatusDTO);
81+
82+
return ChallengeResponseDTO.ChallengeStatusPagedResponseDTO.builder()
83+
.content(mappedPage.getContent())
84+
.currentPage(mappedPage.getNumber() + 1)
85+
.totalPages(mappedPage.getTotalPages())
86+
.totalElements(mappedPage.getTotalElements())
87+
.isFirst(mappedPage.isFirst())
88+
.isLast(mappedPage.isLast())
89+
.build();
90+
}
91+
92+
// 챌린지 인증 작성 결과 반환
93+
public static ChallengeResponseDTO.ProofDetailsDTO toProofDetailsDTO(Challenge challenge, UserChallenge userChallenge) {
94+
return ChallengeResponseDTO.ProofDetailsDTO.builder()
95+
.id(userChallenge.getId())
96+
.title(challenge.getTitle())
97+
.time(challenge.getTime())
98+
.certificationImageUrl(userChallenge.getCertificationImageUrl())
99+
.thoughts(userChallenge.getThoughts())
100+
.certificationDate(userChallenge.getCertificationDate())
101+
.build();
102+
}
103+
104+
// UserChallenge 생성
105+
public static UserChallenge createUserChallenge(User user, Challenge challenge, UserChallengeType dtype, LocalDate date) {
106+
return UserChallenge.builder()
107+
.user(user)
108+
.challenge(challenge)
109+
.dtype(dtype)
110+
.date(date)
111+
.completed(false)
112+
.build();
113+
}
114+
115+
// 선택한 챌린지 저장
116+
public static ChallengeResponseDTO.SelectChallengeDTO toSelectChallengeDTO(List<UserChallenge> userChallenges) {
117+
List<ChallengeResponseDTO.SelectedChallengesInfo> selectedChallenges = userChallenges.stream()
118+
.map(userChallenge -> ChallengeResponseDTO.SelectedChallengesInfo.builder()
119+
.id(userChallenge.getId())
120+
.dtype(userChallenge.getDtype())
121+
.title(userChallenge.getChallenge().getTitle())
122+
.content(userChallenge.getChallenge().getContent())
123+
.time(userChallenge.getChallenge().getTime())
124+
.build())
125+
.toList();
126+
127+
return ChallengeResponseDTO.SelectChallengeDTO.builder()
128+
.selectedChallenges(selectedChallenges) // 여러 개의 챌린지 리스트 반환
129+
.build();
130+
}
131+
132+
133+
// 챌린지 수정
134+
public static ChallengeResponseDTO.ModifyProofDTO toChallengeModifyProofDTO(UserChallenge userChallenge) {
135+
return ChallengeResponseDTO.ModifyProofDTO.builder()
136+
.certificationImageUrl(userChallenge.getCertificationImageUrl())
137+
.thoughts(userChallenge.getThoughts())
138+
.build();
139+
}
140+
141+
// 챌린지 삭제
142+
public static ChallengeResponseDTO.DeleteChallengeResponseDTO toDeletedUserChallenge(UserChallenge userChallenge) {
143+
return ChallengeResponseDTO.DeleteChallengeResponseDTO.builder()
144+
.id(userChallenge.getId())
145+
.message("챌린지를 삭제했어요")
146+
.build();
147+
}
148+
149+
public static List<ChallengeResponseDTO.ChallengeDTO> toRecommendedChallenges(List<Challenge> dailyChallenges, Challenge randomChallenge) {
150+
// daily 챌린지 변환
151+
List<ChallengeResponseDTO.ChallengeDTO> recommendedChallenges = dailyChallenges.stream()
152+
.map(challenge -> ChallengeResponseDTO.ChallengeDTO.builder()
153+
.id(challenge.getId())
154+
.title(challenge.getTitle())
155+
.content(challenge.getContent())
156+
.time(challenge.getTime())
157+
.type(UserChallengeType.DAILY)
158+
.build())
159+
.collect(Collectors.toList());
160+
161+
// random 챌린지 변환 후 리스트에 추가
162+
recommendedChallenges.add(
163+
ChallengeResponseDTO.ChallengeDTO.builder()
164+
.id(randomChallenge.getId())
165+
.title(randomChallenge.getTitle())
166+
.content(randomChallenge.getContent())
167+
.time(randomChallenge.getTime())
168+
.type(UserChallengeType.RANDOM)
169+
.build()
170+
);
171+
172+
return recommendedChallenges;
173+
}
174+
}

src/main/java/umc/GrowIT/Server/repository/UserChallengeRepository.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package umc.GrowIT.Server.repository;
22

3+
import org.springframework.data.domain.Page;
4+
import org.springframework.data.domain.Pageable;
35
import org.springframework.data.jpa.repository.JpaRepository;
46
import org.springframework.data.jpa.repository.Modifying;
57
import org.springframework.data.jpa.repository.Query;
@@ -30,18 +32,20 @@ List<UserChallenge> findTodayUserChallengesByUserId(
3032
@Query("SELECT uc FROM UserChallenge uc " +
3133
"WHERE uc.user.id = :userId " +
3234
"AND uc.completed = :completed")
33-
List<UserChallenge> findChallengesByCompletionStatus(
35+
Page<UserChallenge> findChallengesByCompletionStatus(
3436
@Param("userId") Long userId,
35-
@Param("completed") Boolean completed);
37+
@Param("completed") Boolean completed,
38+
Pageable pageable);
3639

3740
// 2. 특정 dtype에 대해 미완료 챌린지 조회 (completed가 true인 챌린지는 제외)
3841
@Query("SELECT uc FROM UserChallenge uc " +
3942
"WHERE uc.user.id = :userId " +
4043
"AND uc.dtype = :dtype " +
4144
"AND uc.completed = false") // 항상 미완료 챌린지만 조회
42-
List<UserChallenge> findChallengesByDtypeAndCompletionStatus(
45+
Page<UserChallenge> findChallengesByDtypeAndCompletionStatus(
4346
@Param("userId") Long userId,
44-
@Param("dtype") UserChallengeType dtype);
47+
@Param("dtype") UserChallengeType dtype,
48+
Pageable pageable);
4549

4650
//userId와 date로 UserChallenge 조회
4751
@Query("SELECT uc FROM UserChallenge uc " +
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package umc.GrowIT.Server.service.ChallengeService;
22

3+
import org.springframework.data.domain.Page;
34
import umc.GrowIT.Server.domain.enums.UserChallengeType;
45
import umc.GrowIT.Server.web.dto.ChallengeDTO.ChallengeResponseDTO;
56

@@ -8,6 +9,6 @@ public interface ChallengeQueryService {
89
int getTotalDiaries(Long userId);
910
String getDiaryDate(Long userId);
1011
ChallengeResponseDTO.ChallengeHomeDTO getChallengeHome(Long userId);
11-
ChallengeResponseDTO.ChallengeStatusListDTO getChallengeStatus(Long userId, UserChallengeType dtype, Boolean completed);
12+
ChallengeResponseDTO.ChallengeStatusPagedResponseDTO getChallengeStatus(Long userId, UserChallengeType dtype, Boolean completed, Integer page);
1213
ChallengeResponseDTO.ProofDetailsDTO getChallengeProofDetails(Long userId, Long userChallengeId);
1314
}

0 commit comments

Comments
 (0)