Skip to content

Commit f517a5d

Browse files
authored
Merge pull request #57 from FlipNoteTeam/feat/cardset-detail
Feat: [FN-222] 카드셋 조회시 좋아요/즐겨찾기 여부 반환
2 parents ef1bd69 + 4bf7887 commit f517a5d

5 files changed

Lines changed: 62 additions & 8 deletions

File tree

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package project.flipnote.bookmark.service;
2+
3+
import org.springframework.stereotype.Service;
4+
5+
import lombok.RequiredArgsConstructor;
6+
import project.flipnote.bookmark.entity.BookmarkTargetType;
7+
import project.flipnote.bookmark.repository.BookmarkRepository;
8+
9+
@Service
10+
@RequiredArgsConstructor
11+
public class BookmarkReader {
12+
private final BookmarkRepository bookmarkRepository;
13+
14+
/**
15+
* 즐겨찾기를 했는지 여부를 조회합니다.
16+
*
17+
* @param userId 즐겨찾기를 했는지 확인할 회원 ID
18+
* @param targetType 즐겨찾기 대상의 타입
19+
* @param targetId 즐겨찾기 대상의 ID
20+
* @return 타겟을 즐겨찾기 했으면 true, 아니면 false
21+
* @author 윤정환
22+
*/
23+
public boolean isBookmarked(Long userId, BookmarkTargetType targetType, Long targetId) {
24+
return bookmarkRepository.existsByTargetTypeAndUserIdAndTargetId(targetType, userId, targetId);
25+
}
26+
}

