diff --git a/src/main/java/com/example/solidconnection/common/exception/ErrorCode.java b/src/main/java/com/example/solidconnection/common/exception/ErrorCode.java index 214da0838..5638c024a 100644 --- a/src/main/java/com/example/solidconnection/common/exception/ErrorCode.java +++ b/src/main/java/com/example/solidconnection/common/exception/ErrorCode.java @@ -88,6 +88,7 @@ public enum ErrorCode { SCHOOL_EMAIL_CONFIRM_CODE_DIFFERENT(HttpStatus.BAD_REQUEST.value(), "인증 코드가 일치하지 않습니다."), SCHOOL_EMAIL_VERIFICATION_INFO_SAVE_FAILED(HttpStatus.INTERNAL_SERVER_ERROR.value(), "학교 이메일 인증 정보 저장에 실패했습니다."), SCHOOL_EMAIL_VERIFICATION_INFO_CORRUPTED(HttpStatus.INTERNAL_SERVER_ERROR.value(), "학교 이메일 인증 정보가 손상되었습니다. 인증 코드 발송을 다시 요청해주세요."), + SCHOOL_EMAIL_NOT_VERIFIED(HttpStatus.BAD_REQUEST.value(), "학교 이메일 인증이 필요합니다."), // s3 S3_SERVICE_EXCEPTION(HttpStatus.BAD_REQUEST.value(), "S3 서비스 에러 발생"), diff --git a/src/main/java/com/example/solidconnection/score/dto/GpaScoreStatusesResponse.java b/src/main/java/com/example/solidconnection/score/dto/GpaScoreStatusesResponse.java index 4d31d4252..a79f8500f 100644 --- a/src/main/java/com/example/solidconnection/score/dto/GpaScoreStatusesResponse.java +++ b/src/main/java/com/example/solidconnection/score/dto/GpaScoreStatusesResponse.java @@ -3,10 +3,14 @@ import java.util.List; public record GpaScoreStatusesResponse( + String homeUniversityName, List gpaScoreStatusResponseList ) { - public static GpaScoreStatusesResponse from(List gpaScoreStatusResponseList) { - return new GpaScoreStatusesResponse(gpaScoreStatusResponseList); + public static GpaScoreStatusesResponse of( + String homeUniversityName, + List gpaScoreStatusResponseList + ) { + return new GpaScoreStatusesResponse(homeUniversityName, gpaScoreStatusResponseList); } } diff --git a/src/main/java/com/example/solidconnection/score/service/ScoreService.java b/src/main/java/com/example/solidconnection/score/service/ScoreService.java index f1f055c81..871c955f4 100644 --- a/src/main/java/com/example/solidconnection/score/service/ScoreService.java +++ b/src/main/java/com/example/solidconnection/score/service/ScoreService.java @@ -20,6 +20,7 @@ import com.example.solidconnection.score.repository.LanguageTestScoreRepository; import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.siteuser.repository.SiteUserRepository; +import com.example.solidconnection.university.service.HomeUniversityQueryService; import java.util.List; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; @@ -35,6 +36,7 @@ public class ScoreService { private final S3Service s3Service; private final LanguageTestScoreRepository languageTestScoreRepository; private final SiteUserRepository siteUserRepository; + private final HomeUniversityQueryService homeUniversityQueryService; @Transactional public Long submitGpaScore(long siteUserId, GpaScoreRequest gpaScoreRequest, MultipartFile file) { @@ -63,13 +65,14 @@ public Long submitLanguageTestScore(long siteUserId, LanguageTestScoreRequest la public GpaScoreStatusesResponse getGpaScoreStatus(long siteUserId) { SiteUser siteUser = siteUserRepository.findById(siteUserId) .orElseThrow(() -> new CustomException(USER_NOT_FOUND)); + String homeUniversityName = homeUniversityQueryService.findNameByRequiredId(siteUser.getHomeUniversityId()); List gpaScoreStatusResponseList = gpaScoreRepository.findBySiteUserId(siteUser.getId()) .stream() .map(GpaScoreStatusResponse::from) .toList(); - return GpaScoreStatusesResponse.from(gpaScoreStatusResponseList); + return GpaScoreStatusesResponse.of(homeUniversityName, gpaScoreStatusResponseList); } @Transactional(readOnly = true) diff --git a/src/main/java/com/example/solidconnection/siteuser/service/MyPageService.java b/src/main/java/com/example/solidconnection/siteuser/service/MyPageService.java index 69daa9273..95367668b 100644 --- a/src/main/java/com/example/solidconnection/siteuser/service/MyPageService.java +++ b/src/main/java/com/example/solidconnection/siteuser/service/MyPageService.java @@ -25,10 +25,9 @@ import com.example.solidconnection.siteuser.dto.PasswordUpdateRequest; import com.example.solidconnection.siteuser.repository.SiteUserRepository; import com.example.solidconnection.university.domain.HostUniversity; -import com.example.solidconnection.university.domain.HomeUniversity; import com.example.solidconnection.university.repository.HostUniversityRepository; -import com.example.solidconnection.university.repository.HomeUniversityRepository; import com.example.solidconnection.university.repository.LikedUnivApplyInfoRepository; +import com.example.solidconnection.university.service.HomeUniversityQueryService; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; @@ -51,7 +50,7 @@ public class MyPageService { private final CountryRepository countryRepository; private final MentorRepository mentorRepository; private final HostUniversityRepository hostUniversityRepository; - private final HomeUniversityRepository homeUniversityRepository; + private final HomeUniversityQueryService homeUniversityQueryService; private final S3Service s3Service; private final InterestedCountryService interestedCountryService; private final InterestedRegionService interestedRegionService; @@ -67,7 +66,7 @@ public MyPageResponse getMyPageInfo(long siteUserId) { List interestedCountries = null; String universityKoreanName = null; - String homeUniversityName = findHomeUniversityName(siteUser); + String homeUniversityName = homeUniversityQueryService.findNameByNullableId(siteUser.getHomeUniversityId()); if (siteUser.getRole() == Role.MENTEE) { interestedCountries = countryRepository.findKoreanNamesBySiteUserId(siteUser.getId()); } else if (siteUser.getRole() == Role.MENTOR) { @@ -86,17 +85,6 @@ public MyPageResponse getMyPageInfo(long siteUserId) { ); } - private String findHomeUniversityName(SiteUser siteUser) { - Long homeUniversityId = siteUser.getHomeUniversityId(); - if (homeUniversityId == null) { - return null; - } - - HomeUniversity homeUniversity = homeUniversityRepository.findById(homeUniversityId) - .orElseThrow(() -> new CustomException(UNIVERSITY_NOT_FOUND)); - return homeUniversity.getName(); - } - /* * 마이페이지 정보를 수정한다. * */ diff --git a/src/main/java/com/example/solidconnection/university/service/HomeUniversityQueryService.java b/src/main/java/com/example/solidconnection/university/service/HomeUniversityQueryService.java new file mode 100644 index 000000000..6d489ae74 --- /dev/null +++ b/src/main/java/com/example/solidconnection/university/service/HomeUniversityQueryService.java @@ -0,0 +1,42 @@ +package com.example.solidconnection.university.service; + +import static com.example.solidconnection.common.exception.ErrorCode.SCHOOL_EMAIL_NOT_VERIFIED; +import static com.example.solidconnection.common.exception.ErrorCode.UNIVERSITY_NOT_FOUND; + +import com.example.solidconnection.common.exception.CustomException; +import com.example.solidconnection.university.domain.HomeUniversity; +import com.example.solidconnection.university.repository.HomeUniversityRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class HomeUniversityQueryService { + + private final HomeUniversityRepository homeUniversityRepository; + + @Transactional(readOnly = true) + public String findNameByNullableId(Long homeUniversityId) { + if (homeUniversityId == null) { + return null; + } + + return findNameById(homeUniversityId); + } + + @Transactional(readOnly = true) + public String findNameByRequiredId(Long homeUniversityId) { + if (homeUniversityId == null) { + throw new CustomException(SCHOOL_EMAIL_NOT_VERIFIED); + } + + return findNameById(homeUniversityId); + } + + private String findNameById(Long homeUniversityId) { + HomeUniversity homeUniversity = homeUniversityRepository.findById(homeUniversityId) + .orElseThrow(() -> new CustomException(UNIVERSITY_NOT_FOUND)); + return homeUniversity.getName(); + } +} diff --git a/src/test/java/com/example/solidconnection/score/service/ScoreServiceTest.java b/src/test/java/com/example/solidconnection/score/service/ScoreServiceTest.java index ddf7a722e..c4d25ce9c 100644 --- a/src/test/java/com/example/solidconnection/score/service/ScoreServiceTest.java +++ b/src/test/java/com/example/solidconnection/score/service/ScoreServiceTest.java @@ -1,9 +1,11 @@ package com.example.solidconnection.score.service; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.BDDMockito.given; import com.example.solidconnection.common.VerifyStatus; +import com.example.solidconnection.common.exception.ErrorCode; import com.example.solidconnection.s3.domain.UploadPath; import com.example.solidconnection.s3.dto.UploadedFileUrlResponse; import com.example.solidconnection.s3.service.S3Service; @@ -20,7 +22,9 @@ import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.siteuser.fixture.SiteUserFixture; import com.example.solidconnection.support.TestContainerSpringBootTest; +import com.example.solidconnection.university.domain.HomeUniversity; import com.example.solidconnection.university.domain.LanguageTestType; +import com.example.solidconnection.university.fixture.HomeUniversityFixture; import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -54,11 +58,16 @@ class ScoreServiceTest { @Autowired private LanguageTestScoreFixture languageTestScoreFixture; + @Autowired + private HomeUniversityFixture homeUniversityFixture; + + private HomeUniversity homeUniversity; private SiteUser user; @BeforeEach void setUp() { - user = siteUserFixture.사용자(); + homeUniversity = homeUniversityFixture.인하대학교(); + user = siteUserFixture.국내_대학_정보_소지_사용자(homeUniversity.getId()); } @Test @@ -76,6 +85,15 @@ void setUp() { assertThat(response.gpaScoreStatusResponseList()).hasSize(scores.size()); } + @Test + void GPA_점수_상태를_조회할_때_사용자의_모학교명을_반환한다() { + // when + GpaScoreStatusesResponse response = scoreService.getGpaScoreStatus(user.getId()); + + // then + assertThat(response.homeUniversityName()).isEqualTo(homeUniversity.getName()); + } + @Test void GPA_점수가_없는_경우_빈_리스트를_반환한다() { // when @@ -85,6 +103,17 @@ void setUp() { assertThat(response.gpaScoreStatusResponseList()).isEmpty(); } + @Test + void 모학교가_없는_사용자의_GPA_점수_상태를_조회하면_예외가_발생한다() { + // given + user = siteUserFixture.사용자(); + + // when + // then + assertThatThrownBy(() -> scoreService.getGpaScoreStatus(user.getId())) + .hasMessage(ErrorCode.SCHOOL_EMAIL_NOT_VERIFIED.getMessage()); + } + @Test void 어학_시험_점수_상태를_조회한다() { // given