팀장님의 테스트 결과, 리뷰는 상품과 거기에 달린 주문 아이디를 입력해서 리뷰를 쓰는 식인데, 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()
}
이것들을 나머지에도 적용해주면 된다.