Skip to content

Commit 8ed8bd0

Browse files
authored
Feature/86 봉사자의 관심기관 조회 기능 (#96)
* feat: 기관 아이디 리스트를 통한 오버뷰 데이터 조회 구현 - 기관Id 리스트로 기관 Id, 이름, 프로필 이미지 url을 조회하는 query 메서드를 영속성 레이어에 구현 - 서비스 레이어 구현 - 테스트 코드 작성및 검증 완 * feat: 봉사자의 관심 기관 리스트 조회 기능 구현 - 봉사자 Id로 관심기관 데이터를 조회하는 쿼리 메서드 구현 - 서비스 레이어 구현 - 관심 기관의 Id, 이름, 프로필 이미지 링크를 담아줄 응답 객체 생성 - 테스트 코드 작성및 검증 완 * feat: 테스트용 인증 유저 어노테이션 구현 - 컨트롤러 테스트에서 이용할 인증유저 어노테이션을 구현했습니다. * feat: 관심기관 조회 컨트롤러 구현 - 관심기관 조회 컨트롤러 구현 - swagger 어노테이션 작성 - 테스트 코드 작성및 검증 완료 * chore: 불필요한 import문 제거 - 응답 객체의 불필요한 import문 제거 * chore: 테스트 커버리지 제외 클래스 추가 - 테스트용 contextFactory의 테스트 커버리지 예외 설정 * chore: 코드 리뷰 사항 반영 - 일부 mapper 클래스의 네이밍을 수정 - mapper 클래스의 디렉토리 위치 수정 - 응답 클래스에 대한 스웨거 작
1 parent 33f9854 commit 8ed8bd0

18 files changed

+431
-16
lines changed

build.gradle

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,8 @@ def jacocoExcludePatterns = [
115115
'**/auth/**',
116116
'**/domain/*',
117117
'**/domains/*',
118-
'**/fixture/*'
118+
'**/fixture/*',
119+
'**/*Factory*'
119120
]
120121

121122
def jacocoExcludePatternsForVerify = [
@@ -130,7 +131,8 @@ def jacocoExcludePatternsForVerify = [
130131
'*.auth.*',
131132
'*.domain.*',
132133
'*.domains.*',
133-
'*.fixture.*'
134+
'*.fixture.*',
135+
'*.*Factory*'
134136
]
135137

136138
jacocoTestReport {

src/main/java/com/somemore/center/repository/CenterRepository.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package com.somemore.center.repository;
22

33
import com.somemore.center.domain.Center;
4+
import com.somemore.center.repository.mapper.CenterOverviewInfo;
45
import org.springframework.stereotype.Repository;
56

7+
import java.util.List;
68
import java.util.Optional;
79
import java.util.UUID;
810

@@ -14,5 +16,6 @@ default boolean doesNotExistById(UUID id) {
1416
return !existsById(id);
1517
}
1618
Optional<Center> findCenterById(UUID id);
19+
List<CenterOverviewInfo> findCenterOverviewsByIds(List<UUID> ids);
1720
void deleteAllInBatch();
1821
}

src/main/java/com/somemore/center/repository/CenterRepositoryImpl.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,22 @@
11
package com.somemore.center.repository;
22

3+
import com.querydsl.core.types.Projections;
4+
import com.querydsl.jpa.impl.JPAQueryFactory;
35
import com.somemore.center.domain.Center;
6+
import com.somemore.center.domain.QCenter;
7+
import com.somemore.center.repository.mapper.CenterOverviewInfo;
48
import lombok.RequiredArgsConstructor;
59
import org.springframework.stereotype.Repository;
610

11+
import java.util.List;
712
import java.util.Optional;
813
import java.util.UUID;
914

1015
@RequiredArgsConstructor
1116
@Repository
1217
public class CenterRepositoryImpl implements CenterRepository {
1318

19+
private final JPAQueryFactory queryFactory;
1420
private final CenterJpaRepository centerJpaRepository;
1521

1622
@Override
@@ -28,6 +34,23 @@ public Optional<Center> findCenterById(UUID id) {
2834
return centerJpaRepository.findCenterById(id);
2935
}
3036

37+
@Override
38+
public List<CenterOverviewInfo> findCenterOverviewsByIds(List<UUID> ids) {
39+
QCenter center = QCenter.center;
40+
41+
return queryFactory
42+
.select(Projections.constructor(
43+
CenterOverviewInfo.class,
44+
center.id,
45+
center.name,
46+
center.imgUrl
47+
))
48+
.from(center)
49+
.where(center.id.in(ids)
50+
.and(center.deleted.eq(false)))
51+
.fetch();
52+
}
53+
3154
@Override
3255
public void deleteAllInBatch() {
3356
centerJpaRepository.deleteAllInBatch();
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.somemore.center.repository.mapper;
2+
3+
4+
import java.util.UUID;
5+
6+
public record CenterOverviewInfo(
7+
UUID centerId,
8+
String centerName,
9+
String imgUrl
10+
) {
11+
12+
}

src/main/java/com/somemore/center/service/query/CenterQueryService.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.somemore.center.service.query;
22

33
import com.somemore.center.domain.Center;
4+
import com.somemore.center.repository.mapper.CenterOverviewInfo;
45
import com.somemore.center.dto.response.CenterProfileResponseDto;
56
import com.somemore.center.dto.response.PreferItemResponseDto;
67
import com.somemore.center.repository.CenterRepository;
@@ -33,6 +34,11 @@ public CenterProfileResponseDto getCenterProfileByCenterId(UUID centerId) {
3334
return CenterProfileResponseDto.of(center, preferItemDtos);
3435
}
3536

37+
@Override
38+
public List<CenterOverviewInfo> getCenterOverviewsByIds(List<UUID> centerIds) {
39+
return centerRepository.findCenterOverviewsByIds(centerIds);
40+
}
41+
3642
@Override
3743
public void validateCenterExists(UUID id) {
3844
if (centerRepository.doesNotExistById(id)) {
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package com.somemore.center.usecase.query;
22

3+
import com.somemore.center.repository.mapper.CenterOverviewInfo;
34
import com.somemore.center.dto.response.CenterProfileResponseDto;
45

6+
import java.util.List;
57
import java.util.UUID;
68

79
public interface CenterQueryUseCase {
8-
910
CenterProfileResponseDto getCenterProfileByCenterId(UUID centerId);
11+
List<CenterOverviewInfo> getCenterOverviewsByIds(List<UUID> centerIds);
1012
void validateCenterExists(UUID centerId);
1113
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.somemore.interestcenter.controller;
2+
3+
import com.somemore.global.common.response.ApiResponse;
4+
import com.somemore.interestcenter.dto.response.InterestCentersResponseDto;
5+
import com.somemore.interestcenter.usecase.InterestCenterQueryUseCase;
6+
import io.swagger.v3.oas.annotations.Operation;
7+
import io.swagger.v3.oas.annotations.tags.Tag;
8+
import lombok.RequiredArgsConstructor;
9+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
10+
import org.springframework.web.bind.annotation.GetMapping;
11+
import org.springframework.web.bind.annotation.RestController;
12+
13+
import java.util.List;
14+
import java.util.UUID;
15+
16+
@RequiredArgsConstructor
17+
@RestController
18+
@Tag(name = "Interest Center Query API", description = "관심 기관의 조회 API를 제공합니다")
19+
public class InterestCenterQueryApiController {
20+
21+
private final InterestCenterQueryUseCase interestCenterQueryUseCase;
22+
23+
@Operation(summary = "관심기관 목록 조회 API")
24+
@GetMapping("/api/interest-centers")
25+
public ApiResponse<List<InterestCentersResponseDto>> getInterestCenters(@AuthenticationPrincipal String volunteerId) {
26+
27+
List<InterestCentersResponseDto> responseDtos = interestCenterQueryUseCase.getInterestCenters(UUID.fromString(volunteerId));
28+
29+
return ApiResponse.ok(200, responseDtos, "관심기관 조회 성공");
30+
}
31+
32+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.somemore.interestcenter.dto.response;
2+
3+
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
4+
import com.fasterxml.jackson.databind.annotation.JsonNaming;
5+
import com.somemore.center.repository.mapper.CenterOverviewInfo;
6+
import io.swagger.v3.oas.annotations.media.Schema;
7+
import lombok.Builder;
8+
9+
import java.util.UUID;
10+
11+
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
12+
@Builder
13+
public record InterestCentersResponseDto(
14+
@Schema(description = "관심기관의 ID", example = "123e4567-e89b-12d3-a456-426614174000")
15+
UUID centerId,
16+
@Schema(description = "관심기관의 이름", example = "서울 도서관")
17+
String centerName,
18+
@Schema(description = "관심기관의 프로필 이미지 링크", example = "~~/image.jpeg")
19+
String imgUrl
20+
) {
21+
public static InterestCentersResponseDto of(CenterOverviewInfo responseDto) {
22+
return InterestCentersResponseDto.builder()
23+
.centerId(responseDto.centerId())
24+
.centerName(responseDto.centerName())
25+
.imgUrl(responseDto.imgUrl())
26+
.build();
27+
}
28+
}

src/main/java/com/somemore/interestcenter/dto/response/RegisterInterestCenterResponseDto.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public record RegisterInterestCenterResponseDto(
1717
@Schema(description = "봉사자 ID", example = "123e4567-e89b-12d3-a456-426614174000")
1818
UUID volunteerId,
1919

20-
@Schema(description = "센터 ID", example = "123e4567-e89b-12d3-a456-426614174000")
20+
@Schema(description = "기관 ID", example = "123e4567-e89b-12d3-a456-426614174000")
2121
UUID centerId
2222
) {
2323
public static RegisterInterestCenterResponseDto from(InterestCenter interestCenter) {

src/main/java/com/somemore/interestcenter/repository/InterestCenterRepository.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@
33
import com.somemore.interestcenter.domain.InterestCenter;
44
import com.somemore.interestcenter.dto.response.RegisterInterestCenterResponseDto;
55

6+
import java.util.List;
67
import java.util.Optional;
78
import java.util.UUID;
89

910
public interface InterestCenterRepository {
1011
InterestCenter save(InterestCenter interestCenter);
1112
Optional<InterestCenter> findById(Long id);
1213
Optional<RegisterInterestCenterResponseDto> findInterestCenterResponseById(Long id);
14+
List<UUID> findInterestCenterIdsByVolunteerId(UUID volunteerId);
1315
boolean existsByVolunteerIdAndCenterId(UUID volunteerId, UUID centerId);
1416
}

0 commit comments

Comments
 (0)