Skip to content

Commit b642392

Browse files
authored
Merge pull request #55 from FixLog/feature/#54-myfolder-bookmark-sm
2 parents af1ac06 + d1b895d commit b642392

7 files changed

Lines changed: 86 additions & 42 deletions

File tree

src/main/java/com/example/FixLog/controller/BookmarkFolderController.java

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
11
package com.example.FixLog.controller;
22

3+
import com.example.FixLog.dto.PageResponseDto;
34
import com.example.FixLog.dto.Response;
45
import com.example.FixLog.dto.bookmark.request.BookmarkFolderCreateRequest;
56
import com.example.FixLog.dto.bookmark.request.BookmarkFolderUpdateRequest;
67
import com.example.FixLog.dto.bookmark.request.BookmarkMoveRequest;
78
import com.example.FixLog.dto.bookmark.response.BookmarkFolderCreateResponse;
8-
import com.example.FixLog.dto.bookmark.response.BookmarkFolderPageResponse;
9+
import com.example.FixLog.dto.bookmark.response.BookmarkFolderReadResponse;
10+
import com.example.FixLog.dto.post.MyPostPageResponseDto;
911
import com.example.FixLog.service.BookmarkFolderService;
1012
import com.example.FixLog.service.BookmarkService;
1113
import lombok.RequiredArgsConstructor;
1214
import org.springframework.http.ResponseEntity;
15+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
16+
import org.springframework.security.core.userdetails.UserDetails;
1317
import org.springframework.web.bind.annotation.*;
1418

1519
@RestController
@@ -30,16 +34,6 @@ public ResponseEntity<?> createFolder(
3034
return ResponseEntity.ok(Response.success("북마크 폴더 생성 성공", response));
3135
}
3236

33-
// 북마크 폴더 목록 전체 조회
34-
@GetMapping
35-
public ResponseEntity<Response<BookmarkFolderPageResponse>> getFolders(
36-
@RequestParam String requesterEmail,
37-
@RequestParam int page
38-
) {
39-
BookmarkFolderPageResponse response = bookmarkFolderService.getFoldersByEmail(requesterEmail, page);
40-
return ResponseEntity.ok(Response.success("북마크 폴더 목록 전체 조회 성공", response));
41-
}
42-
4337
// 북마크 폴더 이름 수정
4438
@PatchMapping("/{folder_id}")
4539
public ResponseEntity<Response<Void>> updateFolderName(
@@ -73,5 +67,31 @@ public ResponseEntity<Response<Void>> deleteFolder(
7367
return ResponseEntity.ok(Response.success("북마크 폴더 삭제 완료", null));
7468
}
7569

70+
// 북마크 폴더 목록 전체 조회 - MVP
71+
@GetMapping
72+
public ResponseEntity<Response<PageResponseDto<BookmarkFolderReadResponse>>> getFolders(
73+
@AuthenticationPrincipal UserDetails userDetails,
74+
@RequestParam(defaultValue = "0") int page,
75+
@RequestParam(defaultValue = "20") int size
76+
) {
77+
String email = userDetails.getUsername();
78+
PageResponseDto<BookmarkFolderReadResponse> response = bookmarkFolderService.getFoldersByEmail(email, page, size);
79+
return ResponseEntity.ok(Response.success("북마크 폴더 목록 전체 조회 성공", response));
80+
}
81+
82+
// 특정 폴더의 북마크 목록 조회 -MVP
83+
@GetMapping("/{folderId}/bookmarks")
84+
public ResponseEntity<Response<PageResponseDto<MyPostPageResponseDto>>> getBookmarksByFolder(
85+
@PathVariable Long folderId,
86+
@AuthenticationPrincipal UserDetails userDetails,
87+
@RequestParam(defaultValue = "0") int page,
88+
@RequestParam(defaultValue = "6") int size,
89+
@RequestParam(defaultValue = "0") int sort
90+
) {
91+
String email = userDetails.getUsername();
92+
PageResponseDto<MyPostPageResponseDto> data = bookmarkService.getBookmarksInFolder(email, folderId, page, sort, size);
93+
return ResponseEntity.ok(Response.success("특정 폴더의 북마크 목록 조회 성공", data));
94+
}
95+
7696

7797
}

