Skip to content

Commit 7928146

Browse files
authored
Merge pull request #157 from Moongeul/feat/#155
[FEAT] 마이페이지 조회 기능 구현
2 parents 13bf7fa + 1329ccb commit 7928146

File tree

3 files changed

+121
-1
lines changed

3 files changed

+121
-1
lines changed

src/main/java/com/core/book/api/article/repository/ArticleLikeRepository.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,11 @@ public interface ArticleLikeRepository extends JpaRepository<ArticleLike, Long>
1919
Optional<ArticleLike> findByArticleIdAndMemberId(Long articleId, Long userId);
2020
List<ArticleLike> findByArticle(Article article);
2121

22-
@Query("SELECT al FROM ArticleLike al WHERE al.member = :member AND al.article.type IN :types")
22+
@Query("SELECT al FROM ArticleLike al " +
23+
"JOIN FETCH al.article a " +
24+
"LEFT JOIN FETCH a.book " +
25+
"WHERE al.member = :member " +
26+
"AND a.type IN :types")
2327
Page<ArticleLike> findByMemberAndArticleTypeIn(@Param("member") Member member,
2428
@Param("types") List<ArticleType> types,
2529
Pageable pageable);

src/main/java/com/core/book/api/member/controller/MyPageController.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,40 @@ public ResponseEntity<ApiResponse<ArticleListResponseDTO>> getUserCommentedArtic
5858
ArticleListResponseDTO response = myPageService.getUserCommentedArticles(userId, page, size, userDetails);
5959
return ApiResponse.success(SuccessStatus.GET_ARTICLE_LIST_SUCCESS, response);
6060
}
61+
62+
@Operation(summary = "내가 작성한 게시글 목록 조회 API",
63+
description = "내가 작성한 Review, Phrase, QnA 게시글들을 조회합니다.")
64+
@GetMapping("/my/articles")
65+
public ResponseEntity<ApiResponse<ArticleListResponseDTO>> getMyArticles(
66+
@RequestParam int page,
67+
@RequestParam int size,
68+
@AuthenticationPrincipal UserDetails userDetails
69+
) {
70+
ArticleListResponseDTO response = myPageService.getMyArticles(page, size, userDetails);
71+
return ApiResponse.success(SuccessStatus.GET_ARTICLE_LIST_SUCCESS, response);
72+
}
73+
74+
@Operation(summary = "내가 좋아요한 게시글 목록 조회 API",
75+
description = "내가 좋아요 한 Review, Phrase, QnA 게시글들을 조회합니다.")
76+
@GetMapping("/my/liked-articles")
77+
public ResponseEntity<ApiResponse<ArticleListResponseDTO>> getMyLikedArticles(
78+
@RequestParam int page,
79+
@RequestParam int size,
80+
@AuthenticationPrincipal UserDetails userDetails
81+
) {
82+
ArticleListResponseDTO response = myPageService.getMyLikedArticles(page, size, userDetails);
83+
return ApiResponse.success(SuccessStatus.GET_ARTICLE_LIST_SUCCESS, response);
84+
}
85+
86+
@Operation(summary = "내가 댓글을 남긴 게시글 목록 조회 API",
87+
description = "내가 댓글을 남긴 Review, Phrase, QnA 게시글들을 조회합니다.")
88+
@GetMapping("/my/commented-articles")
89+
public ResponseEntity<ApiResponse<ArticleListResponseDTO>> getMyCommentedArticles(
90+
@RequestParam int page,
91+
@RequestParam int size,
92+
@AuthenticationPrincipal UserDetails userDetails
93+
) {
94+
ArticleListResponseDTO response = myPageService.getMyCommentedArticles(page, size, userDetails);
95+
return ApiResponse.success(SuccessStatus.GET_ARTICLE_LIST_SUCCESS, response);
96+
}
6197
}

src/main/java/com/core/book/api/member/service/MyPageService.java

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,4 +142,84 @@ public ArticleListResponseDTO getUserCommentedArticles(Long targetUserId, int pa
142142
return new ArticleListResponseDTO(dtos, isLast, page);
143143
}
144144

