Skip to content

Commit 1897251

Browse files
authored
Merge pull request #60 from HearDay/feat/profile
feat: 프로필 화면에서 사용자 정보 조회 API
2 parents ce60353 + b3f3caa commit 1897251

13 files changed

Lines changed: 189 additions & 11 deletions

File tree

src/main/java/HearDay/spring/domain/article/service/ArticleService.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import HearDay.spring.domain.article.exception.ArticleException;
1010
import HearDay.spring.domain.article.repository.ArticleRepository;
1111
import HearDay.spring.domain.user.entity.User;
12+
import HearDay.spring.domain.user.repository.UserRepository;
13+
import HearDay.spring.domain.usercalendar.service.UserCalendarService;
1214
import HearDay.spring.domain.userrecentarticle.service.UserRecentArticleService;
1315
import lombok.RequiredArgsConstructor;
1416
import lombok.extern.slf4j.Slf4j;
@@ -32,6 +34,8 @@ public class ArticleService {
3234
private final ArticleRepository articleRepository;
3335
private final UserRecentArticleService recentArticleService;
3436
private final ArticleViewCountService articleViewCountService;
37+
private final UserCalendarService userCalendarService;
38+
private final UserRepository userRepository;
3539
private final WebClient webClient;
3640

3741
@Value("${ai.api.url}")
@@ -54,6 +58,10 @@ public ArticleResponseDto getArticle(User user, Long id) {
5458
recentArticleService.addRecentArticle(user.getId(), article);
5559
AgeGroup ageGroup = AgeGroup.fromAge(user.getAge());
5660
articleViewCountService.incrementViewCount(user.getId(), article.getId(), ageGroup, user.getGender());
61+
62+
userCalendarService.checkAttendance(user);
63+
user.addPoint(5);
64+
userRepository.save(user);
5765
}
5866

5967
return ArticleResponseDto.fromWithDetail(article);

src/main/java/HearDay/spring/domain/articlequiz/service/ArticleQuizService.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import HearDay.spring.domain.articlequiz.repository.ArticleQuizRepository;
88
import HearDay.spring.domain.articlequiz.repository.ArticleQuizUserResultRepository;
99
import HearDay.spring.domain.user.entity.User;
10+
import HearDay.spring.domain.user.repository.UserRepository;
1011
import lombok.RequiredArgsConstructor;
1112
import org.springframework.stereotype.Service;
1213
import org.springframework.transaction.annotation.Transactional;
@@ -20,6 +21,7 @@ public class ArticleQuizService {
2021

2122
private final ArticleQuizRepository articleQuizRepository;
2223
private final ArticleQuizUserResultRepository articleQuizUserResultRepository;
24+
private final UserRepository userRepository;
2325

2426
public ArticleQuizDto getArticleQuiz(Long articleId, Long userId) {
2527
ArticleQuiz quiz = articleQuizRepository.findByArticleId(articleId)
@@ -49,5 +51,8 @@ public void submitQuizAnswer(Long quizId, User user) {
4951
.build();
5052

5153
articleQuizUserResultRepository.save(result);
54+
55+
user.addPoint(5);
56+
userRepository.save(user);
5257
}
5358
}

src/main/java/HearDay/spring/domain/discussion/dto/response/VoiceResponseDto.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
public record VoiceResponseDto(
44
String reply,
5-
Long discussionId
5+
Long discussionId,
6+
String title
67
) {
78
}

src/main/java/HearDay/spring/domain/discussion/service/ChatCommandServiceImpl.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import HearDay.spring.domain.discussion.repository.DiscussionContentRepository;
1717
import HearDay.spring.domain.discussion.repository.DiscussionRepository;
1818
import HearDay.spring.domain.user.entity.User;
19+
import HearDay.spring.domain.user.repository.UserRepository;
1920
import lombok.RequiredArgsConstructor;
2021
import lombok.extern.slf4j.Slf4j;
2122
import org.springframework.beans.factory.annotation.Value;
@@ -39,6 +40,7 @@ public class ChatCommandServiceImpl implements ChatCommandService {
3940
private final DiscussionRepository discussionRepository;
4041
private final SpeechToTextService sttService;
4142
private final TextToSpeechService ttsService;
43+
private final UserRepository userRepository;
4244

4345
@Value("${ai.api.url}")
4446
private String aiUrl;
@@ -60,6 +62,9 @@ public ChatResponseDto getAiReply(ChatRequestDto request, Long articleId, Long d
6062
.build()
6163
);
6264
mode = AiChatModeEnum.OPEN;
65+
66+
user.addPoint(10);
67+
userRepository.save(user);
6368
} else {
6469
discussion = discussionRepository.findById(discussionId)
6570
.orElseThrow(() -> new DiscussionException.DiscussionNotFoundException(discussionId));
@@ -148,6 +153,9 @@ public VoiceResponseDto getAiVoiceReply(Long discussionId, Long articleId, Multi
148153
.build()
149154
);
150155
mode = AiChatModeEnum.OPEN;
156+
157+
user.addPoint(10);
158+
userRepository.save(user);
151159
} else {
152160
discussion = discussionRepository.findById(discussionId)
153161
.orElseThrow(() -> new DiscussionException.DiscussionNotFoundException(discussionId));
@@ -190,7 +198,8 @@ public VoiceResponseDto getAiVoiceReply(Long discussionId, Long articleId, Multi
190198

191199
return new VoiceResponseDto(
192200
outputAudio,
193-
discussion.getId()
201+
discussion.getId(),
202+
article.getTitle()
194203
);
195204
}
196205
}

src/main/java/HearDay/spring/domain/user/controller/UserController.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,7 @@
33
import HearDay.spring.common.dto.response.CommonApiResponse;
44
import HearDay.spring.common.enums.CategoryEnum;
55
import HearDay.spring.domain.user.dto.request.*;
6-
import HearDay.spring.domain.user.dto.response.AlarmTimeResponse;
7-
import HearDay.spring.domain.user.dto.response.HomeResponseDto;
8-
import HearDay.spring.domain.user.dto.response.UserGenderAgeResponseDto;
9-
import HearDay.spring.domain.user.dto.response.UserLoginResponseDto;
10-
import HearDay.spring.domain.user.dto.response.UserResponseDto;
6+
import HearDay.spring.domain.user.dto.response.*;
117
import HearDay.spring.domain.user.entity.User;
128
import HearDay.spring.domain.user.service.MailService;
139
import HearDay.spring.domain.user.service.RefreshTokenService;
@@ -199,4 +195,17 @@ public ResponseEntity<CommonApiResponse<Void>> updateAlarmTime(
199195
return ResponseEntity.status(HttpStatus.OK)
200196
.body(CommonApiResponse.success("알람 시간 설정에 성공했습니다.", null));
201197
}
198+
199+
@GetMapping("/profile")
200+
@Operation(summary = "프로필 정보 조회 API")
201+
public ResponseEntity<CommonApiResponse<?>> getProfile(
202+
@AuthUser User user,
203+
@RequestParam int year,
204+
@RequestParam int month
205+
) {
206+
UserProfileResponseDto result = userQueryService.getUserProfile(user, year, month);
207+
208+
return ResponseEntity.status(HttpStatus.OK)
209+
.body(CommonApiResponse.success("조회에 성공했습니다.", result));
210+
}
202211
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package HearDay.spring.domain.user.dto.response;
2+
3+
import java.time.LocalDate;
4+
import java.util.List;
5+
6+
public record UserProfileResponseDto(
7+
String nickname,
8+
String email,
9+
Integer level,
10+
Integer point,
11+
List<Attendance> attendance
12+
) {
13+
public record Attendance(
14+
LocalDate date
15+
) {}
16+
}

src/main/java/HearDay/spring/domain/user/entity/User.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public class User extends BaseEntity {
3636
private String phone;
3737

3838
@Column(nullable = false)
39-
private Integer level;
39+
private Integer point;
4040

4141
@Enumerated(EnumType.STRING)
4242
private Gender gender;
@@ -87,4 +87,8 @@ public void updateAlarmTime(Integer hour, Integer minute, AlarmDayType dayType)
8787
this.alarmMinute = minute;
8888
this.alarmDayType = dayType;
8989
}
90+
91+
public void addPoint(int amount) {
92+
this.point += amount;
93+
}
9094
}

src/main/java/HearDay/spring/domain/user/service/UserCommandServiceImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public UserLoginResponseDto registerUser(UserRequestDto request) {
4545
.password(passwordEncoder.encode(request.password()))
4646
.email(request.email())
4747
.phone(request.phone())
48-
.level(1)
48+
.point(0)
4949
.build();
5050

5151
userRepository.save(user);
@@ -132,7 +132,7 @@ private User createNewUser(KakaoRequestDto kakaoProfile) {
132132
.password(null)
133133
.email(kakaoProfile.kakao_account().email())
134134
.phone(null)
135-
.level(1)
135+
.point(0)
136136
.userCategory(null)
137137
.build();
138138
return userRepository.save(user);

src/main/java/HearDay/spring/domain/user/service/UserQueryService.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22

33
import HearDay.spring.domain.user.dto.response.HomeResponseDto;
44
import HearDay.spring.domain.user.dto.response.UserGenderAgeResponseDto;
5+
import HearDay.spring.domain.user.dto.response.UserProfileResponseDto;
56
import HearDay.spring.domain.user.entity.User;
67

78
public interface UserQueryService {
89
void checkId(String userLoginId);
910
User getUserEntity(Long userId);
1011
HomeResponseDto getHomeInformation(User user);
1112
UserGenderAgeResponseDto getGenderAndAge(User user);
13+
UserProfileResponseDto getUserProfile(User user, int year, int month);
1214
}

src/main/java/HearDay/spring/domain/user/service/UserQueryServiceImpl.java

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@
44
import HearDay.spring.domain.article.repository.ArticleRepository;
55
import HearDay.spring.domain.user.dto.response.HomeResponseDto;
66
import HearDay.spring.domain.user.dto.response.UserGenderAgeResponseDto;
7+
import HearDay.spring.domain.user.dto.response.UserProfileResponseDto;
78
import HearDay.spring.domain.user.entity.User;
89
import HearDay.spring.domain.user.exception.UserException;
910
import HearDay.spring.domain.user.repository.UserRepository;
11+
import HearDay.spring.domain.usercalendar.entity.UserCalendar;
12+
import HearDay.spring.domain.usercalendar.repository.UserCalendarRepository;
1013
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
1114
import com.fasterxml.jackson.databind.annotation.JsonNaming;
1215
import lombok.RequiredArgsConstructor;
@@ -18,6 +21,7 @@
1821
import org.springframework.web.reactive.function.client.WebClient;
1922
import reactor.core.publisher.Mono;
2023

24+
import java.time.LocalDate;
2125
import java.time.format.DateTimeFormatter;
2226
import java.util.List;
2327
import 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

Comments
 (0)