Skip to content

Commit

Permalink
Feat: 인기 피드는 삭제 못하게 설정
Browse files Browse the repository at this point in the history
  • Loading branch information
jzakka committed Feb 9, 2024
1 parent eef16d7 commit 2c0e01d
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 3 deletions.
10 changes: 10 additions & 0 deletions src/main/java/com/stoury/exception/feed/FeedDeleteException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.stoury.exception.feed;

public class FeedDeleteException extends RuntimeException {
public FeedDeleteException() {
}

public FeedDeleteException(String message) {
super(message);
}
}
6 changes: 6 additions & 0 deletions src/main/java/com/stoury/repository/RankingRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -50,4 +50,10 @@ public List<String> getRankedFeedIds(HotFeedsKeys key) {
}
return rankedFeedIds.stream().toList();
}

public boolean contains(HotFeedsKeys key, String feedId) {
Set<String> ids = opsForZset.range(key.toString(), 0, -1);

return ids != null && ids.contains(feedId);
}
}
6 changes: 5 additions & 1 deletion src/main/java/com/stoury/service/FeedService.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,12 @@
import com.stoury.event.GraphicDeleteEvent;
import com.stoury.event.GraphicSaveEvent;
import com.stoury.exception.feed.FeedCreateException;
import com.stoury.exception.feed.FeedDeleteException;
import com.stoury.exception.feed.FeedSearchException;
import com.stoury.exception.member.MemberSearchException;
import com.stoury.repository.FeedRepository;
import com.stoury.repository.LikeRepository;
import com.stoury.repository.MemberRepository;
import com.stoury.repository.RankingRepository;
import com.stoury.service.location.LocationService;
import com.stoury.utils.FileUtils;
import com.stoury.utils.SupportedFileType;
Expand Down Expand Up @@ -47,6 +47,7 @@ public class FeedService {
private final MemberRepository memberRepository;
private final LikeRepository likeRepository;
private final TagService tagService;
private final RankingService rankingService;
private final LocationService locationService;
private final ApplicationEventPublisher eventPublisher;

Expand Down Expand Up @@ -173,6 +174,9 @@ private void publishDeleteFileEvents(List<GraphicContent> beforeDeleteGraphicCon
@PostAuthorize("returnObject.writer().id() == authentication.name")
@Transactional
public FeedResponse deleteFeed(Long feedId) {
if (rankingService.isRankedFeed(feedId)) {
throw new FeedDeleteException("As the feed is in hot feeds, cannot delete this.");
}
Feed feed = feedRepository.findById(Objects.requireNonNull(feedId))
.orElseThrow(FeedSearchException::new);
feedRepository.delete(feed);
Expand Down
20 changes: 19 additions & 1 deletion src/main/java/com/stoury/service/RankingService.java
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
package com.stoury.service;

import com.stoury.dto.feed.FeedResponse;
import com.stoury.exception.feed.FeedSearchException;
import com.stoury.repository.FeedRepository;
import com.stoury.repository.LikeRepository;
import com.stoury.repository.RankingRepository;
import com.stoury.utils.cachekeys.HotFeedsKeys;
import com.stoury.utils.cachekeys.PopularSpotsKey;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.time.temporal.ChronoUnit;
import java.util.Comparator;
import java.util.List;

import static com.stoury.utils.cachekeys.HotFeedsKeys.getHotFeedsKey;
Expand All @@ -25,10 +28,16 @@ public List<FeedResponse> getHotFeeds(ChronoUnit chronoUnit) {
.stream()
.map(Long::parseLong)
.toList();
return feedRepository.findAllById(feedIds)
List<FeedResponse> hotFeeds = feedRepository.findAllById(feedIds)
.stream()
.map(feed -> FeedResponse.from(feed, likeRepository.getLikes(feed.getId().toString())))
.sorted(Comparator.comparing(FeedResponse::likes).reversed())
.toList();
if (hotFeeds.size() != feedIds.size()) {
throw new FeedSearchException("Cannot find HotFeeds");
}

return hotFeeds;
}


Expand All @@ -39,4 +48,13 @@ public List<String> getPopularAbroadSpots() {
public List<String> getPopularDomesticSpots() {
return rankingRepository.getRankedLocations(PopularSpotsKey.POPULAR_DOMESTIC_SPOTS);
}

public boolean isRankedFeed(Long feedId) {
for (HotFeedsKeys key : HotFeedsKeys.values()) {
if (rankingRepository.contains(key, feedId.toString())) {
return true;
}
}
return false;
}
}
13 changes: 12 additions & 1 deletion src/test/groovy/com/stoury/service/FeedServiceTest.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import com.stoury.dto.feed.FeedCreateRequest
import com.stoury.dto.feed.FeedUpdateRequest
import com.stoury.event.GraphicDeleteEvent
import com.stoury.exception.feed.FeedCreateException
import com.stoury.exception.feed.FeedDeleteException
import com.stoury.repository.FeedRepository
import com.stoury.repository.LikeRepository
import com.stoury.repository.MemberRepository
Expand All @@ -20,12 +21,13 @@ import spock.lang.Specification
class FeedServiceTest extends Specification {
def memberRepository = Mock(MemberRepository)
def tagService = Mock(TagService)
def rankingServie = Mock(RankingService)
def feedRepository = Mock(FeedRepository)
def likeRepository = Mock(LikeRepository)
def eventPublisher = Mock(ApplicationEventPublisher)
def locationService = Mock(LocationService)
def feedService = new FeedService(feedRepository, memberRepository, likeRepository,
tagService, locationService, eventPublisher)
tagService, rankingServie, locationService, eventPublisher)

def writer = Mock(Member)
def feedCreateRequest = FeedCreateRequest.builder()
Expand Down Expand Up @@ -107,4 +109,13 @@ class FeedServiceTest extends Specification {
feed.textContent == "updated"
feed.tags.isEmpty()
}

def "인기 피드는 삭제 불가"() {
given:
rankingServie.isRankedFeed(_) >> true
when:
feedService.deleteFeed(1L)
then:
thrown(FeedDeleteException)
}
}

0 comments on commit 2c0e01d

Please sign in to comment.