diff --git a/src/main/java/com/example/FixLog/controller/BookmarkFolderController.java b/src/main/java/com/example/FixLog/controller/BookmarkFolderController.java index 8ade01f..73321d5 100644 --- a/src/main/java/com/example/FixLog/controller/BookmarkFolderController.java +++ b/src/main/java/com/example/FixLog/controller/BookmarkFolderController.java @@ -1,15 +1,19 @@ package com.example.FixLog.controller; +import com.example.FixLog.dto.PageResponseDto; import com.example.FixLog.dto.Response; import com.example.FixLog.dto.bookmark.request.BookmarkFolderCreateRequest; import com.example.FixLog.dto.bookmark.request.BookmarkFolderUpdateRequest; import com.example.FixLog.dto.bookmark.request.BookmarkMoveRequest; import com.example.FixLog.dto.bookmark.response.BookmarkFolderCreateResponse; -import com.example.FixLog.dto.bookmark.response.BookmarkFolderPageResponse; +import com.example.FixLog.dto.bookmark.response.BookmarkFolderReadResponse; +import com.example.FixLog.dto.post.MyPostPageResponseDto; import com.example.FixLog.service.BookmarkFolderService; import com.example.FixLog.service.BookmarkService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.security.core.userdetails.UserDetails; import org.springframework.web.bind.annotation.*; @RestController @@ -30,16 +34,6 @@ public ResponseEntity createFolder( return ResponseEntity.ok(Response.success("북마크 폴더 생성 성공", response)); } - // 북마크 폴더 목록 전체 조회 - @GetMapping - public ResponseEntity> getFolders( - @RequestParam String requesterEmail, - @RequestParam int page - ) { - BookmarkFolderPageResponse response = bookmarkFolderService.getFoldersByEmail(requesterEmail, page); - return ResponseEntity.ok(Response.success("북마크 폴더 목록 전체 조회 성공", response)); - } - // 북마크 폴더 이름 수정 @PatchMapping("/{folder_id}") public ResponseEntity> updateFolderName( @@ -73,5 +67,31 @@ public ResponseEntity> deleteFolder( return ResponseEntity.ok(Response.success("북마크 폴더 삭제 완료", null)); } + // 북마크 폴더 목록 전체 조회 - MVP + @GetMapping + public ResponseEntity>> getFolders( + @AuthenticationPrincipal UserDetails userDetails, + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "20") int size + ) { + String email = userDetails.getUsername(); + PageResponseDto response = bookmarkFolderService.getFoldersByEmail(email, page, size); + return ResponseEntity.ok(Response.success("북마크 폴더 목록 전체 조회 성공", response)); + } + + // 특정 폴더의 북마크 목록 조회 -MVP + @GetMapping("/{folderId}/bookmarks") + public ResponseEntity>> getBookmarksByFolder( + @PathVariable Long folderId, + @AuthenticationPrincipal UserDetails userDetails, + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "6") int size, + @RequestParam(defaultValue = "0") int sort + ) { + String email = userDetails.getUsername(); + PageResponseDto data = bookmarkService.getBookmarksInFolder(email, folderId, page, sort, size); + return ResponseEntity.ok(Response.success("특정 폴더의 북마크 목록 조회 성공", data)); + } + } diff --git a/src/main/java/com/example/FixLog/dto/bookmark/response/BookmarkFolderPageResponse.java b/src/main/java/com/example/FixLog/dto/bookmark/response/BookmarkFolderPageResponse.java deleted file mode 100644 index a4e8755..0000000 --- a/src/main/java/com/example/FixLog/dto/bookmark/response/BookmarkFolderPageResponse.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.example.FixLog.dto.bookmark.response; - -import com.fasterxml.jackson.annotation.JsonProperty; - -import java.util.List; - -public record BookmarkFolderPageResponse( - @JsonProperty("content") List content, - @JsonProperty("page") int page, - @JsonProperty("size") int size, - @JsonProperty("total_pages") int totalPages, - @JsonProperty("total_elements") long totalElements -) {} - diff --git a/src/main/java/com/example/FixLog/repository/bookmark/BookmarkRepository.java b/src/main/java/com/example/FixLog/repository/bookmark/BookmarkRepository.java index a083a44..d751110 100644 --- a/src/main/java/com/example/FixLog/repository/bookmark/BookmarkRepository.java +++ b/src/main/java/com/example/FixLog/repository/bookmark/BookmarkRepository.java @@ -3,10 +3,18 @@ import com.example.FixLog.domain.bookmark.Bookmark; import com.example.FixLog.domain.bookmark.BookmarkFolder; import com.example.FixLog.domain.post.Post; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.util.Optional; public interface BookmarkRepository extends JpaRepository { Optional findByFolderIdAndPostId(BookmarkFolder folderId, Post postId); + + @EntityGraph(attributePaths = {"postId.postLikes"}) // 좋아요 수 때문 + Page findByFolderId(BookmarkFolder folder, Pageable pageable); } diff --git a/src/main/java/com/example/FixLog/service/BookmarkFolderService.java b/src/main/java/com/example/FixLog/service/BookmarkFolderService.java index d799439..db28851 100644 --- a/src/main/java/com/example/FixLog/service/BookmarkFolderService.java +++ b/src/main/java/com/example/FixLog/service/BookmarkFolderService.java @@ -2,8 +2,8 @@ import com.example.FixLog.domain.bookmark.BookmarkFolder; import com.example.FixLog.domain.member.Member; +import com.example.FixLog.dto.PageResponseDto; import com.example.FixLog.dto.bookmark.response.BookmarkFolderCreateResponse; -import com.example.FixLog.dto.bookmark.response.BookmarkFolderPageResponse; import com.example.FixLog.dto.bookmark.response.BookmarkFolderReadResponse; import com.example.FixLog.exception.CustomException; import com.example.FixLog.exception.ErrorCode; @@ -36,25 +36,13 @@ public BookmarkFolderCreateResponse createFolder(String folderName, String reque } // 북마크 폴더 목록 전체 조회 - public BookmarkFolderPageResponse getFoldersByEmail(String email, int page) { + public PageResponseDto getFoldersByEmail(String email, int page, int size) { Member member = memberRepository.findByEmail(email) .orElseThrow(() -> new CustomException(ErrorCode.USER_EMAIL_NOT_FOUND)); - - Pageable pageable = PageRequest.of(page - 1, 10); // 기본 size = 10 + Pageable pageable = PageRequest.of(page, size); Page folderPage = bookmarkFolderRepository.findAllByUserId(member, pageable); - List content = folderPage.getContent().stream() - .map(folder -> new BookmarkFolderReadResponse(folder.getFolderId(), folder.getFolderName())) - .toList(); - - return new BookmarkFolderPageResponse( - content, - folderPage.getNumber() + 1, - folderPage.getSize(), - folderPage.getTotalPages(), - folderPage.getTotalElements() - ); - + return PageResponseDto.from(folderPage, folder -> new BookmarkFolderReadResponse(folder.getFolderId(), folder.getFolderName())); } // 북마크 폴더 이름 수정 diff --git a/src/main/java/com/example/FixLog/service/BookmarkService.java b/src/main/java/com/example/FixLog/service/BookmarkService.java index 729b0d5..66a406c 100644 --- a/src/main/java/com/example/FixLog/service/BookmarkService.java +++ b/src/main/java/com/example/FixLog/service/BookmarkService.java @@ -3,14 +3,26 @@ import com.example.FixLog.domain.bookmark.Bookmark; import com.example.FixLog.domain.bookmark.BookmarkFolder; import com.example.FixLog.domain.member.Member; +import com.example.FixLog.domain.post.Post; +import com.example.FixLog.dto.PageResponseDto; +import com.example.FixLog.dto.post.MyPostPageResponseDto; import com.example.FixLog.exception.CustomException; import com.example.FixLog.exception.ErrorCode; import com.example.FixLog.repository.MemberRepository; import com.example.FixLog.repository.bookmark.BookmarkFolderRepository; import com.example.FixLog.repository.bookmark.BookmarkRepository; +import com.example.FixLog.repository.fork.ForkRepository; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + @Service @RequiredArgsConstructor public class BookmarkService { @@ -18,6 +30,7 @@ public class BookmarkService { private final BookmarkFolderRepository bookmarkFolderRepository; private final BookmarkRepository bookmarkRepository; private final MemberRepository memberRepository; + private final ForkRepository forkRepository; // 북마크 폴더 이동 public void moveBookmarkToFolder(Long bookmarkId, Long newFolderId, String email) { @@ -37,4 +50,33 @@ public void moveBookmarkToFolder(Long bookmarkId, Long newFolderId, String email bookmark.moveToFolder(targetFolder); } + + // 특정 폴더의 북마크 목록 + public PageResponseDto getBookmarksInFolder(String email, Long folderId, int page, int sort, int size) { + Member member = memberRepository.findByEmail(email) + .orElseThrow(() -> new CustomException(ErrorCode.USER_EMAIL_NOT_FOUND)); + + BookmarkFolder folder = bookmarkFolderRepository.findById(folderId) + .orElseThrow(() -> new CustomException(ErrorCode.FOLDER_NOT_FOUND)); + + // 1: 오래된순, 0: 최신순 + Sort.Direction direction = (sort == 1) ? Sort.Direction.ASC : Sort.Direction.DESC; + Pageable pageable = PageRequest.of(page, size, Sort.by(direction, "postId.createdAt")); + + Page bookmarkPage = bookmarkRepository.findByFolderId(folder, pageable); + List bookmarkedPosts = bookmarkPage.map(Bookmark::getPostId).getContent(); + + // fork count 한번에 조회 + Map forkCountMap = forkRepository.countForksByOriginalPosts(bookmarkedPosts) + .stream() + .collect(Collectors.toMap( + row -> (Long) row[0], + row -> ((Long) row[1]).intValue() + )); + + return PageResponseDto.from(bookmarkPage.map(Bookmark::getPostId), post -> + MyPostPageResponseDto.from(post, forkCountMap.getOrDefault(post.getPostId(), 0)) + ); + } + } diff --git a/src/main/java/com/example/FixLog/service/MainPageService.java b/src/main/java/com/example/FixLog/service/MainPageService.java index 86f1958..1610912 100644 --- a/src/main/java/com/example/FixLog/service/MainPageService.java +++ b/src/main/java/com/example/FixLog/service/MainPageService.java @@ -22,6 +22,7 @@ public class MainPageService { public MainPageService(PostRepository postRepository, MemberService memberService) { this.postRepository = postRepository; + this.memberService = memberService; } // 이미지 null일 때 default 사진으로 변경 (프로필 사진, diff --git a/src/main/java/com/example/FixLog/service/MypagePostService.java b/src/main/java/com/example/FixLog/service/MypagePostService.java index 7e46619..2a3133a 100644 --- a/src/main/java/com/example/FixLog/service/MypagePostService.java +++ b/src/main/java/com/example/FixLog/service/MypagePostService.java @@ -35,7 +35,7 @@ public MypagePostService(PostRepository postRepository, MemberRepository memberR // 내가 쓴 글 보기 public PageResponseDto getMyPosts(String email, int page, int sort, int size) { Member member = memberRepository.findByEmail(email) - .orElseThrow(() -> new CustomException(ErrorCode.MEMBER_NOT_FOUND)); + .orElseThrow(() -> new CustomException(ErrorCode.USER_EMAIL_NOT_FOUND)); // 1: 오래된순, 0: 최신순 Sort.Direction direction = (sort == 1) ? Sort.Direction.ASC : Sort.Direction.DESC; diff --git a/src/main/java/com/example/FixLog/service/TagService.java b/src/main/java/com/example/FixLog/service/TagService.java index e9dbfed..8c3bbef 100644 --- a/src/main/java/com/example/FixLog/service/TagService.java +++ b/src/main/java/com/example/FixLog/service/TagService.java @@ -2,7 +2,6 @@ import com.example.FixLog.domain.member.Member; import com.example.FixLog.domain.tag.Tag; -import com.example.FixLog.dto.UserIdDto; import com.example.FixLog.dto.tag.TagDto; import com.example.FixLog.dto.tag.TagResponseDto; import com.example.FixLog.exception.CustomException;