Skip to content

Commit 69dd092

Browse files
authored
Merge pull request #253 from MoneyMakersClub/develop
[FIX] GET /clubs/{clubId}/archives에 memberId 추가
2 parents c4e1430 + 0a92b16 commit 69dd092

File tree

4 files changed

+47
-11
lines changed

4 files changed

+47
-11
lines changed

bookduck/src/main/java/com/mmc/bookduck/domain/club/controller/ClubController.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,11 +114,12 @@ public ResponseEntity<ClubJoinedListResponseDto> getJoinedClubs(
114114
return ResponseEntity.ok(clubService.getJoinedClubs(clubStatus));
115115
}
116116

117-
@Operation(summary = "클럽 내 게시글 목록 조회", description = "클럽 내의 게시글이나 아카이브를 조회합니다.")
117+
@Operation(summary = "클럽 내 게시글 목록 조회", description = "클럽 내의 게시글이나 아카이브를 조회합니다. memberId로 특정 멤버의 게시글만 필터링 가능합니다.")
118118
@GetMapping("/{clubId}/archives")
119119
public ResponseEntity<ClubArchiveListResponseDto> getClubArchives(
120120
@PathVariable Long clubId,
121+
@RequestParam(required = false) Long memberId,
121122
Pageable pageable) {
122-
return ResponseEntity.ok(clubService.getClubArchives(clubId, pageable));
123+
return ResponseEntity.ok(clubService.getClubArchives(clubId, memberId, pageable));
123124
}
124125
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.mmc.bookduck.domain.club.dto.common;
2+
3+
import com.mmc.bookduck.domain.club.entity.ClubMember;
4+
5+
public record ClubMemberSummaryDto(
6+
Long memberId,
7+
String nickname
8+
) {
9+
public static ClubMemberSummaryDto from(ClubMember member) {
10+
return new ClubMemberSummaryDto(
11+
member.getClubMemberId(),
12+
member.getUser().getNickname()
13+
);
14+
}
15+
}
16+

bookduck/src/main/java/com/mmc/bookduck/domain/club/dto/response/ClubDetailResponseDto.java

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

33
import com.mmc.bookduck.domain.book.entity.BookInfo;
44
import com.mmc.bookduck.domain.club.dto.common.ClubBookInfoDto;
5+
import com.mmc.bookduck.domain.club.dto.common.ClubMemberSummaryDto;
56
import com.mmc.bookduck.domain.club.entity.Club;
67
import com.mmc.bookduck.domain.club.entity.ClubStatus;
78
import io.swagger.v3.oas.annotations.media.Schema;
89
import lombok.Builder;
910

1011
import java.time.LocalDate;
1112
import java.time.LocalDateTime;
13+
import java.util.List;
1214

