Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -94,4 +96,22 @@ public ResponseEntity<List<ReviewResponse>> getMyReviews(
List<ReviewResponse> list = reviewService.getMyReviews(userId);
return ResponseEntity.ok(list);
}

@Operation(summary = "병원 리뷰 평균 점수 조회 API", description = "특정 병원의 리뷰 평균 점수를 조회하는 API입니다.")
@GetMapping("/hospitals/{ykiho}/reviews/average")
public ResponseEntity<ReviewAverageResponse> 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<ReviewStatsResponse> getReviewStats(
@PathVariable("ykiho") String ykiho
) {
ReviewStatsResponse response = reviewService.getStatsByHospital(ykiho);
return ResponseEntity.ok(response);
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
Original file line number Diff line number Diff line change
@@ -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으로 설정
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -13,4 +15,11 @@ public interface ReviewRepository extends JpaRepository<Review, Long> {

// 특정 사용자(user.id) 기준으로 리뷰 조회
List<Review> 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);
}
27 changes: 27 additions & 0 deletions src/main/java/com/onebridge/ouch/service/review/ReviewService.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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();
}
}