diff --git a/src/main/java/com/clova/anifriends/domain/applicant/Applicant.java b/src/main/java/com/clova/anifriends/domain/applicant/Applicant.java index 77ba4c3a5..7894f7e51 100644 --- a/src/main/java/com/clova/anifriends/domain/applicant/Applicant.java +++ b/src/main/java/com/clova/anifriends/domain/applicant/Applicant.java @@ -56,8 +56,10 @@ public Applicant( validateRecruitment(recruitment); checkConcurrency(recruitment); this.recruitment = recruitment; + recruitment.addApplicant(this); validateVolunteer(volunteer); this.volunteer = volunteer; + volunteer.addApplicant(this); this.status = ApplicantStatus.PENDING; } @@ -77,6 +79,10 @@ public Long getApplicantId() { return applicantId; } + public Review getReview() { + return review; + } + private void validateRecruitment(Recruitment recruitment) { if (recruitment == null) { throw new ApplicantBadRequestException("봉사는 필수 입력 항목입니다."); @@ -105,4 +111,8 @@ public boolean isAttendance() { public boolean hasReview() { return review != null; } + + public void registerReview(Review review) { + this.review = review; + } } diff --git a/src/main/java/com/clova/anifriends/domain/recruitment/Recruitment.java b/src/main/java/com/clova/anifriends/domain/recruitment/Recruitment.java index dea9ab56c..b95af3c38 100644 --- a/src/main/java/com/clova/anifriends/domain/recruitment/Recruitment.java +++ b/src/main/java/com/clova/anifriends/domain/recruitment/Recruitment.java @@ -158,4 +158,8 @@ public void closeRecruitment() { public List getApplicants() { return Collections.unmodifiableList(applicants); } + + public void addApplicant(Applicant applicant) { + applicants.add(applicant); + } } diff --git a/src/main/java/com/clova/anifriends/domain/review/Review.java b/src/main/java/com/clova/anifriends/domain/review/Review.java index 3abafc187..e28d50a33 100644 --- a/src/main/java/com/clova/anifriends/domain/review/Review.java +++ b/src/main/java/com/clova/anifriends/domain/review/Review.java @@ -49,6 +49,7 @@ public Review( validateApplicant(applicant); validateImageUrlsSize(imageUrls); this.applicant = applicant; + this.applicant.registerReview(this); this.content = new ReviewContent(content); this.imageUrls = imageUrls == null ? null : imageUrls.stream() .map(url -> new ReviewImage(this, url)) diff --git a/src/main/java/com/clova/anifriends/domain/review/dto/response/FindShelterReviewsResponse.java b/src/main/java/com/clova/anifriends/domain/review/dto/response/FindShelterReviewsResponse.java index 27b4f487f..8b228da96 100644 --- a/src/main/java/com/clova/anifriends/domain/review/dto/response/FindShelterReviewsResponse.java +++ b/src/main/java/com/clova/anifriends/domain/review/dto/response/FindShelterReviewsResponse.java @@ -19,7 +19,7 @@ public record FindShelterReviewResponse( String volunteerName, int temperature, String volunteerImageUrl, - int VolunteerReviewCount) { + long VolunteerReviewCount) { public static FindShelterReviewResponse from(Review review) { Volunteer volunteer = review.getApplicant().getVolunteer(); @@ -31,7 +31,7 @@ public static FindShelterReviewResponse from(Review review) { volunteer.getName(), volunteer.getTemperature(), volunteer.getVolunteerImageUrl(), - volunteer.getApplications().size() + volunteer.getReviewCount() ); } } diff --git a/src/main/java/com/clova/anifriends/domain/volunteer/Volunteer.java b/src/main/java/com/clova/anifriends/domain/volunteer/Volunteer.java index 710c5b965..56fe613bb 100644 --- a/src/main/java/com/clova/anifriends/domain/volunteer/Volunteer.java +++ b/src/main/java/com/clova/anifriends/domain/volunteer/Volunteer.java @@ -28,6 +28,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Objects; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -64,7 +65,7 @@ public class Volunteer extends BaseTimeEntity { private VolunteerName name; @OneToMany(mappedBy = "volunteer", fetch = FetchType.LAZY) - private List applications = new ArrayList<>(); + private List applicants = new ArrayList<>(); @OneToOne(mappedBy = "volunteer") private VolunteerImage volunteerImage; @@ -94,6 +95,20 @@ private LocalDate validateBirthDate(String birthDate) { } } + public void addApplicant(Applicant applicant) { + applicants.add(applicant); + } + + public void updateVolunteerImage(VolunteerImage volunteerImage) { + this.volunteerImage = volunteerImage; + } + + public long getReviewCount() { + return applicants.stream() + .filter(applicant -> Objects.nonNull(applicant.getReview())) + .count(); + } + public Long getVolunteerId() { return volunteerId; } @@ -130,11 +145,7 @@ public String getVolunteerImageUrl() { return this.volunteerImage == null ? null : volunteerImage.getImageUrl(); } - public List getApplications() { - return Collections.unmodifiableList(applications); - } - - public void updateVolunteerImage(VolunteerImage volunteerImage) { - this.volunteerImage = volunteerImage; + public List getApplicants() { + return Collections.unmodifiableList(applicants); } } diff --git a/src/main/java/com/clova/anifriends/domain/volunteer/dto/response/FindVolunteerMyPageResponse.java b/src/main/java/com/clova/anifriends/domain/volunteer/dto/response/FindVolunteerMyPageResponse.java index 08198485e..55c1adeb9 100644 --- a/src/main/java/com/clova/anifriends/domain/volunteer/dto/response/FindVolunteerMyPageResponse.java +++ b/src/main/java/com/clova/anifriends/domain/volunteer/dto/response/FindVolunteerMyPageResponse.java @@ -21,7 +21,7 @@ public static FindVolunteerMyPageResponse from(Volunteer volunteer) { volunteer.getBirthDate(), volunteer.getPhoneNumber(), volunteer.getTemperature(), - volunteer.getApplications().stream() + volunteer.getApplicants().stream() .filter(applicant -> applicant.getStatus().equals(ApplicantStatus.ATTENDANCE)) .count(), volunteer.getVolunteerImageUrl() diff --git a/src/test/java/com/clova/anifriends/domain/review/service/ReviewServiceTest.java b/src/test/java/com/clova/anifriends/domain/review/service/ReviewServiceTest.java index b3345c873..0c929a11c 100644 --- a/src/test/java/com/clova/anifriends/domain/review/service/ReviewServiceTest.java +++ b/src/test/java/com/clova/anifriends/domain/review/service/ReviewServiceTest.java @@ -24,9 +24,9 @@ import com.clova.anifriends.domain.review.Review; import com.clova.anifriends.domain.review.dto.response.FindReviewResponse; import com.clova.anifriends.domain.review.dto.response.FindShelterReviewsResponse; +import com.clova.anifriends.domain.review.dto.response.FindVolunteerReviewsResponse; import com.clova.anifriends.domain.review.exception.ApplicantNotFoundException; import com.clova.anifriends.domain.review.exception.ReviewBadRequestException; -import com.clova.anifriends.domain.review.dto.response.FindVolunteerReviewsResponse; import com.clova.anifriends.domain.review.exception.ReviewNotFoundException; import com.clova.anifriends.domain.review.repository.ReviewRepository; import com.clova.anifriends.domain.shelter.Shelter; diff --git a/src/test/java/com/clova/anifriends/domain/volunteer/controller/VolunteerControllerTest.java b/src/test/java/com/clova/anifriends/domain/volunteer/controller/VolunteerControllerTest.java index 59cc6e5f4..77d3af1c4 100644 --- a/src/test/java/com/clova/anifriends/domain/volunteer/controller/VolunteerControllerTest.java +++ b/src/test/java/com/clova/anifriends/domain/volunteer/controller/VolunteerControllerTest.java @@ -74,7 +74,7 @@ void findVolunteerMyPage() throws Exception { volunteer.getBirthDate(), volunteer.getPhoneNumber(), volunteer.getTemperature(), - volunteer.getApplications().stream() + volunteer.getApplicants().stream() .filter(applicant -> applicant.getStatus().equals(ApplicantStatus.ATTENDANCE)) .count(), VolunteerImageFixture.volunteerImage(volunteer).getImageUrl());