Update: kakao 리뷰 중복 체크
This commit is contained in:
parent
1a1f3b787e
commit
7d880f552a
@ -8,6 +8,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.ktds.hi.review.biz.domain.Review;
|
||||
import com.ktds.hi.review.biz.domain.ReviewStatus;
|
||||
import com.ktds.hi.review.biz.usecase.out.ReviewRepository;
|
||||
import com.ktds.hi.review.infra.gateway.repository.ReviewJpaRepository;
|
||||
import jakarta.annotation.PostConstruct;
|
||||
import jakarta.annotation.PreDestroy;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
@ -33,7 +34,7 @@ public class ExternalReviewEventHubAdapter {
|
||||
|
||||
@Qualifier("externalReviewEventConsumer")
|
||||
private final EventHubConsumerClient externalReviewEventConsumer;
|
||||
|
||||
private final ReviewJpaRepository reviewJpaRepository;
|
||||
private final ObjectMapper objectMapper;
|
||||
private final ReviewRepository reviewRepository;
|
||||
|
||||
@ -119,10 +120,21 @@ public class ExternalReviewEventHubAdapter {
|
||||
String platform = (String) event.get("platform");
|
||||
Integer syncedCount = (Integer) event.get("syncedCount");
|
||||
|
||||
|
||||
// Store에서 발행하는 reviews 배열 처리
|
||||
@SuppressWarnings("unchecked")
|
||||
List<Map<String, Object>> reviews = (List<Map<String, Object>>) event.get("reviews");
|
||||
|
||||
if (reviews != null) {
|
||||
for (int i = 0; i < reviews.size(); i++) {
|
||||
Map<String, Object> review = reviews.get(i);
|
||||
log.info("Review[{}]: {}", i, review);
|
||||
}
|
||||
} else {
|
||||
log.info("No reviews found in event.");
|
||||
}
|
||||
|
||||
|
||||
if (reviews == null || reviews.isEmpty()) {
|
||||
log.warn("리뷰 데이터가 없습니다: platform={}, storeId={}", platform, storeId);
|
||||
return;
|
||||
@ -157,16 +169,22 @@ public class ExternalReviewEventHubAdapter {
|
||||
*/
|
||||
private Review saveExternalReview(Long storeId, String platform, Map<String, Object> reviewData) {
|
||||
try {
|
||||
String nickname = createMemberNickname(platform, reviewData);
|
||||
// ✅ 단순화된 매핑
|
||||
if (reviewJpaRepository.existsByStoreIdAndExternalNickname(storeId, nickname)) {
|
||||
log.info("중복 리뷰 스킵: storeId={}, nickname={}", storeId, nickname);
|
||||
return null;
|
||||
}
|
||||
|
||||
Review review = Review.builder()
|
||||
.storeId(storeId)
|
||||
.memberId(null) // 외부 리뷰는 회원 ID 없음
|
||||
.memberId(-1L)
|
||||
.memberNickname(createMemberNickname(platform, reviewData))
|
||||
.rating(extractRating(reviewData))
|
||||
.content(extractContent(reviewData))
|
||||
.imageUrls(new ArrayList<>()) // 외부 리뷰는 이미지 없음
|
||||
.status(ReviewStatus.ACTIVE)
|
||||
.likeCount(0) // ✅ 고정값 0
|
||||
.likeCount(0)
|
||||
.dislikeCount(0)
|
||||
.build();
|
||||
|
||||
|
||||
@ -5,6 +5,8 @@ import com.ktds.hi.review.infra.gateway.entity.ReviewEntity;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.data.jpa.repository.Query;
|
||||
import org.springframework.data.repository.query.Param;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.Optional;
|
||||
@ -30,9 +32,11 @@ public interface ReviewJpaRepository extends JpaRepository<ReviewEntity, Long> {
|
||||
* 리뷰 ID와 회원 ID로 리뷰 조회
|
||||
*/
|
||||
Optional<ReviewEntity> findByIdAndMemberId(Long id, Long memberId);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 매장 ID와 회원 ID로 리뷰 존재 여부 확인
|
||||
* 닉네임으로 외부 리뷰 중복 체크
|
||||
*/
|
||||
boolean existsByStoreIdAndMemberId(Long storeId, Long memberId);
|
||||
@Query("SELECT COUNT(r) > 0 FROM ReviewEntity r WHERE r.storeId = :storeId AND r.memberId = -1 AND r.memberNickname = :nickname")
|
||||
boolean existsByStoreIdAndExternalNickname(@Param("storeId") Long storeId, @Param("nickname") String nickname);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user