src/main/java/com/example/FixLog/dto/bookmark/response/BookmarkFolderPageResponse.java

Lines changed: 0 additions & 14 deletions
This file was deleted.

src/main/java/com/example/FixLog/repository/bookmark/BookmarkRepository.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,18 @@
33
import com.example.FixLog.domain.bookmark.Bookmark;
44
import com.example.FixLog.domain.bookmark.BookmarkFolder;
55
import com.example.FixLog.domain.post.Post;
6+
import org.springframework.data.domain.Page;
7+
import org.springframework.data.domain.Pageable;
8+
import org.springframework.data.jpa.repository.EntityGraph;
69
import org.springframework.data.jpa.repository.JpaRepository;
10+
import org.springframework.data.jpa.repository.Query;
11+
import org.springframework.data.repository.query.Param;
712

813
import java.util.Optional;
914

1015
public interface BookmarkRepository extends JpaRepository<Bookmark, Long> {
1116
Optional<Bookmark> findByFolderIdAndPostId(BookmarkFolder folderId, Post postId);
17+
18+
@EntityGraph(attributePaths = {"postId.postLikes"}) // 좋아요 수 때문
19+
Page<Bookmark> findByFolderId(BookmarkFolder folder, Pageable pageable);
1220
}

src/main/java/com/example/FixLog/service/BookmarkFolderService.java

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
import com.example.FixLog.domain.bookmark.BookmarkFolder;
44
import com.example.FixLog.domain.member.Member;
5+
import com.example.FixLog.dto.PageResponseDto;
56
import com.example.FixLog.dto.bookmark.response.BookmarkFolderCreateResponse;
6-
import com.example.FixLog.dto.bookmark.response.BookmarkFolderPageResponse;
77
import com.example.FixLog.dto.bookmark.response.BookmarkFolderReadResponse;
88
import com.example.FixLog.exception.CustomException;
99
import com.example.FixLog.exception.ErrorCode;
@@ -36,25 +36,13 @@ public BookmarkFolderCreateResponse createFolder(String folderName, String reque
3636
}
3737

