44import HearDay .spring .domain .article .repository .ArticleRepository ;
55import HearDay .spring .domain .user .dto .response .HomeResponseDto ;
66import HearDay .spring .domain .user .dto .response .UserGenderAgeResponseDto ;
7+ import HearDay .spring .domain .user .dto .response .UserProfileResponseDto ;
78import HearDay .spring .domain .user .entity .User ;
89import HearDay .spring .domain .user .exception .UserException ;
910import HearDay .spring .domain .user .repository .UserRepository ;
11+ import HearDay .spring .domain .usercalendar .entity .UserCalendar ;
12+ import HearDay .spring .domain .usercalendar .repository .UserCalendarRepository ;
1013import com .fasterxml .jackson .databind .PropertyNamingStrategies ;
1114import com .fasterxml .jackson .databind .annotation .JsonNaming ;
1215import lombok .RequiredArgsConstructor ;
1821import org .springframework .web .reactive .function .client .WebClient ;
1922import reactor .core .publisher .Mono ;
2023
24+ import java .time .LocalDate ;
2125import java .time .format .DateTimeFormatter ;
2226import java .util .List ;
2327import java .util .Locale ;
@@ -31,6 +35,7 @@ public class UserQueryServiceImpl implements UserQueryService {
3135 private final UserRepository userRepository ;
3236 private final ArticleRepository articleRepository ;
3337 private final WebClient webClient ;
38+ private final UserCalendarRepository userCalendarRepository ;
3439
3540 @ Value ("${ai.api.url}" )
3641 private String aiUrl ;
@@ -59,8 +64,11 @@ public HomeResponseDto getHomeInformation(User user) {
5964
6065 List <HomeResponseDto .ArticleDto > recommendedArticles = fetchRecommendedArticlesFromAiServer (user .getId ());
6166
67+ int point = user .getPoint ();
68+ int level = calculateLevel (point );
69+
6270 return new HomeResponseDto (
63- user . getLevel () ,
71+ level ,
6472 user .getNickname (),
6573 formattedDate ,
6674 recommendedArticles
@@ -126,4 +134,37 @@ public String getImageUrl() {
126134 public UserGenderAgeResponseDto getGenderAndAge (User user ) {
127135 return UserGenderAgeResponseDto .from (user );
128136 }
137+
138+ @ Override
139+ public UserProfileResponseDto getUserProfile (User user , int year , int month ) {
140+ LocalDate startDate = LocalDate .of (year , month , 1 );
141+ LocalDate endDate = startDate .withDayOfMonth (startDate .lengthOfMonth ());
142+
143+ List <UserProfileResponseDto .Attendance > attendanceList =
144+ userCalendarRepository .findAllByUserAndAttendanceDateBetween (user , startDate , endDate )
145+ .stream ()
146+ .map (UserCalendar ::getAttendanceDate )
147+ .map (UserProfileResponseDto .Attendance ::new )
148+ .toList ();
149+
150+ int point = user .getPoint ();
151+ int level = calculateLevel (point );
152+
153+ return new UserProfileResponseDto (
154+ user .getNickname (),
155+ user .getEmail (),
156+ level ,
157+ point ,
158+ attendanceList
159+ );
160+ }
161+
162+ private int calculateLevel (int point ) {
163+ if (point < 50 ) return 1 ;
164+ if (point < 130 ) return 2 ;
165+ if (point < 250 ) return 3 ;
166+ if (point < 430 ) return 4 ;
167+ if (point < 680 ) return 5 ;
168+ return 6 ;
169+ }
129170}
0 commit comments