diff --git a/src/main/java/com/pawwithu/connectdog/domain/application/entity/Application.java b/src/main/java/com/pawwithu/connectdog/domain/application/entity/Application.java index a7c2e8fd..8f1494bf 100644 --- a/src/main/java/com/pawwithu/connectdog/domain/application/entity/Application.java +++ b/src/main/java/com/pawwithu/connectdog/domain/application/entity/Application.java @@ -26,7 +26,7 @@ public class Application extends BaseTimeEntity { private String phone; // 전화번호 @Column(length = 200, nullable = false) private String content; // 전달 및 문의사항 - @OneToOne(fetch = FetchType.LAZY) + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "post_id", nullable = false) private Post post; // 공고 id @ManyToOne(fetch = FetchType.LAZY) diff --git a/src/main/java/com/pawwithu/connectdog/domain/application/repository/ApplicationRepository.java b/src/main/java/com/pawwithu/connectdog/domain/application/repository/ApplicationRepository.java index 1ebe1876..1213af99 100644 --- a/src/main/java/com/pawwithu/connectdog/domain/application/repository/ApplicationRepository.java +++ b/src/main/java/com/pawwithu/connectdog/domain/application/repository/ApplicationRepository.java @@ -1,6 +1,7 @@ package com.pawwithu.connectdog.domain.application.repository; import com.pawwithu.connectdog.domain.application.entity.Application; +import com.pawwithu.connectdog.domain.application.entity.ApplicationStatus; import com.pawwithu.connectdog.domain.volunteer.entity.Volunteer; import org.springframework.data.jpa.repository.JpaRepository; @@ -15,5 +16,6 @@ public interface ApplicationRepository extends JpaRepository Optional findByIdAndIntermediaryId(Long id, Long intermediaryId); Long countAllByPostId(Long id); List findByVolunteer(Volunteer volunteer); + Optional findByPostIdAndStatusNot(Long postId, ApplicationStatus status); } diff --git a/src/main/java/com/pawwithu/connectdog/domain/application/repository/CustomApplicationRepository.java b/src/main/java/com/pawwithu/connectdog/domain/application/repository/CustomApplicationRepository.java index 3e68017b..a8e024a6 100644 --- a/src/main/java/com/pawwithu/connectdog/domain/application/repository/CustomApplicationRepository.java +++ b/src/main/java/com/pawwithu/connectdog/domain/application/repository/CustomApplicationRepository.java @@ -21,7 +21,6 @@ public interface CustomApplicationRepository { List getVolunteerCompletedApplications(Long volunteerId, Pageable pageable); List getIntermediaryCompletedApplications(Long intermediaryId, Pageable pageable); List getCountOfApplicationsByStatus(Long id); - boolean existsByPostIdAndPostStatus(Long postId); void updateExpiredApplications(LocalDate today); List getYesterdayExpiredApplications(LocalDate date); List getExpiredProgressingPosts(LocalDate date); diff --git a/src/main/java/com/pawwithu/connectdog/domain/application/repository/impl/CustomApplicationRepositoryImpl.java b/src/main/java/com/pawwithu/connectdog/domain/application/repository/impl/CustomApplicationRepositoryImpl.java index 5b05eb7c..11297ed2 100644 --- a/src/main/java/com/pawwithu/connectdog/domain/application/repository/impl/CustomApplicationRepositoryImpl.java +++ b/src/main/java/com/pawwithu/connectdog/domain/application/repository/impl/CustomApplicationRepositoryImpl.java @@ -5,6 +5,7 @@ import com.pawwithu.connectdog.domain.application.entity.ApplicationStatus; import com.pawwithu.connectdog.domain.application.repository.CustomApplicationRepository; import com.pawwithu.connectdog.domain.post.entity.Post; +import com.pawwithu.connectdog.domain.post.entity.PostStatus; import com.querydsl.core.Tuple; import com.querydsl.core.types.Projections; import com.querydsl.jpa.impl.JPAQueryFactory; @@ -185,16 +186,6 @@ public List getCountOfApplicationsByStatus(Long id) { .fetch(); } - @Override - public boolean existsByPostIdAndPostStatus(Long postId) { - return queryFactory - .select(application) - .from(application) - .where(application.post.id.eq(postId) - .and(application.status.ne(ApplicationStatus.REJECTED))) - .fetchOne() != null; - } - // 어제 모집 마감된 신청 가져오기 @Override public List getYesterdayExpiredApplications(LocalDate date) { diff --git a/src/main/java/com/pawwithu/connectdog/domain/application/service/ApplicationService.java b/src/main/java/com/pawwithu/connectdog/domain/application/service/ApplicationService.java index d688c8a7..1b60618f 100644 --- a/src/main/java/com/pawwithu/connectdog/domain/application/service/ApplicationService.java +++ b/src/main/java/com/pawwithu/connectdog/domain/application/service/ApplicationService.java @@ -50,13 +50,14 @@ public void volunteerApply(String email, Long postId, VolunteerApplyRequest requ // 이동봉사자 Volunteer volunteer = volunteerRepository.findByEmail(email).orElseThrow(() -> new BadRequestException(VOLUNTEER_NOT_FOUND)); // 공고 - Post post = postRepository.findById(postId).orElseThrow(() -> new BadRequestException(POST_NOT_FOUND)); + Post post = postRepository.findByIdAndStatus(postId, PostStatus.RECRUITING).orElseThrow(() -> new BadRequestException(POST_NOT_FOUND)); // 이동봉사 중개 Intermediary intermediary = post.getIntermediary(); - // 해당 공고에 대한 신청이 이미 존재할 경우 - 신청 상태가 반려가 아닐 경우 - if (customApplicationRepository.existsByPostIdAndPostStatus(postId)) { - throw new BadRequestException(ALREADY_EXIST_APPLICATION); - } + // 해당 공고에 대한 신청이 이미 존재할 경우 예외 처리 - 신청 상태가 반려가 아닐 경우 + applicationRepository.findByPostIdAndStatusNot(postId, ApplicationStatus.REJECTED) + .ifPresent(application -> { + throw new BadRequestException(ALREADY_EXIST_APPLICATION); + }); // 공고 신청 저장 Application application = request.toEntity(post, intermediary, volunteer); applicationRepository.save(application); diff --git a/src/main/java/com/pawwithu/connectdog/domain/post/repository/PostRepository.java b/src/main/java/com/pawwithu/connectdog/domain/post/repository/PostRepository.java index 5a501ce0..13ac399b 100644 --- a/src/main/java/com/pawwithu/connectdog/domain/post/repository/PostRepository.java +++ b/src/main/java/com/pawwithu/connectdog/domain/post/repository/PostRepository.java @@ -1,6 +1,7 @@ package com.pawwithu.connectdog.domain.post.repository; import com.pawwithu.connectdog.domain.post.entity.Post; +import com.pawwithu.connectdog.domain.post.entity.PostStatus; import org.springframework.data.jpa.repository.JpaRepository; import java.util.Optional; @@ -8,4 +9,5 @@ public interface PostRepository extends JpaRepository { Optional findByIdAndIntermediaryId(Long id, Long intermediaryId); + Optional findByIdAndStatus(Long id, PostStatus postStatus); }