내일배움캠프 프로젝트

Buysell - 별점기능 구현(2)

공부처음하는사람 2024. 3. 20. 00:45

 

이전에 사용하던 별점 통계내는 쿼리가 잘못되었다.

판매자의 게시글에 대한 리뷰의 평점을 종합해서 받아오게 작성하면 되는 상황이었는데,

이전 쿼리는 상대방의 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만 있는 것 같다고 동시성 제어를 하는 기능을 추가해보라고 해서

부랴부랴 기능을 추가구현 하고있다. 선착순 쿠폰기능을 구현하고 있는데 생각보다 잘 안된다....