diff --git a/src/main/java/issueissyu/backend/domain/community/repository/CommunityRepository.java b/src/main/java/issueissyu/backend/domain/community/repository/CommunityRepository.java index a7cd180..28e5fb5 100644 --- a/src/main/java/issueissyu/backend/domain/community/repository/CommunityRepository.java +++ b/src/main/java/issueissyu/backend/domain/community/repository/CommunityRepository.java @@ -47,6 +47,18 @@ public interface CommunityRepository extends JpaRepository { join fetch c.pin p join fetch p.user where c.communityType = :type + and ( + :type not in ( + issueissyu.backend.domain.community.enums.CommunityType.STORE, + issueissyu.backend.domain.community.enums.CommunityType.FESTIVAL + ) + or exists ( + select 1 + from EventPin ep + where ep.pin = p + and :now between ep.eventStartTime and ep.eventEndTime + ) + ) and exists ( select 1 from PinLocation pl @@ -62,6 +74,7 @@ and exists ( """) List findFeedByTypeAndRegion( @Param("type") CommunityType type, + @Param("now") LocalDateTime now, @Param("locationId") Long locationId, @Param("cursorCreatedAt") LocalDateTime cursorCreatedAt, @Param("cursorId") Long cursorId, @@ -80,6 +93,18 @@ List findFeedByTypeAndRegion( join fetch c.pin p join fetch p.user where c.communityType in :types + and ( + c.communityType not in ( + issueissyu.backend.domain.community.enums.CommunityType.STORE, + issueissyu.backend.domain.community.enums.CommunityType.FESTIVAL + ) + or exists ( + select 1 + from EventPin ep + where ep.pin = p + and :now between ep.eventStartTime and ep.eventEndTime + ) + ) and exists ( select 1 from PinLocation pl @@ -95,6 +120,7 @@ and exists ( """) List findFeedByTypesAndRegion( @Param("types") Collection types, + @Param("now") LocalDateTime now, @Param("locationId") Long locationId, @Param("cursorCreatedAt") LocalDateTime cursorCreatedAt, @Param("cursorId") Long cursorId, @@ -175,6 +201,18 @@ List findCardnewsFeedByTypesWithImages( where ( ( c.communityType in :regionTypes + and ( + c.communityType not in ( + issueissyu.backend.domain.community.enums.CommunityType.STORE, + issueissyu.backend.domain.community.enums.CommunityType.FESTIVAL + ) + or exists ( + select 1 + from EventPin ep + where ep.pin = p + and :now between ep.eventStartTime and ep.eventEndTime + ) + ) and exists ( select 1 from PinLocation pl @@ -194,6 +232,7 @@ and exists ( List findFeedByRegionOrGlobalTypes( @Param("regionTypes") Collection regionTypes, @Param("globalTypes") Collection globalTypes, + @Param("now") LocalDateTime now, @Param("locationId") Long locationId, @Param("cursorCreatedAt") LocalDateTime cursorCreatedAt, @Param("cursorId") Long cursorId, @@ -221,6 +260,18 @@ List findFeedByRegionOrGlobalTypes( where ( ( c.communityType in :regionTypes + and ( + c.communityType not in ( + issueissyu.backend.domain.community.enums.CommunityType.STORE, + issueissyu.backend.domain.community.enums.CommunityType.FESTIVAL + ) + or exists ( + select 1 + from EventPin ep + where ep.pin = p + and :now between ep.eventStartTime and ep.eventEndTime + ) + ) and exists ( select 1 from PinLocation pl @@ -241,6 +292,7 @@ and exists ( List findHotFeedByRegionOrGlobalTypes( @Param("regionTypes") Collection regionTypes, @Param("globalTypes") Collection globalTypes, + @Param("now") LocalDateTime now, @Param("locationId") Long locationId, @Param("since") LocalDateTime since, @Param("cursorPopularity") Double cursorPopularity, diff --git a/src/main/java/issueissyu/backend/domain/community/service/query/CommunityHotQueryServiceImpl.java b/src/main/java/issueissyu/backend/domain/community/service/query/CommunityHotQueryServiceImpl.java index cdb1588..bdd4d6f 100644 --- a/src/main/java/issueissyu/backend/domain/community/service/query/CommunityHotQueryServiceImpl.java +++ b/src/main/java/issueissyu/backend/domain/community/service/query/CommunityHotQueryServiceImpl.java @@ -34,12 +34,14 @@ public class CommunityHotQueryServiceImpl implements CommunityHotQueryService { @Override public Optional findTopHotInRegion(Long locationId) { + LocalDateTime now = LocalDateTime.now(); LocalDateTime since = LocalDateTime.now().minusDays(HOT_DAYS); Pageable limit = PageRequest.of(0, 1); List communities = communityRepository.findHotFeedByRegionOrGlobalTypes( REGION_BASED_FEED_TYPES, GLOBAL_FEED_TYPES, + now, locationId, since, null, diff --git a/src/main/java/issueissyu/backend/domain/community/service/query/CommunityQueryServiceImpl.java b/src/main/java/issueissyu/backend/domain/community/service/query/CommunityQueryServiceImpl.java index b15fe1c..3a9b93d 100644 --- a/src/main/java/issueissyu/backend/domain/community/service/query/CommunityQueryServiceImpl.java +++ b/src/main/java/issueissyu/backend/domain/community/service/query/CommunityQueryServiceImpl.java @@ -249,10 +249,12 @@ public CommunityQueryService.CommunityDetailResult getCommunityDetail( private List fetchCommunities(CommunityTab tab, Long locationId, CursorKey cursorKey) { Pageable limit = PageRequest.of(0, sizeWithLookahead(cursorKey.requestSize())); + LocalDateTime now = LocalDateTime.now(); return switch (tab) { case ISSUE -> communityRepository.findFeedByTypeAndRegion( CommunityType.ISSUE, + now, locationId, cursorKey.createdAt(), cursorKey.communityId(), @@ -261,6 +263,7 @@ private List fetchCommunities(CommunityTab tab, Long locationId, Curs case STORE -> communityRepository.findFeedByTypeAndRegion( CommunityType.STORE, + now, locationId, cursorKey.createdAt(), cursorKey.communityId(), @@ -269,6 +272,7 @@ private List fetchCommunities(CommunityTab tab, Long locationId, Curs case COMMUNICATION -> communityRepository.findFeedByTypeAndRegion( CommunityType.COMMUNICATION, + now, locationId, cursorKey.createdAt(), cursorKey.communityId(), @@ -277,6 +281,7 @@ private List fetchCommunities(CommunityTab tab, Long locationId, Curs case FESTIVAL -> communityRepository.findFeedByTypeAndRegion( CommunityType.FESTIVAL, + now, locationId, cursorKey.createdAt(), cursorKey.communityId(), @@ -307,6 +312,7 @@ private List fetchCommunities(CommunityTab tab, Long locationId, Curs case ALL -> communityRepository.findFeedByRegionOrGlobalTypes( REGION_BASED_FEED_TYPES, GLOBAL_FEED_TYPES, + now, locationId, cursorKey.createdAt(), cursorKey.communityId(), @@ -344,9 +350,11 @@ private boolean usesRegion(CommunityTab tab) { private List fetchStorePromotions(Long locationId, int storeSize) { int resolvedSize = Math.min(Math.max(1, storeSize), MAX_STORE_SIZE); Pageable limit = PageRequest.of(0, resolvedSize); + LocalDateTime now = LocalDateTime.now(); List communities = communityRepository.findFeedByTypeAndRegion( CommunityType.STORE, + now, locationId, null, null, @@ -357,12 +365,14 @@ private List fetchStorePromotions(Long locationId, int } private List fetchHotPreviews(Long locationId) { + LocalDateTime now = LocalDateTime.now(); LocalDateTime since = LocalDateTime.now().minusDays(HOT_DAYS); Pageable limit = PageRequest.of(0, HOT_PREVIEW_SIZE); return toFeedItems(communityRepository.findHotFeedByRegionOrGlobalTypes( REGION_BASED_FEED_TYPES, GLOBAL_FEED_TYPES, + now, locationId, since, null, @@ -374,9 +384,11 @@ private List fetchHotPreviews(Long locationId) { private CommunityCursorPageResDTO fetchRecentNews(Long locationId, String recentCursor, int recentSize) { CursorKey cursorKey = CursorKey.parse(recentCursor, recentSize); Pageable limit = PageRequest.of(0, sizeWithLookahead(cursorKey.requestSize())); + LocalDateTime now = LocalDateTime.now(); List communities = communityRepository.findFeedByTypesAndRegion( REGION_BASED_FEED_TYPES, + now, locationId, cursorKey.createdAt(), cursorKey.communityId(), @@ -715,12 +727,14 @@ private String resolveWriterProfileUrl(CommunityType type, Pin pin) { private CommunityCursorPageResDTO getHotFeed(Long locationId, String cursor, int size) { HotCursorKey cursorKey = HotCursorKey.parse(cursor, size); + LocalDateTime now = LocalDateTime.now(); LocalDateTime since = LocalDateTime.now().minusDays(HOT_DAYS); Pageable limit = PageRequest.of(0, sizeWithLookahead(size)); List communities = communityRepository.findHotFeedByRegionOrGlobalTypes( REGION_BASED_FEED_TYPES, GLOBAL_FEED_TYPES, + now, locationId, since, cursorKey.popularity(),