diff --git a/backend/src/main/java/corea/matchresult/controller/MatchingResultController.java b/backend/src/main/java/corea/matchresult/controller/MatchingResultController.java new file mode 100644 index 00000000..9bcb253c --- /dev/null +++ b/backend/src/main/java/corea/matchresult/controller/MatchingResultController.java @@ -0,0 +1,32 @@ +package corea.matchresult.controller; + +import corea.auth.annotation.LoginMember; +import corea.auth.domain.AuthInfo; +import corea.matchresult.dto.MatchResultResponses; +import corea.matchresult.service.MatchResultService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/rooms") +@RequiredArgsConstructor +public class MatchingResultController implements MatchingResultControllerSpecification { + + private final MatchResultService matchResultService; + + @GetMapping("/{id}/reviewers") + public ResponseEntity reviewers(@PathVariable long id, @LoginMember AuthInfo authInfo) { + MatchResultResponses response = matchResultService.findReviewers(authInfo.getId(), id); + return ResponseEntity.ok(response); + } + + @GetMapping("/{id}/reviewees") + public ResponseEntity reviewees(@PathVariable long id, @LoginMember AuthInfo authInfo) { + MatchResultResponses response = matchResultService.findReviewees(authInfo.getId(), id); + return ResponseEntity.ok(response); + } +} diff --git a/backend/src/main/java/corea/matchresult/controller/MatchingResultControllerSpecification.java b/backend/src/main/java/corea/matchresult/controller/MatchingResultControllerSpecification.java new file mode 100644 index 00000000..ae97acb3 --- /dev/null +++ b/backend/src/main/java/corea/matchresult/controller/MatchingResultControllerSpecification.java @@ -0,0 +1,35 @@ +package corea.matchresult.controller; + +import corea.auth.domain.AuthInfo; +import corea.exception.ExceptionType; +import corea.global.annotation.ApiErrorResponses; +import corea.matchresult.dto.MatchResultResponses; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import org.springframework.http.ResponseEntity; + +public interface MatchingResultControllerSpecification { + @Operation(summary = "해당 방에서 나에게 배정된 리뷰어들의 정보를 반환합니다.", + description = "해당 방에서 자신에게 배정된 리뷰어를 확인합니다.
" + + "요청 시 `Authorization Header`에 `Bearer JWT token`을 포함시켜야 합니다. " + + "이 토큰을 기반으로 `AuthInfo` 객체가 생성되며 사용자의 정보가 자동으로 주입됩니다.
" + + "JWT 토큰에서 추출된 사용자 정보는 피드백 작성에 필요한 인증된 사용자 정보를 제공합니다. " + + "

**참고:** 이 API를 사용하기 위해서는 유효한 JWT 토큰이 필요하며, " + + "토큰이 없거나 유효하지 않은 경우 인증 오류가 발생합니다.") + @ApiErrorResponses(value = {ExceptionType.MEMBER_NOT_FOUND, ExceptionType.ROOM_NOT_FOUND}) + ResponseEntity reviewers(@Parameter(description = "방 아이디", example = "1") + long id, + AuthInfo authInfo); + + @Operation(summary = "해당 방에서 나에게 배정된 리뷰이들의 정보를 반환합니다.", + description = "해당 방에서 자신에게 배정된 리뷰이를 확인합니다.
" + + "요청 시 `Authorization Header`에 `Bearer JWT token`을 포함시켜야 합니다. " + + "이 토큰을 기반으로 `AuthInfo` 객체가 생성되며 사용자의 정보가 자동으로 주입됩니다.
" + + "JWT 토큰에서 추출된 사용자 정보는 피드백 작성에 필요한 인증된 사용자 정보를 제공합니다. " + + "

