From 18b1ddfd88f7002b13467ea77dcd448f593e8021 Mon Sep 17 00:00:00 2001 From: dungbik Date: Thu, 4 Sep 2025 15:29:26 +0900 Subject: [PATCH 1/4] =?UTF-8?q?Feat:=20=EC=A6=90=EA=B2=A8=EC=B0=BE?= =?UTF-8?q?=EA=B8=B0=20=EC=B6=94=EA=B0=80=EC=8B=9C=20=EB=8C=80=EC=83=81=20?= =?UTF-8?q?=EC=A1=B4=EC=9E=AC=20=EA=B2=80=EC=A6=9D=EC=9D=B4=20=EC=95=84?= =?UTF-8?q?=EB=8B=8C=20=EC=A0=91=EA=B7=BC=20=EA=B0=80=EB=8A=A5=EC=84=B1=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=EC=88=98=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bookmark/service/BookmarkPolicyService.java | 4 ++-- .../bookmark/service/BookmarkService.java | 2 +- .../service/BookmarkTargetFetchService.java | 4 ++-- .../service/fetcher/BookmarkCardSetFetcher.java | 4 ++-- .../service/fetcher/BookmarkTargetFetcher.java | 2 +- .../cardset/service/CardSetPolicyService.java | 17 ++++++++++++++--- .../cardset/service/CardSetService.java | 16 +++++++++++++++- 7 files changed, 37 insertions(+), 12 deletions(-) diff --git a/src/main/java/project/flipnote/bookmark/service/BookmarkPolicyService.java b/src/main/java/project/flipnote/bookmark/service/BookmarkPolicyService.java index 10750ae3..30c8f4c7 100644 --- a/src/main/java/project/flipnote/bookmark/service/BookmarkPolicyService.java +++ b/src/main/java/project/flipnote/bookmark/service/BookmarkPolicyService.java @@ -16,8 +16,8 @@ public class BookmarkPolicyService { private final BookmarkRepository bookmarkRepository; private final BookmarkTargetFetchService bookmarkTargetFetchService; - public void validateTargetExists(BookmarkTargetType targetType, Long targetId) { - if (!bookmarkTargetFetchService.existsByTypeAndId(targetType, targetId)) { + public void validateTargetViewable(BookmarkTargetType targetType, Long targetId, Long userId) { + if (!bookmarkTargetFetchService.isTargetViewable(targetType, targetId, userId)) { throw new BizException(BookmarkErrorCode.BOOKMARK_TARGET_NOT_FOUND); } } diff --git a/src/main/java/project/flipnote/bookmark/service/BookmarkService.java b/src/main/java/project/flipnote/bookmark/service/BookmarkService.java index 7350ebaf..e1eaf6f0 100644 --- a/src/main/java/project/flipnote/bookmark/service/BookmarkService.java +++ b/src/main/java/project/flipnote/bookmark/service/BookmarkService.java @@ -43,7 +43,7 @@ public class BookmarkService { @Transactional public IdResponse addBookmark(Long userId, BookmarkTargetType targetType, Long targetId) { bookmarkPolicyService.validateBookmarkNotExists(targetType, userId, targetId); - bookmarkPolicyService.validateTargetExists(targetType, targetId); + bookmarkPolicyService.validateTargetViewable(targetType, targetId, userId); Bookmark bookmark = Bookmark.builder() .targetType(targetType) diff --git a/src/main/java/project/flipnote/bookmark/service/BookmarkTargetFetchService.java b/src/main/java/project/flipnote/bookmark/service/BookmarkTargetFetchService.java index f67c84cb..6df62895 100644 --- a/src/main/java/project/flipnote/bookmark/service/BookmarkTargetFetchService.java +++ b/src/main/java/project/flipnote/bookmark/service/BookmarkTargetFetchService.java @@ -30,10 +30,10 @@ public void init() { .collect(Collectors.toMap(BookmarkTargetFetcher::getTargetType, Function.identity())); } - public boolean existsByTypeAndId(BookmarkTargetType targetType, Long targetId) { + public boolean isTargetViewable(BookmarkTargetType targetType, Long targetId, Long userId) { BookmarkTargetFetcher targetFetcher = getFetcher(targetType); - return targetFetcher.existsById(targetId); + return targetFetcher.isTargetViewable(targetId, userId); } public Map fetchByTypeAndIds( diff --git a/src/main/java/project/flipnote/bookmark/service/fetcher/BookmarkCardSetFetcher.java b/src/main/java/project/flipnote/bookmark/service/fetcher/BookmarkCardSetFetcher.java index 77f30121..868419b7 100644 --- a/src/main/java/project/flipnote/bookmark/service/fetcher/BookmarkCardSetFetcher.java +++ b/src/main/java/project/flipnote/bookmark/service/fetcher/BookmarkCardSetFetcher.java @@ -24,8 +24,8 @@ public BookmarkTargetType getTargetType() { } @Override - public boolean existsById(Long targetId) { - return cardSetService.existsById(targetId); + public boolean isTargetViewable(Long targetId, Long userId) { + return cardSetService.isCardSetViewable(targetId, userId); } @Override diff --git a/src/main/java/project/flipnote/bookmark/service/fetcher/BookmarkTargetFetcher.java b/src/main/java/project/flipnote/bookmark/service/fetcher/BookmarkTargetFetcher.java index 0be48db7..71bf72ac 100644 --- a/src/main/java/project/flipnote/bookmark/service/fetcher/BookmarkTargetFetcher.java +++ b/src/main/java/project/flipnote/bookmark/service/fetcher/BookmarkTargetFetcher.java @@ -9,7 +9,7 @@ public interface BookmarkTargetFetcher { BookmarkTargetType getTargetType(); - boolean existsById(Long targetId); + boolean isTargetViewable(Long targetId, Long userId); Map fetchByIds(Set ids); } diff --git a/src/main/java/project/flipnote/cardset/service/CardSetPolicyService.java b/src/main/java/project/flipnote/cardset/service/CardSetPolicyService.java index 406d4cf2..564213cc 100644 --- a/src/main/java/project/flipnote/cardset/service/CardSetPolicyService.java +++ b/src/main/java/project/flipnote/cardset/service/CardSetPolicyService.java @@ -49,12 +49,23 @@ public void validateCardSetEditable(Long userId, Long cardSetId) { * * @param cardSet 조회 대상 카드셋 엔티티 * @param userId 조회 권한을 검증할 회원의 ID - * @param groupId 카드셋이 속한 그룹의 ID * @author 윤정환 */ - public void validateCardSetViewable(CardSet cardSet, Long userId, Long groupId) { - if (!cardSet.getPublicVisible() && !groupService.existsMember(groupId, userId)) { + public void validateCardSetViewable(CardSet cardSet, Long userId) { + if (!isCardSetViewable(cardSet, userId)) { throw new BizException(CardSetErrorCode.CARD_SET_PRIVATE); } } + + /** + * 특정 회원이 해당 카드셋을 조회할 수 있는 권한이 있는지 확인 + * + * @param cardSet 조회 대상 카드셋 엔티티 + * @param userId 조회 권한을 검증할 회원의 ID + * @return 카드셋 조회 가능 여부 + * @author 윤정환 + */ + public boolean isCardSetViewable(CardSet cardSet, Long userId) { + return cardSet.getPublicVisible() || groupService.existsMember(cardSet.getGroup().getId(), userId); + } } diff --git a/src/main/java/project/flipnote/cardset/service/CardSetService.java b/src/main/java/project/flipnote/cardset/service/CardSetService.java index 41b8e02a..be584a66 100644 --- a/src/main/java/project/flipnote/cardset/service/CardSetService.java +++ b/src/main/java/project/flipnote/cardset/service/CardSetService.java @@ -143,7 +143,7 @@ public PagingResponse getCardSets(CardSetSearchRequest r public CardSetDetailResponse getCardSet(Long userId, Long groupId, Long cardSetId) { CardSet cardSet = cardSetPolicyService.findByIdAndGroupIdOrThrow(groupId, cardSetId); - cardSetPolicyService.validateCardSetViewable(cardSet, userId, groupId); + cardSetPolicyService.validateCardSetViewable(cardSet, userId); return CardSetDetailResponse.from(cardSet); } @@ -219,4 +219,18 @@ public List getCardSetsByIds(Set targetIds) { .map(CardSetSummaryResponse::from) .toList(); } + + /** + * 사용자가 특정 카드셋에 접근할 수 있는지 여부를 확인 + * + * @param cardSetId 확인할 카드셋의 ID + * @param userId 접근 권한을 확인할 사용자의 ID + * @return 접근 가능 여부 + * @author 윤정환 + */ + public boolean isCardSetViewable(Long cardSetId, Long userId) { + return cardSetRepository.findById(cardSetId) + .map(cardSet -> cardSetPolicyService.isCardSetViewable(cardSet, userId)) + .orElse(false); + } } From d76e414a3e264b9ee6f32cf85b2d235cd34506f3 Mon Sep 17 00:00:00 2001 From: dungbik Date: Thu, 4 Sep 2025 16:01:56 +0900 Subject: [PATCH 2/4] =?UTF-8?q?Feat:=20=EC=B9=B4=EB=93=9C=EC=85=8B=20?= =?UTF-8?q?=EC=A6=90=EA=B2=A8=EC=B0=BE=EA=B8=B0=20=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=EC=8B=9C=20=EC=A1=B0=ED=9A=8C=20=EA=B0=80?= =?UTF-8?q?=EB=8A=A5=ED=95=9C=20=EC=B9=B4=EB=93=9C=EC=85=8B=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=EB=A7=8C=20=EC=A1=B0=ED=9A=8C=EB=90=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bookmark/service/BookmarkService.java | 2 +- .../service/BookmarkTargetFetchService.java | 5 +++-- .../service/fetcher/BookmarkCardSetFetcher.java | 4 ++-- .../service/fetcher/BookmarkTargetFetcher.java | 2 +- .../cardset/service/CardSetService.java | 17 +++++++++++++++++ 5 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/main/java/project/flipnote/bookmark/service/BookmarkService.java b/src/main/java/project/flipnote/bookmark/service/BookmarkService.java index e1eaf6f0..9550ecc8 100644 --- a/src/main/java/project/flipnote/bookmark/service/BookmarkService.java +++ b/src/main/java/project/flipnote/bookmark/service/BookmarkService.java @@ -100,7 +100,7 @@ public PagingResponse> getBookmarks( Set targetIds = likedAtMap.keySet(); Map targetMap - = bookmarkTargetFetchService.fetchByTypeAndIds(targetType, targetIds); + = bookmarkTargetFetchService.fetchByTypeAndIds(targetType, targetIds, userId); Page> content = bookmarkPage.map(bookmark -> new BookmarkResponse<>( diff --git a/src/main/java/project/flipnote/bookmark/service/BookmarkTargetFetchService.java b/src/main/java/project/flipnote/bookmark/service/BookmarkTargetFetchService.java index 6df62895..f10d4fc2 100644 --- a/src/main/java/project/flipnote/bookmark/service/BookmarkTargetFetchService.java +++ b/src/main/java/project/flipnote/bookmark/service/BookmarkTargetFetchService.java @@ -38,11 +38,12 @@ public boolean isTargetViewable(BookmarkTargetType targetType, Long targetId, Lo public Map fetchByTypeAndIds( BookmarkTargetType targetType, - Set targetIds + Set targetIds, + Long userId ) { BookmarkTargetFetcher targetFetcher = getFetcher(targetType); - return targetFetcher.fetchByIds(targetIds); + return targetFetcher.fetchByIds(targetIds, userId); } private BookmarkTargetFetcher getFetcher(BookmarkTargetType targetType) { diff --git a/src/main/java/project/flipnote/bookmark/service/fetcher/BookmarkCardSetFetcher.java b/src/main/java/project/flipnote/bookmark/service/fetcher/BookmarkCardSetFetcher.java index 868419b7..1b562ae2 100644 --- a/src/main/java/project/flipnote/bookmark/service/fetcher/BookmarkCardSetFetcher.java +++ b/src/main/java/project/flipnote/bookmark/service/fetcher/BookmarkCardSetFetcher.java @@ -29,8 +29,8 @@ public boolean isTargetViewable(Long targetId, Long userId) { } @Override - public Map fetchByIds(Set ids) { - return cardSetService.getCardSetsByIds(ids).stream() + public Map fetchByIds(Set targetIds, Long userId) { + return cardSetService.findViewableCardSetsByIds(targetIds, userId).stream() .map(CardSetBookmarkResponse::from) .collect(Collectors.toMap(CardSetBookmarkResponse::getId, Function.identity())); } diff --git a/src/main/java/project/flipnote/bookmark/service/fetcher/BookmarkTargetFetcher.java b/src/main/java/project/flipnote/bookmark/service/fetcher/BookmarkTargetFetcher.java index 71bf72ac..308e3896 100644 --- a/src/main/java/project/flipnote/bookmark/service/fetcher/BookmarkTargetFetcher.java +++ b/src/main/java/project/flipnote/bookmark/service/fetcher/BookmarkTargetFetcher.java @@ -11,5 +11,5 @@ public interface BookmarkTargetFetcher { boolean isTargetViewable(Long targetId, Long userId); - Map fetchByIds(Set ids); + Map fetchByIds(Set targetIds, Long userId); } diff --git a/src/main/java/project/flipnote/cardset/service/CardSetService.java b/src/main/java/project/flipnote/cardset/service/CardSetService.java index be584a66..c9b4eb82 100644 --- a/src/main/java/project/flipnote/cardset/service/CardSetService.java +++ b/src/main/java/project/flipnote/cardset/service/CardSetService.java @@ -233,4 +233,21 @@ public boolean isCardSetViewable(Long cardSetId, Long userId) { .map(cardSet -> cardSetPolicyService.isCardSetViewable(cardSet, userId)) .orElse(false); } + + /** + * 카드셋 ID 목록에 해당하는 카드셋 목록 조회 + * + * @param targetIds 조회할 카드셋 ID 목록 + * @param userId 카드셋 목록을 조회하는 회원 ID + * @return 조회된 카드셋 목록 + * @author 윤정환 + */ + @Transactional + public List findViewableCardSetsByIds(Set targetIds, Long userId) { + // TODO: MSA로 전환시 전용 DTO로 변경 필요 + return cardSetRepository.findAllById(targetIds).stream() + .filter(cardSet -> cardSetPolicyService.isCardSetViewable(cardSet, userId)) + .map(CardSetSummaryResponse::from) + .toList(); + } } From e76720076321acf2fd0d48ffffa2631077b74b88 Mon Sep 17 00:00:00 2001 From: dungbik Date: Sun, 7 Sep 2025 11:23:26 +0900 Subject: [PATCH 3/4] =?UTF-8?q?Feat:=20=EA=B7=B8=EB=A3=B9=20=ED=83=88?= =?UTF-8?q?=ED=87=B4=EC=8B=9C=20=EC=A6=90=EA=B2=A8=EC=B0=BE=EA=B8=B0?= =?UTF-8?q?=ED=95=9C=20=EB=B9=84=EA=B3=B5=EA=B0=9C=20=EC=B9=B4=EB=93=9C?= =?UTF-8?q?=EC=85=8B=20=EC=82=AD=EC=A0=9C=20=EB=90=98=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GroupLeftCleanupBookmarkListener.java | 38 +++++++++++++++++++ .../repository/BookmarkRepository.java | 3 ++ .../bookmark/service/BookmarkService.java | 16 ++++++++ .../cardset/repository/CardSetRepository.java | 2 + .../cardset/service/CardSetService.java | 11 ++++++ .../common/model/event/GroupLeftEvent.java | 7 ++++ 6 files changed, 77 insertions(+) create mode 100644 src/main/java/project/flipnote/bookmark/listener/GroupLeftCleanupBookmarkListener.java create mode 100644 src/main/java/project/flipnote/common/model/event/GroupLeftEvent.java diff --git a/src/main/java/project/flipnote/bookmark/listener/GroupLeftCleanupBookmarkListener.java b/src/main/java/project/flipnote/bookmark/listener/GroupLeftCleanupBookmarkListener.java new file mode 100644 index 00000000..0f3cb44d --- /dev/null +++ b/src/main/java/project/flipnote/bookmark/listener/GroupLeftCleanupBookmarkListener.java @@ -0,0 +1,38 @@ +package project.flipnote.bookmark.listener; + +import org.springframework.retry.annotation.Backoff; +import org.springframework.retry.annotation.Recover; +import org.springframework.retry.annotation.Retryable; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; +import org.springframework.transaction.event.TransactionPhase; +import org.springframework.transaction.event.TransactionalEventListener; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import project.flipnote.bookmark.service.BookmarkService; +import project.flipnote.common.model.event.GroupLeftEvent; + +@Slf4j +@RequiredArgsConstructor +@Component +public class GroupLeftCleanupBookmarkListener { + + private final BookmarkService bookmarkService; + + @Async + @Retryable( + maxAttempts = 3, + backoff = @Backoff(delay = 2000, multiplier = 2) + ) + @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) + public void handleGroupLeftEvent(GroupLeftEvent event) { + // TODO: 해당 이벤트 그룹 탈퇴시 퍼블리싱되게 + bookmarkService.removePrivateCardSetBookmarks(event.groupId(), event.userId()); + } + + @Recover + public void recover(Exception ex, GroupLeftEvent event) { + log.error("그룹 탈퇴 후처리 - 비공개 카드셋 북마크 제거 실패: groupId={}, userId={}", event.groupId(), event.userId(), ex); + } +} diff --git a/src/main/java/project/flipnote/bookmark/repository/BookmarkRepository.java b/src/main/java/project/flipnote/bookmark/repository/BookmarkRepository.java index 2a9289f9..f51e5f99 100644 --- a/src/main/java/project/flipnote/bookmark/repository/BookmarkRepository.java +++ b/src/main/java/project/flipnote/bookmark/repository/BookmarkRepository.java @@ -1,6 +1,7 @@ package project.flipnote.bookmark.repository; import java.util.Optional; +import java.util.Set; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -15,4 +16,6 @@ public interface BookmarkRepository extends JpaRepository { Optional findByTargetTypeAndUserIdAndTargetId(BookmarkTargetType targetType, Long userId, Long targetId); Page findAllByTargetTypeAndUserId(BookmarkTargetType targetType, Long userId, Pageable pageable); + + int deleteByTargetTypeAndUserIdAndTargetIdIn(BookmarkTargetType targetType, Long userId, Set targetIds); } diff --git a/src/main/java/project/flipnote/bookmark/service/BookmarkService.java b/src/main/java/project/flipnote/bookmark/service/BookmarkService.java index 9550ecc8..c879756c 100644 --- a/src/main/java/project/flipnote/bookmark/service/BookmarkService.java +++ b/src/main/java/project/flipnote/bookmark/service/BookmarkService.java @@ -18,6 +18,7 @@ import project.flipnote.bookmark.model.BookmarkSearchRequest; import project.flipnote.bookmark.model.BookmarkTargetResponse; import project.flipnote.bookmark.repository.BookmarkRepository; +import project.flipnote.cardset.service.CardSetService; import project.flipnote.common.exception.BizException; import project.flipnote.common.model.response.IdResponse; import project.flipnote.common.model.response.PagingResponse; @@ -30,6 +31,7 @@ public class BookmarkService { private final BookmarkPolicyService bookmarkPolicyService; private final BookmarkRepository bookmarkRepository; private final BookmarkTargetFetchService bookmarkTargetFetchService; + private final CardSetService cardSetService; /** * 즐겨찾기 추가 @@ -111,4 +113,18 @@ public PagingResponse> getBookmarks( return PagingResponse.from(content); } + + /** + * 해당 그룹의 비공개 카드셋 즐겨찾기 제거 + * + * @param groupId 즐겨찾기를 제거할 카드셋이 속한 그룹 ID + * @param userId 즐겨찾기를 제거할 사용자 ID + * @author 윤정환 + */ + @Transactional + public void removePrivateCardSetBookmarks(Long groupId, Long userId) { + Set privateCardSetIds = cardSetService.findPrivateCardSetIds(groupId); + + bookmarkRepository.deleteByTargetTypeAndUserIdAndTargetIdIn(BookmarkTargetType.CARD_SET, userId, privateCardSetIds); + } } diff --git a/src/main/java/project/flipnote/cardset/repository/CardSetRepository.java b/src/main/java/project/flipnote/cardset/repository/CardSetRepository.java index 42a30727..b860f453 100644 --- a/src/main/java/project/flipnote/cardset/repository/CardSetRepository.java +++ b/src/main/java/project/flipnote/cardset/repository/CardSetRepository.java @@ -1,6 +1,7 @@ package project.flipnote.cardset.repository; import java.util.Optional; +import java.util.Set; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -29,4 +30,5 @@ Page findByNameContainingAndCategory( Optional findByIdAndGroup_Id(Long id, Long groupId); + Set findAllByGroup_IdAndPublicVisibleFalse(Long groupId); } diff --git a/src/main/java/project/flipnote/cardset/service/CardSetService.java b/src/main/java/project/flipnote/cardset/service/CardSetService.java index c9b4eb82..4110f0a9 100644 --- a/src/main/java/project/flipnote/cardset/service/CardSetService.java +++ b/src/main/java/project/flipnote/cardset/service/CardSetService.java @@ -250,4 +250,15 @@ public List findViewableCardSetsByIds(Set targetId .map(CardSetSummaryResponse::from) .toList(); } + + /** + * 해당 그룹의 비공개인 카드셋의 ID들을 조회 + * + * @param groupId 조회할 그룹의 ID + * @return 그룹에 속한 비공개 카드셋 ID의 집합 + * @author 윤정환 + */ + public Set findPrivateCardSetIds(Long groupId) { + return cardSetRepository.findAllByGroup_IdAndPublicVisibleFalse(groupId); + } } diff --git a/src/main/java/project/flipnote/common/model/event/GroupLeftEvent.java b/src/main/java/project/flipnote/common/model/event/GroupLeftEvent.java new file mode 100644 index 00000000..86c57a95 --- /dev/null +++ b/src/main/java/project/flipnote/common/model/event/GroupLeftEvent.java @@ -0,0 +1,7 @@ +package project.flipnote.common.model.event; + +public record GroupLeftEvent( + Long groupId, + Long userId +) { +} From 1ff53226b61e5ed4811be47b25df0ce7ec8b0600 Mon Sep 17 00:00:00 2001 From: dungbik Date: Tue, 9 Sep 2025 19:24:12 +0900 Subject: [PATCH 4/4] =?UTF-8?q?Refactor:=20=EC=BD=94=EB=93=9C=20=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EB=82=B4=EC=9A=A9=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flipnote/bookmark/service/BookmarkService.java | 3 +++ .../flipnote/cardset/repository/CardSetRepository.java | 7 ++++++- .../flipnote/cardset/service/CardSetPolicyService.java | 7 +++++++ .../project/flipnote/cardset/service/CardSetService.java | 2 +- .../java/project/flipnote/common/config/RetryConfig.java | 9 +++++++++ 5 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 src/main/java/project/flipnote/common/config/RetryConfig.java diff --git a/src/main/java/project/flipnote/bookmark/service/BookmarkService.java b/src/main/java/project/flipnote/bookmark/service/BookmarkService.java index c879756c..e38a8ee1 100644 --- a/src/main/java/project/flipnote/bookmark/service/BookmarkService.java +++ b/src/main/java/project/flipnote/bookmark/service/BookmarkService.java @@ -124,6 +124,9 @@ public PagingResponse> getBookmarks( @Transactional public void removePrivateCardSetBookmarks(Long groupId, Long userId) { Set privateCardSetIds = cardSetService.findPrivateCardSetIds(groupId); + if (privateCardSetIds == null || privateCardSetIds.isEmpty()) { + return; + } bookmarkRepository.deleteByTargetTypeAndUserIdAndTargetIdIn(BookmarkTargetType.CARD_SET, userId, privateCardSetIds); } diff --git a/src/main/java/project/flipnote/cardset/repository/CardSetRepository.java b/src/main/java/project/flipnote/cardset/repository/CardSetRepository.java index b860f453..91f10e06 100644 --- a/src/main/java/project/flipnote/cardset/repository/CardSetRepository.java +++ b/src/main/java/project/flipnote/cardset/repository/CardSetRepository.java @@ -30,5 +30,10 @@ Page findByNameContainingAndCategory( Optional findByIdAndGroup_Id(Long id, Long groupId); - Set findAllByGroup_IdAndPublicVisibleFalse(Long groupId); + @Query(""" + SELECT c.id FROM CardSet c + WHERE c.group.id = :groupId + AND c.publicVisible = false + """) + Set findPrivateIdsByGroupId(@Param("groupId") Long groupId); } diff --git a/src/main/java/project/flipnote/cardset/service/CardSetPolicyService.java b/src/main/java/project/flipnote/cardset/service/CardSetPolicyService.java index 564213cc..58a5d18d 100644 --- a/src/main/java/project/flipnote/cardset/service/CardSetPolicyService.java +++ b/src/main/java/project/flipnote/cardset/service/CardSetPolicyService.java @@ -66,6 +66,13 @@ public void validateCardSetViewable(CardSet cardSet, Long userId) { * @author 윤정환 */ public boolean isCardSetViewable(CardSet cardSet, Long userId) { + if (cardSet == null || userId == null) { + return false; + } + if (cardSet.getGroup() == null || cardSet.getGroup().getId() == null) { + return false; + } + return cardSet.getPublicVisible() || groupService.existsMember(cardSet.getGroup().getId(), userId); } } diff --git a/src/main/java/project/flipnote/cardset/service/CardSetService.java b/src/main/java/project/flipnote/cardset/service/CardSetService.java index 4110f0a9..cb9dc43c 100644 --- a/src/main/java/project/flipnote/cardset/service/CardSetService.java +++ b/src/main/java/project/flipnote/cardset/service/CardSetService.java @@ -259,6 +259,6 @@ public List findViewableCardSetsByIds(Set targetId * @author 윤정환 */ public Set findPrivateCardSetIds(Long groupId) { - return cardSetRepository.findAllByGroup_IdAndPublicVisibleFalse(groupId); + return cardSetRepository.findPrivateIdsByGroupId(groupId); } } diff --git a/src/main/java/project/flipnote/common/config/RetryConfig.java b/src/main/java/project/flipnote/common/config/RetryConfig.java new file mode 100644 index 00000000..662e12ca --- /dev/null +++ b/src/main/java/project/flipnote/common/config/RetryConfig.java @@ -0,0 +1,9 @@ +package project.flipnote.common.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.retry.annotation.EnableRetry; + +@EnableRetry +@Configuration +public class RetryConfig { +}