Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
@@ -1,5 +1,6 @@
package com.example.solidconnection.application.controller;

import com.example.solidconnection.application.dto.ApplicationPreviewResponse;
import com.example.solidconnection.application.dto.ApplicationSubmissionResponse;
import com.example.solidconnection.application.dto.ApplicationsResponse;
import com.example.solidconnection.application.dto.ApplyRequest;
Expand Down Expand Up @@ -37,6 +38,14 @@ public ResponseEntity<ApplicationSubmissionResponse> apply(
.body(applicationSubmissionResponse);
}

@GetMapping("/preview")
public ResponseEntity<ApplicationPreviewResponse> getApplicationPreview(
@AuthorizedUser long siteUserId
) {
ApplicationPreviewResponse result = applicationQueryService.getApplicantUniversityPreviews(siteUserId);
return ResponseEntity.ok(result);
}

// @RequireRoleAccess(roles = {Role.ADMIN}) // todo : 추후 어드민 페이지에서 권한 변경 기능 추가 필요
@GetMapping
public ResponseEntity<ApplicationsResponse> getApplicants(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.example.solidconnection.application.dto;

import java.util.List;

public record ApplicationPreviewResponse(
long totalUniversityCount,
List<ApplicationUniversityPreviewResponse> universities) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.example.solidconnection.application.dto;

import com.example.solidconnection.university.domain.UnivApplyInfo;

public record ApplicationUniversityPreviewResponse(
long id,
String koreanName,
Integer studentCapacity,
String region,
String country,
String logoImageUrl,
String backgroundImageUrl) {

public static ApplicationUniversityPreviewResponse from(UnivApplyInfo univApplyInfo) {
return new ApplicationUniversityPreviewResponse(
univApplyInfo.getId(),
univApplyInfo.getKoreanName(),
univApplyInfo.getStudentCapacity(),
univApplyInfo.getUniversity().getRegion().getKoreanName(),
univApplyInfo.getUniversity().getCountry().getKoreanName(),
univApplyInfo.getUniversity().getLogoImageUrl(),
univApplyInfo.getUniversity().getBackgroundImageUrl()
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import static com.example.solidconnection.common.exception.ErrorCode.APPLICATION_NOT_FOUND;

import com.example.solidconnection.application.domain.Application;
import com.example.solidconnection.application.dto.ApplicationUniversityPreviewResponse;
import com.example.solidconnection.common.VerifyStatus;
import com.example.solidconnection.common.exception.CustomException;
import java.util.List;
Expand All @@ -29,6 +30,32 @@ List<Application> findAllByUnivApplyInfoIds(
@Param("status") VerifyStatus status,
@Param("termId") long termId);

@Query("""
SELECT DISTINCT new com.example.solidconnection.application.dto.ApplicationUniversityPreviewResponse(
uai.id,
uai.koreanName,
uai.studentCapacity,
region.koreanName,
country.koreanName,
university.logoImageUrl,
university.backgroundImageUrl
)
FROM Application application
JOIN application.choices choice
JOIN UnivApplyInfo uai ON uai.id = choice.univApplyInfoId
JOIN uai.university university
JOIN university.region region
JOIN university.country country
WHERE application.verifyStatus = :status
AND application.termId = :termId
AND application.isDelete = false
AND uai.termId = :termId
ORDER BY uai.koreanName
""")
Comment thread
Hexeong marked this conversation as resolved.
List<ApplicationUniversityPreviewResponse> findApplicantUniversityPreviews(
@Param("status") VerifyStatus status,
@Param("termId") long termId);

Optional<Application> findTopBySiteUserIdAndTermIdAndIsDeleteFalseOrderByIdDesc(long siteUserId, long termId);

default Application getApplicationBySiteUserIdAndTermId(long siteUserId, long termId) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import com.example.solidconnection.application.domain.Application;
import com.example.solidconnection.application.domain.ApplicationChoice;
import com.example.solidconnection.application.dto.ApplicantsResponse;
import com.example.solidconnection.application.dto.ApplicationPreviewResponse;
import com.example.solidconnection.application.dto.ApplicationsResponse;
import com.example.solidconnection.application.repository.ApplicationRepository;
import com.example.solidconnection.common.VerifyStatus;
Expand Down Expand Up @@ -41,6 +42,20 @@ public class ApplicationQueryService {
private final TermRepository termRepository;
private final HomeUniversityRepository homeUniversityRepository;

@Transactional(readOnly = true)
public ApplicationPreviewResponse getApplicantUniversityPreviews(long siteUserId) {
siteUserRepository.findById(siteUserId)
.orElseThrow(() -> new CustomException(USER_NOT_FOUND));

Term term = termRepository.findByIsCurrentTrue()
.orElseThrow(() -> new CustomException(CURRENT_TERM_NOT_FOUND));

return new ApplicationPreviewResponse(
univApplyInfoRepository.countByTermId(term.getId()),
applicationRepository.findApplicantUniversityPreviews(VerifyStatus.APPROVED, term.getId())
);
}

@Transactional(readOnly = true)
public ApplicationsResponse getApplicants(long siteUserId, String regionCode, String keyword) {
SiteUser siteUser = siteUserRepository.findById(siteUserId)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@ default UnivApplyInfo getUnivApplyInfoById(Long id) {

boolean existsByHomeUniversityId(Long homeUniversityId);

long countByTermId(long termId);

@Query("""
SELECT uai.id
FROM UnivApplyInfo uai
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import com.example.solidconnection.application.domain.Application;
import com.example.solidconnection.application.dto.ApplicantResponse;
import com.example.solidconnection.application.dto.ApplicantsResponse;
import com.example.solidconnection.application.dto.ApplicationPreviewResponse;
import com.example.solidconnection.application.dto.ApplicationUniversityPreviewResponse;
import com.example.solidconnection.application.dto.ApplicationsResponse;
import com.example.solidconnection.application.fixture.ApplicationFixture;
import com.example.solidconnection.application.repository.ApplicationRepository;
Expand Down Expand Up @@ -98,6 +100,63 @@ void setUp() {
서던덴마크대학교_지원_정보 = univApplyInfoFixture.서던덴마크대학교_지원_정보(term.getId());
}

@Nested
Comment thread
Hexeong marked this conversation as resolved.
class 지원_현황_미리보기_조회_테스트 {

@Test
void 현재_학기에_승인되고_삭제되지_않은_지원서의_대학만_중복_없이_조회한다() {
// given
applicationFixture.지원서(
user1, "nickname1", term.getId(),
gpaScore1.getGpa(), languageTestScore1.getLanguageTest(),
List.of(괌대학_A_지원_정보.getId(), 버지니아공과대학_지원_정보.getId())
);
applicationFixture.지원서(
user2, "nickname2", term.getId(),
gpaScore2.getGpa(), languageTestScore2.getLanguageTest(),
List.of(괌대학_A_지원_정보.getId())
);
Application deletedApplication = applicationFixture.지원서(
user3, "nickname3", term.getId(),
gpaScore3.getGpa(), languageTestScore3.getLanguageTest(),
List.of(서던덴마크대학교_지원_정보.getId())
);
deletedApplication.setIsDeleteTrue();
applicationRepository.save(deletedApplication);

// when
ApplicationPreviewResponse response = applicationQueryService.getApplicantUniversityPreviews(user1.getId());

// then
assertThat(response.totalUniversityCount()).isEqualTo(3);
assertThat(response.universities()).containsExactly(
ApplicationUniversityPreviewResponse.from(괌대학_A_지원_정보),
ApplicationUniversityPreviewResponse.from(버지니아공과대학_지원_정보)
);
}

@Test
void 성적과_지원서를_제출하지_않은_로그인_사용자도_미리보기를_조회할_수_있다() {
// given
SiteUser signedInUserWithoutScores = siteUserFixture.사용자(4, "signed-in-only");
applicationFixture.지원서(
user2, "nickname2", term.getId(),
gpaScore2.getGpa(), languageTestScore2.getLanguageTest(),
List.of(괌대학_A_지원_정보.getId())
);

// when
ApplicationPreviewResponse response = applicationQueryService.getApplicantUniversityPreviews(
signedInUserWithoutScores.getId());

// then
assertThat(response.totalUniversityCount()).isEqualTo(3);
assertThat(response.universities()).containsExactly(
ApplicationUniversityPreviewResponse.from(괌대학_A_지원_정보)
);
}
}

@Nested
class 지원자_목록_조회_테스트 {

Expand Down
Loading