Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
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
Expand Up @@ -34,21 +34,21 @@ public class GetMyStudyInfoService {

public GetStudyOverviewResponse getMyStudyOverview(
long viewerId,
StudyMemberStatus status,
List<StudyMemberStatus> statuses,
Long cursor,
int size
) {
final int pageSize = Math.min(size, MAX_PAGE_SIZE);
List<Study> rows = studyQueryRepository.findMyStudies(
viewerId,
status,
statuses,
cursor,
pageSize + 1
);

long totalElements = studyQueryRepository.countMyStudies(
viewerId,
status
statuses
);
return toCursorPage(rows, viewerId, pageSize, totalElements);
}
Expand All @@ -66,7 +66,8 @@ public GetStudyOverviewResponse getMyPreferredRegionStudies(
) {
final int pageSize = Math.min(size, MAX_PAGE_SIZE);
List<String> preferredRegionCodes = getPreferredRegionPort.get(viewerId);
List<String> filteredRegionCodes = filterPreferredRegionCodes(regionCodes, preferredRegionCodes);
List<String> filteredRegionCodes = filterPreferredRegionCodes(regionCodes,
preferredRegionCodes);

List<Study> rows = studyQueryRepository.findMyPreferredRegionStudies(
recruitingStatus,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public class StudyQueryRepository {

public List<Study> findMyStudies(
Long viewerId,
StudyMemberStatus status,
List<StudyMemberStatus> statuses,
Long cursor,
int limit) {
QStudy study = QStudy.study;
Expand All @@ -39,7 +39,7 @@ public List<Study> findMyStudies(
.join(study).on(study.id.eq(studyMember.studyId))
.where(
studyMember.memberId.eq(viewerId),
studyMember.studyMemberStatus.eq(status),
studyMember.studyMemberStatus.in(statuses),
ltCursor(cursor, study)
)
.orderBy(study.id.desc())
Expand All @@ -49,7 +49,7 @@ public List<Study> findMyStudies(

public long countMyStudies(
Long viewerId,
StudyMemberStatus status
List<StudyMemberStatus> statuses
) {
QStudy study = QStudy.study;
QStudyMember studyMember = QStudyMember.studyMember;
Expand All @@ -60,7 +60,7 @@ public long countMyStudies(
.join(study).on(study.id.eq(studyMember.studyId))
.where(
studyMember.memberId.eq(viewerId),
studyMember.studyMemberStatus.eq(status)
studyMember.studyMemberStatus.in(statuses)
)
.fetchOne();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,17 +34,17 @@ public class StudySearchController {
@Operation(summary = "마이페이지 스터디 조회",
description = "마이페이지에 필요한 스터디를 조회합니다.\n "
+ "\n 모집 중인 스터디 : status = OWNER (기본값) \n"
+ "\n 참여 중인 스터디 : status = APPROVED \n "
+ "\n 참여 중인 스터디 : statuses = {OWNER, APPROVED} \n "
+ "\n 대기 중인 스터디 : status = APPLIED")
@GetMapping("/me")
public ResponseEntity<ApiResponse<GetStudyOverviewResponse>> getMyStudies(
@CurrentMember @Parameter(hidden = true) Long viewerId,
@RequestParam(required = false, defaultValue = "OWNER") StudyMemberStatus status,
@RequestParam(required = false, defaultValue = "OWNER") List<StudyMemberStatus> statuses,
@RequestParam(required = false) Long cursor,
@RequestParam(defaultValue = "10") @Min(1) @Max(50) Integer size
) {
return ResponseEntity.ok(ApiResponse.onSuccess(SuccessStatus._OK,
getMyStudyInfoService.getMyStudyOverview(viewerId, status, cursor, size)));
getMyStudyInfoService.getMyStudyOverview(viewerId, statuses, cursor, size)));
}

@Operation(summary = "전공/진로학습 이건 어때요? 스터디 조회",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@
import kr.spot.ports.GetPreferredCategoryPort;
import kr.spot.ports.GetPreferredRegionPort;
import kr.spot.study.domain.Study;
import kr.spot.study.infrastructure.jpa.associations.StudyLikeRepository;
import kr.spot.study.domain.enums.Category;
import kr.spot.study.domain.enums.FeeCategory;
import kr.spot.study.domain.enums.RecruitingStatus;
import kr.spot.study.domain.enums.SortBy;
import kr.spot.study.domain.enums.StudyMemberStatus;
import kr.spot.study.infrastructure.jpa.associations.StudyLikeRepository;
import kr.spot.study.infrastructure.jpa.querydsl.StudyQueryRepository;
import kr.spot.study.presentation.query.dto.response.GetStudyOverviewResponse;
import org.junit.jupiter.api.DisplayName;
Expand Down Expand Up @@ -61,18 +61,20 @@ void should_return_first_page_with_next_page() {
List<Study> studies = createStudies(pageSize + 1); // 11개 생성
Long expectedNextCursor = studies.get(pageSize - 1).getId(); // 10번째 스터디의 ID

given(studyQueryRepository.findMyStudies(viewerId, status, null, pageSize + 1))
given(studyQueryRepository.findMyStudies(viewerId, List.of(status), null, pageSize + 1))
.willReturn(studies);
given(studyQueryRepository.countMyStudies(viewerId, status)).willReturn((long) studies.size());
given(studyQueryRepository.countMyStudies(viewerId, List.of(status))).willReturn(
(long) studies.size());
given(studyLikeRepository.findStudyIdsByMemberId(viewerId)).willReturn(Set.of());

// when
GetStudyOverviewResponse response = getMyStudyInfoService.getMyStudyOverview(viewerId, status,
GetStudyOverviewResponse response = getMyStudyInfoService.getMyStudyOverview(viewerId,
List.of(status),
null,
pageSize);

// then
verify(studyQueryRepository).findMyStudies(viewerId, status, null, pageSize + 1);
verify(studyQueryRepository).findMyStudies(viewerId, List.of(status), null, pageSize + 1);
assertThat(response.content()).hasSize(pageSize);
assertThat(response.hasNext()).isTrue();
assertThat(response.nextCursor()).isEqualTo(expectedNextCursor);
Expand All @@ -85,18 +87,20 @@ void should_return_last_page() {
int pageSize = 10;
List<Study> studies = createStudies(5); // 5개 생성 (pageSize보다 적음)

given(studyQueryRepository.findMyStudies(viewerId, status, null, pageSize + 1))
given(studyQueryRepository.findMyStudies(viewerId, List.of(status), null, pageSize + 1))
.willReturn(studies);
given(studyQueryRepository.countMyStudies(viewerId, status)).willReturn((long) studies.size());
given(studyQueryRepository.countMyStudies(viewerId, List.of(status))).willReturn(
(long) studies.size());
given(studyLikeRepository.findStudyIdsByMemberId(viewerId)).willReturn(Set.of());

// when
GetStudyOverviewResponse response = getMyStudyInfoService.getMyStudyOverview(viewerId, status,
GetStudyOverviewResponse response = getMyStudyInfoService.getMyStudyOverview(viewerId,
List.of(status),
null,
pageSize);

// then
verify(studyQueryRepository).findMyStudies(viewerId, status, null, pageSize + 1);
verify(studyQueryRepository).findMyStudies(viewerId, List.of(status), null, pageSize + 1);
assertThat(response.content()).hasSize(5);
assertThat(response.hasNext()).isFalse();
assertThat(response.nextCursor()).isNull();
Expand All @@ -111,18 +115,20 @@ void should_return_next_page_with_cursor() {
List<Study> studies = createStudies(pageSize + 1);
Long expectedNextCursor = studies.get(pageSize - 1).getId();

given(studyQueryRepository.findMyStudies(viewerId, status, cursor, pageSize + 1))
given(studyQueryRepository.findMyStudies(viewerId, List.of(status), cursor, pageSize + 1))
.willReturn(studies);
given(studyQueryRepository.countMyStudies(viewerId, status)).willReturn((long) studies.size());
given(studyQueryRepository.countMyStudies(viewerId, List.of(status))).willReturn(
(long) studies.size());
given(studyLikeRepository.findStudyIdsByMemberId(viewerId)).willReturn(Set.of());

// when
GetStudyOverviewResponse response = getMyStudyInfoService.getMyStudyOverview(viewerId, status,
GetStudyOverviewResponse response = getMyStudyInfoService.getMyStudyOverview(viewerId,
List.of(status),
cursor,
pageSize);

// then
verify(studyQueryRepository).findMyStudies(viewerId, status, cursor, pageSize + 1);
verify(studyQueryRepository).findMyStudies(viewerId, List.of(status), cursor, pageSize + 1);
assertThat(response.content()).hasSize(pageSize);
assertThat(response.hasNext()).isTrue();
assertThat(response.nextCursor()).isEqualTo(expectedNextCursor);
Expand All @@ -136,18 +142,20 @@ void should_cap_page_size_at_max_page_size() {
int maxPageSize = GetMyStudyInfoService.MAX_PAGE_SIZE; // 50
List<Study> studies = createStudies(maxPageSize + 1); // 51개 생성

given(studyQueryRepository.findMyStudies(viewerId, status, null, maxPageSize + 1))
given(studyQueryRepository.findMyStudies(viewerId, List.of(status), null, maxPageSize + 1))
.willReturn(studies);
given(studyQueryRepository.countMyStudies(viewerId, status)).willReturn((long) studies.size());
given(studyQueryRepository.countMyStudies(viewerId, List.of(status))).willReturn(
(long) studies.size());
given(studyLikeRepository.findStudyIdsByMemberId(viewerId)).willReturn(Set.of());

// when
GetStudyOverviewResponse response = getMyStudyInfoService.getMyStudyOverview(viewerId, status,
GetStudyOverviewResponse response = getMyStudyInfoService.getMyStudyOverview(viewerId,
List.of(status),
null,
requestedSize);

// then
verify(studyQueryRepository).findMyStudies(viewerId, status, null, maxPageSize + 1);
verify(studyQueryRepository).findMyStudies(viewerId, List.of(status), null, maxPageSize + 1);
assertThat(response.content()).hasSize(maxPageSize);
assertThat(response.hasNext()).isTrue();
}
Expand All @@ -172,7 +180,8 @@ void should_find_studies_in_all_preferred_regions_when_no_filter() {
given(studyQueryRepository.findMyPreferredRegionStudies(any(), any(), any(), any(), any(),
any(), anyInt(), eq(preferredRegions)))
.willReturn(studies);
given(studyQueryRepository.countMyPreferredRegionStudies(any(), any(), any(), any(), eq(preferredRegions)))
given(studyQueryRepository.countMyPreferredRegionStudies(any(), any(), any(), any(),
eq(preferredRegions)))
.willReturn((long) studies.size());
given(studyLikeRepository.findStudyIdsByMemberId(viewerId)).willReturn(Set.of());

Expand Down Expand Up @@ -206,7 +215,8 @@ void should_find_studies_in_filtered_preferred_regions() {
given(studyQueryRepository.findMyPreferredRegionStudies(any(), any(), any(), any(), any(),
any(), anyInt(), eq(expectedRegions)))
.willReturn(studies);
given(studyQueryRepository.countMyPreferredRegionStudies(any(), any(), any(), any(), eq(expectedRegions)))
given(studyQueryRepository.countMyPreferredRegionStudies(any(), any(), any(), any(),
eq(expectedRegions)))
.willReturn((long) studies.size());
given(studyLikeRepository.findStudyIdsByMemberId(viewerId)).willReturn(Set.of());

Expand All @@ -233,7 +243,8 @@ void should_return_empty_when_no_preferred_regions() {
given(studyQueryRepository.findMyPreferredRegionStudies(any(), any(), any(), any(), any(),
any(), anyInt(), eq(Collections.emptyList())))
.willReturn(Collections.emptyList());
given(studyQueryRepository.countMyPreferredRegionStudies(any(), any(), any(), any(), eq(Collections.emptyList())))
given(studyQueryRepository.countMyPreferredRegionStudies(any(), any(), any(), any(),
eq(Collections.emptyList())))
.willReturn(0L);
given(studyLikeRepository.findStudyIdsByMemberId(viewerId)).willReturn(Set.of());

Expand Down Expand Up @@ -274,7 +285,8 @@ void should_find_studies_in_all_preferred_regions_when_no_filter() {
given(studyQueryRepository.findMyPreferredCategoryStudies(any(), any(), any(), any(), any(),
anyInt(), eq(preferredCategory)))
.willReturn(studies);
given(studyQueryRepository.countMyPreferredCategoryStudies(any(), any(), any(), eq(preferredCategory)))
given(studyQueryRepository.countMyPreferredCategoryStudies(any(), any(), any(),
eq(preferredCategory)))
.willReturn((long) studies.size());
given(studyLikeRepository.findStudyIdsByMemberId(viewerId)).willReturn(Set.of());

Expand Down Expand Up @@ -304,7 +316,8 @@ void should_return_empty_when_no_preferred_regions() {
given(studyQueryRepository.findMyPreferredCategoryStudies(any(), any(), any(), any(), any(),
anyInt(), eq(Collections.emptyList())))
.willReturn(Collections.emptyList());
given(studyQueryRepository.countMyPreferredCategoryStudies(any(), any(), any(), eq(Collections.emptyList())))
given(studyQueryRepository.countMyPreferredCategoryStudies(any(), any(), any(),
eq(Collections.emptyList())))
.willReturn(0L);
given(studyLikeRepository.findStudyIdsByMemberId(viewerId)).willReturn(Set.of());

Expand Down Expand Up @@ -557,7 +570,8 @@ void should_find_studies_by_category() {
@DisplayName("조건에 맞는 스터디가 없으면 빈 결과를 반환한다")
void should_return_empty_when_no_studies() {
// given
given(studyQueryRepository.findStudiesByCategory(any(), any(), any(), any(), any(), any(), anyInt()))
given(studyQueryRepository.findStudiesByCategory(any(), any(), any(), any(), any(), any(),
anyInt()))
.willReturn(Collections.emptyList());
given(studyQueryRepository.countStudiesByCategory(any(), any(), any(), any()))
.willReturn(0L);
Expand Down Expand Up @@ -590,7 +604,8 @@ void should_find_liked_studies() {
// given
List<Study> studies = createStudies(pageSize + 1);
Long expectedNextCursor = studies.get(pageSize - 1).getId();
Set<Long> likedStudyIds = studies.stream().map(Study::getId).collect(java.util.stream.Collectors.toSet());
Set<Long> likedStudyIds = studies.stream().map(Study::getId)
.collect(java.util.stream.Collectors.toSet());

given(studyQueryRepository.findLikedStudies(viewerId, null, pageSize + 1))
.willReturn(studies);
Expand All @@ -599,7 +614,8 @@ void should_find_liked_studies() {
given(studyLikeRepository.findStudyIdsByMemberId(viewerId)).willReturn(likedStudyIds);

// when
GetStudyOverviewResponse response = getMyStudyInfoService.getLikedStudies(viewerId, null, pageSize);
GetStudyOverviewResponse response = getMyStudyInfoService.getLikedStudies(viewerId, null,
pageSize);

// then
verify(studyQueryRepository).findLikedStudies(viewerId, null, pageSize + 1);
Expand All @@ -620,7 +636,8 @@ void should_return_empty_when_no_liked_studies() {
given(studyLikeRepository.findStudyIdsByMemberId(viewerId)).willReturn(Set.of());

// when
GetStudyOverviewResponse response = getMyStudyInfoService.getLikedStudies(viewerId, null, pageSize);
GetStudyOverviewResponse response = getMyStudyInfoService.getLikedStudies(viewerId, null,
pageSize);

// then
assertThat(response.content()).isEmpty();
Expand All @@ -643,7 +660,8 @@ void should_find_next_page_with_cursor() {
given(studyLikeRepository.findStudyIdsByMemberId(viewerId)).willReturn(Set.of());

// when
GetStudyOverviewResponse response = getMyStudyInfoService.getLikedStudies(viewerId, cursor, pageSize);
GetStudyOverviewResponse response = getMyStudyInfoService.getLikedStudies(viewerId, cursor,
pageSize);

// then
verify(studyQueryRepository).findLikedStudies(viewerId, cursor, pageSize + 1);
Expand Down