Skip to content

Commit a560152

Browse files
committed
feature: 권역으로 멘토 필터링 구현
1 parent 007baf7 commit a560152

File tree

4 files changed

+81
-24
lines changed

4 files changed

+81
-24
lines changed

src/main/java/com/example/solidconnection/location/region/repository/RegionRepository.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.example.solidconnection.location.region.domain.Region;
44
import java.util.List;
5+
import java.util.Optional;
56
import org.springframework.data.jpa.repository.JpaRepository;
67
import org.springframework.data.jpa.repository.Query;
78
import org.springframework.data.repository.query.Param;
@@ -10,4 +11,6 @@ public interface RegionRepository extends JpaRepository<Region, Long> {
1011

1112
@Query("SELECT r FROM Region r WHERE r.koreanName IN :names")
1213
List<Region> findByKoreanNames(@Param(value = "names") List<String> names);
14+
15+
Optional<Region> findByKoreanName(String koreanName);
1316
}

src/main/java/com/example/solidconnection/mentor/repository/MentorRepository.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package com.example.solidconnection.mentor.repository;
22

3+
import com.example.solidconnection.location.region.domain.Region;
34
import com.example.solidconnection.mentor.domain.Mentor;
45
import java.util.Optional;
56
import org.springframework.data.domain.Pageable;
67
import org.springframework.data.domain.Slice;
78
import org.springframework.data.jpa.repository.JpaRepository;
9+
import org.springframework.data.jpa.repository.Query;
10+
import org.springframework.data.repository.query.Param;
811

