Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BE] 종료됨 탭에서 reviewDeadline 역순으로 정렬하는 기능 구현(#763) #765

Merged
merged 7 commits into from
Nov 18, 2024
19 changes: 19 additions & 0 deletions backend/src/main/java/corea/room/domain/RoomSortStrategy.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package corea.room.domain;

import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Sort;

@RequiredArgsConstructor
public enum RoomSortStrategy {

RECRUITMENT_DEADLINE_DESC("roomDeadline.recruitmentDeadline", Sort.Direction.ASC),
REVIEW_DEADLINE_DESC("roomDeadline.reviewDeadline", Sort.Direction.DESC),
;

private final String property;
private final Sort.Direction direction;

public Sort toSort() {
return Sort.by(direction, property);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package corea.room.domain;

import org.springframework.stereotype.Component;

@Component
public class RoomSortStrategyFactory {

public RoomSortStrategy getRoomSortStrategy(RoomStatus status) {
if (status.isClosed()) {
return RoomSortStrategy.REVIEW_DEADLINE_DESC;
}
return RoomSortStrategy.RECRUITMENT_DEADLINE_DESC;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@

public interface RoomRepository extends JpaRepository<Room, Long>, JpaSpecificationExecutor<Room> {

Page<Room> findAllByStatusOrderByRoomDeadline_RecruitmentDeadline(RoomStatus status, Pageable pageable);
Page<Room> findAllByStatus(RoomStatus status, Pageable pageable);

Page<Room> findAllByClassificationAndStatusOrderByRoomDeadline_RecruitmentDeadline(RoomClassification classification, RoomStatus status, Pageable pageable);
Page<Room> findAllByClassificationAndStatus(RoomClassification classification, RoomStatus status, Pageable pageable);

List<Room> findAllByIdInOrderByRoomDeadline_ReviewDeadlineAsc(List<Long> ids);
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ public class RoomInquiryService {
private final RoomRepository roomRepository;
private final ParticipationRepository participationRepository;
private final RoomMatchReader roomMatchReader;
private final RoomSortStrategyFactory roomSortStrategyFactory;

public RoomSearchResponses search(long memberId, RoomStatus status, RoomClassification classification, String keywordTitle) {
Specification<Room> spec = getSearchSpecification(status, classification, keywordTitle);
Expand Down Expand Up @@ -58,12 +59,13 @@ public RoomResponses findRoomsWithRoomStatus(long memberId, int pageNumber, Stri

private Page<Room> getPaginatedRooms(int pageNumber, String expression, RoomStatus status) {
RoomClassification classification = RoomClassification.from(expression);
PageRequest pageRequest = PageRequest.of(pageNumber, PAGE_DISPLAY_SIZE);
RoomSortStrategy roomSortStrategy = roomSortStrategyFactory.getRoomSortStrategy(status);
PageRequest pageRequest = PageRequest.of(pageNumber, PAGE_DISPLAY_SIZE, roomSortStrategy.toSort());

if (classification.isAll()) {
return roomRepository.findAllByStatusOrderByRoomDeadline_RecruitmentDeadline(status, pageRequest);
return roomRepository.findAllByStatus(status, pageRequest);
}
return roomRepository.findAllByClassificationAndStatusOrderByRoomDeadline_RecruitmentDeadline(classification, status, pageRequest);
return roomRepository.findAllByClassificationAndStatus(classification, status, pageRequest);
}

private List<RoomResponse> getRoomResponses(List<Room> rooms, long memberId) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package corea.room.domain;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

import static org.assertj.core.api.Assertions.assertThat;

class RoomSortStrategyFactoryTest {

@ParameterizedTest
@CsvSource(value = {"OPEN, RECRUITMENT_DEADLINE_DESC", "CLOSE, REVIEW_DEADLINE_DESC"})
@DisplayName("방 상태에 따라 방 정렬 방식을 얻을 수 있다.")
void getRoomSortStrategy(RoomStatus status, RoomSortStrategy expected) {
RoomSortStrategyFactory roomSortStrategyFactory = new RoomSortStrategyFactory();

RoomSortStrategy actual = roomSortStrategyFactory.getRoomSortStrategy(status);

assertThat(actual).isEqualTo(expected);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,13 @@ class RoomRepositoryTest {

@Test
@DisplayName("선택한 분야와 일치하는 방들을 조회할 수 있다.")
void findAllByClassificationAndStatusOrderByRoomDeadline_RecruitmentDeadline() {
void findAllByClassificationAndStatus() {
Member pororo = memberRepository.save(MemberFixture.MEMBER_PORORO());
Member joyson = memberRepository.save(MemberFixture.MEMBER_YOUNGSU());
roomRepository.save(RoomFixture.ROOM_DOMAIN_WITH_CLASSIFICATION(pororo, LocalDateTime.now().plusDays(2), RoomClassification.ANDROID));
roomRepository.save(RoomFixture.ROOM_DOMAIN_WITH_CLASSIFICATION(joyson, LocalDateTime.now().plusDays(3), RoomClassification.BACKEND));

Page<Room> roomPage = roomRepository.findAllByClassificationAndStatusOrderByRoomDeadline_RecruitmentDeadline(RoomClassification.BACKEND, RoomStatus.OPEN, PageRequest.of(0, 8));
Page<Room> roomPage = roomRepository.findAllByClassificationAndStatus(RoomClassification.BACKEND, RoomStatus.OPEN, PageRequest.of(0, 8));

List<String> managerNames = getManagerNames(roomPage.getContent());
assertThat(managerNames).containsExactly("youngsu5582");
Expand All @@ -58,7 +58,7 @@ void findAllByMemberAndStatus_participated() {
roomRepository.save(RoomFixture.ROOM_DOMAIN(joyson, LocalDateTime.now().plusDays(3)));

participationRepository.save(new Participation(pororoRoom, pororo, MemberRole.REVIEWER, ParticipationStatus.MANAGER,pororoRoom.getMatchingSize()));
Page<Room> roomPage = roomRepository.findAllByStatusOrderByRoomDeadline_RecruitmentDeadline(RoomStatus.OPEN, PageRequest.of(0, 8));
Page<Room> roomPage = roomRepository.findAllByStatus(RoomStatus.OPEN, PageRequest.of(0, 8));

List<String> managerNames = getManagerNames(roomPage.getContent());
assertThat(managerNames).containsExactly("pororo", "youngsu5582");
Expand All @@ -72,7 +72,7 @@ void findAllByMemberAndStatus_notParticipated() {
roomRepository.save(RoomFixture.ROOM_DOMAIN(pororo, LocalDateTime.now().plusDays(2)));
roomRepository.save(RoomFixture.ROOM_DOMAIN(joyson, LocalDateTime.now().plusDays(3)));

Page<Room> roomPage = roomRepository.findAllByStatusOrderByRoomDeadline_RecruitmentDeadline(RoomStatus.OPEN, PageRequest.of(0, 8));
Page<Room> roomPage = roomRepository.findAllByStatus(RoomStatus.OPEN, PageRequest.of(0, 8));

List<String> managerNames = getManagerNames(roomPage.getContent());
assertThat(managerNames).containsExactly("pororo", "youngsu5582");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,24 +45,38 @@ public class RoomInquiryServiceTest {
private ParticipationRepository participationRepository;

@ParameterizedTest
@EnumSource(RoomStatus.class)
@EnumSource(value = RoomStatus.class, mode = EnumSource.Mode.EXCLUDE, names = {"CLOSE"})
@DisplayName("로그인한 사용자가 방을 상태별로 마감일 임박순으로 조회할 수 있다.")
void findRoomsWithRoomStatus_login_member(RoomStatus roomStatus) {
Member pororo = memberRepository.save(MemberFixture.MEMBER_PORORO());
Member ash = memberRepository.save(MemberFixture.MEMBER_ASH());

roomRepository.save(RoomFixture.ROOM_DOMAIN(pororo, LocalDateTime.now().plusDays(2), roomStatus));
Room ashRoom = roomRepository.save(RoomFixture.ROOM_DOMAIN(ash, LocalDateTime.now().plusDays(3), roomStatus));
participationRepository.save(new Participation(ashRoom, ash, MemberRole.REVIEWER, ParticipationStatus.MANAGER, ashRoom.getMatchingSize()));
roomRepository.save(RoomFixture.ROOM_DOMAIN(ash, LocalDateTime.now().plusDays(3), roomStatus));

RoomResponses response = roomInquiryService.findRoomsWithRoomStatus(pororo.getId(), 0, "all", roomStatus);
List<String> managerNames = getManagerNames(response);

assertThat(managerNames).containsExactly("pororo", "ashsty");
}

@Test
@DisplayName("로그인한 사용자가 종료된 방을 마감된 최신순으로 조회할 수 있다.")
void findClosedRooms_login_member() {
Member pororo = memberRepository.save(MemberFixture.MEMBER_PORORO());
Member ash = memberRepository.save(MemberFixture.MEMBER_ASH());

roomRepository.save(RoomFixture.ROOM_DOMAIN(pororo, LocalDateTime.now().plusDays(2), RoomStatus.CLOSE));
roomRepository.save(RoomFixture.ROOM_DOMAIN(ash, LocalDateTime.now().plusDays(3), RoomStatus.CLOSE));

RoomResponses response = roomInquiryService.findRoomsWithRoomStatus(pororo.getId(), 0, "all", RoomStatus.CLOSE);
List<String> managerNames = getManagerNames(response);

assertThat(managerNames).containsExactly("ashsty", "pororo");
}

@ParameterizedTest
@EnumSource(RoomStatus.class)
@EnumSource(value = RoomStatus.class, mode = EnumSource.Mode.EXCLUDE, names = {"CLOSE"})
@DisplayName("비로그인 사용자가 방을 상태별로 마감일 임박순으로 조회할 수 있다.")
void findRoomsWithRoomStatus_non_login_member(RoomStatus roomStatus) {
Member pororo = memberRepository.save(MemberFixture.MEMBER_PORORO());
Expand All @@ -79,6 +93,23 @@ void findRoomsWithRoomStatus_non_login_member(RoomStatus roomStatus) {
assertThat(managerNames).containsExactly("pororo", "ashsty");
}

@Test
@DisplayName("비로그인 사용자가 종료된 방을 마감된 최신순으로 조회할 수 있다.")
void findClosedRooms_non_login_member() {
Member pororo = memberRepository.save(MemberFixture.MEMBER_PORORO());
Member ash = memberRepository.save(MemberFixture.MEMBER_ASH());

roomRepository.save(RoomFixture.ROOM_DOMAIN(pororo, LocalDateTime.now().plusDays(2), RoomStatus.CLOSE));
roomRepository.save(RoomFixture.ROOM_DOMAIN(ash, LocalDateTime.now().plusDays(3), RoomStatus.CLOSE));

AuthInfo anonymous = AuthInfo.getAnonymous();

RoomResponses response = roomInquiryService.findRoomsWithRoomStatus(anonymous.getId(), 0, "all", RoomStatus.CLOSE);
List<String> managerNames = getManagerNames(response);

assertThat(managerNames).containsExactly("ashsty", "pororo");
}

private List<String> getManagerNames(RoomResponses response) {
return response.rooms()
.stream()
Expand Down
Loading