Skip to content

Commit d3fba8d

Browse files
committed
fix: GET /clubs/{clubId} 응답에 현재 로그인된 유저의 readStatus 추가
1 parent 69dd092 commit d3fba8d

File tree

4 files changed

+18
-49
lines changed

4 files changed

+18
-49
lines changed

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

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

117-
@Operation(summary = "클럽 내 게시글 목록 조회", description = "클럽 내의 게시글이나 아카이브를 조회합니다. memberId로 특정 멤버의 게시글만 필터링 가능합니다.")
117+
@Operation(summary = "클럽 내 게시글 목록 조회", description = "클럽 내의 게시글이나 아카이브를 조회합니다.")
118118
@GetMapping("/{clubId}/archives")
119119
public ResponseEntity<ClubArchiveListResponseDto> getClubArchives(
120120
@PathVariable Long clubId,
121-
@RequestParam(required = false) Long memberId,
122121
Pageable pageable) {
123-
return ResponseEntity.ok(clubService.getClubArchives(clubId, memberId, pageable));
122+
return ResponseEntity.ok(clubService.getClubArchives(clubId, pageable));
124123
}
125124
}
Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1 @@
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-
1+

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
package com.mmc.bookduck.domain.club.dto.response;
22

33
import com.mmc.bookduck.domain.book.entity.BookInfo;
4+
import com.mmc.bookduck.domain.book.entity.ReadStatus;
45
import com.mmc.bookduck.domain.club.dto.common.ClubBookInfoDto;
5-
import com.mmc.bookduck.domain.club.dto.common.ClubMemberSummaryDto;
66
import com.mmc.bookduck.domain.club.entity.Club;
77
import com.mmc.bookduck.domain.club.entity.ClubStatus;
88
import io.swagger.v3.oas.annotations.media.Schema;
99
import lombok.Builder;
1010

1111
import java.time.LocalDate;
1212
import java.time.LocalDateTime;
13-
import java.util.List;
1413

1514
@Builder
1615
@Schema(description = "클럽 상세 정보 응답 DTO")
@@ -30,9 +29,9 @@ public record ClubDetailResponseDto(
3029
@Schema(description = "현재 사용자의 멤버 여부") Boolean isMember,
3130
@Schema(description = "현재 사용자의 멤버 역할") String memberRole,
3231
@Schema(description = "현재 사용자의 UserBook ID (없으면 null)") Long userBookId,
33-
@Schema(description = "클럽 멤버 목록 (ID, 닉네임)") List<ClubMemberSummaryDto> members
32+
@Schema(description = "현재 사용자의 책 읽기 상태") ReadStatus readStatus
3433
) {
35-
public static ClubDetailResponseDto from(Club club, BookInfo bookInfo, Integer memberCount, boolean isMember, String memberRole, Long userBookId, List<ClubMemberSummaryDto> members) {
34+
public static ClubDetailResponseDto from(Club club, BookInfo bookInfo, Integer memberCount, boolean isMember, String memberRole, Long userBookId, ReadStatus readStatus) {
3635
return ClubDetailResponseDto.builder()
3736
.clubId(club.getClubId())
3837
.clubName(club.getClubName())
@@ -49,7 +48,7 @@ public static ClubDetailResponseDto from(Club club, BookInfo bookInfo, Integer m
4948
.isMember(isMember)
5049
.memberRole(memberRole)
5150
.userBookId(userBookId)
52-
.members(members)
51+
.readStatus(readStatus)
5352
.build();
5453
}
5554
}

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

Lines changed: 11 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
import com.mmc.bookduck.domain.archive.repository.ExcerptRepository;
66
import com.mmc.bookduck.domain.archive.repository.ReviewRepository;
77
import com.mmc.bookduck.domain.book.entity.BookInfo;
8+
import com.mmc.bookduck.domain.book.entity.ReadStatus;
89
import com.mmc.bookduck.domain.book.entity.UserBook;
910
import com.mmc.bookduck.domain.book.repository.UserBookRepository;
1011
import com.mmc.bookduck.domain.book.service.BookInfoService;
1112
import com.mmc.bookduck.domain.club.dto.common.ClubBookInfoDto;
12-
import com.mmc.bookduck.domain.club.dto.common.ClubMemberSummaryDto;
1313
import com.mmc.bookduck.domain.club.dto.common.ClubMemberRoleInfo;
1414
import com.mmc.bookduck.domain.club.dto.request.ClubCreateRequestDto;
1515
import com.mmc.bookduck.domain.club.dto.request.ClubJoinRequestDto;
@@ -74,29 +74,20 @@ public Long createClub(ClubCreateRequestDto requestDto) {
7474
}
7575

7676
@Transactional(readOnly = true)
77-
public ClubArchiveListResponseDto getClubArchives(Long clubId, Long memberId, Pageable pageable) {
77+
public ClubArchiveListResponseDto getClubArchives(Long clubId, Pageable pageable) {
7878
User currentUser = userService.getCurrentUser();
7979
Club club = getClubById(clubId);
8080
// 클럽 멤버 및 상태 조회
8181
ClubMember currentMember = clubMemberService.getClubMemberByClubAndUser(club, currentUser);
8282
LocalDateTime lastReadAt = markAsReadAndGetLastReadAt(currentMember);
8383
BookInfo targetBook = club.getBookInfo();
8484

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-
}
85+
// 클럽 멤버 전체 userId 추출
86+
List<Long> memberUserIds = clubMemberService.getClubMembersByClub(club).stream()
87+
.map(cm -> cm.getUser().getUserId())
88+
.toList();
9989

90+
// 전체 Excerpt / Review 조회 (읽음 여부 필터 제거)
10091
List<Excerpt> excerpts = excerptRepository.findClubExcerpts(
10192
targetBook.getBookInfoId(),
10293
memberUserIds,
@@ -252,16 +243,11 @@ public ClubDetailResponseDto getClubDetail(Long clubId) {
252243
ClubMemberRoleInfo roleInfo = clubMemberService.getMemberRoleInfo(club, currentUser);
253244

254245
// 현재 사용자의 UserBook 조회
255-
Long userBookId = userBookRepository.findByUserAndBookInfo(currentUser, club.getBookInfo())
256-
.map(UserBook::getUserBookId)
257-
.orElse(null);
258-
259-
// 클럽 멤버 목록 조회
260-
List<ClubMemberSummaryDto> members = clubMemberService.getClubMembersByClub(club).stream()
261-
.map(ClubMemberSummaryDto::from)
262-
.toList();
246+
var userBookOpt = userBookRepository.findByUserAndBookInfo(currentUser, club.getBookInfo());
247+
Long userBookId = userBookOpt.map(UserBook::getUserBookId).orElse(null);
248+
var readStatus = userBookOpt.map(UserBook::getReadStatus).orElse(null);
263249

264-
return ClubDetailResponseDto.from(club, club.getBookInfo(), memberCount, roleInfo.isMember(), roleInfo.memberRole(), userBookId, members);
250+
return ClubDetailResponseDto.from(club, club.getBookInfo(), memberCount, roleInfo.isMember(), roleInfo.memberRole(), userBookId, readStatus);
265251
}
266252

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

0 commit comments

Comments
 (0)