src/main/java/project/flipnote/cardset/model/CardSetDetailResponse.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ public record CardSetDetailResponse(
1515
String imageUrl,
1616
Long imageRefId,
1717
boolean publicVisible,
18+
boolean liked,
19+
boolean bookmarked,
1820

1921
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
2022
LocalDateTime createdAt,
@@ -23,7 +25,7 @@ public record CardSetDetailResponse(
2325
LocalDateTime modifiedAt
2426
) {
2527

26-
public static CardSetDetailResponse from(CardSet cardSet, Long imageRefId) {
28+
public static CardSetDetailResponse from(CardSet cardSet, boolean liked, boolean bookmarked, Long imageRefId) {
2729
return new CardSetDetailResponse(
2830
cardSet.getId(),
2931
cardSet.getGroup().getId(),
@@ -33,6 +35,8 @@ public static CardSetDetailResponse from(CardSet cardSet, Long imageRefId) {
3335
cardSet.getImageUrl(),
3436
imageRefId,
3537
cardSet.getPublicVisible(),
38+
liked,
39+
bookmarked,
3640
cardSet.getCreatedAt(),
3741
cardSet.getModifiedAt()
3842
);

src/main/java/project/flipnote/cardset/service/CardSetService.java

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package project.flipnote.cardset.service;
22

33
import java.util.List;
4-
import java.util.Optional;
54
import java.util.Set;
65

76
import org.springframework.beans.factory.annotation.Value;
@@ -11,6 +10,9 @@
1110

1211
import lombok.RequiredArgsConstructor;
1312
import lombok.extern.slf4j.Slf4j;
13+
import project.flipnote.bookmark.entity.BookmarkTargetType;
14+
import project.flipnote.bookmark.service.BookmarkReader;
15+
import project.flipnote.bookmark.service.BookmarkService;
1416
import project.flipnote.cardset.entity.CardSet;
1517
import project.flipnote.cardset.entity.CardSetManager;
1618
import project.flipnote.cardset.entity.CardSetMetadata;
@@ -40,6 +42,8 @@
4042
import project.flipnote.image.entity.ReferenceType;
4143
import project.flipnote.image.service.ImageRefService;
4244
import project.flipnote.image.service.ImageService;
45+
import project.flipnote.like.entity.LikeTargetType;
46+
import project.flipnote.like.service.LikeReader;
4347
import project.flipnote.user.entity.UserProfile;
4448
import project.flipnote.user.entity.UserStatus;
4549
import project.flipnote.user.exception.UserErrorCode;
@@ -61,6 +65,8 @@ public class CardSetService {
6165
private final ImageService imageService;
6266
private final ImageRefService imageRefService;
6367
private final GroupService groupService;
68+
private final LikeReader likeReader;
69+
private final BookmarkReader bookmarkReader;
6470

6571
@Value("${image.default.cardSet}")
6672
private String defaultCardSetImage;
@@ -116,7 +122,7 @@ public CreateCardSetResponse createCardSet(Long groupId, AuthPrinciple authPrinc
116122

117123
cardSetRepository.save(cardSet);
118124

119-
if(req.imageRefId()!=null) {
125+
if (req.imageRefId() != null) {
120126
// 이미지 활성화
121127
imageService.changeUrlStatus(req.imageRefId(), REFERENCE_TYPE, cardSet.getId());
122128
}
@@ -147,7 +153,7 @@ public CreateCardSetResponse createCardSet(Long groupId, AuthPrinciple authPrinc
147153
public PagingResponse<CardSetSummaryResponse> getCardSets(CardSetSearchRequest req) {
148154
// TODO: Projection 튜닝 필요
149155
Page<CardSetInfo> cardSetPage = cardSetRepository.searchByNameContainingAndCategory(
150-
req.getKeyword(), Category.from(req.getCategory()), req.getPageRequest()
156+
req.getKeyword(), Category.from(req.getCategory()), req.getPageRequest()
151157
);
152158

153159
Page<CardSetSummaryResponse> res = cardSetPage.map(CardSetSummaryResponse::from);
@@ -169,13 +175,14 @@ public CardSetDetailResponse getCardSet(Long userId, Long groupId, Long cardSetI
169175

170176
cardSetPolicyService.validateCardSetViewable(cardSet, userId);
171177

172-
Optional<ImageRef> imageRef = imageRefService.findByTypeAndReferenceId(REFERENCE_TYPE, cardSetId);
178+
boolean liked = likeReader.isLiked(userId, LikeTargetType.CARD_SET, cardSetId);
179+
boolean bookmarked = bookmarkReader.isBookmarked(userId, BookmarkTargetType.CARD_SET, cardSetId);
173180

174181
Long imageRefId = imageRefService.findByTypeAndReferenceId(REFERENCE_TYPE, cardSetId)
175182
.map(ImageRef::getId)
176183
.orElse(null);
177184

178-
return CardSetDetailResponse.from(cardSet, imageRefId);
185+
return CardSetDetailResponse.from(cardSet, liked, bookmarked, imageRefId);
179186
}
180187

181188
/**
@@ -201,7 +208,10 @@ public CardSetDetailResponse updateCardSet(Long userId, Long groupId, Long cardS
201208

202209
cardSetRepository.saveAndFlush(cardSet);
203210

204-
return CardSetDetailResponse.from(cardSet, imageMeta.imageRefId());
211+
boolean liked = likeReader.isLiked(userId, LikeTargetType.CARD_SET, cardSetId);
212+
boolean bookmarked = bookmarkReader.isBookmarked(userId, BookmarkTargetType.CARD_SET, cardSetId);
213+
214+
return CardSetDetailResponse.from(cardSet, liked, bookmarked, imageMeta.imageRefId());
205215
}
206216

207217
/**

src/main/java/project/flipnote/like/service/LikeReader.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,18 @@ public Like findByTargetAndUserId(LikeTargetType targetType, Long targetId, Long
1919
return likeRepository.findByTargetTypeAndTargetIdAndUserId(targetType, targetId, userId)
2020
.orElseThrow(() -> new BizException(LikeErrorCode.LIKE_NOT_FOUND));
2121
}
22+
23+
24+
/**
25+
* 좋아요 누른 여부를 조회합니다.
26+
*
27+
* @param userId 좋아요를 눌렀는지 확인할 회원 ID
28+
* @param targetType 좋아요 대상의 타입
29+
* @param targetId 좋아요 대상의 ID
30+
* @return 타겟을 좋아요 눌렀으면 true, 아니면 false
31+
* @author 윤정환
32+
*/
33+
public boolean isLiked(Long userId, LikeTargetType targetType, Long targetId) {
34+
return likeRepository.existsByTargetTypeAndTargetIdAndUserId(targetType, targetId, userId);
35+
}
2236
}

src/main/java/project/flipnote/like/service/LikeService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020
import project.flipnote.like.entity.Like;
2121
import project.flipnote.like.entity.LikeTargetType;
2222
import project.flipnote.like.exception.LikeErrorCode;
23-
import project.flipnote.like.model.response.LikeResponse;
2423
import project.flipnote.like.model.request.LikeSearchRequest;
24+
import project.flipnote.like.model.response.LikeResponse;
2525
import project.flipnote.like.model.response.LikeTargetResponse;
2626
import project.flipnote.like.repository.LikeRepository;
2727

0 commit comments

Comments
 (0)