diff --git a/src/main/java/com/onebridge/ouch/controller/review/ReviewController.java b/src/main/java/com/onebridge/ouch/controller/review/ReviewController.java index 8e7457d..79385fc 100644 --- a/src/main/java/com/onebridge/ouch/controller/review/ReviewController.java +++ b/src/main/java/com/onebridge/ouch/controller/review/ReviewController.java @@ -14,8 +14,10 @@ import org.springframework.web.bind.annotation.RestController; import com.onebridge.ouch.apiPayload.ApiResponse; +import com.onebridge.ouch.dto.review.ReviewAverageResponse; import com.onebridge.ouch.dto.review.ReviewRequest; import com.onebridge.ouch.dto.review.ReviewResponse; +import com.onebridge.ouch.dto.review.ReviewStatsResponse; import com.onebridge.ouch.security.authorization.UserId; import com.onebridge.ouch.service.review.ReviewService; @@ -94,4 +96,22 @@ public ResponseEntity> getMyReviews( List list = reviewService.getMyReviews(userId); return ResponseEntity.ok(list); } + + @Operation(summary = "병원 리뷰 평균 점수 조회 API", description = "특정 병원의 리뷰 평균 점수를 조회하는 API입니다.") + @GetMapping("/hospitals/{ykiho}/reviews/average") + public ResponseEntity getAverageScore( + @PathVariable("ykiho") String ykiho + ) { + ReviewAverageResponse response = reviewService.getAverageScoreByHospital(ykiho); + return ResponseEntity.ok(response); + } + + @Operation(summary = "병원 리뷰 평균 점수, 리뷰 개수 조회 API", description = "특정 병원의 리뷰 평균 점수 및 리뷰 개수를 조회하는 API입니다.") + @GetMapping("/hospitals/{ykiho}/reviews/stats") + public ResponseEntity getReviewStats( + @PathVariable("ykiho") String ykiho + ) { + ReviewStatsResponse response = reviewService.getStatsByHospital(ykiho); + return ResponseEntity.ok(response); + } } \ No newline at end of file diff --git a/src/main/java/com/onebridge/ouch/dto/review/ReviewAverageResponse.java b/src/main/java/com/onebridge/ouch/dto/review/ReviewAverageResponse.java new file mode 100644 index 0000000..adec71e --- /dev/null +++ b/src/main/java/com/onebridge/ouch/dto/review/ReviewAverageResponse.java @@ -0,0 +1,13 @@ +package com.onebridge.ouch.dto.review; + +import lombok.*; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class ReviewAverageResponse { + private String hospitalYkiho; + private Double averageScore; +} diff --git a/src/main/java/com/onebridge/ouch/dto/review/ReviewStatsResponse.java b/src/main/java/com/onebridge/ouch/dto/review/ReviewStatsResponse.java new file mode 100644 index 0000000..5dba4f3 --- /dev/null +++ b/src/main/java/com/onebridge/ouch/dto/review/ReviewStatsResponse.java @@ -0,0 +1,14 @@ +package com.onebridge.ouch.dto.review; + +import lombok.*; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class ReviewStatsResponse { + private String hospitalYkiho; + private long reviewCount; + private double averageScore; // 리뷰가 없으면 0.0으로 설정 +} diff --git a/src/main/java/com/onebridge/ouch/repository/review/ReviewRepository.java b/src/main/java/com/onebridge/ouch/repository/review/ReviewRepository.java index f59c728..813e057 100644 --- a/src/main/java/com/onebridge/ouch/repository/review/ReviewRepository.java +++ b/src/main/java/com/onebridge/ouch/repository/review/ReviewRepository.java @@ -3,6 +3,8 @@ import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import com.onebridge.ouch.domain.Review; @@ -13,4 +15,11 @@ public interface ReviewRepository extends JpaRepository { // 특정 사용자(user.id) 기준으로 리뷰 조회 List findAllByUser_Id(Long userId); + + // 추가: 특정 병원 리뷰의 평균 score 계산 (null일 경우 리뷰가 없는 상태) + @Query("SELECT AVG(r.score) FROM Review r WHERE r.hospital.ykiho = :ykiho") + Double findAverageScoreByHospitalYkiho(@Param("ykiho") String hospitalYkiho); + + // 리뷰 개수 계산 + long countByHospital_Ykiho(String hospitalYkiho); } \ No newline at end of file diff --git a/src/main/java/com/onebridge/ouch/service/review/ReviewService.java b/src/main/java/com/onebridge/ouch/service/review/ReviewService.java index c2c7401..e7bcd74 100644 --- a/src/main/java/com/onebridge/ouch/service/review/ReviewService.java +++ b/src/main/java/com/onebridge/ouch/service/review/ReviewService.java @@ -3,8 +3,10 @@ import com.onebridge.ouch.domain.Hospital; import com.onebridge.ouch.domain.Review; import com.onebridge.ouch.domain.User; +import com.onebridge.ouch.dto.review.ReviewAverageResponse; import com.onebridge.ouch.dto.review.ReviewRequest; import com.onebridge.ouch.dto.review.ReviewResponse; +import com.onebridge.ouch.dto.review.ReviewStatsResponse; import com.onebridge.ouch.repository.hospital.HospitalRepository; import com.onebridge.ouch.repository.review.ReviewRepository; import com.onebridge.ouch.repository.user.UserRepository; @@ -120,4 +122,29 @@ private ReviewResponse toDto(Review review) { .updatedAt(review.getUpdatedAt().format(dateFormatter)) .build(); } + + @Transactional(readOnly = true) + public ReviewAverageResponse getAverageScoreByHospital(String hospitalYkiho) { + Double avg = reviewRepository.findAverageScoreByHospitalYkiho(hospitalYkiho); + // 리뷰가 하나도 없으면 avg == null이므로, 그대로 넘기거나 0.0으로 바꿀 수 있습니다. + return ReviewAverageResponse.builder() + .hospitalYkiho(hospitalYkiho) + .averageScore(avg) + .build(); + } + + @Transactional(readOnly = true) + public ReviewStatsResponse getStatsByHospital(String hospitalYkiho) { + long count = reviewRepository.countByHospital_Ykiho(hospitalYkiho); + Double avg = reviewRepository.findAverageScoreByHospitalYkiho(hospitalYkiho); + + // 리뷰가 없으면 avg == null이므로 0.0으로 설정 + double averageScore = (avg == null) ? 0.0 : avg; + + return ReviewStatsResponse.builder() + .hospitalYkiho(hospitalYkiho) + .reviewCount(count) + .averageScore(averageScore) + .build(); + } } \ No newline at end of file