diff --git a/src/main/java/gg/agit/konect/domain/website/dto/WebsiteClubDetailResponse.java b/src/main/java/gg/agit/konect/domain/website/dto/WebsiteClubDetailResponse.java index 75783697e..0b30a2691 100644 --- a/src/main/java/gg/agit/konect/domain/website/dto/WebsiteClubDetailResponse.java +++ b/src/main/java/gg/agit/konect/domain/website/dto/WebsiteClubDetailResponse.java @@ -45,6 +45,7 @@ public record WebsiteClubDetailResponse( Recruitment recruitment ) { + @Schema(name = "WebsiteClubDetailUniversityResponse") public record University( @Schema(description = "대학 고유 ID", example = "1", requiredMode = REQUIRED) Integer id, @@ -59,7 +60,17 @@ public record University( UniversityRegion region, @Schema(description = "지역명", example = "충청도", requiredMode = REQUIRED) - String regionName + String regionName, + + @Schema( + description = "대학 로고 이미지 URL", + example = "https://example.com/koreatech-logo.png", + requiredMode = REQUIRED + ) + String imageUrl, + + @Schema(description = "대학에 등록된 동아리 수", example = "28", requiredMode = REQUIRED) + Long clubCount ) { } @@ -95,7 +106,7 @@ private static Recruitment from(Club club) { } } - public static WebsiteClubDetailResponse of(Club club, Long memberCount) { + public static WebsiteClubDetailResponse of(Club club, Long memberCount, Long universityClubCount) { return new WebsiteClubDetailResponse( club.getId(), club.getName(), @@ -111,7 +122,9 @@ public static WebsiteClubDetailResponse of(Club club, Long memberCount) { club.getUniversity().getKoreanName(), club.getUniversity().getCampus().getDisplayName(), club.getUniversity().getRegion(), - club.getUniversity().getRegion().getDisplayName() + club.getUniversity().getRegion().getDisplayName(), + club.getUniversity().getImageUrl(), + universityClubCount ), Recruitment.from(club) ); diff --git a/src/main/java/gg/agit/konect/domain/website/repository/WebsiteQueryRepository.java b/src/main/java/gg/agit/konect/domain/website/repository/WebsiteQueryRepository.java index ea142261b..d4f00ee99 100644 --- a/src/main/java/gg/agit/konect/domain/website/repository/WebsiteQueryRepository.java +++ b/src/main/java/gg/agit/konect/domain/website/repository/WebsiteQueryRepository.java @@ -125,6 +125,16 @@ public Map countClubCategories(Integer universityId, String return categoryCounts; } + public Long countClubsByUniversityId(Integer universityId) { + Long count = jpaQueryFactory + .select(club.count()) + .from(club) + .where(createClubCondition(universityId, null, null)) + .fetchOne(); + + return count == null ? 0 : count; + } + public Optional findClub(Integer clubId) { return Optional.ofNullable(jpaQueryFactory .selectFrom(club) diff --git a/src/main/java/gg/agit/konect/domain/website/service/WebsiteService.java b/src/main/java/gg/agit/konect/domain/website/service/WebsiteService.java index 69b384658..5902e611f 100644 --- a/src/main/java/gg/agit/konect/domain/website/service/WebsiteService.java +++ b/src/main/java/gg/agit/konect/domain/website/service/WebsiteService.java @@ -63,8 +63,9 @@ public WebsiteClubDetailResponse getClubDetail(Integer clubId) { Club club = websiteQueryRepository.findClub(clubId) .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB)); Long memberCount = websiteQueryRepository.countMembersByClubIds(List.of(clubId)).getOrDefault(clubId, 0L); + Long universityClubCount = websiteQueryRepository.countClubsByUniversityId(club.getUniversity().getId()); - return WebsiteClubDetailResponse.of(club, memberCount); + return WebsiteClubDetailResponse.of(club, memberCount, universityClubCount); } public WebsiteClubsResponse getRecentClubs(List clubIds) { diff --git a/src/test/java/gg/agit/konect/integration/domain/website/WebsiteApiTest.java b/src/test/java/gg/agit/konect/integration/domain/website/WebsiteApiTest.java index ab7a54b5c..e357d5dda 100644 --- a/src/test/java/gg/agit/konect/integration/domain/website/WebsiteApiTest.java +++ b/src/test/java/gg/agit/konect/integration/domain/website/WebsiteApiTest.java @@ -126,9 +126,11 @@ void getClubDetailSuccess() throws Exception { University university = persist(UniversityFixture.create( "한국기술교육대학교", Campus.MAIN, - UniversityRegion.CHUNGCHEONG + UniversityRegion.CHUNGCHEONG, + "https://example.com/koreatech-logo.png" )); Club club = persist(createClub(university, "ZEST", ClubCategory.PERFORMANCE)); + persist(createClub(university, "BCSD Lab", ClubCategory.ACADEMIC)); persist(ClubRecruitmentFixture.createAlwaysRecruiting(club)); persistMember(club, "회장", "2024000004"); clearPersistenceContext(); @@ -140,6 +142,8 @@ void getClubDetailSuccess() throws Exception { .andExpect(jsonPath("$.categoryName").value("공연")) .andExpect(jsonPath("$.university.name").value("한국기술교육대학교")) .andExpect(jsonPath("$.university.region").value("CHUNGCHEONG")) + .andExpect(jsonPath("$.university.imageUrl").value("https://example.com/koreatech-logo.png")) + .andExpect(jsonPath("$.university.clubCount").value(2)) .andExpect(jsonPath("$.memberCount").value(1)) .andExpect(jsonPath("$.recruitment.isAlwaysRecruiting").value(true)) .andExpect(jsonPath("$.recruitment.content").value("상시 모집 공고 내용입니다."));