Skip to content

Commit 55ab5c4

Browse files
committed
[Feat] : report 화면에서 사용자 학습 카드 레벨 수정
1 parent 5ddf2f2 commit 55ab5c4

5 files changed

Lines changed: 101 additions & 7 deletions

File tree

src/main/java/com/potato/balbambalbam/myReport/report/controller/ReportController.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package com.potato.balbambalbam.myReport.report.controller;
22

33
import com.potato.balbambalbam.exception.dto.ExceptionDto;
4+
import com.potato.balbambalbam.myReport.report.dto.CardLevelRequestDto;
45
import com.potato.balbambalbam.myReport.report.dto.ReportInfoDto;
56
import com.potato.balbambalbam.myReport.report.service.ReportInfoService;
6-
import com.potato.balbambalbam.user.join.service.JoinService;
77
import com.potato.balbambalbam.user.token.jwt.JWTUtil;
88
import io.swagger.v3.oas.annotations.Operation;
99
import io.swagger.v3.oas.annotations.media.Content;
@@ -14,6 +14,8 @@
1414
import lombok.RequiredArgsConstructor;
1515
import org.springframework.http.ResponseEntity;
1616
import org.springframework.web.bind.annotation.GetMapping;
17+
import org.springframework.web.bind.annotation.PostMapping;
18+
import org.springframework.web.bind.annotation.RequestBody;
1719
import org.springframework.web.bind.annotation.RequestHeader;
1820
import org.springframework.web.bind.annotation.RestController;
1921

@@ -35,4 +37,17 @@ public ResponseEntity<ReportInfoDto> getHomeInfo(@RequestHeader("access") String
3537
ReportInfoDto response = reportInfoService.getMyReportInfo(userId);
3638
return ResponseEntity.ok(response);
3739
}
40+
41+
@Operation(summary = "사용자 카드 레벨 설정", description = "사용자가 선택한 카드 레벨을 설정한다.")
42+
@ApiResponses(value = {
43+
@ApiResponse(responseCode = "200", description = "카드 레벨 설정 성공", content = @Content),
44+
@ApiResponse(responseCode = "400", description = "잘못된 요청", content = @Content),
45+
@ApiResponse(responseCode = "500", description = "서버 오류 발생", content = @Content)
46+
})
47+
@PostMapping("/report/cardLevel")
48+
public ResponseEntity<String> setCardLevel(@RequestHeader("access") String access, @RequestBody CardLevelRequestDto requestDto) {
49+
Long userId = jwtUtil.getUserId(access);
50+
reportInfoService.setCardLevel(userId, requestDto.getLevel());
51+
return ResponseEntity.ok(requestDto.getLevel());
52+
}
3853
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.potato.balbambalbam.myReport.report.dto;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import lombok.Getter;
5+
import lombok.Setter;
6+
7+
@Getter
8+
@Setter
9+
@Schema(description = "카드 레벨 설정 요청 DTO")
10+
public class CardLevelRequestDto {
11+
@Schema(description = "선택한 레벨 (Beginner, Intermediate, Advanced)")
12+
private String level;
13+
}

src/main/java/com/potato/balbambalbam/myReport/report/dto/ReportInfoDto.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,6 @@ public class ReportInfoDto {
5050
@Schema(description = "취약 음소 목록")
5151
private List<UserWeakSoundResponseDto> weakPhonemes;
5252

53-
@Schema(description = "오늘의 학습 카드 레벨")
54-
private Long cardLevel;
53+
@Schema(description = "오늘의 학습 카드 레벨 (Beginner, Intermediate, Advanced)")
54+
private String cardLevel;
5555
}

src/main/java/com/potato/balbambalbam/myReport/report/service/ReportInfoService.java

Lines changed: 70 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package com.potato.balbambalbam.myReport.report.service;
22

33
import com.potato.balbambalbam.data.entity.CardScore;
4+
import com.potato.balbambalbam.data.entity.Card;
45
import com.potato.balbambalbam.data.entity.User;
56
import com.potato.balbambalbam.data.entity.UserLevel;
7+
import com.potato.balbambalbam.data.repository.CardRepository;
68
import com.potato.balbambalbam.data.repository.CardScoreRepository;
79
import com.potato.balbambalbam.data.repository.UserAttendanceRepository;
810
import com.potato.balbambalbam.data.repository.UserLevelRepository;
911
import com.potato.balbambalbam.data.repository.UserRepository;
10-
import com.potato.balbambalbam.exception.UserNotFoundException;
1112
import com.potato.balbambalbam.myReport.report.dto.ReportInfoDto;
1213
import com.potato.balbambalbam.myReport.weaksound.service.PhonemeService;
1314
import java.time.DayOfWeek;
@@ -17,6 +18,7 @@
1718
import java.util.EnumMap;
1819
import java.util.List;
1920
import java.util.Map;
21+
import java.util.stream.Collectors;
2022
import lombok.RequiredArgsConstructor;
2123
import lombok.extern.slf4j.Slf4j;
2224
import 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
}

src/main/java/com/potato/balbambalbam/user/setting/service/ProfileService.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package com.potato.balbambalbam.user.setting.service;
22

33
import com.potato.balbambalbam.data.entity.User;
4-
import com.potato.balbambalbam.data.entity.UserLevel;
5-
import com.potato.balbambalbam.data.repository.UserLevelRepository;
64
import com.potato.balbambalbam.data.repository.UserRepository;
75
import com.potato.balbambalbam.exception.UserNotFoundException;
86
import com.potato.balbambalbam.user.setting.dto.EditResponseDto;

0 commit comments

Comments
 (0)