어제 만들었던것에서 이어지는데,
실험결과 이것은
@Transactional
override fun getAllProducts(): List<ProductResponse> {
val products = productRepository.findAll().filter { it.deletedAt == null }
return products.map { product ->
val reviews = reviewRepository.findAllByProductIdAndDeletedAtIsNull(product.id!!, Pageable.unpaged()).content
val averageRating = reviews.map { it.rating }.average()
product.ratingAverage = averageRating
productRepository.save(product)
ProductResponse(product)
}
}
@Transactional
override fun getProductById(productId: Long): ProductResponse {
val product =
productRepository.findByIdAndDeletedAtIsNull(productId)
.orElseThrow { ModelNotFoundException("Product", productId) }
val reviews = reviewRepository.findAllByProductIdAndDeletedAtIsNull(productId, Pageable.unpaged()).content
val averageRating = reviews.map { it.rating }.average()
product.ratingAverage = averageRating
productRepository.save(product)
return ProductResponse(product)
}
이건 리뷰가 평점을 넣지 않은채로 생성이 되면 평점을 넣지 않은 리뷰가 NaN이라고 뜨길래 거슬렸었다.
"productId": 7,
"title": "dsds",
"content": "string",
"imageUrl": "string",
"price": 10,
"ratingAverage": "NaN",
"likes": 0,
"createdAt": "2024-03-19T20:08:20.5571706",
"updatedAt": "2024-03-19T20:08:20.5571706",
"deletedAt": null
그래도 건드릴 이유는 없다고 생각해 내버려뒀지만, 나증에 평점순 조회를 할때 NaN 부분이 맨위로 나와서 보이게 되는것이 아닌가! 그래서
@Transactional
override fun getAllProducts(): List<ProductResponse> {
val products = productRepository.findAll().filter { it.deletedAt == null }
return products.map { product ->
val reviews = reviewRepository.findAllByProductIdAndDeletedAtIsNull(product.id!!, Pageable.unpaged()).content
val averageRating = if (reviews.isNotEmpty()) reviews.map { it.rating }.average() else 0.0
product.ratingAverage = averageRating
productRepository.save(product)
ProductResponse(product)
}
}
@Transactional
override fun getProductById(productId: Long): ProductResponse {
val product =
productRepository.findByIdAndDeletedAtIsNull(productId)
.orElseThrow { ModelNotFoundException("Product", productId) }
val reviews = reviewRepository.findAllByProductIdAndDeletedAtIsNull(productId, Pageable.unpaged()).content
val averageRating = if (reviews.isNotEmpty()) reviews.map { it.rating }.average() else 0.0
product.ratingAverage = averageRating
productRepository.save(product)
return ProductResponse(product)
}
이렇게
val averageRating = reviews.map { it.rating }.average()를
val averageRating = if (reviews.isNotEmpty()) reviews.map { it.rating }.average() else 0.0로 바꿨다. 그러면 NaN은 0이되고 밑으로 정렬된다.
@Transactional
override fun searchProductsByRating(pageable: Pageable): List<ProductSearchResponse> {
val products = searchProductRepository.findAllByDeletedAtIsNullOrderByRatingAverageDesc(pageable)
products.forEach { product ->
val reviews = reviewRepository.findAllByProductIdAndDeletedAtIsNull(product.id!!, Pageable.unpaged()).content
val averageRating = reviews.map { it.rating }.average()
product.ratingAverage = if (reviews.isNotEmpty()) averageRating else 0.0 // 평가가 없는 경우 평균 별점을 0으로 설정. 이거 없으면 nan이라고 나오고 맨 위에 나와서 방해함
productRepository.save(product)
}
return products.map { product ->
ProductSearchResponse(
productId = product.id!!,
title = product.title,
content = product.content,
imageUrl = product.imageUrl,
price = product.price,
ratingAverage = product.ratingAverage,
likes = product.likes,
)
}
}
검색기능도 이렇게 만들었다.