**참고:** 이 API를 사용하기 위해서는 유효한 JWT 토큰이 필요하며, " + + "토큰이 없거나 유효하지 않은 경우 인증 오류가 발생합니다.") + @ApiErrorResponses(value = {ExceptionType.MEMBER_NOT_FOUND, ExceptionType.ROOM_NOT_FOUND}) + ResponseEntity reviewees(@Parameter(description = "방 아이디", example = "1") + long id, + AuthInfo authInfo); +} diff --git a/backend/src/main/java/corea/room/controller/RoomController.java b/backend/src/main/java/corea/room/controller/RoomController.java index 28aa50ad..383801fd 100644 --- a/backend/src/main/java/corea/room/controller/RoomController.java +++ b/backend/src/main/java/corea/room/controller/RoomController.java @@ -3,9 +3,6 @@ import corea.auth.annotation.AccessedMember; import corea.auth.annotation.LoginMember; import corea.auth.domain.AuthInfo; -import corea.matchresult.dto.MatchResultResponses; -import corea.matchresult.service.MatchResultService; -import corea.room.domain.RoomStatus; import corea.room.dto.RoomCreateRequest; import corea.room.dto.RoomParticipantResponses; import corea.room.dto.RoomResponse; @@ -25,7 +22,6 @@ public class RoomController implements RoomControllerSpecification { private final RoomService roomService; - private final MatchResultService matchResultService; private final AutomaticUpdateService automaticUpdateService; private final AutomaticMatchingService automaticMatchingService; @@ -52,48 +48,12 @@ public ResponseEntity participants(@PathVariable long return ResponseEntity.ok(response); } - @GetMapping("/{id}/reviewers") - public ResponseEntity reviewers(@PathVariable long id, @LoginMember AuthInfo authInfo) { - MatchResultResponses response = matchResultService.findReviewers(authInfo.getId(), id); - return ResponseEntity.ok(response); - } - - @GetMapping("/{id}/reviewees") - public ResponseEntity reviewees(@PathVariable long id, @LoginMember AuthInfo authInfo) { - MatchResultResponses response = matchResultService.findReviewees(authInfo.getId(), id); - return ResponseEntity.ok(response); - } - @GetMapping("/participated") public ResponseEntity participatedRooms(@LoginMember AuthInfo authInfo) { RoomResponses response = roomService.findParticipatedRooms(authInfo.getId()); return ResponseEntity.ok(response); } - @GetMapping("/opened") - public ResponseEntity openedRooms(@AccessedMember AuthInfo authInfo, - @RequestParam(defaultValue = "0") int page, - @RequestParam(value = "classification", defaultValue = "all") String expression) { - RoomResponses response = roomService.findRoomsWithRoomStatus(authInfo.getId(), page, expression, RoomStatus.OPEN); - return ResponseEntity.ok(response); - } - - @GetMapping("/progress") - public ResponseEntity progressRooms(@AccessedMember AuthInfo authInfo, - @RequestParam(defaultValue = "0") int page, - @RequestParam(value = "classification", defaultValue = "all") String expression) { - RoomResponses response = roomService.findRoomsWithRoomStatus(authInfo.getId(), page, expression, RoomStatus.PROGRESS); - return ResponseEntity.ok(response); - } - - @GetMapping("/closed") - public ResponseEntity closedRooms(@AccessedMember AuthInfo authInfo, - @RequestParam(defaultValue = "0") int page, - @RequestParam(value = "classification", defaultValue = "all") String expression) { - RoomResponses response = roomService.findRoomsWithRoomStatus(authInfo.getId(), page, expression, RoomStatus.CLOSE); - return ResponseEntity.ok(response); - } - @DeleteMapping("/{id}") public ResponseEntity delete(@PathVariable long id, @LoginMember AuthInfo authInfo) { roomService.delete(id, authInfo.getId()); diff --git a/backend/src/main/java/corea/room/controller/RoomControllerSpecification.java b/backend/src/main/java/corea/room/controller/RoomControllerSpecification.java index b8b380b0..25697fc7 100644 --- a/backend/src/main/java/corea/room/controller/RoomControllerSpecification.java +++ b/backend/src/main/java/corea/room/controller/RoomControllerSpecification.java @@ -50,30 +50,6 @@ ResponseEntity participants(@Parameter(description = " long id, AuthInfo authInfo); - @Operation(summary = "해당 방에서 나에게 배정된 리뷰어들의 정보를 반환합니다.", - description = "해당 방에서 자신에게 배정된 리뷰어를 확인합니다.
" + - "요청 시 `Authorization Header`에 `Bearer JWT token`을 포함시켜야 합니다. " + - "이 토큰을 기반으로 `AuthInfo` 객체가 생성되며 사용자의 정보가 자동으로 주입됩니다.
" + - "JWT 토큰에서 추출된 사용자 정보는 피드백 작성에 필요한 인증된 사용자 정보를 제공합니다. " + - "

**참고:** 이 API를 사용하기 위해서는 유효한 JWT 토큰이 필요하며, " + - "토큰이 없거나 유효하지 않은 경우 인증 오류가 발생합니다.") - @ApiErrorResponses(value = {ExceptionType.MEMBER_NOT_FOUND, ExceptionType.ROOM_NOT_FOUND}) - ResponseEntity reviewers(@Parameter(description = "방 아이디", example = "1") - long id, - AuthInfo authInfo); - - @Operation(summary = "해당 방에서 나에게 배정된 리뷰이들의 정보를 반환합니다.", - description = "해당 방에서 자신에게 배정된 리뷰이를 확인합니다.
" + - "요청 시 `Authorization Header`에 `Bearer JWT token`을 포함시켜야 합니다. " + - "이 토큰을 기반으로 `AuthInfo` 객체가 생성되며 사용자의 정보가 자동으로 주입됩니다.
" + - "JWT 토큰에서 추출된 사용자 정보는 피드백 작성에 필요한 인증된 사용자 정보를 제공합니다. " + - "

**참고:** 이 API를 사용하기 위해서는 유효한 JWT 토큰이 필요하며, " + - "토큰이 없거나 유효하지 않은 경우 인증 오류가 발생합니다.") - @ApiErrorResponses(value = {ExceptionType.MEMBER_NOT_FOUND, ExceptionType.ROOM_NOT_FOUND}) - ResponseEntity reviewees(@Parameter(description = "방 아이디", example = "1") - long id, - AuthInfo authInfo); - @Operation(summary = "참여 중인 방 정보를 반환합니다..", description = "해당 멤버가 참여 중인 방들의 정보를 리뷰 마감일이 임박한 순으로 정렬해 반환합니다.
" + "요청 시 `Authorization Header`에 `Bearer JWT token`을 포함시켜야 합니다. " + @@ -83,54 +59,6 @@ ResponseEntity reviewees(@Parameter(description = "방 아 "토큰이 없거나 유효하지 않은 경우 인증 오류가 발생합니다.") ResponseEntity participatedRooms(AuthInfo authInfo); - @Operation(summary = "현재 모집 중인 방 정보를 반환합니다.", - description = "현재 모집 중인 방들의 정보를 모집 마감일이 임박한 순으로 정렬해 반환합니다. 이미 참여 중인 방들의 정보는 제외됩니다.
" + - "요청 시 `Authorization Header`에 `Bearer JWT token`을 포함시켜야 합니다. " + - "이 토큰을 기반으로 `AuthInfo` 객체가 생성되며 사용자의 정보가 자동으로 주입됩니다.
" + - "JWT 토큰에서 추출된 사용자 정보는 피드백 작성에 필요한 인증된 사용자 정보를 제공합니다. " + - "

**참고:** 이 API를 사용하기 위해서는 유효한 JWT 토큰이 필요하며, " + - "토큰이 없거나 유효하지 않은 경우 인증 오류가 발생합니다.") - @ApiErrorResponses(value = ExceptionType.NOT_FOUND_ERROR) - ResponseEntity openedRooms(AuthInfo authInfo, - - @Parameter(description = "페이지 정보", example = "1") - int page, - - @Parameter(description = "방 분야", example = "AN") - String expression); - - @Operation(summary = "현재 모집 완료된 방 정보를 반환합니다.", - description = "현재 모집 완료된 방들의 정보를 반환합니다. 이미 참여 중인 방들의 정보는 제외됩니다.
" + - "요청 시 `Authorization Header`에 `Bearer JWT token`을 포함시켜야 합니다. " + - "이 토큰을 기반으로 `AuthInfo` 객체가 생성되며 사용자의 정보가 자동으로 주입됩니다.
" + - "JWT 토큰에서 추출된 사용자 정보는 피드백 작성에 필요한 인증된 사용자 정보를 제공합니다. " + - "

**참고:** 이 API를 사용하기 위해서는 유효한 JWT 토큰이 필요하며, " + - "토큰이 없거나 유효하지 않은 경우 인증 오류가 발생합니다.") - @ApiErrorResponses(value = ExceptionType.NOT_FOUND_ERROR) - ResponseEntity progressRooms(AuthInfo authInfo, - - @Parameter(description = "페이지 정보", example = "1") - int page, - - @Parameter(description = "방 분야", example = "AN") - String expression); - - @Operation(summary = "현재 종료된 방 정보를 반환합니다.", - description = "현재 모든 진행이 종료된 방들의 정보를 반환합니다. 이미 참여 중인 방들의 정보는 제외됩니다.
" + - "요청 시 `Authorization Header`에 `Bearer JWT token`을 포함시켜야 합니다. " + - "이 토큰을 기반으로 `AuthInfo` 객체가 생성되며 사용자의 정보가 자동으로 주입됩니다.
" + - "JWT 토큰에서 추출된 사용자 정보는 피드백 작성에 필요한 인증된 사용자 정보를 제공합니다. " + - "

**참고:** 이 API를 사용하기 위해서는 유효한 JWT 토큰이 필요하며, " + - "토큰이 없거나 유효하지 않은 경우 인증 오류가 발생합니다.") - @ApiErrorResponses(value = ExceptionType.NOT_FOUND_ERROR) - ResponseEntity closedRooms(AuthInfo authInfo, - - @Parameter(description = "페이지 정보", example = "2") - int page, - - @Parameter(description = "방 분야", example = "FE") - String expression); - @Operation(summary = "방을 삭제합니다.", description = "이미 생성되어 있는 방을 삭제합니다.
" + "요청 시 `Authorization Header`에 `Bearer JWT token`을 포함시켜야 합니다. " + diff --git a/backend/src/main/java/corea/room/controller/RoomInquiryController.java b/backend/src/main/java/corea/room/controller/RoomInquiryController.java new file mode 100644 index 00000000..6cc3d1e7 --- /dev/null +++ b/backend/src/main/java/corea/room/controller/RoomInquiryController.java @@ -0,0 +1,45 @@ +package corea.room.controller; + +import corea.auth.annotation.AccessedMember; +import corea.auth.domain.AuthInfo; +import corea.room.domain.RoomStatus; +import corea.room.dto.RoomResponses; +import corea.room.service.RoomInquiryService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/rooms") +@RequiredArgsConstructor +public class RoomInquiryController implements RoomInquiryControllerSpecification { + + private final RoomInquiryService roomInquiryService; + + @GetMapping("/opened") + public ResponseEntity openedRooms(@AccessedMember AuthInfo authInfo, + @RequestParam(defaultValue = "0") int page, + @RequestParam(value = "classification", defaultValue = "all") String expression) { + RoomResponses response = roomInquiryService.findRoomsWithRoomStatus(authInfo.getId(), page, expression, RoomStatus.OPEN); + return ResponseEntity.ok(response); + } + + @GetMapping("/progress") + public ResponseEntity progressRooms(@AccessedMember AuthInfo authInfo, + @RequestParam(defaultValue = "0") int page, + @RequestParam(value = "classification", defaultValue = "all") String expression) { + RoomResponses response = roomInquiryService.findRoomsWithRoomStatus(authInfo.getId(), page, expression, RoomStatus.PROGRESS); + return ResponseEntity.ok(response); + } + + @GetMapping("/closed") + public ResponseEntity closedRooms(@AccessedMember AuthInfo authInfo, + @RequestParam(defaultValue = "0") int page, + @RequestParam(value = "classification", defaultValue = "all") String expression) { + RoomResponses response = roomInquiryService.findRoomsWithRoomStatus(authInfo.getId(), page, expression, RoomStatus.CLOSE); + return ResponseEntity.ok(response); + } +} diff --git a/backend/src/main/java/corea/room/controller/RoomInquiryControllerSpecification.java b/backend/src/main/java/corea/room/controller/RoomInquiryControllerSpecification.java new file mode 100644 index 00000000..14cc38b5 --- /dev/null +++ b/backend/src/main/java/corea/room/controller/RoomInquiryControllerSpecification.java @@ -0,0 +1,60 @@ +package corea.room.controller; + +import corea.auth.domain.AuthInfo; +import corea.exception.ExceptionType; +import corea.global.annotation.ApiErrorResponses; +import corea.room.dto.RoomResponses; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import org.springframework.http.ResponseEntity; + +public interface RoomInquiryControllerSpecification { + + @Operation(summary = "현재 모집 중인 방 정보를 반환합니다.", + description = "현재 모집 중인 방들의 정보를 모집 마감일이 임박한 순으로 정렬해 반환합니다. 이미 참여 중인 방들의 정보는 제외됩니다.
" + + "요청 시 `Authorization Header`에 `Bearer JWT token`을 포함시켜야 합니다. " + + "이 토큰을 기반으로 `AuthInfo` 객체가 생성되며 사용자의 정보가 자동으로 주입됩니다.
" + + "JWT 토큰에서 추출된 사용자 정보는 피드백 작성에 필요한 인증된 사용자 정보를 제공합니다. " + + "

**참고:** 이 API를 사용하기 위해서는 유효한 JWT 토큰이 필요하며, " + + "토큰이 없거나 유효하지 않은 경우 인증 오류가 발생합니다.") + @ApiErrorResponses(value = ExceptionType.NOT_FOUND_ERROR) + ResponseEntity openedRooms(AuthInfo authInfo, + + @Parameter(description = "페이지 정보", example = "1") + int page, + + @Parameter(description = "방 분야", example = "AN") + String expression); + + @Operation(summary = "현재 모집 완료된 방 정보를 반환합니다.", + description = "현재 모집 완료된 방들의 정보를 반환합니다. 이미 참여 중인 방들의 정보는 제외됩니다.
" + + "요청 시 `Authorization Header`에 `Bearer JWT token`을 포함시켜야 합니다. " + + "이 토큰을 기반으로 `AuthInfo` 객체가 생성되며 사용자의 정보가 자동으로 주입됩니다.
" + + "JWT 토큰에서 추출된 사용자 정보는 피드백 작성에 필요한 인증된 사용자 정보를 제공합니다. " + + "

**참고:** 이 API를 사용하기 위해서는 유효한 JWT 토큰이 필요하며, " + + "토큰이 없거나 유효하지 않은 경우 인증 오류가 발생합니다.") + @ApiErrorResponses(value = ExceptionType.NOT_FOUND_ERROR) + ResponseEntity progressRooms(AuthInfo authInfo, + + @Parameter(description = "페이지 정보", example = "1") + int page, + + @Parameter(description = "방 분야", example = "AN") + String expression); + + @Operation(summary = "현재 종료된 방 정보를 반환합니다.", + description = "현재 모든 진행이 종료된 방들의 정보를 반환합니다. 이미 참여 중인 방들의 정보는 제외됩니다.
" + + "요청 시 `Authorization Header`에 `Bearer JWT token`을 포함시켜야 합니다. " + + "이 토큰을 기반으로 `AuthInfo` 객체가 생성되며 사용자의 정보가 자동으로 주입됩니다.
" + + "JWT 토큰에서 추출된 사용자 정보는 피드백 작성에 필요한 인증된 사용자 정보를 제공합니다. " + + "

**참고:** 이 API를 사용하기 위해서는 유효한 JWT 토큰이 필요하며, " + + "토큰이 없거나 유효하지 않은 경우 인증 오류가 발생합니다.") + @ApiErrorResponses(value = ExceptionType.NOT_FOUND_ERROR) + ResponseEntity closedRooms(AuthInfo authInfo, + + @Parameter(description = "페이지 정보", example = "2") + int page, + + @Parameter(description = "방 분야", example = "FE") + String expression); +} diff --git a/backend/src/main/java/corea/room/service/RoomInquiryService.java b/backend/src/main/java/corea/room/service/RoomInquiryService.java new file mode 100644 index 00000000..0c93d241 --- /dev/null +++ b/backend/src/main/java/corea/room/service/RoomInquiryService.java @@ -0,0 +1,40 @@ +package corea.room.service; + +import corea.member.domain.MemberRole; +import corea.participation.domain.ParticipationStatus; +import corea.room.domain.Room; +import corea.room.domain.RoomClassification; +import corea.room.domain.RoomStatus; +import corea.room.dto.RoomResponses; +import corea.room.repository.RoomRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class RoomInquiryService { + private static final int PAGE_DISPLAY_SIZE = 8; + private final RoomRepository roomRepository; + + public RoomResponses findRoomsWithRoomStatus(long memberId, int pageNumber, String expression, RoomStatus roomStatus) { + RoomClassification classification = RoomClassification.from(expression); + return getRoomResponses(memberId, pageNumber, classification, roomStatus); + } + + private RoomResponses getRoomResponses(long memberId, int pageNumber, RoomClassification classification, RoomStatus status) { + PageRequest pageRequest = PageRequest.of(pageNumber, PAGE_DISPLAY_SIZE); + + if (classification.isAll()) { + Page roomsWithPage = roomRepository.findAllByMemberAndStatus(memberId, status, pageRequest); + return RoomResponses.of(roomsWithPage, MemberRole.NONE, ParticipationStatus.NOT_PARTICIPATED, pageNumber); + } + Page roomsWithPage = roomRepository.findAllByMemberAndClassificationAndStatus(memberId, classification, status, pageRequest); + return RoomResponses.of(roomsWithPage, MemberRole.NONE, ParticipationStatus.NOT_PARTICIPATED, pageNumber); + } +} diff --git a/backend/src/main/java/corea/room/service/RoomService.java b/backend/src/main/java/corea/room/service/RoomService.java index 5bb1b292..83971841 100644 --- a/backend/src/main/java/corea/room/service/RoomService.java +++ b/backend/src/main/java/corea/room/service/RoomService.java @@ -39,7 +39,6 @@ public class RoomService { private static final int PLUS_HOURS_TO_MINIMUM_RECRUITMENT_DEADLINE = 1; private static final int PLUS_DAYS_TO_MINIMUM_REVIEW_DEADLINE = 1; - private static final int PAGE_DISPLAY_SIZE = 8; private static final int RANDOM_DISPLAY_PARTICIPANTS_SIZE = 6; private final RoomRepository roomRepository; @@ -108,22 +107,6 @@ private List findNonClosedParticipatedRooms(long memberId) { .toList(); } - public RoomResponses findRoomsWithRoomStatus(long memberId, int pageNumber, String expression, RoomStatus roomStatus) { - RoomClassification classification = RoomClassification.from(expression); - return getRoomResponses(memberId, pageNumber, classification, roomStatus); - } - - private RoomResponses getRoomResponses(long memberId, int pageNumber, RoomClassification classification, RoomStatus status) { - PageRequest pageRequest = PageRequest.of(pageNumber, PAGE_DISPLAY_SIZE); - - if (classification.isAll()) { - Page roomsWithPage = roomRepository.findAllByMemberAndStatus(memberId, status, pageRequest); - return RoomResponses.of(roomsWithPage, MemberRole.NONE, ParticipationStatus.NOT_PARTICIPATED, pageNumber); - } - Page roomsWithPage = roomRepository.findAllByMemberAndClassificationAndStatus(memberId, classification, status, pageRequest); - return RoomResponses.of(roomsWithPage, MemberRole.NONE, ParticipationStatus.NOT_PARTICIPATED, pageNumber); - } - @Transactional public void delete(long roomId, long memberId) { Room room = getRoom(roomId); diff --git a/backend/src/test/java/corea/room/service/RoomInquiryServiceTest.java b/backend/src/test/java/corea/room/service/RoomInquiryServiceTest.java new file mode 100644 index 00000000..52aeed75 --- /dev/null +++ b/backend/src/test/java/corea/room/service/RoomInquiryServiceTest.java @@ -0,0 +1,91 @@ +package corea.room.service; + +import config.ServiceTest; +import corea.auth.domain.AuthInfo; +import corea.fixture.MemberFixture; +import corea.fixture.RoomFixture; +import corea.member.domain.Member; +import corea.member.repository.MemberRepository; +import corea.room.domain.RoomStatus; +import corea.room.dto.RoomResponse; +import corea.room.dto.RoomResponses; +import corea.room.repository.RoomRepository; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.EnumSource; +import org.springframework.beans.factory.annotation.Autowired; + +import java.time.LocalDateTime; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +@ServiceTest +public class RoomInquiryServiceTest { + + @Autowired + private MemberRepository memberRepository; + + @Autowired + private RoomInquiryService roomInquiryService; + + @Autowired + private RoomRepository roomRepository; + + @ParameterizedTest + @EnumSource(RoomStatus.class) + @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)); + roomRepository.save(RoomFixture.ROOM_DOMAIN(ash, LocalDateTime.now().plusDays(3), roomStatus)); + + RoomResponses response = roomInquiryService.findRoomsWithRoomStatus(pororo.getId(), 0, "all", roomStatus); + List managerNames = getManagerNames(response); + + assertThat(managerNames).containsExactly("박민아"); + } + + @ParameterizedTest + @EnumSource(RoomStatus.class) + @DisplayName("비로그인 사용자가 방을 상태별로 마감일 임박순으로 조회할 수 있다.") + void findRoomsWithRoomStatus_non_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)); + roomRepository.save(RoomFixture.ROOM_DOMAIN(ash, LocalDateTime.now().plusDays(3), roomStatus)); + + AuthInfo anonymous = AuthInfo.getAnonymous(); + + RoomResponses response = roomInquiryService.findRoomsWithRoomStatus(anonymous.getId(), 0, "all", roomStatus); + List managerNames = getManagerNames(response); + + assertThat(managerNames).containsExactly("조경찬", "박민아"); + } + + @ParameterizedTest + @CsvSource(value = {"0, false", "1, true"}) + @DisplayName("방을 조회할 때 전달받은 페이지가 마지막 페이지인지 판별할 수 있다.") + void isLastPage(int pageNumber, boolean expected) { + Member pororo = memberRepository.save(MemberFixture.MEMBER_PORORO()); + for (int i = 0; i < 9; i++) { + roomRepository.save(RoomFixture.ROOM_DOMAIN(pororo)); + } + + AuthInfo anonymous = AuthInfo.getAnonymous(); + RoomResponses response = roomInquiryService.findRoomsWithRoomStatus(anonymous.getId(), pageNumber, "all", RoomStatus.OPEN); + + assertThat(response.isLastPage()).isEqualTo(expected); + } + + private List getManagerNames(RoomResponses response) { + return response.rooms() + .stream() + .map(RoomResponse::manager) + .toList(); + } +} diff --git a/backend/src/test/java/corea/room/service/RoomServiceTest.java b/backend/src/test/java/corea/room/service/RoomServiceTest.java index dd61a061..16b6bb5f 100644 --- a/backend/src/test/java/corea/room/service/RoomServiceTest.java +++ b/backend/src/test/java/corea/room/service/RoomServiceTest.java @@ -198,55 +198,6 @@ void findNonClosedParticipatedRooms() { assertThat(managerNames).containsExactly("조경찬", "박민아"); } - @ParameterizedTest - @EnumSource(RoomStatus.class) - @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)); - roomRepository.save(RoomFixture.ROOM_DOMAIN(ash, LocalDateTime.now().plusDays(3), roomStatus)); - - RoomResponses response = roomService.findRoomsWithRoomStatus(pororo.getId(), 0, "all", roomStatus); - List managerNames = getManagerNames(response); - - assertThat(managerNames).containsExactly("박민아"); - } - - @ParameterizedTest - @EnumSource(RoomStatus.class) - @DisplayName("비로그인 사용자가 방을 상태별로 마감일 임박순으로 조회할 수 있다.") - void findRoomsWithRoomStatus_non_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)); - roomRepository.save(RoomFixture.ROOM_DOMAIN(ash, LocalDateTime.now().plusDays(3), roomStatus)); - - AuthInfo anonymous = AuthInfo.getAnonymous(); - - RoomResponses response = roomService.findRoomsWithRoomStatus(anonymous.getId(), 0, "all", roomStatus); - List managerNames = getManagerNames(response); - - assertThat(managerNames).containsExactly("조경찬", "박민아"); - } - - @ParameterizedTest - @CsvSource(value = {"0, false", "1, true"}) - @DisplayName("방을 조회할 때 전달받은 페이지가 마지막 페이지인지 판별할 수 있다.") - void isLastPage(int pageNumber, boolean expected) { - Member pororo = memberRepository.save(MemberFixture.MEMBER_PORORO()); - for (int i = 0; i < 9; i++) { - roomRepository.save(RoomFixture.ROOM_DOMAIN(pororo)); - } - - AuthInfo anonymous = AuthInfo.getAnonymous(); - RoomResponses response = roomService.findRoomsWithRoomStatus(anonymous.getId(), pageNumber, "all", RoomStatus.OPEN); - - assertThat(response.isLastPage()).isEqualTo(expected); - } - @Test @DisplayName("방을 생성한 방장의 참여 상태는 MANAGER다.") void create_participationStatus_manager() { @@ -331,7 +282,6 @@ void findParticipants_withNoPullRequestParticipants() { matchResultRepository.saveAll(members.stream().map(member -> MatchResultFixture.MATCH_RESULT_DOMAIN(room.getId(), manager, member)).toList()); matchResultRepository.save(MatchResultFixture.MATCH_RESULT_DOMAIN(room.getId(), members.get(0), manager)); - RoomParticipantResponses participants = assertDoesNotThrow(() -> roomService.findParticipants(room.getId(), manager.getId())); assertAll(