diff --git a/backend/src/main/java/moim_today/application/moim/moim/MoimService.java b/backend/src/main/java/moim_today/application/moim/moim/MoimService.java index 75e4c4e7..2ac55838 100644 --- a/backend/src/main/java/moim_today/application/moim/moim/MoimService.java +++ b/backend/src/main/java/moim_today/application/moim/moim/MoimService.java @@ -35,5 +35,7 @@ MoimIdResponse createMoim(final long memberId, final long universityId, List searchMoim(final long universityId, final String searchParam); - List findAllMyJoinedMoimSimpleResponse(final long memberId, final boolean ended, final boolean onlyHost); + List findAllMyJoinedMoimSimpleResponses(final long memberId, final long lastMoimId, final boolean ended); + + List findAllMyMoimSimpleResponses(final long hostMemberId, final long lastMoimId, final Boolean ended); } diff --git a/backend/src/main/java/moim_today/application/moim/moim/MoimServiceImpl.java b/backend/src/main/java/moim_today/application/moim/moim/MoimServiceImpl.java index a316270d..1707ab0a 100644 --- a/backend/src/main/java/moim_today/application/moim/moim/MoimServiceImpl.java +++ b/backend/src/main/java/moim_today/application/moim/moim/MoimServiceImpl.java @@ -175,12 +175,16 @@ public List searchMoim(final long universityId, final String } @Override - public List findAllMyJoinedMoimSimpleResponse(final long memberId, - final boolean ended, - final boolean onlyHost) { - if(onlyHost){ - return moimManager.findAllHostMoimSimpleResponsesByEndStatus(memberId, LocalDate.now(), ended); - } - return moimManager.findAllJoinedMoimSimpleResponseByEndStatus(memberId, LocalDate.now(), ended); + public List findAllMyMoimSimpleResponses(final long hostMemberId, + final long lastMoimId, + final Boolean ended) { + return moimManager.findAllMyMoimSimpleResponses(hostMemberId, lastMoimId, LocalDate.now(), ended); + } + + @Override + public List findAllMyJoinedMoimSimpleResponses(final long memberId, + final long lastMoimId, + final boolean ended) { + return moimManager.findAllMyJoinedMoimSimpleResponses(memberId, lastMoimId, LocalDate.now(), ended); } } diff --git a/backend/src/main/java/moim_today/global/constant/NumberConstant.java b/backend/src/main/java/moim_today/global/constant/NumberConstant.java index ce0dc72f..2d9cf200 100644 --- a/backend/src/main/java/moim_today/global/constant/NumberConstant.java +++ b/backend/src/main/java/moim_today/global/constant/NumberConstant.java @@ -11,6 +11,7 @@ public enum NumberConstant { DEFAULT_MOIM_CURRENT_COUNT(0), DEFAULT_MOIM_VIEWS(0), VIEW_COUNT_OF_ONE(1), + DEFAULT_JOINED_MOIM_PAGE_SIZE(4), SCHEDULE_MEETING_ID(0), SCHEDULE_MOIM_ID(0), diff --git a/backend/src/main/java/moim_today/implement/moim/joined_moim/JoinedMoimFinder.java b/backend/src/main/java/moim_today/implement/moim/joined_moim/JoinedMoimFinder.java index 2fce11d3..6bf99e32 100644 --- a/backend/src/main/java/moim_today/implement/moim/joined_moim/JoinedMoimFinder.java +++ b/backend/src/main/java/moim_today/implement/moim/joined_moim/JoinedMoimFinder.java @@ -1,5 +1,6 @@ package moim_today.implement.moim.joined_moim; +import moim_today.dto.moim.moim.MoimSimpleResponse; import moim_today.global.annotation.Implement; import moim_today.global.error.BadRequestException; import moim_today.global.error.NotFoundException; @@ -7,6 +8,7 @@ import moim_today.persistence.repository.moim.joined_moim.JoinedMoimRepository; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDate; import java.util.List; import static moim_today.global.constant.exception.JoinedMoimExceptionConstant.JOINED_MOIM_MEMBER_NOT_FOUND; @@ -55,4 +57,11 @@ public boolean isJoining(final long moimId, final long memberId) { public List findMoimIdsByMemberId(final long memberId) { return joinedMoimRepository.findMoimIdsByMemberId(memberId); } + + public List findAllMyJoinedMoimSimpleResponses(final long memberId, + final long lastMoimId, + final LocalDate now, + final boolean ended) { + return joinedMoimRepository.findAllMyJoinedMoimSimpleResponses(memberId, lastMoimId, now, ended); + } } diff --git a/backend/src/main/java/moim_today/implement/moim/moim/MoimFinder.java b/backend/src/main/java/moim_today/implement/moim/moim/MoimFinder.java index fbe9b02d..c8093ce5 100644 --- a/backend/src/main/java/moim_today/implement/moim/moim/MoimFinder.java +++ b/backend/src/main/java/moim_today/implement/moim/moim/MoimFinder.java @@ -99,11 +99,10 @@ public List searchMoim(final long universityId, final String } @Transactional(readOnly = true) - public List findEndedMoimSimpleResponsesByMoimIds(final List moimIds, final LocalDate now) { - return moimRepository.findEndedMoimSimpleResponsesByMoimIds(moimIds, now); - } - - public List findInProgressMoimSimpleResponsesByMoimIds(final List moimIds, final LocalDate now) { - return moimRepository.findInProgressMoimSimpleResponsesByMoimIds(moimIds, now); + public List findAllMyMoimSimpleResponses(final long hostMemberId, + final long lastMoimId, + final LocalDate now, + final boolean ended) { + return moimRepository.findAllMyMoimSimpleResponses(hostMemberId, lastMoimId, now, ended); } } diff --git a/backend/src/main/java/moim_today/implement/moim/moim/MoimManager.java b/backend/src/main/java/moim_today/implement/moim/moim/MoimManager.java index d9948f10..dc73d249 100644 --- a/backend/src/main/java/moim_today/implement/moim/moim/MoimManager.java +++ b/backend/src/main/java/moim_today/implement/moim/moim/MoimManager.java @@ -95,25 +95,18 @@ public String getTitleById(final Long moimId) { } @Transactional(readOnly = true) - public List findAllJoinedMoimSimpleResponseByEndStatus(final long memberId, final LocalDate now, final boolean ended) { - List joinedMoims = joinedMoimFinder.findMoimIdsByMemberId(memberId); - return getMoimSimpleResponses(joinedMoims, now, ended); + public List findAllMyMoimSimpleResponses(final long hostMemberId, + final long lastMoimId, + final LocalDate now, + final boolean ended) { + return moimFinder.findAllMyMoimSimpleResponses(hostMemberId, lastMoimId, now, ended); } @Transactional(readOnly = true) - public List findAllHostMoimSimpleResponsesByEndStatus(final long hostMemberId, final LocalDate now, final boolean ended) { - List joinedMoims = joinedMoimFinder.findMoimIdsByMemberId(hostMemberId); - List hostMoims = joinedMoims.stream() - .filter(moimId -> moimFinder.isHost(hostMemberId, moimId)) - .toList(); - return getMoimSimpleResponses(hostMoims, now, ended); - } - - @Transactional(readOnly = true) - public List getMoimSimpleResponses(final List joinedMoims, final LocalDate now, final boolean ended) { - if (ended) { - return moimFinder.findEndedMoimSimpleResponsesByMoimIds(joinedMoims, now); - } - return moimFinder.findInProgressMoimSimpleResponsesByMoimIds(joinedMoims, now); + public List findAllMyJoinedMoimSimpleResponses(final long memberId, + final long lastMoimId, + final LocalDate now, + final boolean ended) { + return joinedMoimFinder.findAllMyJoinedMoimSimpleResponses(memberId, lastMoimId, now, ended); } } diff --git a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepositoryImpl.java b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepositoryImpl.java index f77a43f2..de4c4201 100644 --- a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepositoryImpl.java +++ b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepositoryImpl.java @@ -63,6 +63,7 @@ public List findAllByMeetingId(final long meetingId) { .from(meetingCommentJpaEntity) .join(memberJpaEntity).on(meetingCommentJpaEntity.memberId.eq(memberJpaEntity.id)) .where(meetingCommentJpaEntity.meetingId.eq(meetingId)) + .orderBy(meetingCommentJpaEntity.createdAt.asc()) .fetch(); } diff --git a/backend/src/main/java/moim_today/persistence/repository/moim/joined_moim/JoinedMoimRepository.java b/backend/src/main/java/moim_today/persistence/repository/moim/joined_moim/JoinedMoimRepository.java index 829251e0..95fffa5d 100644 --- a/backend/src/main/java/moim_today/persistence/repository/moim/joined_moim/JoinedMoimRepository.java +++ b/backend/src/main/java/moim_today/persistence/repository/moim/joined_moim/JoinedMoimRepository.java @@ -1,7 +1,9 @@ package moim_today.persistence.repository.moim.joined_moim; +import moim_today.dto.moim.moim.MoimSimpleResponse; import moim_today.persistence.entity.moim.joined_moim.JoinedMoimJpaEntity; +import java.time.LocalDate; import java.util.List; public interface JoinedMoimRepository { @@ -23,4 +25,6 @@ public interface JoinedMoimRepository { boolean isJoining(final long moimId, final long memberId); boolean existsByMoimIdAndMemberId(final long moimId, final long memberId); + + List findAllMyJoinedMoimSimpleResponses(final long memberId, final long lastMoimId, final LocalDate now, final boolean ended); } diff --git a/backend/src/main/java/moim_today/persistence/repository/moim/joined_moim/JoinedMoimRepositoryImpl.java b/backend/src/main/java/moim_today/persistence/repository/moim/joined_moim/JoinedMoimRepositoryImpl.java index e39384c0..bddfb766 100644 --- a/backend/src/main/java/moim_today/persistence/repository/moim/joined_moim/JoinedMoimRepositoryImpl.java +++ b/backend/src/main/java/moim_today/persistence/repository/moim/joined_moim/JoinedMoimRepositoryImpl.java @@ -1,15 +1,21 @@ package moim_today.persistence.repository.moim.joined_moim; +import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQueryFactory; +import moim_today.dto.moim.moim.MoimSimpleResponse; +import moim_today.dto.moim.moim.QMoimSimpleResponse; import moim_today.global.error.NotFoundException; import moim_today.persistence.entity.moim.joined_moim.JoinedMoimJpaEntity; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDate; import java.util.List; +import static moim_today.global.constant.NumberConstant.DEFAULT_JOINED_MOIM_PAGE_SIZE; import static moim_today.global.constant.exception.MoimExceptionConstant.JOINED_MOIM_MEMBER_IS_EMPTY; import static moim_today.persistence.entity.moim.joined_moim.QJoinedMoimJpaEntity.joinedMoimJpaEntity; +import static moim_today.persistence.entity.moim.moim.QMoimJpaEntity.moimJpaEntity; @Repository public class JoinedMoimRepositoryImpl implements JoinedMoimRepository { @@ -79,4 +85,44 @@ public boolean isJoining(final long moimId, final long memberId) { public boolean existsByMoimIdAndMemberId(final long moimId, final long memberId) { return joinedMoimJpaRepository.existsByMoimIdAndMemberId(moimId, memberId); } + + @Override + public List findAllMyJoinedMoimSimpleResponses(final long memberId, + final long lastMoimId, + final LocalDate now, + final boolean ended) { + return queryFactory.select(new QMoimSimpleResponse( + moimJpaEntity.id, + moimJpaEntity.title, + moimJpaEntity.capacity, + moimJpaEntity.currentCount, + moimJpaEntity.imageUrl, + moimJpaEntity.moimCategory, + moimJpaEntity.displayStatus + )) + .from(joinedMoimJpaEntity) + .join(moimJpaEntity).on(joinedMoimJpaEntity.moimId.eq(moimJpaEntity.id)) + .where( + joinedMoimJpaEntity.memberId.eq(memberId), + applyEndedFilter(now, ended), + ltLastMoimId(lastMoimId) + ) + .orderBy(moimJpaEntity.id.desc()) + .limit(DEFAULT_JOINED_MOIM_PAGE_SIZE.value()) + .fetch(); + } + + private BooleanExpression applyEndedFilter(final LocalDate now, final boolean ended) { + if (ended) { + return moimJpaEntity.endDate.before(now); + } + return moimJpaEntity.endDate.goe(now); + } + + private BooleanExpression ltLastMoimId(final long lastMoimId) { + if (lastMoimId == 0) { + return null; + } + return moimJpaEntity.id.lt(lastMoimId); + } } diff --git a/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepository.java b/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepository.java index 08131c64..c604ea4f 100644 --- a/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepository.java +++ b/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepository.java @@ -32,7 +32,5 @@ public interface MoimRepository { List searchMoimBySearchParam(final long universityId, final String searchParam); - List findEndedMoimSimpleResponsesByMoimIds(final List moimIds, final LocalDate now); - - List findInProgressMoimSimpleResponsesByMoimIds(final List moimIds, final LocalDate now); + List findAllMyMoimSimpleResponses(final long hostMemberId, final long lastMoimId, final LocalDate now, final boolean ended); } diff --git a/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepositoryImpl.java b/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepositoryImpl.java index a664b591..0ec7c849 100644 --- a/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepositoryImpl.java +++ b/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepositoryImpl.java @@ -17,6 +17,7 @@ import java.util.List; import java.util.Optional; +import static moim_today.global.constant.NumberConstant.DEFAULT_JOINED_MOIM_PAGE_SIZE; import static moim_today.global.constant.SymbolConstant.PERCENT; import static moim_today.global.constant.exception.MoimExceptionConstant.MOIM_NOT_FOUND_ERROR; import static moim_today.persistence.entity.moim.moim.QMoimJpaEntity.moimJpaEntity; @@ -100,11 +101,15 @@ public List searchMoimBySearchParam(final long universityId, .where(moimJpaEntity.universityId.eq(universityId) .and(moimJpaEntity.title.likeIgnoreCase(PERCENT.value() + searchParam.trim() + PERCENT.value())) ) + .orderBy(moimJpaEntity.views.desc()) .fetch(); } @Override - public List findEndedMoimSimpleResponsesByMoimIds(final List moimIds, final LocalDate now) { + public List findAllMyMoimSimpleResponses(final long hostMemberId, + final long lastMoimId, + final LocalDate now, + final boolean ended) { return queryFactory.select(new QMoimSimpleResponse( moimJpaEntity.id, moimJpaEntity.title, @@ -115,23 +120,13 @@ public List findEndedMoimSimpleResponsesByMoimIds(final List moimJpaEntity.displayStatus )) .from(moimJpaEntity) - .where(moimJpaEntity.id.in(moimIds).and(moimJpaEntity.endDate.before(now))) - .fetch(); - } - - @Override - public List findInProgressMoimSimpleResponsesByMoimIds(final List moimIds, final LocalDate now) { - return queryFactory.select(new QMoimSimpleResponse( - moimJpaEntity.id, - moimJpaEntity.title, - moimJpaEntity.capacity, - moimJpaEntity.currentCount, - moimJpaEntity.imageUrl, - moimJpaEntity.moimCategory, - moimJpaEntity.displayStatus - )) - .from(moimJpaEntity) - .where(moimJpaEntity.id.in(moimIds).and(moimJpaEntity.endDate.goe(now))) + .where( + moimJpaEntity.memberId.eq(hostMemberId), + applyEndedFilter(now, ended), + ltLastMoimId(lastMoimId) + ) + .orderBy(moimJpaEntity.id.desc()) + .limit(DEFAULT_JOINED_MOIM_PAGE_SIZE.value()) .fetch(); } @@ -150,8 +145,9 @@ public List findAllMoimResponses(final long universityId, moimJpaEntity.displayStatus )) .from(moimJpaEntity) - .where(moimJpaEntity.universityId.eq(universityId) - .and(applyMoimCategoryFilter(moimCategoryDto)) + .where( + moimJpaEntity.universityId.eq(universityId), + applyMoimCategoryFilter(moimCategoryDto) ) .orderBy(createOrderBySpecifier(moimSortedFilter)) .fetch(); @@ -183,4 +179,18 @@ private OrderSpecifier createOrderBySpecifier(final MoimSortedFilter moimSort } return moimJpaEntity.createdAt.desc(); } + + private BooleanExpression applyEndedFilter(final LocalDate now, final boolean ended) { + if (ended) { + return moimJpaEntity.endDate.before(now); + } + return moimJpaEntity.endDate.goe(now); + } + + private BooleanExpression ltLastMoimId(final long lastMoimId) { + if (lastMoimId == 0) { + return null; + } + return moimJpaEntity.id.lt(lastMoimId); + } } diff --git a/backend/src/main/java/moim_today/persistence/repository/moim/moim_notice/MoimNoticeRepositoryImpl.java b/backend/src/main/java/moim_today/persistence/repository/moim/moim_notice/MoimNoticeRepositoryImpl.java index 420cbb2e..cdb7105c 100644 --- a/backend/src/main/java/moim_today/persistence/repository/moim/moim_notice/MoimNoticeRepositoryImpl.java +++ b/backend/src/main/java/moim_today/persistence/repository/moim/moim_notice/MoimNoticeRepositoryImpl.java @@ -43,6 +43,7 @@ public List findAllMoimNotice(final long moimId) { )) .from(moimNoticeJpaEntity) .where(moimNoticeJpaEntity.moimId.eq(moimId)) + .orderBy(moimNoticeJpaEntity.createdAt.desc()) .fetch(); } diff --git a/backend/src/main/java/moim_today/presentation/moim/MoimController.java b/backend/src/main/java/moim_today/presentation/moim/MoimController.java index 7006cb12..09807d14 100644 --- a/backend/src/main/java/moim_today/presentation/moim/MoimController.java +++ b/backend/src/main/java/moim_today/presentation/moim/MoimController.java @@ -37,17 +37,27 @@ public CollectionResponse> findAllMyJoinedMoimResponse(@Log return CollectionResponse.from(myMoimResponses); } - @GetMapping("/joined/simple") - public CollectionResponse> findAllMyJoinedMoimSimpleResponse( + @GetMapping("/joined") + public CollectionResponse> findMyJoinedMoimSimpleResponses( @Login final MemberSession memberSession, - @RequestParam final Boolean ended, - @RequestParam(required = false, defaultValue = "false") final Boolean onlyHost){ - List myMoimSimpleResponses = moimService.findAllMyJoinedMoimSimpleResponse( - memberSession.id(), ended, onlyHost - ); + @RequestParam final long lastMoimId, + @RequestParam(required = false, defaultValue = "true") final boolean ended + ){ + List myMoimSimpleResponses = moimService.findAllMyJoinedMoimSimpleResponses( + memberSession.id(), lastMoimId, ended); return CollectionResponse.from(myMoimSimpleResponses); } + @GetMapping("/joined/host") + public CollectionResponse> findMyMoimSimpleResponses( + @Login final MemberSession memberSession, + @RequestParam final long lastMoimId, + @RequestParam(required = false, defaultValue = "true") final boolean ended + ){ + List myMoimSimpleResponses = moimService.findAllMyMoimSimpleResponses( + memberSession.id(), lastMoimId, ended); + return CollectionResponse.from(myMoimSimpleResponses); + } @PostMapping public MoimIdResponse createMoim(@Login final MemberSession memberSession, diff --git a/backend/src/test/java/moim_today/fake_class/moim/FakeMoimService.java b/backend/src/test/java/moim_today/fake_class/moim/FakeMoimService.java index c3e31dc5..3a12b59d 100644 --- a/backend/src/test/java/moim_today/fake_class/moim/FakeMoimService.java +++ b/backend/src/test/java/moim_today/fake_class/moim/FakeMoimService.java @@ -198,9 +198,37 @@ public List searchMoim(final long universityId, final String } @Override - public List findAllMyJoinedMoimSimpleResponse(final long memberId, - final boolean ended, - final boolean onlyHost) { + public List findAllMyJoinedMoimSimpleResponses(final long memberId, + final long lastMoimId, + final boolean ended) { + MoimSimpleResponse moimSimpleResponse1 = MoimSimpleResponse.builder() + .moimId(1L) + .title(MOIM_TITLE.value()) + .capacity(CAPACITY.intValue()) + .currentCount(CURRENT_COUNT.intValue()) + .imageUrl(MOIM_IMAGE_URL.value()) + .moimCategory(MoimCategory.STUDY) + .displayStatus(DisplayStatus.PUBLIC) + .build(); + + MoimSimpleResponse moimSimpleResponse2 = MoimSimpleResponse.builder() + .moimId(2L) + .title(MOIM_TITLE.value()) + .capacity(CAPACITY.intValue()) + .currentCount(CURRENT_COUNT.intValue()) + .imageUrl(MOIM_IMAGE_URL.value()) + .moimCategory(MoimCategory.STUDY) + .displayStatus(DisplayStatus.PUBLIC) + .build(); + + return List.of(moimSimpleResponse1, moimSimpleResponse2); + } + + @Override + public List findAllMyMoimSimpleResponses(final long memberId, + final long lastMoimId, + final Boolean ended) { + MoimSimpleResponse moimSimpleResponse1 = MoimSimpleResponse.builder() .moimId(1L) .title(MOIM_TITLE.value()) diff --git a/backend/src/test/java/moim_today/implement/moim/joined_moim/JoinedMoimFinderTest.java b/backend/src/test/java/moim_today/implement/moim/joined_moim/JoinedMoimFinderTest.java index bf1a857d..f453544b 100644 --- a/backend/src/test/java/moim_today/implement/moim/joined_moim/JoinedMoimFinderTest.java +++ b/backend/src/test/java/moim_today/implement/moim/joined_moim/JoinedMoimFinderTest.java @@ -1,16 +1,18 @@ package moim_today.implement.moim.joined_moim; +import moim_today.dto.moim.moim.MoimSimpleResponse; import moim_today.global.error.NotFoundException; import moim_today.persistence.entity.moim.joined_moim.JoinedMoimJpaEntity; import moim_today.persistence.entity.moim.moim.MoimJpaEntity; import moim_today.util.ImplementTest; -import moim_today.util.TestConstant; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import java.time.LocalDate; import java.util.List; +import static moim_today.global.constant.NumberConstant.DEFAULT_JOINED_MOIM_PAGE_SIZE; import static moim_today.global.constant.exception.JoinedMoimExceptionConstant.JOINED_MOIM_MEMBER_IS_EMPTY; import static moim_today.global.constant.exception.JoinedMoimExceptionConstant.JOINED_MOIM_MEMBER_NOT_FOUND; import static moim_today.util.TestConstant.MEMBER_ID; @@ -231,4 +233,176 @@ void isJoiningFalse() { // then assertThat(isJoined).isFalse(); } + + @DisplayName("내가 참여한 모임을 지난모임/진행중인 모임 별로 조회한다.") + @Test + void findAllMyJoinedMoimSimpleResponses() { + // given1 + long lastMoimId = 0; + long memberId = MEMBER_ID.longValue(); + long otherMemberId = MEMBER_ID.longValue() + 1; + + MoimJpaEntity moimA = MoimJpaEntity.builder() + .memberId(memberId) + .endDate(LocalDate.of(2024,5,23)) + .build(); + + // given2 + MoimJpaEntity moimB = MoimJpaEntity.builder() + .memberId(memberId) + .endDate(LocalDate.of(2024,5,23)) + .build(); + + // given3 + MoimJpaEntity moimC = MoimJpaEntity.builder() + .memberId(otherMemberId) + .endDate(LocalDate.of(2024,5,23)) + .build(); + + moimRepository.save(moimA); + moimRepository.save(moimB); + moimRepository.save(moimC); + + // given4 + JoinedMoimJpaEntity jm1 = JoinedMoimJpaEntity.builder() + .moimId(moimA.getId()) + .memberId(memberId) + .build(); + + // given5 + JoinedMoimJpaEntity jm2 = JoinedMoimJpaEntity.builder() + .moimId(moimB.getId()) + .memberId(memberId) + .build(); + + // given6 + JoinedMoimJpaEntity jm3 = JoinedMoimJpaEntity.builder() + .moimId(moimC.getId()) + .memberId(memberId) + .build(); + + // given7 + JoinedMoimJpaEntity jm4 = JoinedMoimJpaEntity.builder() + .moimId(moimA.getId()) + .memberId(otherMemberId) + .build(); + + joinedMoimRepository.save(jm1); + joinedMoimRepository.save(jm2); + joinedMoimRepository.save(jm3); + joinedMoimRepository.save(jm4); + + //when + List inProgressAllMyJoinedMoimSimpleResponses = joinedMoimFinder.findAllMyJoinedMoimSimpleResponses(memberId, lastMoimId, LocalDate.of(2024, 5, 24), false); + List endedAllMyJoinedMoimSimpleResponses = joinedMoimFinder.findAllMyJoinedMoimSimpleResponses(memberId, lastMoimId, LocalDate.of(2024, 5, 24), true); + + //then + assertThat(inProgressAllMyJoinedMoimSimpleResponses.size()).isEqualTo(0); + assertThat(endedAllMyJoinedMoimSimpleResponses.size()).isEqualTo(3); + } + + @DisplayName("내가 참여한 모임을 지난모임/진행중인 모임 별로 조회할때, No Offset 으로 페이징 처리한다.") + @Test + void findAllMyJoinedMoimSimpleResponsesPaging() { + // given1 + long lastMoimId = 0; + long memberId = MEMBER_ID.longValue(); + long otherMemberId = MEMBER_ID.longValue() + 1; + + MoimJpaEntity moimA = MoimJpaEntity.builder() + .memberId(memberId) + .endDate(LocalDate.of(2024,5,23)) + .build(); + + // given2 + MoimJpaEntity moimB = MoimJpaEntity.builder() + .memberId(memberId) + .endDate(LocalDate.of(2024,5,23)) + .build(); + + // given3 + MoimJpaEntity moimC = MoimJpaEntity.builder() + .memberId(otherMemberId) + .endDate(LocalDate.of(2024,5,23)) + .build(); + + // given4 + MoimJpaEntity moimD = MoimJpaEntity.builder() + .memberId(otherMemberId) + .endDate(LocalDate.of(2024,5,23)) + .build(); + + // given5 + MoimJpaEntity moimE = MoimJpaEntity.builder() + .memberId(otherMemberId) + .endDate(LocalDate.of(2024,5,23)) + .build(); + + // given6 + MoimJpaEntity moimF = MoimJpaEntity.builder() + .memberId(otherMemberId) + .endDate(LocalDate.of(2024,5,23)) + .build(); + + moimRepository.save(moimA); + moimRepository.save(moimB); + moimRepository.save(moimC); + moimRepository.save(moimD); + moimRepository.save(moimE); + moimRepository.save(moimF); + + // given7 + JoinedMoimJpaEntity jm1 = JoinedMoimJpaEntity.builder() + .moimId(moimA.getId()) + .memberId(memberId) + .build(); + + // given8 + JoinedMoimJpaEntity jm2 = JoinedMoimJpaEntity.builder() + .moimId(moimB.getId()) + .memberId(memberId) + .build(); + + // given9 + JoinedMoimJpaEntity jm3 = JoinedMoimJpaEntity.builder() + .moimId(moimC.getId()) + .memberId(memberId) + .build(); + + // given10 + JoinedMoimJpaEntity jm4 = JoinedMoimJpaEntity.builder() + .moimId(moimD.getId()) + .memberId(memberId) + .build(); + + // given11 + JoinedMoimJpaEntity jm5 = JoinedMoimJpaEntity.builder() + .moimId(moimE.getId()) + .memberId(memberId) + .build(); + + // given12 + JoinedMoimJpaEntity jm6 = JoinedMoimJpaEntity.builder() + .moimId(moimF.getId()) + .memberId(memberId) + .build(); + + joinedMoimRepository.save(jm1); + joinedMoimRepository.save(jm2); + joinedMoimRepository.save(jm3); + joinedMoimRepository.save(jm4); + joinedMoimRepository.save(jm5); + joinedMoimRepository.save(jm6); + + //when + List endedAllMyJoinedMoimSimpleResponses1 = joinedMoimFinder.findAllMyJoinedMoimSimpleResponses(memberId, lastMoimId, LocalDate.of(2024, 5, 24), true); + MoimSimpleResponse lastMoim = endedAllMyJoinedMoimSimpleResponses1.get(DEFAULT_JOINED_MOIM_PAGE_SIZE.value() - 1); + lastMoimId = lastMoim.moimId(); + List endedAllMyJoinedMoimSimpleResponses2 = joinedMoimFinder.findAllMyJoinedMoimSimpleResponses(memberId, lastMoimId, LocalDate.of(2024, 5, 24), true); + + + //then + assertThat(endedAllMyJoinedMoimSimpleResponses1.size()).isEqualTo(4); + assertThat(endedAllMyJoinedMoimSimpleResponses2.size()).isEqualTo(2); + } } \ No newline at end of file diff --git a/backend/src/test/java/moim_today/implement/moim/moim/MoimFinderTest.java b/backend/src/test/java/moim_today/implement/moim/moim/MoimFinderTest.java index d310d6eb..bf494fe6 100644 --- a/backend/src/test/java/moim_today/implement/moim/moim/MoimFinderTest.java +++ b/backend/src/test/java/moim_today/implement/moim/moim/MoimFinderTest.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Random; +import static moim_today.global.constant.NumberConstant.DEFAULT_JOINED_MOIM_PAGE_SIZE; import static moim_today.global.constant.exception.MoimExceptionConstant.MOIM_CAPACITY_ERROR; import static moim_today.global.constant.exception.MoimExceptionConstant.MOIM_NOT_FOUND_ERROR; import static moim_today.util.TestConstant.*; @@ -606,78 +607,101 @@ void searchMoimBySearchParamAndUniversityId() { assertThat(applemangoResponses.size()).isEqualTo(1); } - @DisplayName("모임들 중 완료된 모임을 반환한다.") + @DisplayName("내가 생성한 모임 지난모임/진행중인모임 별로 전부 조회한다.") @Test - void findEndedMoimSimpleResponsesByMoimIds() { - MemberJpaEntity saveMember = saveRandomMember(); - - LocalDate localDate1 = LocalDate.of(2023, 5, 12); - LocalDate localDate2 = LocalDate.of(2024, 5, 16); - LocalDate localDate3 = LocalDate.of(2025, 6, 5); + void findAllMyMoimSimpleResponses() { + // given1 + long lastMoimId = 0; + long memberId = MEMBER_ID.longValue(); + long otherMemberId = MEMBER_ID.longValue() + 1; - MoimJpaEntity moimJpaEntity1 = MoimJpaEntity.builder() - .memberId(saveMember.getId()) - .endDate(localDate1) - .build(); - MoimJpaEntity moimJpaEntity2 = MoimJpaEntity.builder() - .memberId(saveMember.getId()) - .endDate(localDate2) + MoimJpaEntity moimA = MoimJpaEntity.builder() + .memberId(memberId) + .endDate(LocalDate.of(2024,5,23)) .build(); - MoimJpaEntity moimJpaEntity3 = MoimJpaEntity.builder() - .memberId(saveMember.getId()) - .endDate(localDate3) + + // given2 + MoimJpaEntity moimB = MoimJpaEntity.builder() + .memberId(memberId) + .endDate(LocalDate.of(2024,5,23)) .build(); - moimRepository.save(moimJpaEntity1); - moimRepository.save(moimJpaEntity2); - moimRepository.save(moimJpaEntity3); + // given3 + MoimJpaEntity moimC = MoimJpaEntity.builder() + .memberId(otherMemberId) + .endDate(LocalDate.of(2024,5,23)) + .build(); - List moimIds = List.of(moimJpaEntity1.getId(), moimJpaEntity2.getId(), moimJpaEntity3.getId()); + moimRepository.save(moimA); + moimRepository.save(moimB); + moimRepository.save(moimC); - List endedMoims1 = moimFinder.findEndedMoimSimpleResponsesByMoimIds( - moimIds, LocalDate.of(2024, 5, 16)); - List endedMoims2 = moimFinder.findEndedMoimSimpleResponsesByMoimIds( - moimIds, LocalDate.of(2025, 6, 4)); + //when + List inProgressAllMyMoimSimpleResponses = moimFinder.findAllMyMoimSimpleResponses(memberId, lastMoimId, LocalDate.of(2024, 5, 24), false); + List endedAllMyMoimSimpleResponses = moimFinder.findAllMyMoimSimpleResponses(memberId, lastMoimId, LocalDate.of(2024, 5, 24), true); - assertThat(endedMoims1.size()).isEqualTo(1); - assertThat(endedMoims2.size()).isEqualTo(2); + //then + assertThat(inProgressAllMyMoimSimpleResponses.size()).isEqualTo(0); + assertThat(endedAllMyMoimSimpleResponses.size()).isEqualTo(2); } - @DisplayName("모임들 중 진행중인 모임을 반환한다.") + @DisplayName("내가 생성한 모임 지난모임/진행중인모임 별로 전부 조회할때, No Offset 페이징 처리를 한다.") @Test - void findInProgressMoimSimpleResponsesByMoimIds() { - MemberJpaEntity saveMember = saveRandomMember(); + void findAllMyMoimSimpleResponsesPaging() { + // given1 + long lastMoimId = 0; + long memberId = MEMBER_ID.longValue(); + long otherMemberId = MEMBER_ID.longValue() + 1; - LocalDate localDate1 = LocalDate.of(2023, 5, 12); - LocalDate localDate2 = LocalDate.of(2024, 5, 16); - LocalDate localDate3 = LocalDate.of(2025, 6, 5); + MoimJpaEntity moimA = MoimJpaEntity.builder() + .memberId(memberId) + .endDate(LocalDate.of(2024,5,23)) + .build(); - MoimJpaEntity moimJpaEntity1 = MoimJpaEntity.builder() - .memberId(saveMember.getId()) - .endDate(localDate1) + // given2 + MoimJpaEntity moimB = MoimJpaEntity.builder() + .memberId(memberId) + .endDate(LocalDate.of(2024,5,23)) .build(); - MoimJpaEntity moimJpaEntity2 = MoimJpaEntity.builder() - .memberId(saveMember.getId()) - .endDate(localDate2) + + // given3 + MoimJpaEntity moimC = MoimJpaEntity.builder() + .memberId(memberId) + .endDate(LocalDate.of(2024,5,23)) .build(); - MoimJpaEntity moimJpaEntity3 = MoimJpaEntity.builder() - .memberId(saveMember.getId()) - .endDate(localDate3) + + MoimJpaEntity moimD = MoimJpaEntity.builder() + .memberId(memberId) + .endDate(LocalDate.of(2024,5,23)) .build(); - moimRepository.save(moimJpaEntity1); - moimRepository.save(moimJpaEntity2); - moimRepository.save(moimJpaEntity3); + MoimJpaEntity moimE = MoimJpaEntity.builder() + .memberId(memberId) + .endDate(LocalDate.of(2024,5,23)) + .build(); + + MoimJpaEntity moimF = MoimJpaEntity.builder() + .memberId(otherMemberId) + .endDate(LocalDate.of(2024,5,23)) + .build(); + + moimRepository.save(moimA); + moimRepository.save(moimB); + moimRepository.save(moimC); + moimRepository.save(moimD); + moimRepository.save(moimE); + moimRepository.save(moimF); - List moimIds = List.of(moimJpaEntity1.getId(), moimJpaEntity2.getId(), moimJpaEntity3.getId()); + //when + List endedAllMyMoimSimpleResponses1 = moimFinder.findAllMyMoimSimpleResponses(memberId, lastMoimId, LocalDate.of(2024, 5, 24), true); + MoimSimpleResponse lastMoim = endedAllMyMoimSimpleResponses1.get(DEFAULT_JOINED_MOIM_PAGE_SIZE.value() - 1); + lastMoimId = lastMoim.moimId(); + List endedAllMyMoimSimpleResponses2 = moimFinder.findAllMyMoimSimpleResponses(memberId, lastMoimId, LocalDate.of(2024, 5, 24), true); - List inProgressMoims1 = moimFinder.findInProgressMoimSimpleResponsesByMoimIds( - moimIds, LocalDate.of(2024, 5, 16)); - List inProgressMoims2 = moimFinder.findInProgressMoimSimpleResponsesByMoimIds( - moimIds, LocalDate.of(2025, 6, 4)); - assertThat(inProgressMoims1.size()).isEqualTo(2); - assertThat(inProgressMoims2.size()).isEqualTo(1); + //then + assertThat(endedAllMyMoimSimpleResponses1.size()).isEqualTo(4); + assertThat(endedAllMyMoimSimpleResponses2.size()).isEqualTo(1); } private MemberJpaEntity saveRandomMember() { diff --git a/backend/src/test/java/moim_today/implement/moim/moim/MoimManagerTest.java b/backend/src/test/java/moim_today/implement/moim/moim/MoimManagerTest.java index dd2a02ff..b00116b6 100644 --- a/backend/src/test/java/moim_today/implement/moim/moim/MoimManagerTest.java +++ b/backend/src/test/java/moim_today/implement/moim/moim/MoimManagerTest.java @@ -63,8 +63,10 @@ void validateConcurrencyTest() throws Exception{ @DisplayName("자신이 참여한 모임들 중 완료 여부에 따라 반환한다.") @Test - void findAllJoinedMoimSimpleResponseByEndStatus() { + void findAllMyMoimSimpleResponses() { // given1 + long lastMoimId = 0; + MemberJpaEntity member1 = MemberJpaEntity.builder() .username(USERNAME.value()) .build(); @@ -112,10 +114,10 @@ void findAllJoinedMoimSimpleResponseByEndStatus() { joinedMoimRepository.save(j3); // when - List endedMoims = moimManager.findAllJoinedMoimSimpleResponseByEndStatus( - member1.getId(), LocalDate.of(2024, 5, 16), true); - List inProgressMoims = moimManager.findAllJoinedMoimSimpleResponseByEndStatus( - member1.getId(), LocalDate.of(2024, 5, 16), false); + List endedMoims = moimManager.findAllMyMoimSimpleResponses( + member1.getId(), lastMoimId, LocalDate.of(2024, 5, 16), true); + List inProgressMoims = moimManager.findAllMyMoimSimpleResponses( + member1.getId(), lastMoimId, LocalDate.of(2024, 5, 16), false); // then assertThat(endedMoims.size()).isEqualTo(1); @@ -125,6 +127,8 @@ void findAllJoinedMoimSimpleResponseByEndStatus() { @Test void findAllJoinedMoimSimpleResponseExceptOtherMembers() { // given + long lastMoimId = 0; + MemberJpaEntity me = MemberJpaEntity.builder() .username(USERNAME.value()) .build(); @@ -183,10 +187,10 @@ void findAllJoinedMoimSimpleResponseExceptOtherMembers() { joinedMoimRepository.save(j4); // when - List myEndedMoims = moimManager.findAllJoinedMoimSimpleResponseByEndStatus( - me.getId(), LocalDate.of(2023,5,12), true); - List myInProgressMoims = moimManager.findAllJoinedMoimSimpleResponseByEndStatus( - me.getId(), LocalDate.of(2023, 5, 12), false); + List myEndedMoims = moimManager.findAllMyMoimSimpleResponses( + me.getId(), lastMoimId, LocalDate.of(2023,5,12), true); + List myInProgressMoims = moimManager.findAllMyMoimSimpleResponses( + me.getId(), lastMoimId, LocalDate.of(2023, 5, 12), false); // then assertThat(myEndedMoims.size()).isEqualTo(0); @@ -195,8 +199,10 @@ void findAllJoinedMoimSimpleResponseExceptOtherMembers() { @DisplayName("자신이 호스트인 모임들의 정보만 완료 여부에 따라 가져온다") @Test - void findAllHostMoimSimpleResponsesByEndStatus() { + void findAllMyJoinedMoimSimpleResponses() { // given + long lastMoimId = 0; + MemberJpaEntity me = MemberJpaEntity.builder() .username(USERNAME.value()) .build(); @@ -232,43 +238,11 @@ void findAllHostMoimSimpleResponsesByEndStatus() { moimRepository.save(otherMoim1); moimRepository.save(otherMoim2); - JoinedMoimJpaEntity j1 = JoinedMoimJpaEntity.builder() - .memberId(me.getId()) - .moimId(myMoim1.getId()) - .build(); - JoinedMoimJpaEntity j2 = JoinedMoimJpaEntity.builder() - .memberId(me.getId()) - .moimId(myMoim2.getId()) - .build(); - JoinedMoimJpaEntity j3 = JoinedMoimJpaEntity.builder() - .memberId(other.getId()) - .moimId(otherMoim1.getId()) - .build(); - JoinedMoimJpaEntity j4 = JoinedMoimJpaEntity.builder() - .memberId(other.getId()) - .moimId(otherMoim2.getId()) - .build(); - JoinedMoimJpaEntity j5 = JoinedMoimJpaEntity.builder() - .memberId(me.getId()) - .moimId(otherMoim1.getId()) - .build(); - JoinedMoimJpaEntity j6 = JoinedMoimJpaEntity.builder() - .memberId(me.getId()) - .moimId(otherMoim2.getId()) - .build(); - - joinedMoimRepository.save(j1); - joinedMoimRepository.save(j2); - joinedMoimRepository.save(j3); - joinedMoimRepository.save(j4); - joinedMoimRepository.save(j5); - joinedMoimRepository.save(j6); - // when - List myEndedMoims = moimManager.findAllHostMoimSimpleResponsesByEndStatus( - me.getId(), LocalDate.of(2023,5,12), true); - List myInProgressMoims = moimManager.findAllHostMoimSimpleResponsesByEndStatus( - me.getId(), LocalDate.of(2023, 5, 12), false); + List myEndedMoims = moimManager.findAllMyMoimSimpleResponses( + me.getId(), lastMoimId, LocalDate.of(2023,5,12), true); + List myInProgressMoims = moimManager.findAllMyMoimSimpleResponses( + me.getId(), lastMoimId, LocalDate.of(2023, 5, 12), false); // then assertThat(myEndedMoims.size()).isEqualTo(0); diff --git a/backend/src/test/java/moim_today/presentation/moim/MoimControllerTest.java b/backend/src/test/java/moim_today/presentation/moim/MoimControllerTest.java index ead3ce25..70690dcc 100644 --- a/backend/src/test/java/moim_today/presentation/moim/MoimControllerTest.java +++ b/backend/src/test/java/moim_today/presentation/moim/MoimControllerTest.java @@ -809,50 +809,53 @@ void returnCategoriesTest() throws Exception { ))); } - @DisplayName("로그인한 회원이 참여한 모임들을 완료 여부에 따라 카드 정보로 반환한다") + @DisplayName("회원이 참여한 모임들을 완료 여부에 따라 카드 정보로 반환한다") @Test - void findAllMyJoinedMoimSimpleResponse() throws Exception { + void findMyJoinedMoimSimpleResponses() throws Exception { - mockMvc.perform(get("/api/moims/joined/simple") - .queryParam("ended", "false")) + mockMvc.perform(get("/api/moims/joined") + .queryParam("lastMoimId", "0") + .queryParam("ended", "false") + ) .andExpect(status().isOk()) .andDo(document("자신이 참여한 모임 리스트를 완료 여부로 조회 성공", - resource(ResourceSnippetParameters.builder() - .tag("모임") - .summary("로그인한 회원이 참여한 모임 리스트 자세한 정보 조회") - .queryParameters( - parameterWithName("ended").description("완료된 모임을 찾을 지 여부 - [true, false]") - ) - .responseFields( - fieldWithPath("data[0].moimId").type(NUMBER).description("모임 Id"), - fieldWithPath("data[0].title").type(STRING).description("모임명"), - fieldWithPath("data[0].capacity").type(NUMBER).description("모집 인원"), - fieldWithPath("data[0].currentCount").type(NUMBER).description("현재 인원"), - fieldWithPath("data[0].imageUrl").type(STRING).description("모임 사진 URL"), - fieldWithPath("data[0].moimCategory").type(VARIES).description(String.format("카테고리 - %s", - EnumDocsUtils.getEnumNames(MoimCategory.class))), - fieldWithPath("data[0].displayStatus").type(VARIES).description(String.format("공개 여부 - %s", - EnumDocsUtils.getEnumNames(DisplayStatus.class))) - ) - .build()) - )); - } - - @DisplayName("로그인한 회원이 호스트인 모임들을 완료 여부에 따라 카드 정보로 반환한다") + resource(ResourceSnippetParameters.builder() + .tag("모임") + .summary("로그인한 회원이 참여한 모임 리스트 자세한 정보 조회") + .queryParameters( + parameterWithName("lastMoimId").description("마지막 모임 Id"), + parameterWithName("ended").description("완료된 모임을 찾을 지 여부 - [true, false]") + ) + .responseFields( + fieldWithPath("data[0].moimId").type(NUMBER).description("모임 Id"), + fieldWithPath("data[0].title").type(STRING).description("모임명"), + fieldWithPath("data[0].capacity").type(NUMBER).description("모집 인원"), + fieldWithPath("data[0].currentCount").type(NUMBER).description("현재 인원"), + fieldWithPath("data[0].imageUrl").type(STRING).description("모임 사진 URL"), + fieldWithPath("data[0].moimCategory").type(VARIES).description(String.format("카테고리 - %s", + EnumDocsUtils.getEnumNames(MoimCategory.class))), + fieldWithPath("data[0].displayStatus").type(VARIES).description(String.format("공개 여부 - %s", + EnumDocsUtils.getEnumNames(DisplayStatus.class))) + ) + .build()) + )); + } + + @DisplayName("회원이 호스트인 모임들을 완료 여부에 따라 카드 정보로 반환한다") @Test void findAllHostMoimSimpleResponse() throws Exception { - mockMvc.perform(get("/api/moims/joined/simple") - .queryParam("ended", "false") - .queryParam("onlyHost","true")) + mockMvc.perform(get("/api/moims/joined/host") + .queryParam("lastMoimId", "0") + .queryParam("ended", "false")) .andExpect(status().isOk()) .andDo(document("자신이 호스트인 모임 리스트를 완료 여부로 조회 성공", resource(ResourceSnippetParameters.builder() .tag("모임") .summary("로그인한 회원이 호스트인 모임 리스트 자세한 정보 조회") .queryParameters( - parameterWithName("ended").description("완료된 모임을 찾을 지 여부 - [true, false]"), - parameterWithName("onlyHost").optional().description("자신이 호스트인 모임만 찾을 지 여부 - [true, false] , default : false") + parameterWithName("lastMoimId").description("마지막 모임 Id"), + parameterWithName("ended").description("완료된 모임을 찾을 지 여부 - [true, false]") ) .responseFields( fieldWithPath("data[0].moimId").type(NUMBER).description("모임 Id"),