diff --git a/src/main/java/project/flipnote/bookmark/service/BookmarkReader.java b/src/main/java/project/flipnote/bookmark/service/BookmarkReader.java new file mode 100644 index 0000000..b20eb97 --- /dev/null +++ b/src/main/java/project/flipnote/bookmark/service/BookmarkReader.java @@ -0,0 +1,26 @@ +package project.flipnote.bookmark.service; + +import org.springframework.stereotype.Service; + +import lombok.RequiredArgsConstructor; +import project.flipnote.bookmark.entity.BookmarkTargetType; +import project.flipnote.bookmark.repository.BookmarkRepository; + +@Service +@RequiredArgsConstructor +public class BookmarkReader { + private final BookmarkRepository bookmarkRepository; + + /** + * 즐겨찾기를 했는지 여부를 조회합니다. + * + * @param userId 즐겨찾기를 했는지 확인할 회원 ID + * @param targetType 즐겨찾기 대상의 타입 + * @param targetId 즐겨찾기 대상의 ID + * @return 타겟을 즐겨찾기 했으면 true, 아니면 false + * @author 윤정환 + */ + public boolean isBookmarked(Long userId, BookmarkTargetType targetType, Long targetId) { + return bookmarkRepository.existsByTargetTypeAndUserIdAndTargetId(targetType, userId, targetId); + } +} diff --git a/src/main/java/project/flipnote/cardset/model/CardSetDetailResponse.java b/src/main/java/project/flipnote/cardset/model/CardSetDetailResponse.java index e732d98..da9c51a 100644 --- a/src/main/java/project/flipnote/cardset/model/CardSetDetailResponse.java +++ b/src/main/java/project/flipnote/cardset/model/CardSetDetailResponse.java @@ -15,6 +15,8 @@ public record CardSetDetailResponse( String imageUrl, Long imageRefId, boolean publicVisible, + boolean liked, + boolean bookmarked, @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime createdAt, @@ -23,7 +25,7 @@ public record CardSetDetailResponse( LocalDateTime modifiedAt ) { - public static CardSetDetailResponse from(CardSet cardSet, Long imageRefId) { + public static CardSetDetailResponse from(CardSet cardSet, boolean liked, boolean bookmarked, Long imageRefId) { return new CardSetDetailResponse( cardSet.getId(), cardSet.getGroup().getId(), @@ -33,6 +35,8 @@ public static CardSetDetailResponse from(CardSet cardSet, Long imageRefId) { cardSet.getImageUrl(), imageRefId, cardSet.getPublicVisible(), + liked, + bookmarked, cardSet.getCreatedAt(), cardSet.getModifiedAt() ); diff --git a/src/main/java/project/flipnote/cardset/service/CardSetService.java b/src/main/java/project/flipnote/cardset/service/CardSetService.java index f01909e..67cff14 100644 --- a/src/main/java/project/flipnote/cardset/service/CardSetService.java +++ b/src/main/java/project/flipnote/cardset/service/CardSetService.java @@ -1,7 +1,6 @@ package project.flipnote.cardset.service; import java.util.List; -import java.util.Optional; import java.util.Set; import org.springframework.beans.factory.annotation.Value; @@ -11,6 +10,9 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import project.flipnote.bookmark.entity.BookmarkTargetType; +import project.flipnote.bookmark.service.BookmarkReader; +import project.flipnote.bookmark.service.BookmarkService; import project.flipnote.cardset.entity.CardSet; import project.flipnote.cardset.entity.CardSetManager; import project.flipnote.cardset.entity.CardSetMetadata; @@ -40,6 +42,8 @@ import project.flipnote.image.entity.ReferenceType; import project.flipnote.image.service.ImageRefService; import project.flipnote.image.service.ImageService; +import project.flipnote.like.entity.LikeTargetType; +import project.flipnote.like.service.LikeReader; import project.flipnote.user.entity.UserProfile; import project.flipnote.user.entity.UserStatus; import project.flipnote.user.exception.UserErrorCode; @@ -61,6 +65,8 @@ public class CardSetService { private final ImageService imageService; private final ImageRefService imageRefService; private final GroupService groupService; + private final LikeReader likeReader; + private final BookmarkReader bookmarkReader; @Value("${image.default.cardSet}") private String defaultCardSetImage; @@ -116,7 +122,7 @@ public CreateCardSetResponse createCardSet(Long groupId, AuthPrinciple authPrinc cardSetRepository.save(cardSet); - if(req.imageRefId()!=null) { + if (req.imageRefId() != null) { // 이미지 활성화 imageService.changeUrlStatus(req.imageRefId(), REFERENCE_TYPE, cardSet.getId()); } @@ -147,7 +153,7 @@ public CreateCardSetResponse createCardSet(Long groupId, AuthPrinciple authPrinc public PagingResponse getCardSets(CardSetSearchRequest req) { // TODO: Projection 튜닝 필요 Page cardSetPage = cardSetRepository.searchByNameContainingAndCategory( - req.getKeyword(), Category.from(req.getCategory()), req.getPageRequest() + req.getKeyword(), Category.from(req.getCategory()), req.getPageRequest() ); Page res = cardSetPage.map(CardSetSummaryResponse::from); @@ -169,13 +175,14 @@ public CardSetDetailResponse getCardSet(Long userId, Long groupId, Long cardSetI cardSetPolicyService.validateCardSetViewable(cardSet, userId); - Optional imageRef = imageRefService.findByTypeAndReferenceId(REFERENCE_TYPE, cardSetId); + boolean liked = likeReader.isLiked(userId, LikeTargetType.CARD_SET, cardSetId); + boolean bookmarked = bookmarkReader.isBookmarked(userId, BookmarkTargetType.CARD_SET, cardSetId); Long imageRefId = imageRefService.findByTypeAndReferenceId(REFERENCE_TYPE, cardSetId) .map(ImageRef::getId) .orElse(null); - return CardSetDetailResponse.from(cardSet, imageRefId); + return CardSetDetailResponse.from(cardSet, liked, bookmarked, imageRefId); } /** @@ -201,7 +208,10 @@ public CardSetDetailResponse updateCardSet(Long userId, Long groupId, Long cardS cardSetRepository.saveAndFlush(cardSet); - return CardSetDetailResponse.from(cardSet, imageMeta.imageRefId()); + boolean liked = likeReader.isLiked(userId, LikeTargetType.CARD_SET, cardSetId); + boolean bookmarked = bookmarkReader.isBookmarked(userId, BookmarkTargetType.CARD_SET, cardSetId); + + return CardSetDetailResponse.from(cardSet, liked, bookmarked, imageMeta.imageRefId()); } /** diff --git a/src/main/java/project/flipnote/like/service/LikeReader.java b/src/main/java/project/flipnote/like/service/LikeReader.java index d0f50b0..710f3b5 100644 --- a/src/main/java/project/flipnote/like/service/LikeReader.java +++ b/src/main/java/project/flipnote/like/service/LikeReader.java @@ -19,4 +19,18 @@ public Like findByTargetAndUserId(LikeTargetType targetType, Long targetId, Long return likeRepository.findByTargetTypeAndTargetIdAndUserId(targetType, targetId, userId) .orElseThrow(() -> new BizException(LikeErrorCode.LIKE_NOT_FOUND)); } + + + /** + * 좋아요 누른 여부를 조회합니다. + * + * @param userId 좋아요를 눌렀는지 확인할 회원 ID + * @param targetType 좋아요 대상의 타입 + * @param targetId 좋아요 대상의 ID + * @return 타겟을 좋아요 눌렀으면 true, 아니면 false + * @author 윤정환 + */ + public boolean isLiked(Long userId, LikeTargetType targetType, Long targetId) { + return likeRepository.existsByTargetTypeAndTargetIdAndUserId(targetType, targetId, userId); + } } diff --git a/src/main/java/project/flipnote/like/service/LikeService.java b/src/main/java/project/flipnote/like/service/LikeService.java index 9471389..97b269e 100644 --- a/src/main/java/project/flipnote/like/service/LikeService.java +++ b/src/main/java/project/flipnote/like/service/LikeService.java @@ -20,8 +20,8 @@ import project.flipnote.like.entity.Like; import project.flipnote.like.entity.LikeTargetType; import project.flipnote.like.exception.LikeErrorCode; -import project.flipnote.like.model.response.LikeResponse; import project.flipnote.like.model.request.LikeSearchRequest; +import project.flipnote.like.model.response.LikeResponse; import project.flipnote.like.model.response.LikeTargetResponse; import project.flipnote.like.repository.LikeRepository;