이전에 사용하던 별점 통계내는 쿼리가 잘못되었다.
판매자의 게시글에 대한 리뷰의 평점을 종합해서 받아오게 작성하면 되는 상황이었는데,
이전 쿼리는 상대방의 id에 바로 평점을 부여하는 방식이라 서비스 코드가 제대로 작동이 되질 않았다.
@Query ("SELECT AVG(r.rating) FROM Review r WHERE r.post.member.id = :memberId")
override fun createReview(
postId: Int,
request: CreateReviewRequest,
principal: UserPrincipal
): MessageResponse {
val post = postRepository.findByIdOrNull(postId)
?: throw ModelNotFoundException("Post", postId)
val member = memberRepository.findByIdOrNull(principal.id)
?: throw ModelNotFoundException("Member", principal.id)
val seller = post.member
if (!post.isSoldOut) {
throw IllegalStateException("판매되지 않은 물품에 리뷰를 작성할 수 없습니다.")
}
// order.memberId == review.memberId 일 경우에 작성가능한 메서드 추가
// review 중복작성 불가한 예외 추가
post.myPostCheckPermission(principal)
val sellerReview = Review.makeEntity(
request = request.copy(sellerRating = request.rating),
post = post,
member = member
)
reviewRepository.save(sellerReview)
val averageRating = reviewRepository.getAverageRatingByMember(seller.id!!)
seller.sellerRating = averageRating
memberRepository.save(seller)
return MessageResponse("리뷰가 작성되었습니다.")
}
코드가 굉장히 더럽다..
엔티티에서 메서드를 작성하는 방식을 쓰다가 구현하느라 일단 서비스 쪽에서 계속 작성했는데
리팩터링할 때 전체 수정을 해야겠다.
그리고 아직 orderId와 review의 memberId가 일치할 때만 글을 쓰게하는 기능이 없다.
평점 위주로 구현을 하다보니 계속 미루게 된다.
지금 또 피드백으로 MVP 내용에 아직 단순한 CRUD만 있는 것 같다고 동시성 제어를 하는 기능을 추가해보라고 해서
부랴부랴 기능을 추가구현 하고있다. 선착순 쿠폰기능을 구현하고 있는데 생각보다 잘 안된다....
'내일배움캠프 프로젝트' 카테고리의 다른 글
BuySell - 선착순 쿠폰발급 (2) (0) | 2024.03.20 |
---|---|
BuySell - 선착순 쿠폰발급 (0) | 2024.03.20 |
BuySell - 별점기능 구현 (0) | 2024.03.13 |
최종프로젝트 (BuySell) 중고거래 플랫폼 서비스 (0) | 2024.03.07 |
백오피스 프로젝트 (1) | 2024.02.13 |