Skip to content

Commit

Permalink
feat: Processor를 적용해 UpdatteReviewService 리팩토링
Browse files Browse the repository at this point in the history
  • Loading branch information
pminsung12 committed Sep 8, 2024
1 parent 73b47ad commit cb8d0cd
Showing 1 changed file with 21 additions and 100 deletions.
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
package org.depromeet.spot.usecase.service.review;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

import org.depromeet.spot.common.exception.review.ReviewException.UnauthorizedReviewModificationException;
import org.depromeet.spot.domain.member.Member;
import org.depromeet.spot.domain.review.Review;
import org.depromeet.spot.domain.review.image.ReviewImage;
import org.depromeet.spot.domain.review.keyword.Keyword;
import org.depromeet.spot.domain.review.keyword.ReviewKeyword;
import org.depromeet.spot.domain.seat.Seat;
import org.depromeet.spot.usecase.port.in.review.UpdateReviewUsecase;
import org.depromeet.spot.usecase.port.out.block.BlockRepository;
import org.depromeet.spot.usecase.port.out.block.BlockRowRepository;
import org.depromeet.spot.usecase.port.out.review.BlockTopKeywordRepository;
import org.depromeet.spot.usecase.port.out.review.KeywordRepository;
import org.depromeet.spot.usecase.port.out.review.ReviewRepository;
import org.depromeet.spot.usecase.port.out.seat.SeatRepository;
import org.depromeet.spot.usecase.port.out.section.SectionRepository;
import org.depromeet.spot.usecase.port.out.stadium.StadiumRepository;
import org.depromeet.spot.usecase.service.review.processor.ReviewCreationProcessor;
import org.depromeet.spot.usecase.service.review.processor.ReviewDataProcessor;
import org.depromeet.spot.usecase.service.review.processor.ReviewImageProcessor;
import org.depromeet.spot.usecase.service.review.processor.ReviewKeywordProcessor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

Expand All @@ -32,34 +32,37 @@
@Transactional
public class UpdateReviewService implements UpdateReviewUsecase {

private final StadiumRepository stadiumRepository;
private final BlockRepository blockRepository;
private final SectionRepository sectionRepository;
private final BlockRowRepository blockRowRepository;
private final ReviewRepository reviewRepository;
private final SeatRepository seatRepository;
private final KeywordRepository keywordRepository;
private final BlockTopKeywordRepository blockTopKeywordRepository;
private final ReviewDataProcessor reviewDataProcessor;
private final ReviewKeywordProcessor reviewKeywordProcessor;
private final ReviewImageProcessor reviewImageProcessor;
private final ReviewCreationProcessor reviewCreationProcessor;

public UpdateReviewResult updateReview(
Long memberId, Long reviewId, UpdateReviewCommand command) {
// 1. review id로 조회
Review existingReview = reviewRepository.findById(reviewId);

if (!existingReview.getMember().getId().equals(memberId)) {
throw new UnauthorizedReviewModificationException();
}

Member member = existingReview.getMember();
Seat seat = seatRepository.findByIdWith(command.blockId(), command.seatNumber());

// 새로운 Review 객체 생성
Review updatedReview = createUpdatedReview(reviewId, member, seat, command, existingReview);
// 2. 새로운 Review 객체 생성
Review updatedReview = reviewCreationProcessor.updateReviewData(existingReview, command);

// keyword와 image 처리
Map<Long, Keyword> keywordMap =
processKeywords(updatedReview, command.good(), command.bad());
processImages(updatedReview, command.images());
reviewCreationProcessor.processReviewDetails(updatedReview, command);

// 저장 및 blockTopKeyword 업데이트
Review savedReview = reviewRepository.save(updatedReview);
updateBlockTopKeywords(existingReview, savedReview);

reviewKeywordProcessor.updateBlockTopKeywords(existingReview, savedReview);
savedReview.setKeywordMap(keywordMap);

return new UpdateReviewResult(savedReview);
Expand All @@ -74,86 +77,4 @@ public void updateLikesCount(Review review) {
public void updateScrapsCount(Review review) {
reviewRepository.updateScrapsCount(review.getId(), review.getScrapsCount());
}

private Review createUpdatedReview(
Long reviewId,
Member member,
Seat seat,
UpdateReviewCommand command,
Review savedReview) {
return Review.builder()
.id(reviewId)
.member(member)
.stadium(seat.getStadium())
.section(seat.getSection())
.block(seat.getBlock())
.row(seat.getRow())
.seat(seat)
.dateTime(command.dateTime())
.content(command.content())
.likesCount(savedReview.getLikesCount())
.build();
}

private Map<Long, Keyword> processKeywords(
Review review, List<String> goodKeywords, List<String> badKeywords) {
Map<Long, Keyword> keywordMap = new HashMap<>();
processKeywordList(review, goodKeywords, true, keywordMap);
processKeywordList(review, badKeywords, false, keywordMap);

return keywordMap;
}

private void processKeywordList(
Review review,
List<String> keywordContents,
boolean isPositive,
Map<Long, Keyword> keywordMap) {
for (String content : keywordContents) {
Keyword keyword =
keywordRepository
.findByContent(content)
.orElseGet(
() ->
keywordRepository.save(
Keyword.create(null, content, isPositive)));

ReviewKeyword reviewKeyword = ReviewKeyword.create(null, keyword.getId());
review.addKeyword(reviewKeyword);
keywordMap.put(keyword.getId(), keyword);
}
}

private void processImages(Review review, List<String> imageUrls) {
for (String url : imageUrls) {
ReviewImage image = ReviewImage.create(null, review, url);
review.addImage(image);
}
}

private void updateBlockTopKeywords(Review oldReview, Review newReview) {
Set<Long> oldKeywordIds =
oldReview.getKeywords().stream()
.map(ReviewKeyword::getKeywordId)
.collect(Collectors.toSet());
Set<Long> newKeywordIds =
newReview.getKeywords().stream()
.map(ReviewKeyword::getKeywordId)
.collect(Collectors.toSet());

List<Long> decrementIds =
oldKeywordIds.stream()
.filter(id -> !newKeywordIds.contains(id))
.collect(Collectors.toList());

List<Long> incrementIds =
newKeywordIds.stream()
.filter(id -> !oldKeywordIds.contains(id))
.collect(Collectors.toList());

if (!decrementIds.isEmpty() || !incrementIds.isEmpty()) {
blockTopKeywordRepository.batchUpdateCounts(
newReview.getBlock().getId(), incrementIds, decrementIds);
}
}
}

0 comments on commit cb8d0cd

Please sign in to comment.