11package com .potato .balbambalbam .myReport .report .service ;
22
33import com .potato .balbambalbam .data .entity .CardScore ;
4+ import com .potato .balbambalbam .data .entity .Card ;
45import com .potato .balbambalbam .data .entity .User ;
56import com .potato .balbambalbam .data .entity .UserLevel ;
7+ import com .potato .balbambalbam .data .repository .CardRepository ;
68import com .potato .balbambalbam .data .repository .CardScoreRepository ;
79import com .potato .balbambalbam .data .repository .UserAttendanceRepository ;
810import com .potato .balbambalbam .data .repository .UserLevelRepository ;
911import com .potato .balbambalbam .data .repository .UserRepository ;
10- import com .potato .balbambalbam .exception .UserNotFoundException ;
1112import com .potato .balbambalbam .myReport .report .dto .ReportInfoDto ;
1213import com .potato .balbambalbam .myReport .weaksound .service .PhonemeService ;
1314import java .time .DayOfWeek ;
1718import java .util .EnumMap ;
1819import java .util .List ;
1920import java .util .Map ;
21+ import java .util .stream .Collectors ;
2022import lombok .RequiredArgsConstructor ;
2123import lombok .extern .slf4j .Slf4j ;
2224import org .springframework .stereotype .Service ;
@@ -31,6 +33,7 @@ public class ReportInfoService {
3133 private final CardScoreRepository cardScoreRepository ;
3234 private final PhonemeService phonemeService ;
3335 private final UserLevelRepository userLevelRepository ;
36+ private final CardRepository cardRepository ;
3437
3538 @ Transactional (readOnly = true )
3639 public ReportInfoDto getMyReportInfo (Long userId ) {
@@ -100,8 +103,73 @@ public ReportInfoDto getMyReportInfo(Long userId) {
100103 // 7. 사용자 레벨 조회
101104 UserLevel userLevel = userLevelRepository .findByUserId (userId )
102105 .orElseThrow (() -> new RuntimeException ("User level not found" ));
103- reportInfoDto .setCardLevel (userLevel .getCategoryId ());
106+ Long categoryId = userLevel .getCategoryId ();
107+ reportInfoDto .setCardLevel (getLevelNameByCategoryId (categoryId ));
104108
105109 return reportInfoDto ;
106110 }
111+
112+ private String getLevelNameByCategoryId (Long categoryId ) {
113+ if (categoryId >= 1 && categoryId <= 4 ) {
114+ return "Beginner" ;
115+ } else if (categoryId >= 5 && categoryId <= 15 ) {
116+ return "Intermediate" ;
117+ } else {
118+ return "Advanced" ;
119+ }
120+ }
121+
122+ @ Transactional
123+ public void setCardLevel (Long userId , String level ) {
124+ // 1. 사용자 레벨 조회
125+ UserLevel userLevel = userLevelRepository .findByUserId (userId )
126+ .orElseThrow (() -> new RuntimeException ("User not found" ));
127+
128+ // 2. 선택한 레벨에 따라 초기 카테고리 ID 설정
129+ Long initialCategoryId ;
130+ switch (level .toLowerCase ()) {
131+ case "beginner" :
132+ initialCategoryId = 1L ;
133+ break ;
134+ case "intermediate" :
135+ initialCategoryId = 5L ;
136+ break ;
137+ case "advanced" :
138+ initialCategoryId = 16L ;
139+ break ;
140+ default :
141+ throw new IllegalArgumentException ("Invalid level" );
142+ }
143+
144+ // 3. 학습한 카테고리를 확인하고 다음 카테고리로 이동
145+ Long nextCategoryId = getNextCategoryId (userId , initialCategoryId );
146+ userLevel .setCategoryId (nextCategoryId );
147+ userLevelRepository .save (userLevel );
148+ }
149+
150+ private Long getNextCategoryId (Long userId , Long initialCategoryId ) {
151+ Long currentCategoryId = initialCategoryId ;
152+
153+ // 1. 사용자가 학습한 모든 카드 ID와 모든 카테고리의 카드 ID를 한 번에 가져오기
154+ List <Long > studiedCardIds = cardScoreRepository .findByUserId (userId ).stream ().map (CardScore ::getCardId ).toList ();
155+ Map <Long , List <Long >> allCategoryCards = cardRepository .findAll ().stream ()
156+ .collect (Collectors .groupingBy (Card ::getCategoryId , Collectors .mapping (Card ::getCardId , Collectors .toList ())));
157+
158+ // 2. 현재 카테고리부터 시작하여 모든 카드를 학습했는지 검사
159+ while (allCategoryCards .containsKey (currentCategoryId )) {
160+ List <Long > currentCategoryCards = allCategoryCards .get (currentCategoryId );
161+
162+ long studiedCount = currentCategoryCards .stream ().filter (studiedCardIds ::contains ).count ();
163+
164+ // 모든 카드를 학습했다면 다음 카테고리로 이동
165+ if (studiedCount == currentCategoryCards .size ()) {
166+ currentCategoryId ++;
167+ } else {
168+ break ;
169+ }
170+ }
171+
172+ return currentCategoryId ;
173+ }
174+
107175}
0 commit comments