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,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;
Expand All @@ -19,4 +20,6 @@ List<CocktailComment> findTop10ByCocktailIdAndStatusInAndIdLessThanOrderByIdDesc
);

boolean existsByCocktailIdAndUserIdAndStatusNot(Long cocktailId, Long id, CommentStatus status);

Long countByCocktail(Cocktail cocktail);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -56,31 +55,29 @@ public CocktailCommentResponseDto createCocktailComment(Long cocktailId, Cocktai
// 칵테일 댓글 다건 조회 로직 (무한스크롤)
@Transactional(readOnly = true)
public List<CocktailCommentResponseDto> 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<CocktailComment> 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();
Expand Down
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;
Expand All @@ -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;

Expand Down Expand Up @@ -64,13 +70,23 @@ public List<CocktailSummaryResponseDto> 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());
}

Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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<MyBar, Long> {
Expand Down Expand Up @@ -56,4 +57,7 @@ public interface MyBarRepository extends JpaRepository<MyBar, Long> {
and m.status = 'ACTIVE'
""")
int softDeleteByUserAndCocktail(Long userId, Long cocktailId);

// 특정 칵테일의 ACTIVE Keep 개수
Long countByCocktailAndStatus(Cocktail cocktail, KeepStatus status);
}