diff --git a/src/main/java/com/back/domain/cocktail/comment/repository/CocktailCommentRepository.java b/src/main/java/com/back/domain/cocktail/comment/repository/CocktailCommentRepository.java index 21ddf3c..20d9501 100644 --- a/src/main/java/com/back/domain/cocktail/comment/repository/CocktailCommentRepository.java +++ b/src/main/java/com/back/domain/cocktail/comment/repository/CocktailCommentRepository.java @@ -1,6 +1,7 @@ package com.back.domain.cocktail.comment.repository; import com.back.domain.cocktail.comment.entity.CocktailComment; +import com.back.domain.cocktail.entity.Cocktail; import com.back.domain.post.comment.enums.CommentStatus; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -19,4 +20,6 @@ List findTop10ByCocktailIdAndStatusInAndIdLessThanOrderByIdDesc ); boolean existsByCocktailIdAndUserIdAndStatusNot(Long cocktailId, Long id, CommentStatus status); + + Long countByCocktail(Cocktail cocktail); } diff --git a/src/main/java/com/back/domain/cocktail/comment/service/CocktailCommentService.java b/src/main/java/com/back/domain/cocktail/comment/service/CocktailCommentService.java index 9efc1e9..807b7b5 100644 --- a/src/main/java/com/back/domain/cocktail/comment/service/CocktailCommentService.java +++ b/src/main/java/com/back/domain/cocktail/comment/service/CocktailCommentService.java @@ -9,7 +9,6 @@ import com.back.domain.cocktail.repository.CocktailRepository; import com.back.domain.post.comment.enums.CommentStatus; import com.back.domain.user.entity.User; -import com.back.global.exception.UnauthorizedException; import com.back.global.rq.Rq; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -56,31 +55,29 @@ public CocktailCommentResponseDto createCocktailComment(Long cocktailId, Cocktai // 칵테일 댓글 다건 조회 로직 (무한스크롤) @Transactional(readOnly = true) public List getCocktailComments(Long cocktailId, Long lastId) { - User actor = rq.getActor(); // 서비스에서 호출 가능 + User actor = rq.getActor(); // 로그인 사용자 (null일 수 있음) + Long currentUserId = (actor != null) ? actor.getId() : null; - if (actor == null) { - throw new UnauthorizedException("로그인이 필요합니다."); - } - Long currentUserId = actor.getId(); List comments; if (lastId == null) { - comments = cocktailCommentRepository - .findTop10ByCocktailIdAndStatusInOrderByIdDesc(cocktailId, List.of(CommentStatus.PUBLIC, CommentStatus.PRIVATE) - ); + comments = cocktailCommentRepository.findTop10ByCocktailIdAndStatusInOrderByIdDesc( + cocktailId, + List.of(CommentStatus.PUBLIC, CommentStatus.PRIVATE) + ); } else { - comments = cocktailCommentRepository - .findTop10ByCocktailIdAndStatusInAndIdLessThanOrderByIdDesc(cocktailId, List.of(CommentStatus.PUBLIC, CommentStatus.PRIVATE), - lastId); + comments = cocktailCommentRepository.findTop10ByCocktailIdAndStatusInAndIdLessThanOrderByIdDesc( + cocktailId, + List.of(CommentStatus.PUBLIC, CommentStatus.PRIVATE), + lastId + ); } return comments.stream() - .filter(comment ->{ - if(comment.getStatus() == CommentStatus.PUBLIC) return true; - if(comment.getStatus() == CommentStatus.PRIVATE) { - return comment.getUser().getId().equals(currentUserId); - } - return false; + .filter(comment -> { + if (comment.getStatus() == CommentStatus.PUBLIC) return true; + // PRIVATE 댓글은 로그인한 본인만 + return currentUserId != null && comment.getUser().getId().equals(currentUserId); }) .map(CocktailCommentResponseDto::new) .toList(); diff --git a/src/main/java/com/back/domain/cocktail/dto/CocktailSummaryResponseDto.java b/src/main/java/com/back/domain/cocktail/dto/CocktailSummaryResponseDto.java index 70633d7..cb8d51e 100644 --- a/src/main/java/com/back/domain/cocktail/dto/CocktailSummaryResponseDto.java +++ b/src/main/java/com/back/domain/cocktail/dto/CocktailSummaryResponseDto.java @@ -1,21 +1,22 @@ package com.back.domain.cocktail.dto; -import com.back.domain.cocktail.entity.Cocktail; - public record CocktailSummaryResponseDto( Long cocktailId, String cocktailName, String cocktailNameKo, String cocktailImgUrl, - String alcoholStrength // Enum 대신 String + String alcoholStrength, + Long keepCount, + Long commentCount ) { - public CocktailSummaryResponseDto(Cocktail cocktail) { - this( - cocktail.getId(), - cocktail.getCocktailName(), - cocktail.getCocktailNameKo(), - cocktail.getCocktailImgUrl(), - cocktail.getAlcoholStrength().getDescription() // 설명으로 변환 - ); + + //5개 필드만 사용하는 경우 (keepCount, commentCount 기본값 0) + + public CocktailSummaryResponseDto(Long cocktailId, + String cocktailName, + String cocktailNameKo, + String cocktailImgUrl, + String alcoholStrength) { + this(cocktailId, cocktailName, cocktailNameKo, cocktailImgUrl, alcoholStrength, 0L, 0L); } } \ No newline at end of file diff --git a/src/main/java/com/back/domain/cocktail/service/CocktailService.java b/src/main/java/com/back/domain/cocktail/service/CocktailService.java index b0738dc..3f97999 100644 --- a/src/main/java/com/back/domain/cocktail/service/CocktailService.java +++ b/src/main/java/com/back/domain/cocktail/service/CocktailService.java @@ -1,5 +1,6 @@ package com.back.domain.cocktail.service; +import com.back.domain.cocktail.comment.repository.CocktailCommentRepository; import com.back.domain.cocktail.dto.CocktailDetailResponseDto; import com.back.domain.cocktail.dto.CocktailSearchRequestDto; import com.back.domain.cocktail.dto.CocktailSearchResponseDto; @@ -9,6 +10,8 @@ import com.back.domain.cocktail.enums.AlcoholStrength; import com.back.domain.cocktail.enums.CocktailType; import com.back.domain.cocktail.repository.CocktailRepository; +import com.back.domain.mybar.enums.KeepStatus; +import com.back.domain.mybar.repository.MyBarRepository; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -27,6 +30,9 @@ public class CocktailService { private final CocktailRepository cocktailRepository; + private final MyBarRepository myBarRepository; + private final CocktailCommentRepository cocktailCommentRepository; + private static final int DEFAULT_SIZE = 20; @@ -64,13 +70,23 @@ public List getCocktails(Long lastValue, Long lastId } return cocktails.stream() - .map(c -> new CocktailSummaryResponseDto( - c.getId(), - c.getCocktailName(), - c.getCocktailNameKo(), - c.getCocktailImgUrl(), - c.getAlcoholStrength().getDescription() - )) + .map(c -> { + // 해당 칵테일의 ACTIVE Keep 수 + Long keepCount = myBarRepository.countByCocktailAndStatus(c, KeepStatus.ACTIVE); + + // 해당 칵테일 댓글 수 + Long commentCount = cocktailCommentRepository.countByCocktail(c); + + return new CocktailSummaryResponseDto( + c.getId(), + c.getCocktailName(), + c.getCocktailNameKo(), + c.getCocktailImgUrl(), + c.getAlcoholStrength().getDescription(), + keepCount, + commentCount + ); + }) .collect(Collectors.toList()); } diff --git a/src/main/java/com/back/domain/mybar/repository/MyBarRepository.java b/src/main/java/com/back/domain/mybar/repository/MyBarRepository.java index 0b26188..cd06b97 100644 --- a/src/main/java/com/back/domain/mybar/repository/MyBarRepository.java +++ b/src/main/java/com/back/domain/mybar/repository/MyBarRepository.java @@ -1,5 +1,6 @@ package com.back.domain.mybar.repository; +import com.back.domain.cocktail.entity.Cocktail; import com.back.domain.mybar.entity.MyBar; import com.back.domain.mybar.enums.KeepStatus; import org.springframework.data.domain.Page; @@ -9,9 +10,9 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; -import java.util.Optional; -import java.util.List; import java.time.LocalDateTime; +import java.util.List; +import java.util.Optional; @Repository public interface MyBarRepository extends JpaRepository { @@ -56,4 +57,7 @@ public interface MyBarRepository extends JpaRepository { and m.status = 'ACTIVE' """) int softDeleteByUserAndCocktail(Long userId, Long cocktailId); + + // 특정 칵테일의 ACTIVE Keep 개수 + Long countByCocktailAndStatus(Cocktail cocktail, KeepStatus status); }