3838
// 북마크 폴더 목록 전체 조회
39-
public BookmarkFolderPageResponse getFoldersByEmail(String email, int page) {
39+
public PageResponseDto<BookmarkFolderReadResponse> getFoldersByEmail(String email, int page, int size) {
4040
Member member = memberRepository.findByEmail(email)
4141
.orElseThrow(() -> new CustomException(ErrorCode.USER_EMAIL_NOT_FOUND));
42-
43-
Pageable pageable = PageRequest.of(page - 1, 10); // 기본 size = 10
42+
Pageable pageable = PageRequest.of(page, size);
4443
Page<BookmarkFolder> folderPage = bookmarkFolderRepository.findAllByUserId(member, pageable);
4544

46-
List<BookmarkFolderReadResponse> content = folderPage.getContent().stream()
47-
.map(folder -> new BookmarkFolderReadResponse(folder.getFolderId(), folder.getFolderName()))
48-
.toList();
49-
50-
return new BookmarkFolderPageResponse(
51-
content,
52-
folderPage.getNumber() + 1,
53-
folderPage.getSize(),
54-
folderPage.getTotalPages(),
55-
folderPage.getTotalElements()
56-
);
57-
45+
return PageResponseDto.from(folderPage, folder -> new BookmarkFolderReadResponse(folder.getFolderId(), folder.getFolderName()));
5846
}
5947

6048
// 북마크 폴더 이름 수정

src/main/java/com/example/FixLog/service/BookmarkService.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,34 @@
33
import com.example.FixLog.domain.bookmark.Bookmark;
44
import com.example.FixLog.domain.bookmark.BookmarkFolder;
55
import com.example.FixLog.domain.member.Member;
6+
import com.example.FixLog.domain.post.Post;
7+
import com.example.FixLog.dto.PageResponseDto;
8+
import com.example.FixLog.dto.post.MyPostPageResponseDto;
69
import com.example.FixLog.exception.CustomException;
710
import com.example.FixLog.exception.ErrorCode;
811
import com.example.FixLog.repository.MemberRepository;
912
import com.example.FixLog.repository.bookmark.BookmarkFolderRepository;
1013
import com.example.FixLog.repository.bookmark.BookmarkRepository;
14+
import com.example.FixLog.repository.fork.ForkRepository;
1115
import lombok.RequiredArgsConstructor;
16+
import org.springframework.data.domain.Page;
17+
import org.springframework.data.domain.PageRequest;
18+
import org.springframework.data.domain.Pageable;
19+
import org.springframework.data.domain.Sort;
1220
import org.springframework.stereotype.Service;
1321

22+
import java.util.List;
23+
import java.util.Map;
24+
import java.util.stream.Collectors;
25+
1426
@Service
1527
@RequiredArgsConstructor
1628
public class BookmarkService {
1729

1830
private final BookmarkFolderRepository bookmarkFolderRepository;
1931
private final BookmarkRepository bookmarkRepository;
2032
private final MemberRepository memberRepository;
33+
private final ForkRepository forkRepository;
2134

2235
// 북마크 폴더 이동
2336
public void moveBookmarkToFolder(Long bookmarkId, Long newFolderId, String email) {
@@ -37,4 +50,33 @@ public void moveBookmarkToFolder(Long bookmarkId, Long newFolderId, String email
3750

3851
bookmark.moveToFolder(targetFolder);
3952
}
53+
54+
// 특정 폴더의 북마크 목록
55+
public PageResponseDto<MyPostPageResponseDto> getBookmarksInFolder(String email, Long folderId, int page, int sort, int size) {
56+
Member member = memberRepository.findByEmail(email)
57+
.orElseThrow(() -> new CustomException(ErrorCode.USER_EMAIL_NOT_FOUND));
58+
59+
BookmarkFolder folder = bookmarkFolderRepository.findById(folderId)
60+
.orElseThrow(() -> new CustomException(ErrorCode.FOLDER_NOT_FOUND));
61+
62+
// 1: 오래된순, 0: 최신순
63+
Sort.Direction direction = (sort == 1) ? Sort.Direction.ASC : Sort.Direction.DESC;
64+
Pageable pageable = PageRequest.of(page, size, Sort.by(direction, "postId.createdAt"));
65+
66+
Page<Bookmark> bookmarkPage = bookmarkRepository.findByFolderId(folder, pageable);
67+
List<Post> bookmarkedPosts = bookmarkPage.map(Bookmark::getPostId).getContent();
68+
69+
// fork count 한번에 조회
70+
Map<Long, Integer> forkCountMap = forkRepository.countForksByOriginalPosts(bookmarkedPosts)
71+
.stream()
72+
.collect(Collectors.toMap(
73+
row -> (Long) row[0],
74+
row -> ((Long) row[1]).intValue()
75+
));
76+
77+
return PageResponseDto.from(bookmarkPage.map(Bookmark::getPostId), post ->
78+
MyPostPageResponseDto.from(post, forkCountMap.getOrDefault(post.getPostId(), 0))
79+
);
80+
}
81+
4082
}

src/main/java/com/example/FixLog/service/MainPageService.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public class MainPageService {
2222

2323
public MainPageService(PostRepository postRepository, MemberService memberService) {
2424
this.postRepository = postRepository;
25+
this.memberService = memberService;
2526
}
2627

2728
// 이미지 null일 때 default 사진으로 변경 (프로필 사진,

src/main/java/com/example/FixLog/service/TagService.java

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

33
import com.example.FixLog.domain.member.Member;
44
import com.example.FixLog.domain.tag.Tag;
5-
import com.example.FixLog.dto.UserIdDto;
65
import com.example.FixLog.dto.tag.TagDto;
76
import com.example.FixLog.dto.tag.TagResponseDto;
87
import com.example.FixLog.exception.CustomException;

0 commit comments

Comments
 (0)