diff --git a/src/main/java/life/mosu/mosuserver/application/application/ApplicationService.java b/src/main/java/life/mosu/mosuserver/application/application/ApplicationService.java index b969be97..b14f826b 100644 --- a/src/main/java/life/mosu/mosuserver/application/application/ApplicationService.java +++ b/src/main/java/life/mosu/mosuserver/application/application/ApplicationService.java @@ -3,14 +3,12 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; -import java.util.stream.Collectors; import life.mosu.mosuserver.domain.application.AdmissionTicketImageJpaEntity; import life.mosu.mosuserver.domain.application.AdmissionTicketImageJpaRepository; import life.mosu.mosuserver.domain.application.ApplicationJpaEntity; import life.mosu.mosuserver.domain.application.ApplicationJpaRepository; import life.mosu.mosuserver.domain.application.ApplicationSchoolJpaRepository; import life.mosu.mosuserver.domain.applicationschool.ApplicationSchoolJpaEntity; -import life.mosu.mosuserver.domain.school.AddressJpaVO; import life.mosu.mosuserver.domain.school.SchoolJpaEntity; import life.mosu.mosuserver.domain.school.SchoolJpaRepository; import life.mosu.mosuserver.global.exception.CustomRuntimeException; @@ -38,38 +36,36 @@ public class ApplicationService { // 신청 @Transactional public ApplicationResponse apply(Long userId, ApplicationRequest request) { - Set schools = request.schools(); - List schoolEntities = new ArrayList<>(); + Set schoolRequests = request.schools(); + List savedEntities = new ArrayList<>(); - Set schoolIds = schools.stream() - .map(ApplicationSchoolRequest::schoolId) - .collect(Collectors.toSet()); - - if (applicationSchoolJpaRepository.existsByUserIdAndSchoolIdIn(userId, schoolIds)) { - throw new CustomRuntimeException(ErrorCode.APPLICATION_SCHOOL_ALREADY_APPLIED); - } - - ApplicationJpaEntity application = request.toEntity(userId); - ApplicationJpaEntity applicationJpaEntity = applicationJpaRepository.save(application); - Long applicationId = applicationJpaEntity.getId(); + ApplicationJpaEntity application = applicationJpaRepository.save(request.toEntity(userId)); + Long applicationId = application.getId(); admissionTicketImageJpaRepository.save( createAdmissionTicketImageIfPresent(request.admissionTicket(), applicationId)); - schools.forEach(applicationSchoolRequest -> { - SchoolJpaEntity school = schoolJpaRepository.findById( - applicationSchoolRequest.schoolId()) + for (ApplicationSchoolRequest schoolRequest : schoolRequests) { + Long schoolId = schoolJpaRepository.findBySchoolNameAndAreaAndExamDate( + schoolRequest.schoolName(), + schoolRequest.validatedArea(schoolRequest.area()), + schoolRequest.examDate()) + .orElseThrow(() -> new CustomRuntimeException(ErrorCode.SCHOOL_NOT_FOUND)) + .getId(); + + if (applicationSchoolJpaRepository.existsByUserIdAndSchoolId(userId, schoolId)) { + throw new CustomRuntimeException(ErrorCode.APPLICATION_SCHOOL_ALREADY_APPLIED); + } + + SchoolJpaEntity school = schoolJpaRepository.findById(schoolId) .orElseThrow(() -> new CustomRuntimeException(ErrorCode.SCHOOL_NOT_FOUND)); - AddressJpaVO address = school.getAddress(); - ApplicationSchoolJpaEntity applicationSchoolJpaEntity = applicationSchoolRequest.toEntity( - userId, applicationId, address); - ApplicationSchoolJpaEntity saved = applicationSchoolJpaRepository.save( - applicationSchoolJpaEntity); - schoolEntities.add(saved); - }); + ApplicationSchoolJpaEntity applicationSchool = schoolRequest.toEntity(userId, + applicationId, school); + savedEntities.add(applicationSchoolJpaRepository.save(applicationSchool)); + } - return ApplicationResponse.of(applicationId, schoolEntities); + return ApplicationResponse.of(applicationId, savedEntities); } diff --git a/src/main/java/life/mosu/mosuserver/domain/application/ApplicationSchoolJpaRepository.java b/src/main/java/life/mosu/mosuserver/domain/application/ApplicationSchoolJpaRepository.java index 34167b99..4d8711b4 100644 --- a/src/main/java/life/mosu/mosuserver/domain/application/ApplicationSchoolJpaRepository.java +++ b/src/main/java/life/mosu/mosuserver/domain/application/ApplicationSchoolJpaRepository.java @@ -1,6 +1,5 @@ package life.mosu.mosuserver.domain.application; -import java.util.Collection; import java.util.List; import life.mosu.mosuserver.domain.applicationschool.ApplicationSchoolJpaEntity; import org.springframework.data.jpa.repository.JpaRepository; @@ -8,8 +7,7 @@ public interface ApplicationSchoolJpaRepository extends JpaRepository { - - boolean existsByUserIdAndSchoolIdIn(Long userId, Collection schoolIds); + boolean existsByUserIdAndSchoolId(Long userId, Long schoolId); List findAllByApplicationId(Long applicationId); diff --git a/src/main/java/life/mosu/mosuserver/domain/school/Area.java b/src/main/java/life/mosu/mosuserver/domain/school/Area.java index cd800a96..59936697 100644 --- a/src/main/java/life/mosu/mosuserver/domain/school/Area.java +++ b/src/main/java/life/mosu/mosuserver/domain/school/Area.java @@ -3,8 +3,7 @@ public enum Area { DAECHI("대치"), MOKDONG("목동"), - DAEGU("대구"); - + NOWON("노원"); private final String areaName; Area(String areaName) { diff --git a/src/main/java/life/mosu/mosuserver/domain/school/SchoolJpaRepository.java b/src/main/java/life/mosu/mosuserver/domain/school/SchoolJpaRepository.java index a034cbf6..ff9facf9 100644 --- a/src/main/java/life/mosu/mosuserver/domain/school/SchoolJpaRepository.java +++ b/src/main/java/life/mosu/mosuserver/domain/school/SchoolJpaRepository.java @@ -1,7 +1,11 @@ package life.mosu.mosuserver.domain.school; +import java.time.LocalDate; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; public interface SchoolJpaRepository extends JpaRepository { + Optional findBySchoolNameAndAreaAndExamDate(String schoolName, Area area, + LocalDate examDate); } diff --git a/src/main/java/life/mosu/mosuserver/presentation/application/dto/ApplicationSchoolRequest.java b/src/main/java/life/mosu/mosuserver/presentation/application/dto/ApplicationSchoolRequest.java index 9418a42f..efaa2315 100644 --- a/src/main/java/life/mosu/mosuserver/presentation/application/dto/ApplicationSchoolRequest.java +++ b/src/main/java/life/mosu/mosuserver/presentation/application/dto/ApplicationSchoolRequest.java @@ -8,14 +8,12 @@ import life.mosu.mosuserver.domain.application.Lunch; import life.mosu.mosuserver.domain.application.Subject; import life.mosu.mosuserver.domain.applicationschool.ApplicationSchoolJpaEntity; -import life.mosu.mosuserver.domain.school.AddressJpaVO; import life.mosu.mosuserver.domain.school.Area; +import life.mosu.mosuserver.domain.school.SchoolJpaEntity; import life.mosu.mosuserver.global.exception.CustomRuntimeException; import life.mosu.mosuserver.global.exception.ErrorCode; public record ApplicationSchoolRequest( - @NotNull(message = "학교 ID는 필수입니다.") - Long schoolId, @NotBlank(message = "학교 이름은 필수입니다.") String schoolName, @@ -32,14 +30,14 @@ public record ApplicationSchoolRequest( ) { public ApplicationSchoolJpaEntity toEntity(Long userId, Long applicationId, - AddressJpaVO address) { + SchoolJpaEntity school) { return ApplicationSchoolJpaEntity.builder() .userId(userId) .applicationId(applicationId) - .schoolId(schoolId) - .schoolName(schoolName) - .area(validatedArea(area)) - .address(address) + .schoolId(school.getId()) + .schoolName(school.getSchoolName()) + .area(school.getArea()) + .address(school.getAddress()) .examDate(examDate) .lunch(validatedLunch(lunch)) .subjects(validatedSubjects(subjects)) @@ -64,7 +62,7 @@ private Lunch validatedLunch(String lunch) { } } - private Area validatedArea(String area) { + public Area validatedArea(String area) { try { return Area.valueOf(area.toUpperCase()); } catch (IllegalArgumentException e) { diff --git a/src/main/java/life/mosu/mosuserver/presentation/application/dto/ApplicationSchoolResponse.java b/src/main/java/life/mosu/mosuserver/presentation/application/dto/ApplicationSchoolResponse.java index 746f2bc0..336c1d3e 100644 --- a/src/main/java/life/mosu/mosuserver/presentation/application/dto/ApplicationSchoolResponse.java +++ b/src/main/java/life/mosu/mosuserver/presentation/application/dto/ApplicationSchoolResponse.java @@ -3,32 +3,33 @@ import java.time.LocalDate; import java.util.Set; import java.util.stream.Collectors; -import life.mosu.mosuserver.domain.application.Lunch; import life.mosu.mosuserver.domain.application.Subject; import life.mosu.mosuserver.domain.applicationschool.ApplicationSchoolJpaEntity; -import life.mosu.mosuserver.domain.school.Area; public record ApplicationSchoolResponse( Long applicationSchoolId, - Area area, + String area, LocalDate examDate, String schoolName, - Lunch lunch, + String lunch, String examinationNumber, Set subjects ) { public static ApplicationSchoolResponse from(ApplicationSchoolJpaEntity applicationSchool) { + String areaName = applicationSchool.getArea().getAreaName(); + String lunchName = applicationSchool.getLunch().getLunchName(); + Set subjectNames = applicationSchool.getSubjects().stream() .map(Subject::getSubjectName) .collect(Collectors.toSet()); return new ApplicationSchoolResponse( applicationSchool.getId(), - applicationSchool.getArea(), + areaName, applicationSchool.getExamDate(), applicationSchool.getSchoolName(), - applicationSchool.getLunch(), + lunchName, applicationSchool.getExaminationNumber(), subjectNames );