912
public interface MentorRepository extends JpaRepository<Mentor, Long> {
1013

@@ -13,4 +16,11 @@ public interface MentorRepository extends JpaRepository<Mentor, Long> {
1316
Optional<Mentor> findBySiteUserId(long siteUserId);
1417

1518
Slice<Mentor> findAllBy(Pageable pageable);
19+
20+
@Query("""
21+
SELECT m FROM Mentor m
22+
JOIN University u ON m.universityId = u.id
23+
WHERE u.region = :region
24+
""")
25+
Slice<Mentor> findAllByRegion(@Param("region") Region region, Pageable pageable);
1626
}

src/main/java/com/example/solidconnection/mentor/service/MentorQueryService.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55

66
import com.example.solidconnection.common.dto.SliceResponse;
77
import com.example.solidconnection.common.exception.CustomException;
8+
import com.example.solidconnection.common.exception.ErrorCode;
9+
import com.example.solidconnection.location.region.domain.Region;
10+
import com.example.solidconnection.location.region.repository.RegionRepository;
811
import com.example.solidconnection.mentor.domain.Mentor;
912
import com.example.solidconnection.mentor.dto.MentorDetailResponse;
1013
import com.example.solidconnection.mentor.dto.MentorPreviewResponse;
@@ -33,6 +36,7 @@ public class MentorQueryService {
3336
private final SiteUserRepository siteUserRepository;
3437
private final MentorBatchQueryRepository mentorBatchQueryRepository;
3538
private final UniversityRepository universityRepository;
39+
private final RegionRepository regionRepository;
3640

3741
@Transactional(readOnly = true)
3842
public MentorDetailResponse getMentorDetails(long mentorId, long currentUserId) {
@@ -48,15 +52,24 @@ public MentorDetailResponse getMentorDetails(long mentorId, long currentUserId)
4852
}
4953

5054
@Transactional(readOnly = true)
51-
public SliceResponse<MentorPreviewResponse> getMentorPreviews(String region, long currentUserId, Pageable pageable) { // todo: 멘토의 '인증' 작업 후 region 필터링 추가
52-
Slice<Mentor> mentorSlice = mentorRepository.findAllBy(pageable);
55+
public SliceResponse<MentorPreviewResponse> getMentorPreviews(String regionKoreanName, long currentUserId, Pageable pageable) {
56+
Slice<Mentor> mentorSlice = filterMentorsByRegion(regionKoreanName, pageable);
5357
List<Mentor> mentors = mentorSlice.toList();
5458
List<MentorPreviewResponse> content = getMentorPreviewResponses(mentors, currentUserId);
5559

5660
return SliceResponse.of(content, mentorSlice);
5761
}
5862

59-
private List<MentorPreviewResponse> getMentorPreviewResponses(List<Mentor> mentors, long currentUserId) {
63+
private Slice<Mentor> filterMentorsByRegion(String regionKoreanName, Pageable pageable) {
64+
if (regionKoreanName == null || regionKoreanName.isEmpty()) {
65+
return mentorRepository.findAll(pageable);
66+
}
67+
Region region = regionRepository.findByKoreanName(regionKoreanName)
68+
.orElseThrow(() -> new CustomException(ErrorCode.REGION_NOT_FOUND_BY_KOREAN_NAME));
69+
return mentorRepository.findAllByRegion(region, pageable);
70+
}
71+
72+
private List<MentorPreviewResponse> getMentorPreviewResponses(List<Mentor> mentors, long currentUserId) { // todo: 이름 변경?
6073
Map<Long, SiteUser> mentorIdToSiteUser = mentorBatchQueryRepository.getMentorIdToSiteUserMap(mentors);
6174
Map<Long, University> mentorIdToUniversity = mentorBatchQueryRepository.getMentorIdToUniversityMap(mentors);
6275
Map<Long, Boolean> mentorIdToIsApplied = mentorBatchQueryRepository.getMentorIdToIsApplied(mentors, currentUserId);

src/test/java/com/example/solidconnection/mentor/service/MentorQueryServiceTest.java

Lines changed: 52 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ class MentorQueryServiceTest {
5353
private UniversityFixture universityFixture;
5454

5555
private University university;
56-
private String region = "아시아";
5756

5857
@BeforeEach
5958
void setUp() {
@@ -124,7 +123,7 @@ class 멘토_단일_조회_실패 {
124123
}
125124

126125
@Nested
127-
class 멘토_미리보기_목록_조회 {
126+
class 멘토_미리보기_목록_정보_조회 {
128127

129128
private static final int NO_NEXT_PAGE_NUMBER = -1;
130129

@@ -150,7 +149,7 @@ void setUp() {
150149
Channel channel2 = channelFixture.채널(2, mentor2);
151150

152151
// when
153-
SliceResponse<MentorPreviewResponse> response = mentorQueryService.getMentorPreviews(region, currentUser.getId(), PageRequest.of(0, 10));
152+
SliceResponse<MentorPreviewResponse> response = mentorQueryService.getMentorPreviews("", currentUser.getId(), PageRequest.of(0, 10));
154153

155154
// then
156155
Map<Long, MentorPreviewResponse> mentorPreviewMap = response.content().stream()
@@ -173,38 +172,70 @@ void setUp() {
173172
}
174173

175174
@Test
176-
void 멘토들에_대한_나의_멘토링_지원_여부를_조회한다() {
175+
void 다음_페이지_번호를_응답한다() {
177176
// given
178-
mentoringFixture.대기중_멘토링(mentor1.getId(), currentUser.getId());
179-
180-
// when
181-
SliceResponse<MentorPreviewResponse> response = mentorQueryService.getMentorPreviews(region, currentUser.getId(), PageRequest.of(0, 10));
177+
SliceResponse<MentorPreviewResponse> response = mentorQueryService.getMentorPreviews("", currentUser.getId(), PageRequest.of(0, 1));
182178

183179
// then
184-
Map<Long, MentorPreviewResponse> mentorPreviewMap = response.content().stream()
185-
.collect(Collectors.toMap(MentorPreviewResponse::id, Function.identity()));
186-
assertAll(
187-
() -> assertThat(mentorPreviewMap.get(mentor1.getId()).isApplied()).isTrue(),
188-
() -> assertThat(mentorPreviewMap.get(mentor2.getId()).isApplied()).isFalse()
189-
);
180+
assertThat(response.nextPageNumber()).isEqualTo(2);
190181
}
191182

192183
@Test
193-
void 다음_페이지_번호를_응답한다() {
184+
void 다음_페이지가_없으면_페이지_없음을_의미하는_값을_응답한다() {
194185
// given
195-
SliceResponse<MentorPreviewResponse> response = mentorQueryService.getMentorPreviews(region, currentUser.getId(), PageRequest.of(0, 1));
186+
SliceResponse<MentorPreviewResponse> response = mentorQueryService.getMentorPreviews("", currentUser.getId(), PageRequest.of(0, 10));
196187

197188
// then
198-
assertThat(response.nextPageNumber()).isEqualTo(2);
189+
assertThat(response.nextPageNumber()).isEqualTo(NO_NEXT_PAGE_NUMBER);
190+
}
191+
}
192+
193+
@Nested
194+
class 멘토_미리보기_목록_필터링 {
195+
196+
private Mentor asiaMentor, europeMentor;
197+
private SiteUser currentUser;
198+
private University asiaUniversity, europeUniversity;
199+
200+
@BeforeEach
201+
void setUp() {
202+
currentUser = siteUserFixture.사용자(1, "사용자1");
203+
SiteUser mentorUser1 = siteUserFixture.사용자(2, "멘토1");
204+
SiteUser mentorUser2 = siteUserFixture.사용자(3, "멘토2");
205+
asiaUniversity = universityFixture.메이지_대학();
206+
europeUniversity = universityFixture.린츠_카톨릭_대학();
207+
asiaMentor = mentorFixture.멘토(mentorUser1.getId(), asiaUniversity.getId());
208+
europeMentor = mentorFixture.멘토(mentorUser2.getId(), europeUniversity.getId());
199209
}
200210

201211
@Test
202-
void 다음_페이지가_없으면_페이지_없음을_의미하는_값을_응답한다() {
203-
// given
204-
SliceResponse<MentorPreviewResponse> response = mentorQueryService.getMentorPreviews(region, currentUser.getId(), PageRequest.of(0, 10));
212+
void 권역으로_멘토_목록을_필터링한다() {
213+
// when
214+
SliceResponse<MentorPreviewResponse> asiaFilteredResponse = mentorQueryService.getMentorPreviews(
215+
asiaUniversity.getRegion().getKoreanName(), currentUser.getId(), PageRequest.of(0, 10));
216+
SliceResponse<MentorPreviewResponse> europeFilteredResponse = mentorQueryService.getMentorPreviews(
217+
europeUniversity.getRegion().getKoreanName(), currentUser.getId(), PageRequest.of(0, 10));
205218

206219
// then
207-
assertThat(response.nextPageNumber()).isEqualTo(NO_NEXT_PAGE_NUMBER);
220+
assertAll(
221+
() -> assertThat(asiaFilteredResponse.content()).hasSize(1)
222+
.extracting(MentorPreviewResponse::id)
223+
.containsExactly(asiaMentor.getId()),
224+
() -> assertThat(europeFilteredResponse.content()).hasSize(1)
225+
.extracting(MentorPreviewResponse::id)
226+
.containsExactly(europeMentor.getId())
227+
);
228+
}
229+
230+
@Test
231+
void 권역을_지정하지_않으면_전체_멘토_목록을_조회한다() {
232+
// when
233+
SliceResponse<MentorPreviewResponse> response = mentorQueryService.getMentorPreviews("", currentUser.getId(), PageRequest.of(0, 10));
234+
235+
// then
236+
assertThat(response.content()).hasSize(2)
237+
.extracting(MentorPreviewResponse::id)
238+
.containsExactlyInAnyOrder(asiaMentor.getId(), europeMentor.getId());
208239
}
209240
}
210241
}

0 commit comments

Comments
 (0)