본문 바로가기

카테고리 없음

24.03.28 리뷰에 상품인식, 좋아요에 providerid

 

팀장님의 테스트 결과, 리뷰는 상품과 거기에 달린 주문 아이디를 입력해서 리뷰를 쓰는 식인데, 3번 상품에 주문했는데도 1번 상품으로 해도 작동이 된다는걸 발견했다. 그래서 리뷰를 수정중인데,

 

fun findByIdAndSocialUserId(orderId: Long, socialUserId: Long): Optional<OrdersEntity>

 

이것만으론 productid를 어떻게 할수가 없다. 그래서 prduct 번호를 입력하는데 의미가 없던 것이다.

fun findByIdAndSocialUserIdAndProductId(orderId: Long, socialUserId: Long, productId: Long): Optional<OrdersEntity>

 

이렇게하면 이제 상품 아이디도 인식 가능하다.

 

 val order = orderRepository.findByIdAndSocialUserId(orderId, userId)
            .orElseThrow { ModelNotFoundException("주문내역을 확인할 수 없습니다", orderId) }

 

이것도 이제 상품 아이디를 받을수 있게

val order = orderRepository.findByIdAndSocialUserIdAndProductId(orderId, userId, productId)
    .orElseThrow { ModelNotFoundException("해당 상품에 대한 주문내역을 확인할 수 없습니다.", orderId) }

 

이렇게 바꿔준다.

 

 

 

그리고 이제는 똑같이 소셜유저를 받는 like를 review처럼 providerid를 받도록 개조한다.

 

@Service
class LikeServiceImpl(
private val productRepository: ProductRepository,
private val likeRepository: LikeRepository,
private val reviewRepository: ReviewRepository,
private val socialUserRepository: SocialUserRepository,
) : LikeService {
@Transactional
override fun addLikeToProduct(
productId: Long,
socialUserId: Long,
) {
val product =
productRepository.findById(productId)
.orElseThrow { throw ModelNotFoundException("Product", productId) }


    if (product.deletedAt != null) {
        throw Exception("없는 상품입니다")
    }

    val user =
        socialUserRepository.findById(socialUserId)
            .orElseThrow { throw ModelNotFoundException("User", socialUserId) }

    val existingLike = likeRepository.findByProductAndSocialUser(product, user)
    if (existingLike != null) {
        throw IllegalArgumentException("이미 좋아요를 누른 상품입니다")
    }

    likeRepository.save(Like(product = product, socialUser = user, status = true))
    product.likes++
    productRepository.save(product)
}

@Transactional
override fun removeLikeFromProduct(
    productId: Long,
    socialUserId: Long,
) {
    val product =
        productRepository.findById(productId)
            .orElseThrow { throw ModelNotFoundException("Product", productId) }
    val user =
        socialUserRepository.findById(socialUserId)
            .orElseThrow { throw ModelNotFoundException("User", socialUserId) }

    val like = likeRepository.findByProductAndSocialUser(product, user)
    if (like != null) {
        if (like.socialUser.id != socialUserId) {
            throw IllegalArgumentException("권한이 없습니다")
        }
        likeRepository.delete(like)

        if (product.likes > 0) {
            product.likes--
            productRepository.save(product)
        }
    } else {
        throw IllegalArgumentException("좋아요가 없습니다")
    }
}

@Transactional
override fun addLikeToReview(
    reviewId: Long,
    socialUserId: Long,
) {
    val review =
        reviewRepository.findById(reviewId)
            .orElseThrow { throw ModelNotFoundException("Review", reviewId) }

    if (review.deletedAt != null) {
        throw Exception("없는 리뷰입니다")
    }

    val user =
        socialUserRepository.findById(socialUserId)
            .orElseThrow { throw ModelNotFoundException("User", socialUserId) }

    val existingLike = likeRepository.findByReviewAndSocialUser(review, user)
    if (existingLike != null) {
        throw IllegalArgumentException("이미 좋아요를 누른 리뷰입니다")
    }

    likeRepository.save(Like(review = review, socialUser = user, status = true))
    review.likes++
    reviewRepository.save(review)
}

@Transactional
override fun removeLikeFromReview(
    reviewId: Long,
    socialUserId: Long,
) {
    val review =
        reviewRepository.findById(reviewId)
            .orElseThrow { throw ModelNotFoundException("Review", reviewId) }
    val user =
        socialUserRepository.findById(socialUserId)
            .orElseThrow { throw ModelNotFoundException("User", socialUserId) }

    val like = likeRepository.findByReviewAndSocialUser(review, user)
    if (like != null) {
        if (like.socialUser.id != socialUserId) {
            throw IllegalArgumentException("권한이 없습니다")
        }
        likeRepository.delete(like)

        if (review.likes > 0) {
            review.likes--
            reviewRepository.save(review)
        }
    } else {
        throw IllegalArgumentException("좋아요가 없습니다")
    }
}
}

 

여기의 소셜유저를 싹다 providerid로 바꾼다.

@Transactional
override fun addLikeToProduct(
    productId: Long,
    providerId: Long,
) {
    val product =
        productRepository.findById(productId)
            .orElseThrow { throw ModelNotFoundException("Product", productId) }

    if (product.deletedAt != null) {
        throw Exception("없는 상품입니다")
    }

    val user =
        socialUserRepository.findByProviderId(providerId.toString())
            .orElseThrow { throw ModelNotFoundException("User", providerId) }

    val existingLike = likeRepository.findByProductAndSocialUser(product, user)
    if (existingLike != null) {
        throw IllegalArgumentException("이미 좋아요를 누른 상품입니다")
    }

    likeRepository.save(Like(product = product, socialUser = user, status = true))
    product.likes++
    productRepository.save(product)
}

이런 식으로 바꾼다.

 

컨트롤러도 

 

@Operation(summary = "상품에 '좋아요' 추가", description = "특정 상품에 대한 사용자의 '좋아요'를 추가합니다.")
@PostMapping("/product/{productId}/socialUser/{socialUserId}")
fun addLikeToProduct(
    @Parameter(description = "상품 ID")@PathVariable productId: Long,
    @Parameter(description = "소셜 사용자 ID")@PathVariable socialUserId: Long,
) {
    likeService.addLikeToProduct(productId, socialUserId)
}

이랬던 녀석을

 

@Operation(summary = "상품에 '좋아요' 추가", description = "특정 상품에 대한 사용자의 '좋아요'를 추가합니다.")
@PostMapping("/product/{productId}")
fun addLikeToProduct(
    @Parameter(description = "상품 ID") @PathVariable productId: Long,
    @AuthenticationPrincipal user: UserPrincipal,
): ResponseEntity<Void> {//void는 리스폰스 바디 가 없을때 씀
    likeService.addLikeToProduct(productId, user.id)
    return ResponseEntity.status(HttpStatus.CREATED).build()
}

 

 

이것들을 나머지에도 적용해주면 된다.