1315
@Builder
1416
@Schema(description = "클럽 상세 정보 응답 DTO")
@@ -27,9 +29,10 @@ public record ClubDetailResponseDto(
2729
@Schema(description = "책") ClubBookInfoDto clubBookInfo,
2830
@Schema(description = "현재 사용자의 멤버 여부") Boolean isMember,
2931
@Schema(description = "현재 사용자의 멤버 역할") String memberRole,
30-
@Schema(description = "현재 사용자의 UserBook ID (없으면 null)") Long userBookId
32+
@Schema(description = "현재 사용자의 UserBook ID (없으면 null)") Long userBookId,
33+
@Schema(description = "클럽 멤버 목록 (ID, 닉네임)") List<ClubMemberSummaryDto> members
3134
) {
32-
public static ClubDetailResponseDto from(Club club, BookInfo bookInfo, Integer memberCount, boolean isMember, String memberRole, Long userBookId) {
35+
public static ClubDetailResponseDto from(Club club, BookInfo bookInfo, Integer memberCount, boolean isMember, String memberRole, Long userBookId, List<ClubMemberSummaryDto> members) {
3336
return ClubDetailResponseDto.builder()
3437
.clubId(club.getClubId())
3538
.clubName(club.getClubName())
@@ -46,6 +49,7 @@ public static ClubDetailResponseDto from(Club club, BookInfo bookInfo, Integer m
4649
.isMember(isMember)
4750
.memberRole(memberRole)
4851
.userBookId(userBookId)
52+
.members(members)
4953
.build();
5054
}
5155
}

bookduck/src/main/java/com/mmc/bookduck/domain/club/service/ClubService.java

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.mmc.bookduck.domain.book.repository.UserBookRepository;
1010
import com.mmc.bookduck.domain.book.service.BookInfoService;
1111
import com.mmc.bookduck.domain.club.dto.common.ClubBookInfoDto;
12+
import com.mmc.bookduck.domain.club.dto.common.ClubMemberSummaryDto;
1213
import com.mmc.bookduck.domain.club.dto.common.ClubMemberRoleInfo;
1314
import com.mmc.bookduck.domain.club.dto.request.ClubCreateRequestDto;
1415
import com.mmc.bookduck.domain.club.dto.request.ClubJoinRequestDto;
@@ -73,20 +74,29 @@ public Long createClub(ClubCreateRequestDto requestDto) {
7374
}
7475

7576
@Transactional(readOnly = true)
76-
public ClubArchiveListResponseDto getClubArchives(Long clubId, Pageable pageable) {
77+
public ClubArchiveListResponseDto getClubArchives(Long clubId, Long memberId, Pageable pageable) {
7778
User currentUser = userService.getCurrentUser();
7879
Club club = getClubById(clubId);
7980
// 클럽 멤버 및 상태 조회
8081
ClubMember currentMember = clubMemberService.getClubMemberByClubAndUser(club, currentUser);
8182
LocalDateTime lastReadAt = markAsReadAndGetLastReadAt(currentMember);
8283
BookInfo targetBook = club.getBookInfo();
8384

84-
// 클럽 멤버 전체 userId 추출
85-
List<Long> memberUserIds = clubMemberService.getClubMembersByClub(club).stream()
86-
.map(cm -> cm.getUser().getUserId())
87-
.toList();
85+
List<Long> memberUserIds;
86+
if (memberId != null) {
87+
// 특정 멤버만 필터링
88+
ClubMember targetMember = clubMemberService.getClubMemberById(memberId);
89+
if (!targetMember.getClub().getClubId().equals(clubId)) {
90+
throw new CustomException(ErrorCode.CLUB_MEMBER_NOT_FOUND);
91+
}
92+
memberUserIds = List.of(targetMember.getUser().getUserId());
93+
} else {
94+
// 전체 멤버
95+
memberUserIds = clubMemberService.getClubMembersByClub(club).stream()
96+
.map(cm -> cm.getUser().getUserId())
97+
.toList();
98+
}
8899

89-
// 전체 Excerpt / Review 조회 (읽음 여부 필터 제거)
90100
List<Excerpt> excerpts = excerptRepository.findClubExcerpts(
91101
targetBook.getBookInfoId(),
92102
memberUserIds,
@@ -246,7 +256,12 @@ public ClubDetailResponseDto getClubDetail(Long clubId) {
246256
.map(UserBook::getUserBookId)
247257
.orElse(null);
248258

249-
return ClubDetailResponseDto.from(club, club.getBookInfo(), memberCount, roleInfo.isMember(), roleInfo.memberRole(), userBookId);
259+
// 클럽 멤버 목록 조회
260+
List<ClubMemberSummaryDto> members = clubMemberService.getClubMembersByClub(club).stream()
261+
.map(ClubMemberSummaryDto::from)
262+
.toList();
263+
264+
return ClubDetailResponseDto.from(club, club.getBookInfo(), memberCount, roleInfo.isMember(), roleInfo.memberRole(), userBookId, members);
250265
}
251266

252267
// LEADER만 수정/삭제 가능

0 commit comments

Comments
 (0)