145+
// 내가 작성한 게시글 조회
146+
public ArticleListResponseDTO getMyArticles(int page, int size, UserDetails userDetails) {
147+
148+
// 사용자 정보 조회
149+
Member member = memberRepository.findByEmail(userDetails.getUsername())
150+
.orElseThrow(() -> new NotFoundException(ErrorStatus.USER_NOTFOUND_EXCEPTION.getMessage()));
151+
Long userId = member.getId();
152+
153+
Pageable pageable = PageRequest.of(page, size, Sort.by("createdAt").descending());
154+
List<ArticleType> targetTypes = Arrays.asList(ArticleType.REVIEW, ArticleType.PHRASE, ArticleType.QNA);
155+
156+
// 게시글 조회
157+
Page<Article> articlePage = articleRepository.findByUserIdAndTypes(userId, targetTypes, pageable);
158+
159+
List<ArticleListDTO> articles = articlePage.getContent().stream()
160+
.map(a -> articleViewService.convertToListDTO(a, userDetails))
161+
.collect(Collectors.toList());
162+
163+
return new ArticleListResponseDTO(articles, articlePage.isLast(), page);
164+
}
165+
166+
// 내가 좋아요 누른 게시글 조회
167+
public ArticleListResponseDTO getMyLikedArticles(int page, int size, UserDetails userDetails) {
168+
169+
// 사용자 정보 조회
170+
Member member = memberRepository.findByEmail(userDetails.getUsername())
171+
.orElseThrow(() -> new NotFoundException(ErrorStatus.USER_NOTFOUND_EXCEPTION.getMessage()));
172+
173+
Pageable pageable = PageRequest.of(page, size, Sort.by("article.createdAt").descending());
174+
List<ArticleType> targetTypes = Arrays.asList(ArticleType.REVIEW, ArticleType.PHRASE, ArticleType.QNA);
175+
176+
// 내 좋아요 목록
177+
Page<ArticleLike> likedPage = articleLikeRepository.findByMemberAndArticleTypeIn(member, targetTypes, pageable);
178+
179+
List<ArticleListDTO> articles = likedPage.getContent().stream()
180+
.map(like -> articleViewService.convertToListDTO(like.getArticle(), userDetails))
181+
.collect(Collectors.toList());
182+
183+
return new ArticleListResponseDTO(articles, likedPage.isLast(), page);
184+
}
185+
186+
// 내가 댓글 단 게시글 조회
187+
public ArticleListResponseDTO getMyCommentedArticles(int page, int size, UserDetails userDetails) {
188+
189+
// 사용자 정보 조회
190+
Member member = memberRepository.findByEmail(userDetails.getUsername())
191+
.orElseThrow(() -> new NotFoundException(ErrorStatus.USER_NOTFOUND_EXCEPTION.getMessage()));
192+
Long userId = member.getId();
193+
194+
// Review와 Phrase 게시글은 Comment 엔티티 사용
195+
List<ArticleType> reviewAndPhraseTypes = Arrays.asList(ArticleType.REVIEW, ArticleType.PHRASE);
196+
List<Article> articlesFromComment =
197+
commentRepository.findDistinctArticleByMemberIdAndArticleTypeIn(userId, reviewAndPhraseTypes);
198+
199+
// QnA 게시글은 QnaComment 엔티티 사용
200+
List<Article> articlesFromQnaComment =
201+
qnaCommentRepository.findDistinctQnaArticleByMemberId(userId);
202+
203+
// 두 리스트를 union 처리 (중복 제거)
204+
Set<Article> unionSet = new HashSet<>();
205+
unionSet.addAll(articlesFromComment);
206+
unionSet.addAll(articlesFromQnaComment);
207+
208+
// unionSet을 List로 변환 후, Article의 생성일(createdAt) 내림차순 정렬
209+
List<Article> combined = new ArrayList<>(unionSet);
210+
combined.sort((a, b) -> b.getCreatedAt().compareTo(a.getCreatedAt()));
211+
212+
// 수동 페이징 처리
213+
int start = page * size;
214+
int end = Math.min(start + size, combined.size());
215+
List<Article> subList = (start < combined.size()) ? combined.subList(start, end) : Collections.emptyList();
216+
217+
List<ArticleListDTO> dtos = subList.stream()
218+
.map(a -> articleViewService.convertToListDTO(a, userDetails))
219+
.collect(Collectors.toList());
220+
221+
boolean isLast = (end >= combined.size());
222+
return new ArticleListResponseDTO(dtos, isLast, page);
223+
}
224+
145225
}

0 commit comments

Comments
 (0)