Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,20 +1,19 @@
package checkmo.clubManagement.internal.converter;

import static checkmo.clubManagement.ClubManagementExternalDTO.BasicInfo;
import static checkmo.clubManagement.ClubManagementExternalDTO.MembershipInfo;

import checkmo.book.BookExternalDTO;
import checkmo.clubManagement.internal.entity.BookRecommend;
import checkmo.clubManagement.internal.entity.Club;
import checkmo.clubManagement.internal.entity.ClubMember;
import checkmo.clubManagement.web.dto.ClubRequestDTO;
import checkmo.clubManagement.web.dto.ClubResponseDTO;
import checkmo.member.MemberExternalDTO;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;

import static checkmo.clubManagement.ClubManagementExternalDTO.BasicInfo;
import static checkmo.clubManagement.ClubManagementExternalDTO.MembershipInfo;
Comment on lines +8 to +16
Copy link

Copilot AI Dec 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Using wildcard imports import checkmo.clubManagement.internal.entity.*; and import java.util.*; instead of explicit imports makes it harder to understand which classes are actually used and can lead to naming conflicts. Consider keeping explicit imports for better code clarity and maintainability.

Copilot uses AI. Check for mistakes.

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class ClubManagementConverter {
Expand Down Expand Up @@ -94,38 +93,4 @@ public static ClubResponseDTO.ClubDetail toClubDetailDTO(Club club, boolean isSt
.build();
}

public static BookRecommend toBookRecommend(
ClubRequestDTO.CreateBookRecommend request,
String bookId,
ClubMember clubMember
) {
return BookRecommend.builder()
.title(request.getTitle())
.content(request.getContent())
.rate(request.getRate())
.tag(request.getTag())
.clubMember(clubMember)
.bookId(bookId)
.build();
}

public static ClubResponseDTO.BookRecommendDetail toBookRecommendDetailDTO(
BookRecommend bookRecommend,
BookExternalDTO.BasicInfo bookInfo,
MemberExternalDTO.BasicInfo authorInfo,
String currentMemberNickname,
boolean isStaff
) {
return ClubResponseDTO.BookRecommendDetail.builder()
.id(bookRecommend.getId())
.title(bookRecommend.getTitle())
.content(bookRecommend.getContent())
.rate(bookRecommend.getRate())
.tag(bookRecommend.getTag())
.bookInfo(bookInfo)
.authorInfo(authorInfo)
.isAuthor(authorInfo.getNickname().equals(currentMemberNickname))
.isStaff(isStaff)
.build();
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,26 +1,8 @@
package checkmo.clubManagement.internal.entity;

import checkmo.common.BaseEntity;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import java.util.ArrayList;
import java.util.List;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import jakarta.persistence.*;
import lombok.*;
Comment on lines +4 to +5

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

와일드카드(*)를 사용한 임포트는 코드의 가독성을 해치고, 잠재적인 이름 충돌을 야기할 수 있습니다. 필요한 클래스들을 명시적으로 임포트하는 것이 좋습니다. 예를 들어, Google Java Style Guide에서는 정적 임포트를 제외한 와일드카드 임포트를 허용하지 않습니다.

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

Copy link

Copilot AI Dec 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Using wildcard imports import lombok.*; instead of explicit imports makes it harder to understand which Lombok annotations are actually used and can lead to naming conflicts. Consider keeping explicit imports for better code clarity and maintainability.

Suggested change
import lombok.*;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

Copilot uses AI. Check for mistakes.

@Getter
@Builder
Expand All @@ -47,10 +29,6 @@ public class ClubMember extends BaseEntity {
@Column(name = "member_id", nullable = false)
private String memberId;

@Builder.Default
@OneToMany(mappedBy = "clubMember", cascade = CascadeType.ALL)
private List<BookRecommend> bookRecommends = new ArrayList<>();

public boolean isStaff() {
return this.clubMemberStatus == ClubMemberStatus.STAFF;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,6 @@ public enum ClubManagementErrorStatus implements BaseErrorCode {
CLUB_STAFF_CANNOT_LEAVE(HttpStatus.FORBIDDEN, "CLUB_MEMBER_405", "운영진은 클럽을 탈퇴할 수 없습니다."),
CLUB_MEMBER_IS_NOT_ACTIVE(HttpStatus.FORBIDDEN, "CLUB_MEMBER_406", "해당 클럽 회원은 활성화 상태(STAFF, MEMBER)가 아닙니다."),

// 책 추천,
CLUB_BOOK_RECOMMEND_NOT_FOUND(HttpStatus.NOT_FOUND, "BOOK_RECOMMEND_400", "추천 책을 찾을 수 없습니다."),
CLUB_BOOK_RECOMMEND_FORBIDDEN(HttpStatus.FORBIDDEN, "BOOK_RECOMMEND_401", "해당 추천 책에 대한 권한이 없습니다."),
;

private final HttpStatus httpStatus;
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,45 +1,38 @@
package checkmo.clubManagement.internal.service;

import static checkmo.clubManagement.ClubManagementExternalDTO.BasicInfo;

import checkmo.book.BookAPI;
import checkmo.book.BookExternalDTO;
import checkmo.clubManagement.internal.converter.ClubManagementConverter;
import checkmo.clubManagement.internal.entity.BookRecommend;
import checkmo.clubManagement.internal.entity.Club;
import checkmo.clubManagement.internal.entity.ClubMember;
import checkmo.clubManagement.internal.entity.ClubMember.ClubMemberStatus;
import checkmo.clubManagement.internal.excepetion.ClubManagementErrorStatus;
import checkmo.clubManagement.internal.excepetion.ClubManagementException;
import checkmo.clubManagement.internal.service.query.ClubBookRecommendQueryService;
import checkmo.clubManagement.internal.service.query.ClubManagementQueryService;
import checkmo.clubManagement.internal.service.query.ClubMemberQueryService;
import checkmo.clubManagement.web.dto.ClubRequestDTO;
import checkmo.clubManagement.web.dto.ClubResponseDTO;
import checkmo.clubManagement.web.dto.ClubResponseDTO.BookRecommendDetail;
import checkmo.clubManagement.web.dto.ClubResponseDTO.ClubDetail;
import checkmo.common.template.CursorPagingHelper;
import checkmo.common.template.CursorResult;
import checkmo.member.MemberAPI;
import checkmo.member.MemberExternalDTO;
import java.util.List;
import java.util.Map;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

import static checkmo.clubManagement.ClubManagementExternalDTO.BasicInfo;

@Service
@RequiredArgsConstructor
public class ClubManagementQueryFacade {

// 페이징 기본 크기 상수
private static final int DEFAULT_PAGE_SIZE = 10;

private final MemberAPI memberAPI;
private final BookAPI bookAPI;

private final ClubManagementQueryService clubManagementQueryService;
private final ClubMemberQueryService clubMemberQueryService;
private final ClubBookRecommendQueryService clubBookRecommendQueryService;

public ClubResponseDTO.ClubList retrieveClubList(
String memberId,
Expand Down Expand Up @@ -198,60 +191,6 @@ private List<String> extractMemberIds(List<ClubMember> clubMembers) {
.toList();
}

public ClubResponseDTO.BookRecommendList retrieveBookRecommedList(Long clubId, Long cursorId, String memberId) {
clubManagementQueryService.validateClub(clubId);
ClubMember clubMember = clubMemberQueryService.validateClubMember(clubId, memberId);
String nickname = memberAPI.fetchMemberBasicInfo(memberId).getNickname();

CursorResult<BookRecommend> bookRecommendCursorResult = CursorPagingHelper.getPage(
pageSize -> clubBookRecommendQueryService.retrieveBookRecommends(clubId, cursorId, pageSize),
BookRecommend::getId,
DEFAULT_PAGE_SIZE
);
List<BookRecommend> bookRecommends = bookRecommendCursorResult.content();

List<BookRecommendDetail> bookRecommendDetails = bookRecommends.stream()
.map(bookRecommend -> {
var bookInfo = bookAPI.fetchBookBasicInfo(bookRecommend.getBookId());
var authorInfo = memberAPI.fetchMemberBasicInfo(bookRecommend.getClubMember().getMemberId());
return ClubManagementConverter.toBookRecommendDetailDTO(bookRecommend, bookInfo, authorInfo,
nickname, clubMember.isStaff());
}).toList();

return ClubResponseDTO.BookRecommendList.builder()
.bookRecommendList(bookRecommendDetails)
.hasNext(bookRecommendCursorResult.hasNext())
.nextCursor(bookRecommendCursorResult.nextCursor())
.pageSize(bookRecommendDetails.size())
.build();
}

public ClubResponseDTO.BookRecommendDetail retrieveBookRecommendDetail(
Long clubId,
Long bookRecommendId,
String memberId
) {
ClubMember clubMember = clubMemberQueryService.validateClubMember(clubId, memberId);

BookRecommend bookRecommend = clubBookRecommendQueryService.retrieveBookRecommend(clubId, bookRecommendId,
memberId);

// 외부 도메인 정보 조회 (Facade에서 처리)
BookExternalDTO.BasicInfo bookInfo = bookAPI.fetchBookBasicInfo(bookRecommend.getBookId());
MemberExternalDTO.BasicInfo authorInfo
= memberAPI.fetchMemberBasicInfo(bookRecommend.getClubMember().getMemberId());
MemberExternalDTO.BasicInfo currentMemberInfo = memberAPI.fetchMemberBasicInfo(memberId);

// 4. DTO 변환 후 반환
return ClubManagementConverter.toBookRecommendDetailDTO(
bookRecommend,
bookInfo,
authorInfo,
currentMemberInfo.getNickname(),
clubMember.isStaff()
);
}

public Boolean isClubMemberStaff(Long clubId, String memberId) {
clubManagementQueryService.validateClub(clubId);
ClubMember clubMember = clubMemberQueryService.validateClubMember(clubId, memberId);
Expand Down
Loading