77import ggyuel .ggyuup .problem .mapper .ProblemMapper ;
88import ggyuel .ggyuup .ranking .dto .RankingRespDTO ;
99import ggyuel .ggyuup .ranking .dto .UserLevelStatRespDTO ;
10- import ggyuel .ggyuup .ranking .dto .UserProblemStatsRespDTO ;
1110import ggyuel .ggyuup .ranking .mapper .RankingMapper ;
1211import lombok .RequiredArgsConstructor ;
1312import org .springframework .beans .factory .annotation .Autowired ;
13+ import org .springframework .core .ParameterizedTypeReference ;
14+ import org .springframework .http .HttpEntity ;
15+ import org .springframework .http .HttpHeaders ;
16+ import org .springframework .http .HttpMethod ;
17+ import org .springframework .http .ResponseEntity ;
1418import org .springframework .scheduling .annotation .Scheduled ;
1519import org .springframework .stereotype .Service ;
1620import org .springframework .web .client .RestTemplate ;
@@ -78,22 +82,37 @@ public void refreshScores(ProblemRefreshRespDTO problemRefreshRespDTO) {
7882 public float refreshBasic (String handle , List <Integer > updatedProblems ) {
7983 System .out .println ("refreshBasic 호출" );
8084
81- // plus해줄 basic 점수 계산
8285 float addBasic = 0 ;
86+
8387 for (int pid : updatedProblems ) {
8488 Integer tier = problemMapper .selectTier (pid );
8589
86- // 아직 DB 업데이트가 완료되지 못했을 경우 - solved.ac API 사용
87- if (tier == null ) {
90+ // 아직 DB 업데이트가 안 됐을 경우 solved.ac API 사용
91+ if (tier == null ) {
8892 String url = UriComponentsBuilder
8993 .fromHttpUrl ("https://solved.ac/api/v3/problem/show" )
9094 .queryParam ("problemId" , pid )
9195 .toUriString ();
9296
93- Map <String , Object > response = restTemplate .getForObject (url , Map .class );
97+ HttpHeaders headers = new HttpHeaders ();
98+ headers .set ("x-solvedac-language" , "ko" );
99+ HttpEntity <String > entity = new HttpEntity <>(headers );
100+
101+ ResponseEntity <Map > responseEntity = restTemplate .exchange (
102+ url ,
103+ HttpMethod .GET ,
104+ entity ,
105+ Map .class
106+ );
107+
108+ Map <String , Object > response = responseEntity .getBody ();
94109 Object level = response .get ("level" );
95110
96- tier = (Integer )level ;
111+ if (level != null ) {
112+ tier = (Integer ) level ;
113+ } else {
114+ tier = 0 ; // level이 없으면 0으로 처리 (필요에 따라 조정 가능)
115+ }
97116 }
98117
99118 addBasic += tier ;
@@ -103,6 +122,7 @@ public float refreshBasic(String handle, List<Integer> updatedProblems) {
103122 return rankingMapper .selectBasic (handle ) + addBasic ;
104123 }
105124
125+
106126 // refresh 버튼 - rare 업데이트
107127 @ Override
108128 public float refreshRare (String handle , List <Integer > updatedProblems ) {
@@ -122,7 +142,7 @@ public float refreshRare(String handle, List<Integer> updatedProblems) {
122142
123143 // ranking table 정기 갱신(하루 한번)
124144 @ Override
125- @ Scheduled (cron = "00 30 21 * * ?" )
145+ @ Scheduled (cron = "00 40 3 * * ?" )
126146 public void updateRankingTable () {
127147 System .out .println ("updateRankingTable 호출" );
128148
@@ -158,17 +178,25 @@ public float updateBasic(String handle) {
158178 float insertBasic = 0 ;
159179
160180 String url = "https://solved.ac/api/v3/user/problem_stats?handle=" + handle ;
161- UserProblemStatsRespDTO response = restTemplate .getForObject (url , UserProblemStatsRespDTO .class );
162181
163- List <UserLevelStatRespDTO > UserLevelStatDTOs = response .getItems ();
182+ ResponseEntity <List <UserLevelStatRespDTO >> response =
183+ restTemplate .exchange (
184+ url ,
185+ HttpMethod .GET ,
186+ null ,
187+ new ParameterizedTypeReference <List <UserLevelStatRespDTO >>() {}
188+ );
189+
190+ List <UserLevelStatRespDTO > userLevelStats = response .getBody ();
164191
165- for (UserLevelStatRespDTO userLevelStat : UserLevelStatDTOs ) {
192+ for (UserLevelStatRespDTO userLevelStat : userLevelStats ) {
166193 insertBasic += (userLevelStat .getLevel ()) * (userLevelStat .getSolved ());
167194 }
168195
169196 return insertBasic ;
170197 }
171198
199+
172200 // ranking table 정기 갱신 - rare 업데이트
173201 @ Override
174202 public float updateRare (String handle , Map <Integer , Float > rareScoreMap ) {
0 commit comments