From e57dc01d463048f2aaee3ee53262eeda871c7f52 Mon Sep 17 00:00:00 2001 From: janghyunjun Date: Fri, 12 Sep 2025 15:22:19 +0900 Subject: [PATCH 01/17] =?UTF-8?q?[refactor]=20=ED=8A=B9=EC=A0=95=20?= =?UTF-8?q?=EC=B1=85=EA=B3=BC=20=EA=B4=80=EB=A0=A8=EB=90=9C=20=EB=B0=A9=20?= =?UTF-8?q?=EC=BF=BC=EB=A6=AC=20=ED=95=84=ED=84=B0=EB=A7=81=20=EC=A1=B0?= =?UTF-8?q?=EA=B1=B4=EC=9D=84=20=EC=A0=95=EC=A0=81=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20(#289)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../book/application/service/BookRecruitingRoomsService.java | 4 +--- .../thip/book/application/service/BookSearchService.java | 5 ++--- .../out/persistence/repository/RoomJpaRepository.java | 5 ++--- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/main/java/konkuk/thip/book/application/service/BookRecruitingRoomsService.java b/src/main/java/konkuk/thip/book/application/service/BookRecruitingRoomsService.java index fc0fc5d00..21c439a64 100644 --- a/src/main/java/konkuk/thip/book/application/service/BookRecruitingRoomsService.java +++ b/src/main/java/konkuk/thip/book/application/service/BookRecruitingRoomsService.java @@ -11,8 +11,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.time.LocalDate; - @Service @RequiredArgsConstructor public class BookRecruitingRoomsService implements BookRecruitingRoomsUseCase { @@ -26,7 +24,7 @@ public class BookRecruitingRoomsService implements BookRecruitingRoomsUseCase { @Transactional(readOnly = true) public BookRecruitingRoomsResponse getRecruitingRoomsWithBook(String isbn, String cursorStr) { Integer totalRoomCount = (cursorStr == null || cursorStr.isBlank()) ? // 첫 요청 여부 판단 - roomQueryPort.countRecruitingRoomsByBookAndStartDateAfter(isbn, LocalDate.now()) : null; + roomQueryPort.countRecruitingRoomsByBookIsbn(isbn) : null; Cursor cursor = Cursor.from(cursorStr, DEFAULT_PAGE_SIZE); CursorBasedList roomDtos = roomQueryPort.findRoomsByIsbnOrderByDeadline(isbn, cursor); diff --git a/src/main/java/konkuk/thip/book/application/service/BookSearchService.java b/src/main/java/konkuk/thip/book/application/service/BookSearchService.java index 3493e5d73..617a27d4d 100644 --- a/src/main/java/konkuk/thip/book/application/service/BookSearchService.java +++ b/src/main/java/konkuk/thip/book/application/service/BookSearchService.java @@ -113,9 +113,8 @@ public BookDetailSearchResult searchDetailBooks(String isbn,Long userId) { } private int getRecruitingRoomCount(Book book) { - //오늘 날짜 기준으로 방 활동 시작 기간이 이후인 방 찾기(모집중인 방) - LocalDate today = LocalDate.now(); - return roomQueryPort.countRecruitingRoomsByBookAndStartDateAfter(book.getIsbn(), today); + // 모집 중인 방 개수 + return roomQueryPort.countRecruitingRoomsByBookIsbn(book.getIsbn()); } private int getReadCount(Book book) { diff --git a/src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomJpaRepository.java b/src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomJpaRepository.java index a41e7e811..905a89a69 100644 --- a/src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomJpaRepository.java +++ b/src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomJpaRepository.java @@ -6,7 +6,6 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; -import java.time.LocalDate; import java.util.List; import java.util.Optional; @@ -19,8 +18,8 @@ public interface RoomJpaRepository extends JpaRepository, R @Query("SELECT COUNT(r) FROM RoomJpaEntity r " + "WHERE r.bookJpaEntity.isbn = :isbn " + - "AND r.startDate > :currentDate") - int countActiveRoomsByBookIdAndStartDateAfter(@Param("isbn") String isbn, @Param("currentDate") LocalDate currentDate); + "AND r.roomStatus = 'RECRUITING'") + int countRecruitingRoomsByBookIsbn(@Param("isbn") String isbn); @Modifying(clearAutomatically = true, flushAutomatically = true) @Query(""" From edc58dd49f7b40747e76b2c2211e534a15750952 Mon Sep 17 00:00:00 2001 From: janghyunjun Date: Fri, 12 Sep 2025 15:24:07 +0900 Subject: [PATCH 02/17] =?UTF-8?q?[fix]=20FIrebaseAdapter=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=ED=95=84=20=EC=A1=B0=EA=B1=B4=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?(#289)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/message/adapter/out/firebase/FirebaseAdapter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/konkuk/thip/message/adapter/out/firebase/FirebaseAdapter.java b/src/main/java/konkuk/thip/message/adapter/out/firebase/FirebaseAdapter.java index f8587d743..f907ceb6a 100644 --- a/src/main/java/konkuk/thip/message/adapter/out/firebase/FirebaseAdapter.java +++ b/src/main/java/konkuk/thip/message/adapter/out/firebase/FirebaseAdapter.java @@ -13,7 +13,7 @@ @Slf4j @Component -@Profile({"!test", "!local"}) +@Profile("!test & !local") @RequiredArgsConstructor public class FirebaseAdapter implements FirebaseMessagingPort { From a41646a98b4f069c753d70071528e9b2639f6845 Mon Sep 17 00:00:00 2001 From: janghyunjun Date: Fri, 12 Sep 2025 15:25:59 +0900 Subject: [PATCH 03/17] =?UTF-8?q?[refactor]=20=EB=B0=A9=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20=EB=82=B4=EB=B6=80=20=EB=B0=A9=20=EA=B8=B0?= =?UTF-8?q?=EA=B0=84=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=EC=A0=95=EC=A0=81=EC=9D=84=20=EB=B3=80=EA=B2=BD=20(#289)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/RoomJoinService.java | 9 ++------- .../java/konkuk/thip/room/domain/Room.java | 20 ++++++++----------- 2 files changed, 10 insertions(+), 19 deletions(-) diff --git a/src/main/java/konkuk/thip/room/application/service/RoomJoinService.java b/src/main/java/konkuk/thip/room/application/service/RoomJoinService.java index 3f4167821..02c0e7676 100644 --- a/src/main/java/konkuk/thip/room/application/service/RoomJoinService.java +++ b/src/main/java/konkuk/thip/room/application/service/RoomJoinService.java @@ -34,11 +34,11 @@ public class RoomJoinService implements RoomJoinUseCase { public RoomJoinResult changeJoinState(RoomJoinCommand roomJoinCommand) { RoomJoinType type = roomJoinCommand.type(); - // 방이 존재하지 않거나 만료된 경우 + // 방이 존재하지 않거나 모집기간이 만료된 경우 예외 처리 Room room = roomCommandPort.findById(roomJoinCommand.roomId()) .orElseThrow(() -> new BusinessException(ErrorCode.USER_CANNOT_JOIN_OR_CANCEL)); - validateRoom(room); + room.validateRoomRecruitExpired(); Optional roomParticipantOptional = roomParticipantCommandPort.findByUserIdAndRoomIdOptional(roomJoinCommand.userId(), roomJoinCommand.roomId()); @@ -93,11 +93,6 @@ private void handleJoin(RoomJoinCommand roomJoinCommand, Optional Date: Fri, 12 Sep 2025 15:26:44 +0900 Subject: [PATCH 04/17] =?UTF-8?q?[refactor]=20=EB=B0=A9=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EC=BF=BC=EB=A6=AC=20=EA=B8=B0=EA=B0=84=20=ED=95=84?= =?UTF-8?q?=ED=84=B0=EB=A7=81=20=EC=A1=B0=EA=B1=B4=20=EB=AA=A8=EB=91=90=20?= =?UTF-8?q?=EC=A0=95=EC=A0=81=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95=20(#2?= =?UTF-8?q?89)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RoomQueryPersistenceAdapter.java | 4 +- .../repository/RoomQueryRepositoryImpl.java | 49 ++++++++++--------- .../application/port/out/RoomQueryPort.java | 5 +- 3 files changed, 30 insertions(+), 28 deletions(-) diff --git a/src/main/java/konkuk/thip/room/adapter/out/persistence/RoomQueryPersistenceAdapter.java b/src/main/java/konkuk/thip/room/adapter/out/persistence/RoomQueryPersistenceAdapter.java index 5fa848e00..237172e33 100644 --- a/src/main/java/konkuk/thip/room/adapter/out/persistence/RoomQueryPersistenceAdapter.java +++ b/src/main/java/konkuk/thip/room/adapter/out/persistence/RoomQueryPersistenceAdapter.java @@ -25,8 +25,8 @@ public class RoomQueryPersistenceAdapter implements RoomQueryPort { private final RoomJpaRepository roomJpaRepository; @Override - public int countRecruitingRoomsByBookAndStartDateAfter(String isbn, LocalDate currentDate) { - return roomJpaRepository.countActiveRoomsByBookIdAndStartDateAfter(isbn, currentDate); + public int countRecruitingRoomsByBookIsbn(String isbn) { + return roomJpaRepository.countRecruitingRoomsByBookIsbn(isbn); } @Override diff --git a/src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomQueryRepositoryImpl.java b/src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomQueryRepositoryImpl.java index b708d4cc3..6aeacf18f 100644 --- a/src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomQueryRepositoryImpl.java +++ b/src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomQueryRepositoryImpl.java @@ -19,6 +19,7 @@ import konkuk.thip.room.application.port.out.dto.RoomParticipantQueryDto; import konkuk.thip.room.application.port.out.dto.RoomQueryDto; import konkuk.thip.room.domain.value.Category; +import konkuk.thip.room.domain.value.RoomStatus; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; @@ -35,9 +36,9 @@ public class RoomQueryRepositoryImpl implements RoomQueryRepository { private final QRoomParticipantJpaEntity participant = QRoomParticipantJpaEntity.roomParticipantJpaEntity; /** 모집중 + ACTIVE 공통 where */ - private BooleanBuilder recruitingActiveWhere(LocalDate today) { + private BooleanBuilder recruitingActiveWhere() { BooleanBuilder where = new BooleanBuilder(); - where.and(room.startDate.after(today)); + where.and(room.roomStatus.eq(RoomStatus.RECRUITING)); return where; } @@ -91,10 +92,9 @@ private QRoomQueryDto projectionForRecruitingRoomSearch() { */ @Override public List findRecruitingRoomsOrderByStartDateAsc(String keyword, LocalDate lastStartDate, Long roomId, int pageSize) { - final LocalDate today = LocalDate.now(); DateExpression cursorExpr = room.startDate; // 커서 비교는 startDate - BooleanBuilder where = recruitingActiveWhere(today); + BooleanBuilder where = recruitingActiveWhere(); applyKeyword(where, keyword); applyCursorStartDateAsc(where, cursorExpr, lastStartDate, roomId); @@ -110,10 +110,9 @@ public List findRecruitingRoomsOrderByStartDateAsc(String keyword, @Override public List findRecruitingRoomsWithCategoryOrderByStartDateAsc(String keyword, Category category, LocalDate lastStartDate, Long roomId, int pageSize) { - final LocalDate today = LocalDate.now(); DateExpression cursorExpr = room.startDate; - BooleanBuilder where = recruitingActiveWhere(today); + BooleanBuilder where = recruitingActiveWhere(); applyCategory(where, category); applyKeyword(where, keyword); applyCursorStartDateAsc(where, cursorExpr, lastStartDate, roomId); @@ -130,9 +129,7 @@ public List findRecruitingRoomsWithCategoryOrderByStartDateAsc(Str @Override public List findRecruitingRoomsOrderByMemberCountDesc(String keyword, Integer lastMemberCount, Long roomId, int pageSize) { - final LocalDate today = LocalDate.now(); - - BooleanBuilder where = recruitingActiveWhere(today); + BooleanBuilder where = recruitingActiveWhere(); applyKeyword(where, keyword); applyCursorMemberCountDesc(where, lastMemberCount, roomId); @@ -148,9 +145,7 @@ public List findRecruitingRoomsOrderByMemberCountDesc(String keywo @Override public List findRecruitingRoomsWithCategoryOrderByMemberCountDesc(String keyword, Category category, Integer lastMemberCount, Long roomId, int pageSize) { - final LocalDate today = LocalDate.now(); - - BooleanBuilder where = recruitingActiveWhere(today); + BooleanBuilder where = recruitingActiveWhere(); applyCategory(where, category); applyKeyword(where, keyword); applyCursorMemberCountDesc(where, lastMemberCount, roomId); @@ -174,7 +169,7 @@ public List findOtherRecruitingR .join(room.bookJpaEntity, book) .where( room.category.eq(category) - .and(room.startDate.after(LocalDate.now())) // 모집 마감 시각 > 현재 시각 + .and(room.roomStatus.eq(RoomStatus.RECRUITING)) // 모집 중인 방 .and(room.roomId.ne(roomId))// 현재 방 제외 .and(room.isPublic.isTrue()) // 공개방 만 ) @@ -207,8 +202,9 @@ public List findHomeJoinedRoomsByUserPercentage( // 활동 기간 중인 방만: startDate ≤ today ≤ endDate BooleanBuilder where = new BooleanBuilder(); where.and(participant.userJpaEntity.userId.eq(userId)); - where.and(room.startDate.loe(LocalDate.now())); - where.and(room.endDate.goe(LocalDate.now())); +// where.and(room.startDate.loe(LocalDate.now())); +// where.and(room.endDate.goe(LocalDate.now())); + where.and(room.roomStatus.eq(RoomStatus.IN_PROGRESS)); // 활동 기간 중인 방만: IN_PROGRESS 상태 // 커서 기반 추가 조건 if (userPercentageCursor != null && startDateCursor != null && roomIdCursor != null) { @@ -252,7 +248,8 @@ public List findRecruitingRoomsUserParticipated( ) { LocalDate today = LocalDate.now(); BooleanExpression base = participant.userJpaEntity.userId.eq(userId) - .and(room.startDate.after(today)); // 유저가 참여한 방 && 모집중인 방 +// .and(room.startDate.after(today)); // 유저가 참여한 방 && 모집중인 방 + .and(room.roomStatus.eq(RoomStatus.RECRUITING)); // 유저가 참여한 방 && 모집중인 방 DateExpression cursorExpr = room.startDate; // 커서 비교는 startDate(= 모집 마감일 - 1일) OrderSpecifier[] orders = new OrderSpecifier[]{ cursorExpr.asc(), room.roomId.asc() @@ -268,8 +265,9 @@ public List findPlayingRoomsUserParticipated( ) { LocalDate today = LocalDate.now(); BooleanExpression base = participant.userJpaEntity.userId.eq(userId) - .and(room.startDate.loe(today)) - .and(room.endDate.goe(today)); // 유저가 참여한 방 && 현재 진행중인 방 +// .and(room.startDate.loe(today)) +// .and(room.endDate.goe(today)); // 유저가 참여한 방 && 현재 진행중인 방 + .and(room.roomStatus.eq(RoomStatus.IN_PROGRESS)); // 유저가 참여한 방 && 현재 진행중인 방 DateExpression cursorExpr = room.endDate; // 커서 비교는 endDate(= 진행 마감일) OrderSpecifier[] orders = new OrderSpecifier[]{ cursorExpr.asc(), room.roomId.asc() @@ -284,8 +282,10 @@ public List findPlayingAndRecruitingRoomsUserParticipated( Long userId, Integer priorityCursor, LocalDate dateCursor, Long roomIdCursor, int pageSize ) { LocalDate today = LocalDate.now(); - BooleanExpression playing = room.startDate.loe(today).and(room.endDate.goe(today)); - BooleanExpression recruiting = room.startDate.after(today); +// BooleanExpression playing = room.startDate.loe(today).and(room.endDate.goe(today)); +// BooleanExpression recruiting = room.startDate.after(today); + BooleanExpression playing = room.roomStatus.eq(RoomStatus.IN_PROGRESS); + BooleanExpression recruiting = room.roomStatus.eq(RoomStatus.RECRUITING); BooleanExpression base = participant.userJpaEntity.userId.eq(userId) .and(playing.or(recruiting)); // 유저가 참여한 방 && 현재 진행중인 방 + 모집중인 방 @@ -309,7 +309,8 @@ public List findExpiredRoomsUserParticipated( ) { LocalDate today = LocalDate.now(); BooleanExpression base = participant.userJpaEntity.userId.eq(userId) - .and(room.endDate.before(today)); // 유저가 참여한 방 && 만료된 방 +// .and(room.endDate.before(today)); // 유저가 참여한 방 && 만료된 방 + .and(room.roomStatus.eq(RoomStatus.EXPIRED)); // 유저가 참여한 방 && 만료된 방 DateExpression cursorExpr = room.endDate; OrderSpecifier[] orders = new OrderSpecifier[]{ @@ -361,7 +362,8 @@ public List findRoomsByCategoryOrderByMemberCount(Category categor public List findRoomsByIsbnOrderByStartDateAsc(String isbn, LocalDate dateCursor, Long roomIdCursor, int pageSize) { DateExpression cursorExpr = room.startDate; // 커서 비교는 startDate(= 모집 마감일 - 1일) BooleanExpression baseCondition = room.bookJpaEntity.isbn.eq(isbn) - .and(room.startDate.after(LocalDate.now())); // 모집 마감 시각 > 현재 시각 +// .and(room.startDate.after(LocalDate.now())); // 모집 마감 시각 > 현재 시각 + .and(room.roomStatus.eq(RoomStatus.RECRUITING)); // 모집중인 방 if (dateCursor != null && roomIdCursor != null) { // 첫 페이지가 아닌 경우 @@ -389,7 +391,8 @@ public List findRoomsByIsbnOrderByStartDateAsc(String isbn, LocalD private BooleanExpression findDeadlinePopularRoomCondition(Category category, Long userId) { return room.category.eq(category) - .and(room.startDate.after(LocalDate.now())) // 모집 마감 시각 > 현재 시각 +// .and(room.startDate.after(LocalDate.now())) // 모집 마감 시각 > 현재 시각 + .and(room.roomStatus.eq(RoomStatus.RECRUITING)) // 모집중인 방 .and(room.isPublic.isTrue()) // 공개 방만 조회 .and(userJoinedRoom(userId).not()); // 유저가 참여하지 않은 방만 조회 } diff --git a/src/main/java/konkuk/thip/room/application/port/out/RoomQueryPort.java b/src/main/java/konkuk/thip/room/application/port/out/RoomQueryPort.java index b28d75426..8c43d2034 100644 --- a/src/main/java/konkuk/thip/room/application/port/out/RoomQueryPort.java +++ b/src/main/java/konkuk/thip/room/application/port/out/RoomQueryPort.java @@ -5,15 +5,14 @@ import konkuk.thip.room.adapter.in.web.response.RoomRecruitingDetailViewResponse; import konkuk.thip.room.application.port.out.dto.RoomParticipantQueryDto; import konkuk.thip.room.application.port.out.dto.RoomQueryDto; -import konkuk.thip.room.domain.value.Category; import konkuk.thip.room.domain.Room; +import konkuk.thip.room.domain.value.Category; -import java.time.LocalDate; import java.util.List; public interface RoomQueryPort { - int countRecruitingRoomsByBookAndStartDateAfter(String isbn, LocalDate currentDate); + int countRecruitingRoomsByBookIsbn(String isbn); /** * 방 검색 From 231c256fd0e109e5aced11fcf688edad9971c908 Mon Sep 17 00:00:00 2001 From: janghyunjun Date: Fri, 12 Sep 2025 15:27:43 +0900 Subject: [PATCH 05/17] =?UTF-8?q?[refactor]=20=EA=B8=B0=EA=B0=84=EC=9D=B4?= =?UTF-8?q?=20=EB=A7=8C=EB=A3=8C=EB=90=9C=20=EB=B0=A9=20=EB=82=B4=EB=B6=80?= =?UTF-8?q?=20=EA=B2=8C=EC=8B=9C=EB=AC=BC=EB=93=A4=EC=9D=80=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=EB=A7=8C=20=EA=B0=80=EB=8A=A5=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=20(#289)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../policy/RoomPostCommentAccessPolicy.java | 3 +++ .../swagger/SwaggerResponseDescription.java | 22 ++++++++++++------- .../service/validator/RoomValidator.java | 19 ++++++++++++++++ .../service/AttendanceCheckCreateService.java | 7 ++++++ .../service/AttendanceCheckDeleteService.java | 7 ++++++ .../service/RecordDeleteService.java | 10 ++++++--- .../service/RoomPostUpdateService.java | 14 ++++++++++++ .../service/VoteCreateService.java | 1 + .../policy/RoomPostLikeAccessPolicy.java | 3 +++ 9 files changed, 75 insertions(+), 11 deletions(-) create mode 100644 src/main/java/konkuk/thip/room/application/service/validator/RoomValidator.java diff --git a/src/main/java/konkuk/thip/comment/application/service/policy/RoomPostCommentAccessPolicy.java b/src/main/java/konkuk/thip/comment/application/service/policy/RoomPostCommentAccessPolicy.java index fe9bdc0c1..01b4d45aa 100644 --- a/src/main/java/konkuk/thip/comment/application/service/policy/RoomPostCommentAccessPolicy.java +++ b/src/main/java/konkuk/thip/comment/application/service/policy/RoomPostCommentAccessPolicy.java @@ -2,6 +2,7 @@ import konkuk.thip.post.domain.CountUpdatable; import konkuk.thip.room.application.service.validator.RoomParticipantValidator; +import konkuk.thip.room.application.service.validator.RoomValidator; import konkuk.thip.roompost.domain.RoomPost; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @@ -11,11 +12,13 @@ public class RoomPostCommentAccessPolicy implements CommentAccessPolicy { private final RoomParticipantValidator roomParticipantValidator; + private final RoomValidator roomValidator; @Override public void validateCommentAccess(CountUpdatable post, Long userId) { RoomPost roomPost = (RoomPost) post; roomParticipantValidator.validateUserIsRoomMember(roomPost.getRoomId(), userId); + roomValidator.validateRoomExpired(roomPost.getRoomId()); } } \ No newline at end of file diff --git a/src/main/java/konkuk/thip/common/swagger/SwaggerResponseDescription.java b/src/main/java/konkuk/thip/common/swagger/SwaggerResponseDescription.java index 703e7f4dc..e57e6c0da 100644 --- a/src/main/java/konkuk/thip/common/swagger/SwaggerResponseDescription.java +++ b/src/main/java/konkuk/thip/common/swagger/SwaggerResponseDescription.java @@ -147,7 +147,8 @@ public enum SwaggerResponseDescription { RECORD_DELETE(new LinkedHashSet<>(Set.of( ROOM_ACCESS_FORBIDDEN, RECORD_NOT_FOUND, - RECORD_ACCESS_FORBIDDEN + RECORD_ACCESS_FORBIDDEN, + ROOM_IS_EXPIRED ))), RECORD_PIN(new LinkedHashSet<>(Set.of( ROOM_ACCESS_FORBIDDEN, @@ -158,7 +159,8 @@ public enum SwaggerResponseDescription { RECORD_UPDATE(new LinkedHashSet<>(Set.of( ROOM_ACCESS_FORBIDDEN, RECORD_NOT_FOUND, - RECORD_ACCESS_FORBIDDEN + RECORD_ACCESS_FORBIDDEN, + ROOM_IS_EXPIRED ))), // Vote @@ -175,7 +177,8 @@ public enum SwaggerResponseDescription { VOTE_ITEM_NOT_FOUND, VOTE_ITEM_ALREADY_VOTED, VOTE_ITEM_NOT_VOTED_CANNOT_CANCEL, - VOTE_ITEM_COUNT_CANNOT_BE_NEGATIVE + VOTE_ITEM_COUNT_CANNOT_BE_NEGATIVE, + ROOM_IS_EXPIRED ))), VOTE_DELETE(new LinkedHashSet<>(Set.of( ROOM_ACCESS_FORBIDDEN, @@ -251,8 +254,8 @@ public enum SwaggerResponseDescription { VOTE_NOT_FOUND, INVALID_COMMENT_CREATE, FEED_ACCESS_FORBIDDEN, - ROOM_ACCESS_FORBIDDEN - + ROOM_ACCESS_FORBIDDEN, + ROOM_IS_EXPIRED ))), CHANGE_COMMENT_LIKE_STATE(new LinkedHashSet<>(Set.of( USER_NOT_FOUND, @@ -264,7 +267,8 @@ public enum SwaggerResponseDescription { COMMENT_NOT_LIKED_CANNOT_CANCEL, COMMENT_LIKE_COUNT_UNDERFLOW, FEED_ACCESS_FORBIDDEN, - ROOM_ACCESS_FORBIDDEN + ROOM_ACCESS_FORBIDDEN, + ROOM_IS_EXPIRED ))), COMMENT_DELETE(new LinkedHashSet<>(Set.of( USER_NOT_FOUND, @@ -275,7 +279,8 @@ public enum SwaggerResponseDescription { COMMENT_DELETE_FORBIDDEN, COMMENT_COUNT_UNDERFLOW, FEED_ACCESS_FORBIDDEN, - ROOM_ACCESS_FORBIDDEN + ROOM_ACCESS_FORBIDDEN, + ROOM_IS_EXPIRED ))), // Book @@ -321,7 +326,8 @@ public enum SwaggerResponseDescription { ROOM_NOT_FOUND, USER_NOT_FOUND, ATTENDANCE_CHECK_WRITE_LIMIT_EXCEEDED, - ATTENDANCE_CHECK_NOT_FOUND + ATTENDANCE_CHECK_NOT_FOUND, + ROOM_IS_EXPIRED ))), ATTENDANCE_CHECK_SHOW(new LinkedHashSet<>(Set.of( diff --git a/src/main/java/konkuk/thip/room/application/service/validator/RoomValidator.java b/src/main/java/konkuk/thip/room/application/service/validator/RoomValidator.java new file mode 100644 index 000000000..305d58473 --- /dev/null +++ b/src/main/java/konkuk/thip/room/application/service/validator/RoomValidator.java @@ -0,0 +1,19 @@ +package konkuk.thip.room.application.service.validator; + +import konkuk.thip.common.annotation.application.HelperService; +import konkuk.thip.room.application.port.out.RoomCommandPort; +import konkuk.thip.room.domain.Room; +import lombok.RequiredArgsConstructor; + +@HelperService +@RequiredArgsConstructor +public class RoomValidator { + + private final RoomCommandPort roomCommandPort; + + public void validateRoomExpired(Long roomId) { + Room room = roomCommandPort.getByIdOrThrow(roomId); + room.validateRoomExpired(); + } + +} diff --git a/src/main/java/konkuk/thip/roompost/application/service/AttendanceCheckCreateService.java b/src/main/java/konkuk/thip/roompost/application/service/AttendanceCheckCreateService.java index 1fa93c9ca..62321747e 100644 --- a/src/main/java/konkuk/thip/roompost/application/service/AttendanceCheckCreateService.java +++ b/src/main/java/konkuk/thip/roompost/application/service/AttendanceCheckCreateService.java @@ -1,6 +1,8 @@ package konkuk.thip.roompost.application.service; import konkuk.thip.common.util.DateUtil; +import konkuk.thip.room.application.port.out.RoomCommandPort; +import konkuk.thip.room.domain.Room; import konkuk.thip.roompost.application.port.in.AttendanceCheckCreateUseCase; import konkuk.thip.roompost.application.port.in.dto.attendancecheck.AttendanceCheckCreateCommand; import konkuk.thip.roompost.application.port.in.dto.attendancecheck.AttendanceCheckCreateResult; @@ -22,6 +24,7 @@ public class AttendanceCheckCreateService implements AttendanceCheckCreateUseCas private final AttendanceCheckCommandPort attendanceCheckCommandPort; private final UserCommandPort userCommandPort; private final AttendanceCheckQueryPort attendanceCheckQueryPort; + private final RoomCommandPort roomCommandPort; @Transactional @Override @@ -32,6 +35,10 @@ public AttendanceCheckCreateResult create(AttendanceCheckCreateCommand command) // 1-1. 유저가 해당 방에 오늘의 한마디를 작성할 수 있는지 검증 roomParticipantValidator.validateUserIsRoomMember(command.roomId(), command.creatorId()); + // 1-2. 방이 만료되었는지 검증 + Room room = roomCommandPort.getByIdOrThrow(command.roomId()); + room.validateRoomExpired(); + // 2. 유저가 해당 방에서 오늘 이미 작성한 오늘의 한마디 개수 조회 int alreadyWrittenCountToday = attendanceCheckQueryPort.countAttendanceChecksOnTodayByUser(command.creatorId(), command.roomId()); diff --git a/src/main/java/konkuk/thip/roompost/application/service/AttendanceCheckDeleteService.java b/src/main/java/konkuk/thip/roompost/application/service/AttendanceCheckDeleteService.java index a67707898..b4f55b53e 100644 --- a/src/main/java/konkuk/thip/roompost/application/service/AttendanceCheckDeleteService.java +++ b/src/main/java/konkuk/thip/roompost/application/service/AttendanceCheckDeleteService.java @@ -1,6 +1,8 @@ package konkuk.thip.roompost.application.service; +import konkuk.thip.room.application.port.out.RoomCommandPort; import konkuk.thip.room.application.service.validator.RoomParticipantValidator; +import konkuk.thip.room.domain.Room; import konkuk.thip.roompost.application.port.in.AttendanceCheckDeleteUseCase; import konkuk.thip.roompost.application.port.out.AttendanceCheckCommandPort; import konkuk.thip.roompost.domain.AttendanceCheck; @@ -14,6 +16,7 @@ public class AttendanceCheckDeleteService implements AttendanceCheckDeleteUseCas private final AttendanceCheckCommandPort attendanceCheckCommandPort; private final RoomParticipantValidator roomParticipantValidator; + private final RoomCommandPort roomCommandPort; @Override @Transactional @@ -21,6 +24,10 @@ public Long delete(Long creatorId, Long roomId, Long attendanceCheckId) { // 1. creator 가 room participant인지 검증 roomParticipantValidator.validateUserIsRoomMember(roomId, creatorId); + // 1-1. 방이 만료되었는지 검증 + Room room = roomCommandPort.getByIdOrThrow(roomId); + room.validateRoomExpired(); + // 2. creator 겁증 AttendanceCheck attendanceCheck = attendanceCheckCommandPort.getByIdOrThrow(attendanceCheckId); attendanceCheck.validateCreator(creatorId); diff --git a/src/main/java/konkuk/thip/roompost/application/service/RecordDeleteService.java b/src/main/java/konkuk/thip/roompost/application/service/RecordDeleteService.java index f84c3f007..2f4215d2f 100644 --- a/src/main/java/konkuk/thip/roompost/application/service/RecordDeleteService.java +++ b/src/main/java/konkuk/thip/roompost/application/service/RecordDeleteService.java @@ -2,12 +2,13 @@ import konkuk.thip.comment.application.port.out.CommentCommandPort; import konkuk.thip.post.application.port.out.PostLikeCommandPort; +import konkuk.thip.room.application.port.out.RoomCommandPort; +import konkuk.thip.room.application.service.validator.RoomParticipantValidator; +import konkuk.thip.room.domain.Room; import konkuk.thip.roompost.application.port.in.RecordDeleteUseCase; import konkuk.thip.roompost.application.port.in.dto.record.RecordDeleteCommand; import konkuk.thip.roompost.application.port.out.RecordCommandPort; -import konkuk.thip.roompost.application.service.manager.RoomProgressManager; import konkuk.thip.roompost.domain.Record; -import konkuk.thip.room.application.service.validator.RoomParticipantValidator; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -19,9 +20,9 @@ public class RecordDeleteService implements RecordDeleteUseCase { private final RecordCommandPort recordCommandPort; private final CommentCommandPort commentCommandPort; private final PostLikeCommandPort postLikeCommandPort; + private final RoomCommandPort roomCommandPort; private final RoomParticipantValidator roomParticipantValidator; - private final RoomProgressManager roomProgressManager; @Override @Transactional @@ -30,6 +31,9 @@ public Long deleteRecord(RecordDeleteCommand command) { // 1. 방 참여자 검증 roomParticipantValidator.validateUserIsRoomMember(command.roomId(), command.userId()); + Room room = roomCommandPort.getByIdOrThrow(command.roomId()); + room.validateRoomExpired(); + // 2. 기록 조회 및 검증 Record record = recordCommandPort.getByIdOrThrow(command.recordId()); // 2-1. 기록 삭제 권한 검증 diff --git a/src/main/java/konkuk/thip/roompost/application/service/RoomPostUpdateService.java b/src/main/java/konkuk/thip/roompost/application/service/RoomPostUpdateService.java index 8df64dab2..a4a9bfc4e 100644 --- a/src/main/java/konkuk/thip/roompost/application/service/RoomPostUpdateService.java +++ b/src/main/java/konkuk/thip/roompost/application/service/RoomPostUpdateService.java @@ -1,6 +1,8 @@ package konkuk.thip.roompost.application.service; +import konkuk.thip.room.application.port.out.RoomCommandPort; import konkuk.thip.room.application.service.validator.RoomParticipantValidator; +import konkuk.thip.room.domain.Room; import konkuk.thip.roompost.application.port.in.RoomPostUpdateUseCase; import konkuk.thip.roompost.application.port.in.dto.record.RecordUpdateCommand; import konkuk.thip.roompost.application.port.in.dto.vote.VoteUpdateCommand; @@ -19,6 +21,7 @@ public class RoomPostUpdateService implements RoomPostUpdateUseCase { private final RoomParticipantValidator roomParticipantValidator; private final RecordCommandPort recordCommandPort; private final VoteCommandPort voteCommandPort; + private final RoomCommandPort roomCommandPort; @Override @Transactional @@ -26,6 +29,9 @@ public Long updateRecord(RecordUpdateCommand command) { // 1. 사용자가 방의 참가자인지 검증 roomParticipantValidator.validateUserIsRoomMember(command.roomId(), command.userId()); + // 1.1 방이 만료되었는지 검증 + validateRoom(command.roomId()); + // 2. Record 조회 Record record = recordCommandPort.getByIdOrThrow(command.postId()); @@ -43,6 +49,9 @@ public Long updateVote(VoteUpdateCommand command) { // 1. 사용자가 방의 참가자인지 검증 roomParticipantValidator.validateUserIsRoomMember(command.roomId(), command.userId()); + // 1.1 방이 만료되었는지 검증 + validateRoom(command.roomId()); + // 2. Vote 조회 Vote vote = voteCommandPort.getByIdOrThrow(command.postId()); @@ -53,4 +62,9 @@ public Long updateVote(VoteUpdateCommand command) { voteCommandPort.updateVote(vote); return command.roomId(); } + + private void validateRoom(Long command) { + Room room = roomCommandPort.getByIdOrThrow(command); + room.validateRoomExpired(); + } } diff --git a/src/main/java/konkuk/thip/roompost/application/service/VoteCreateService.java b/src/main/java/konkuk/thip/roompost/application/service/VoteCreateService.java index ce7cf3788..12991f796 100644 --- a/src/main/java/konkuk/thip/roompost/application/service/VoteCreateService.java +++ b/src/main/java/konkuk/thip/roompost/application/service/VoteCreateService.java @@ -55,6 +55,7 @@ public VoteCreateResult createVote(VoteCreateCommand command) { Room room = roomCommandPort.getByIdOrThrow(vote.getRoomId()); Book book = bookCommandPort.findById(room.getBookId()); validateVote(vote, book); + room.validateRoomExpired(); // 2. vote 저장 Long savedVoteId = voteCommandPort.saveVote(vote); diff --git a/src/main/java/konkuk/thip/roompost/application/service/policy/RoomPostLikeAccessPolicy.java b/src/main/java/konkuk/thip/roompost/application/service/policy/RoomPostLikeAccessPolicy.java index 5d75645aa..bc827de00 100644 --- a/src/main/java/konkuk/thip/roompost/application/service/policy/RoomPostLikeAccessPolicy.java +++ b/src/main/java/konkuk/thip/roompost/application/service/policy/RoomPostLikeAccessPolicy.java @@ -3,6 +3,7 @@ import konkuk.thip.post.application.service.policy.PostLikeAccessPolicy; import konkuk.thip.post.domain.CountUpdatable; import konkuk.thip.room.application.service.validator.RoomParticipantValidator; +import konkuk.thip.room.application.service.validator.RoomValidator; import konkuk.thip.roompost.domain.RoomPost; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @@ -12,10 +13,12 @@ public class RoomPostLikeAccessPolicy implements PostLikeAccessPolicy { private final RoomParticipantValidator roomParticipantValidator; + private final RoomValidator roomValidator; @Override public void validatePostLikeAccess(CountUpdatable post, Long userId) { RoomPost roomPost = (RoomPost) post; roomParticipantValidator.validateUserIsRoomMember(roomPost.getRoomId(), userId); + roomValidator.validateRoomExpired(roomPost.getRoomId()); } } \ No newline at end of file From 1d8a507b2340ceb0f005e423ba3bbd38a0ed16d0 Mon Sep 17 00:00:00 2001 From: janghyunjun Date: Fri, 12 Sep 2025 15:28:00 +0900 Subject: [PATCH 06/17] =?UTF-8?q?[refactor]=20RoomStatus=20=EB=8F=84?= =?UTF-8?q?=EC=9E=85=EC=97=90=20=EB=94=B0=EB=A5=B8=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?(#289)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../room/adapter/out/jpa/RoomJpaEntity.java | 3 + .../in/web/BookDetailSearchApiTest.java | 2 + .../in/web/BookRecruitingRoomApiTest.java | 6 +- .../thip/common/util/TestEntityFactory.java | 7 +- .../adapter/in/web/RoomCloseJoinApiTest.java | 5 +- .../in/web/RoomGetDeadlinePopularApiTest.java | 8 +- .../in/web/RoomGetHomeJoinedRoomsApiTest.java | 21 ++- .../web/RoomRecruitingDetailViewApiTest.java | 57 ++++---- .../adapter/in/web/RoomSearchApiTest.java | 101 ++++++++------ .../adapter/in/web/RoomShowMineApiTest.java | 124 +++++++++--------- .../in/web/RoomVerifyPasswordApiTest.java | 2 + .../konkuk/thip/room/domain/RoomTest.java | 7 +- 12 files changed, 197 insertions(+), 146 deletions(-) diff --git a/src/main/java/konkuk/thip/room/adapter/out/jpa/RoomJpaEntity.java b/src/main/java/konkuk/thip/room/adapter/out/jpa/RoomJpaEntity.java index 5865135fd..c5822ba89 100644 --- a/src/main/java/konkuk/thip/room/adapter/out/jpa/RoomJpaEntity.java +++ b/src/main/java/konkuk/thip/room/adapter/out/jpa/RoomJpaEntity.java @@ -100,4 +100,7 @@ public void updateIsPublic(boolean isPublic) { @VisibleForTesting public void updateRoomPercentage(double roomPercentage) {this.roomPercentage = roomPercentage;} + + @VisibleForTesting + public void updateRoomStatus(RoomStatus roomStatus) {this.roomStatus = roomStatus;} } diff --git a/src/test/java/konkuk/thip/book/adapter/in/web/BookDetailSearchApiTest.java b/src/test/java/konkuk/thip/book/adapter/in/web/BookDetailSearchApiTest.java index 0da7110b4..28fecf312 100644 --- a/src/test/java/konkuk/thip/book/adapter/in/web/BookDetailSearchApiTest.java +++ b/src/test/java/konkuk/thip/book/adapter/in/web/BookDetailSearchApiTest.java @@ -14,6 +14,7 @@ import konkuk.thip.book.adapter.out.jpa.SavedBookJpaEntity; import konkuk.thip.book.adapter.out.persistence.repository.SavedBookJpaRepository; import konkuk.thip.room.domain.value.Category; +import konkuk.thip.room.domain.value.RoomStatus; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.domain.value.UserRole; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; @@ -155,6 +156,7 @@ void searchDetailBooks_NoRecruitingRooms_ReturnsZero() { .roomPercentage(0.0) .startDate(LocalDate.now().minusDays(10)) .endDate(LocalDate.now().minusDays(5)) + .roomStatus(RoomStatus.IN_PROGRESS) .recruitCount(10) .bookJpaEntity(book) .category(Category.LITERATURE) diff --git a/src/test/java/konkuk/thip/book/adapter/in/web/BookRecruitingRoomApiTest.java b/src/test/java/konkuk/thip/book/adapter/in/web/BookRecruitingRoomApiTest.java index 93e0f5145..560eed86c 100644 --- a/src/test/java/konkuk/thip/book/adapter/in/web/BookRecruitingRoomApiTest.java +++ b/src/test/java/konkuk/thip/book/adapter/in/web/BookRecruitingRoomApiTest.java @@ -8,6 +8,7 @@ import konkuk.thip.room.adapter.out.jpa.RoomJpaEntity; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; import konkuk.thip.room.domain.value.Category; +import konkuk.thip.room.domain.value.RoomStatus; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.domain.value.UserRole; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; @@ -85,6 +86,7 @@ void getRecruitingRoomsByIsbn_success() throws Exception { .roomPercentage(0.0) .startDate(LocalDate.now().plusDays(1)) .endDate(LocalDate.now().plusDays(30)) + .roomStatus(RoomStatus.RECRUITING) .recruitCount(5) .bookJpaEntity(book) .category(category) @@ -97,6 +99,7 @@ void getRecruitingRoomsByIsbn_success() throws Exception { .roomPercentage(0.0) .startDate(LocalDate.now().minusDays(30)) .endDate(LocalDate.now().minusDays(1)) + .roomStatus(RoomStatus.IN_PROGRESS) .recruitCount(5) .bookJpaEntity(book) .category(category) @@ -139,7 +142,8 @@ void getRecruitingRoomsWithCursor_success() throws Exception { book, category, LocalDate.now().plusDays(i + 1), - LocalDate.now().plusDays(i + 2) + LocalDate.now().plusDays(i + 2), + RoomStatus.RECRUITING )); } diff --git a/src/test/java/konkuk/thip/common/util/TestEntityFactory.java b/src/test/java/konkuk/thip/common/util/TestEntityFactory.java index 27fb9b62a..5f165f1af 100644 --- a/src/test/java/konkuk/thip/common/util/TestEntityFactory.java +++ b/src/test/java/konkuk/thip/common/util/TestEntityFactory.java @@ -18,6 +18,7 @@ import konkuk.thip.room.adapter.out.jpa.RoomParticipantJpaEntity; import konkuk.thip.room.domain.value.RoomParticipantRole; import konkuk.thip.room.domain.value.Category; +import konkuk.thip.room.domain.value.RoomStatus; import konkuk.thip.roompost.adapter.out.jpa.*; import konkuk.thip.user.adapter.out.jpa.FollowingJpaEntity; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; @@ -143,7 +144,7 @@ public static RoomJpaEntity createRoom(BookJpaEntity book, Category category) { .build(); } - public static RoomJpaEntity createCustomRoom(BookJpaEntity book, Category category, LocalDate startDate, LocalDate endDate) { + public static RoomJpaEntity createCustomRoom(BookJpaEntity book, Category category, LocalDate startDate, LocalDate endDate, RoomStatus roomStatus) { return RoomJpaEntity.builder() .title("방이름") .description("설명") @@ -153,10 +154,11 @@ public static RoomJpaEntity createCustomRoom(BookJpaEntity book, Category catego .recruitCount(3) .bookJpaEntity(book) .category(category) + .roomStatus(roomStatus) .build(); } - public static RoomJpaEntity createCustomRoom(BookJpaEntity book, Category category, String roomName, LocalDate startDate, LocalDate endDate) { + public static RoomJpaEntity createCustomRoom(BookJpaEntity book, Category category, String roomName, LocalDate startDate, LocalDate endDate, RoomStatus roomStatus) { return RoomJpaEntity.builder() .title(roomName) .description("설명") @@ -166,6 +168,7 @@ public static RoomJpaEntity createCustomRoom(BookJpaEntity book, Category catego .recruitCount(20) .bookJpaEntity(book) .category(category) + .roomStatus(roomStatus) .build(); } diff --git a/src/test/java/konkuk/thip/room/adapter/in/web/RoomCloseJoinApiTest.java b/src/test/java/konkuk/thip/room/adapter/in/web/RoomCloseJoinApiTest.java index 2a399c451..12400aca5 100644 --- a/src/test/java/konkuk/thip/room/adapter/in/web/RoomCloseJoinApiTest.java +++ b/src/test/java/konkuk/thip/room/adapter/in/web/RoomCloseJoinApiTest.java @@ -9,6 +9,7 @@ import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; import konkuk.thip.room.domain.value.Category; +import konkuk.thip.room.domain.value.RoomStatus; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.domain.value.UserRole; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; @@ -138,9 +139,9 @@ void closeRoomRecruit_fail_not_host() throws Exception { @DisplayName("이미 시작된 방은 모집 마감 요청 시 실패") void closeRoomRecruit_fail_already_started() throws Exception { // startDate를 오늘로 설정해서 이미 시작된 상태로 만듦 - Field field = RoomJpaEntity.class.getDeclaredField("startDate"); + Field field = RoomJpaEntity.class.getDeclaredField("roomStatus"); field.setAccessible(true); - field.set(room, LocalDate.now()); + field.set(room, RoomStatus.IN_PROGRESS); roomJpaRepository.save(room); mockMvc.perform(post("/rooms/" + room.getRoomId() + "/close") diff --git a/src/test/java/konkuk/thip/room/adapter/in/web/RoomGetDeadlinePopularApiTest.java b/src/test/java/konkuk/thip/room/adapter/in/web/RoomGetDeadlinePopularApiTest.java index c3e1e72ad..d097c98b5 100644 --- a/src/test/java/konkuk/thip/room/adapter/in/web/RoomGetDeadlinePopularApiTest.java +++ b/src/test/java/konkuk/thip/room/adapter/in/web/RoomGetDeadlinePopularApiTest.java @@ -5,10 +5,11 @@ import konkuk.thip.common.util.DateUtil; import konkuk.thip.common.util.TestEntityFactory; import konkuk.thip.room.adapter.out.jpa.RoomJpaEntity; -import konkuk.thip.room.domain.value.RoomParticipantRole; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; import konkuk.thip.room.domain.value.Category; +import konkuk.thip.room.domain.value.RoomParticipantRole; +import konkuk.thip.room.domain.value.RoomStatus; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; import konkuk.thip.user.domain.value.Alias; @@ -74,6 +75,7 @@ void setUp() { RoomJpaEntity deadlineRoom = TestEntityFactory.createRoom(book, category); deadlineRoom.updateStartDate(today.plusDays(i + 1)); deadlineRoom.updateMemberCount(5); + deadlineRoom.updateRoomStatus(RoomStatus.RECRUITING); rooms.add(roomJpaRepository.save(deadlineRoom)); } @@ -81,6 +83,7 @@ void setUp() { RoomJpaEntity popularRoom = TestEntityFactory.createRoom(book, category); popularRoom.updateStartDate(today.plusDays(10 + i)); popularRoom.updateMemberCount(maxMemberCount - i); + popularRoom.updateRoomStatus(RoomStatus.RECRUITING); rooms.add(roomJpaRepository.save(popularRoom)); } @@ -88,17 +91,20 @@ void setUp() { RoomJpaEntity expiredRoom = TestEntityFactory.createRoom(book, category); expiredRoom.updateStartDate(today); expiredRoom.updateIsPublic(true); + expiredRoom.updateRoomStatus(RoomStatus.EXPIRED); roomJpaRepository.save(expiredRoom); // 비공개 방 (조건 불만족) privateRoom = TestEntityFactory.createRoom(book, category); privateRoom.updateStartDate(today.plusDays(2)); + privateRoom.updateRoomStatus(RoomStatus.RECRUITING); privateRoom.updateIsPublic(false); roomJpaRepository.save(privateRoom); // 내가 참여한 방 (조건 불만족) joinedRoom = TestEntityFactory.createRoom(book, category); joinedRoom.updateStartDate(today.plusDays(5)); + joinedRoom.updateRoomStatus(RoomStatus.RECRUITING); joinedRoom = roomJpaRepository.save(joinedRoom); participantJpaRepository.save( TestEntityFactory.createRoomParticipant(joinedRoom, currentUser, RoomParticipantRole.MEMBER, 0) diff --git a/src/test/java/konkuk/thip/room/adapter/in/web/RoomGetHomeJoinedRoomsApiTest.java b/src/test/java/konkuk/thip/room/adapter/in/web/RoomGetHomeJoinedRoomsApiTest.java index 1e30aa466..3ac9526f8 100644 --- a/src/test/java/konkuk/thip/room/adapter/in/web/RoomGetHomeJoinedRoomsApiTest.java +++ b/src/test/java/konkuk/thip/room/adapter/in/web/RoomGetHomeJoinedRoomsApiTest.java @@ -8,6 +8,7 @@ import konkuk.thip.room.domain.value.RoomParticipantRole; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; import konkuk.thip.room.domain.value.Category; +import konkuk.thip.room.domain.value.RoomStatus; import konkuk.thip.user.adapter.out.jpa.*; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; @@ -62,8 +63,13 @@ void setUp() { bookJpaRepository.save(book); category = TestEntityFactory.createLiteratureCategory(); - room1 = roomJpaRepository.save(TestEntityFactory.createRoom(book, category)); - room2 = roomJpaRepository.save(TestEntityFactory.createRoom(book, category)); + room1 = TestEntityFactory.createRoom(book, category); + room1.updateRoomStatus(RoomStatus.IN_PROGRESS); + roomJpaRepository.save(room1); + + room2 = TestEntityFactory.createRoom(book, category); + room2.updateRoomStatus(RoomStatus.IN_PROGRESS); + roomJpaRepository.save(room2); // 1번방에 유저 1이 호스트, 유저2가 멤버 roomParticipantJpaRepository.save(TestEntityFactory.createRoomParticipant(room1,user1, RoomParticipantRole.HOST, 80.0)); @@ -161,15 +167,15 @@ void getHomeJoinedRooms_sortByStartDateWhenUserPercentageEquals() throws Excepti // 방1: 시작일 오늘-2 RoomJpaEntity room1 = roomJpaRepository.save( - TestEntityFactory.createCustomRoom(book, category, LocalDate.now().minusDays(2), LocalDate.now().plusDays(10)) + TestEntityFactory.createCustomRoom(book, category, LocalDate.now().minusDays(2), LocalDate.now().plusDays(10), RoomStatus.IN_PROGRESS) ); // 방2: 시작일 오늘-1 RoomJpaEntity room2 = roomJpaRepository.save( - TestEntityFactory.createCustomRoom(book, category, LocalDate.now().minusDays(1), LocalDate.now().plusDays(8)) + TestEntityFactory.createCustomRoom(book, category, LocalDate.now().minusDays(1), LocalDate.now().plusDays(8), RoomStatus.IN_PROGRESS) ); // 방3: 시작일 오늘 RoomJpaEntity room3 = roomJpaRepository.save( - TestEntityFactory.createCustomRoom(book, category, LocalDate.now(), LocalDate.now().plusDays(9)) + TestEntityFactory.createCustomRoom(book, category, LocalDate.now(), LocalDate.now().plusDays(9), RoomStatus.IN_PROGRESS) ); // 모두 동일한 진행률(70%)로 참여 @@ -208,11 +214,11 @@ void getHomeJoinedRooms_excludeRecruitingRooms() throws Exception { // 모집중(시작일 미래) RoomJpaEntity recruitRoom = roomJpaRepository.save( - TestEntityFactory.createCustomRoom(book, category, LocalDate.now().plusDays(2), LocalDate.now().plusDays(5)) + TestEntityFactory.createCustomRoom(book, category, LocalDate.now().plusDays(2), LocalDate.now().plusDays(5), RoomStatus.RECRUITING) ); // 활동중(시작일 오늘-1, 종료일 오늘+2) RoomJpaEntity activeRoom = roomJpaRepository.save( - TestEntityFactory.createCustomRoom(book, category, LocalDate.now().minusDays(1), LocalDate.now().plusDays(2)) + TestEntityFactory.createCustomRoom(book, category, LocalDate.now().minusDays(1), LocalDate.now().plusDays(2), RoomStatus.IN_PROGRESS) ); roomParticipantJpaRepository.save(TestEntityFactory.createRoomParticipant(recruitRoom, newUser, RoomParticipantRole.MEMBER, 20.0)); @@ -267,6 +273,7 @@ void getHomeJoinedRooms_page_1() throws Exception { LocalDate end = LocalDate.now().plusDays(30); RoomJpaEntity room = saveScienceRoom("모집중인방-책-" + (i + 1), isbn, title, start, end, 10); + room.updateRoomStatus(RoomStatus.IN_PROGRESS); changeRoomMemberCount(room, 8); double userPercentage = 89.6 - i; // 진행률은 방번호가 작을수록 높음 diff --git a/src/test/java/konkuk/thip/room/adapter/in/web/RoomRecruitingDetailViewApiTest.java b/src/test/java/konkuk/thip/room/adapter/in/web/RoomRecruitingDetailViewApiTest.java index 0e11daa9b..ee37cbf18 100644 --- a/src/test/java/konkuk/thip/room/adapter/in/web/RoomRecruitingDetailViewApiTest.java +++ b/src/test/java/konkuk/thip/room/adapter/in/web/RoomRecruitingDetailViewApiTest.java @@ -6,12 +6,13 @@ import konkuk.thip.common.util.TestEntityFactory; import konkuk.thip.room.adapter.out.jpa.RoomJpaEntity; import konkuk.thip.room.adapter.out.jpa.RoomParticipantJpaEntity; -import konkuk.thip.room.domain.value.RoomParticipantRole; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; +import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; import konkuk.thip.room.domain.value.Category; -import konkuk.thip.user.adapter.out.jpa.*; +import konkuk.thip.room.domain.value.RoomParticipantRole; +import konkuk.thip.room.domain.value.RoomStatus; +import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; import konkuk.thip.user.domain.value.Alias; import konkuk.thip.user.domain.value.UserRole; import org.junit.jupiter.api.AfterEach; @@ -53,7 +54,7 @@ void tearDown() { userJpaRepository.deleteAll(); } - private RoomJpaEntity saveScienceRoom(String bookTitle, String isbn, String roomName, LocalDate startDate, int recruitCount) { + private RoomJpaEntity saveScienceRoom(String bookTitle, String isbn, String roomName, LocalDate startDate, int recruitCount, RoomStatus roomStatus) { Alias alias = TestEntityFactory.createScienceAlias(); BookJpaEntity book = bookJpaRepository.save(BookJpaEntity.builder() @@ -79,10 +80,11 @@ private RoomJpaEntity saveScienceRoom(String bookTitle, String isbn, String room .recruitCount(recruitCount) .bookJpaEntity(book) .category(category) + .roomStatus(roomStatus) .build()); } - private RoomJpaEntity saveLiteratureRoom(String bookTitle, String isbn, String roomName, LocalDate startDate, int recruitCount) { + private RoomJpaEntity saveLiteratureRoom(String bookTitle, String isbn, String roomName, LocalDate startDate, int recruitCount, RoomStatus roomStatus) { Alias alias = TestEntityFactory.createLiteratureAlias(); BookJpaEntity book = bookJpaRepository.save(BookJpaEntity.builder() @@ -108,6 +110,7 @@ private RoomJpaEntity saveLiteratureRoom(String bookTitle, String isbn, String r .recruitCount(recruitCount) .bookJpaEntity(book) .category(category) + .roomStatus(roomStatus) .build()); } @@ -143,23 +146,23 @@ private void saveUsersToRoom(RoomJpaEntity roomJpaEntity, int count) { @DisplayName("모집중인 모임방 상세조회할 경우, 해당 모임방의 정보, 책 정보, 추천할 모임방의 정보를 반환한다.") void get_recruiting_room_detail() throws Exception { //given - RoomJpaEntity targetRoom = saveScienceRoom("과학-책", "isbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), 10); + RoomJpaEntity targetRoom = saveScienceRoom("과학-책", "isbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), 10, RoomStatus.RECRUITING); saveUsersToRoom(targetRoom, 4); UserJpaEntity joiningUser = roomParticipantJpaRepository.findAllByRoomId(targetRoom.getRoomId()).get(1).getUserJpaEntity(); - RoomJpaEntity science_room_2 = saveScienceRoom("과학-책", "isbn2", "방이름입니다", LocalDate.now().plusDays(1), 10); + RoomJpaEntity science_room_2 = saveScienceRoom("과학-책", "isbn2", "방이름입니다", LocalDate.now().plusDays(1), 10, RoomStatus.RECRUITING); saveUsersToRoom(science_room_2, 5); - RoomJpaEntity science_room_3 = saveScienceRoom("과학-책", "isbn3", "무슨방일까요??", LocalDate.now().plusDays(5), 8); + RoomJpaEntity science_room_3 = saveScienceRoom("과학-책", "isbn3", "무슨방일까요??", LocalDate.now().plusDays(5), 8, RoomStatus.RECRUITING); saveUsersToRoom(science_room_3, 2); - RoomJpaEntity science_room_4 = saveScienceRoom("과학-책", "isbn4", "과학-방-8일뒤-활동시작", LocalDate.now().plusDays(8), 8); + RoomJpaEntity science_room_4 = saveScienceRoom("과학-책", "isbn4", "과학-방-8일뒤-활동시작", LocalDate.now().plusDays(8), 8, RoomStatus.RECRUITING); saveUsersToRoom(science_room_4, 1); - RoomJpaEntity room_3 = saveLiteratureRoom("문학-책", "isbn5", "방제목에-과학-포함된-문학방", LocalDate.now().plusDays(10), 8); + RoomJpaEntity room_3 = saveLiteratureRoom("문학-책", "isbn5", "방제목에-과학-포함된-문학방", LocalDate.now().plusDays(10), 8, RoomStatus.RECRUITING); saveUsersToRoom(room_3, 6); - RoomJpaEntity recruit_expired_room_4 = saveScienceRoom("과학-책", "isbn6", "모집기한-지난-과학방", LocalDate.now().minusDays(1), 8); + RoomJpaEntity recruit_expired_room_4 = saveScienceRoom("과학-책", "isbn6", "모집기한-지난-과학방", LocalDate.now().minusDays(1), 8, RoomStatus.IN_PROGRESS); saveUsersToRoom(recruit_expired_room_4, 6); //when @@ -191,7 +194,7 @@ void get_recruiting_room_detail() throws Exception { @DisplayName("모임방의 호스트가 조회할 경우, 유저가 해당 방의 호스트임을 응답값으로 보여준다. (나머지 응답값은 동일)") void get_recruiting_room_detail_host() throws Exception { //given - RoomJpaEntity targetRoom = saveScienceRoom("과학-책", "isbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), 10); + RoomJpaEntity targetRoom = saveScienceRoom("과학-책", "isbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), 10, RoomStatus.RECRUITING); saveUsersToRoom(targetRoom, 4); RoomParticipantJpaEntity firstMember = roomParticipantJpaRepository.findAllByRoomId(targetRoom.getRoomId()).get(1); roomParticipantJpaRepository.delete(firstMember); @@ -201,19 +204,19 @@ void get_recruiting_room_detail_host() throws Exception { .roomParticipantRole(RoomParticipantRole.HOST) .build()); // firstMember 을 MEMBER -> HOST 로 수정 - RoomJpaEntity science_room_2 = saveScienceRoom("과학-책", "isbn2", "방이름입니다", LocalDate.now().plusDays(1), 10); + RoomJpaEntity science_room_2 = saveScienceRoom("과학-책", "isbn2", "방이름입니다", LocalDate.now().plusDays(1), 10, RoomStatus.RECRUITING); saveUsersToRoom(science_room_2, 5); - RoomJpaEntity science_room_3 = saveScienceRoom("과학-책", "isbn3", "무슨방일까요??", LocalDate.now().plusDays(5), 8); + RoomJpaEntity science_room_3 = saveScienceRoom("과학-책", "isbn3", "무슨방일까요??", LocalDate.now().plusDays(5), 8, RoomStatus.RECRUITING); saveUsersToRoom(science_room_3, 2); - RoomJpaEntity science_room_4 = saveScienceRoom("과학-책", "isbn4", "과학-방-8일뒤-활동시작", LocalDate.now().plusDays(8), 8); + RoomJpaEntity science_room_4 = saveScienceRoom("과학-책", "isbn4", "과학-방-8일뒤-활동시작", LocalDate.now().plusDays(8), 8, RoomStatus.RECRUITING); saveUsersToRoom(science_room_4, 1); - RoomJpaEntity room_3 = saveLiteratureRoom("문학-책", "isbn5", "방제목에-과학-포함된-문학방", LocalDate.now().plusDays(10), 8); + RoomJpaEntity room_3 = saveLiteratureRoom("문학-책", "isbn5", "방제목에-과학-포함된-문학방", LocalDate.now().plusDays(10), 8, RoomStatus.RECRUITING); saveUsersToRoom(room_3, 6); - RoomJpaEntity recruit_expired_room_4 = saveScienceRoom("과학-책", "isbn6", "모집기한-지난-과학방", LocalDate.now().minusDays(1), 8); + RoomJpaEntity recruit_expired_room_4 = saveScienceRoom("과학-책", "isbn6", "모집기한-지난-과학방", LocalDate.now().minusDays(1), 8, RoomStatus.IN_PROGRESS); saveUsersToRoom(recruit_expired_room_4, 6); //when @@ -244,26 +247,26 @@ void get_recruiting_room_detail_host() throws Exception { @DisplayName("추천하는 다른 모집중인 모임방이 많을 경우, 모집 기한 마감임박 순으로 최대 5개만 반환한다.") void get_recruiting_room_detail_too_many_recommend_rooms() throws Exception { //given - RoomJpaEntity targetRoom = saveScienceRoom("과학-책", "isbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), 10); + RoomJpaEntity targetRoom = saveScienceRoom("과학-책", "isbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), 10, RoomStatus.RECRUITING); saveUsersToRoom(targetRoom, 4); UserJpaEntity joiningUser = roomParticipantJpaRepository.findAllByRoomId(targetRoom.getRoomId()).get(1).getUserJpaEntity(); - RoomJpaEntity science_room_2 = saveScienceRoom("과학-책", "isbn2", "방이름입니다", LocalDate.now().plusDays(1), 10); + RoomJpaEntity science_room_2 = saveScienceRoom("과학-책", "isbn2", "방이름입니다", LocalDate.now().plusDays(1), 10, RoomStatus.RECRUITING); saveUsersToRoom(science_room_2, 5); - RoomJpaEntity science_room_3 = saveScienceRoom("과학-책", "isbn3", "무슨방일까요??", LocalDate.now().plusDays(5), 8); + RoomJpaEntity science_room_3 = saveScienceRoom("과학-책", "isbn3", "무슨방일까요??", LocalDate.now().plusDays(5), 8, RoomStatus.RECRUITING); saveUsersToRoom(science_room_3, 2); - RoomJpaEntity science_room_4 = saveScienceRoom("과학-책", "isbn4", "과학-방-8일뒤-활동시작", LocalDate.now().plusDays(8), 8); + RoomJpaEntity science_room_4 = saveScienceRoom("과학-책", "isbn4", "과학-방-8일뒤-활동시작", LocalDate.now().plusDays(8), 8, RoomStatus.RECRUITING); saveUsersToRoom(science_room_4, 1); - RoomJpaEntity science_room_5 = saveScienceRoom("과학-책", "isbn5", "과학-방-10일뒤-활동시작", LocalDate.now().plusDays(10), 8); + RoomJpaEntity science_room_5 = saveScienceRoom("과학-책", "isbn5", "과학-방-10일뒤-활동시작", LocalDate.now().plusDays(10), 8, RoomStatus.RECRUITING); saveUsersToRoom(science_room_5, 1); - RoomJpaEntity science_room_6 = saveScienceRoom("과학-책", "isbn6", "과학-방-15일뒤-활동시작", LocalDate.now().plusDays(15), 8); + RoomJpaEntity science_room_6 = saveScienceRoom("과학-책", "isbn6", "과학-방-15일뒤-활동시작", LocalDate.now().plusDays(15), 8, RoomStatus.RECRUITING); saveUsersToRoom(science_room_6, 1); - RoomJpaEntity science_room_7 = saveScienceRoom("과학-책", "isbn7", "과학-방-20일뒤-활동시작", LocalDate.now().plusDays(20), 8); + RoomJpaEntity science_room_7 = saveScienceRoom("과학-책", "isbn7", "과학-방-20일뒤-활동시작", LocalDate.now().plusDays(20), 8, RoomStatus.RECRUITING); saveUsersToRoom(science_room_7, 1); //when @@ -296,14 +299,14 @@ void get_recruiting_room_detail_too_many_recommend_rooms() throws Exception { @DisplayName("추천하는 다른 모집중인 모임방이 없을 경우, 해당 데이터를 빈 배열로 반환한다.") void get_recruiting_room_detail_no_recommend_rooms() throws Exception { //given - RoomJpaEntity targetRoom = saveScienceRoom("과학-책", "isbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), 10); + RoomJpaEntity targetRoom = saveScienceRoom("과학-책", "isbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), 10, RoomStatus.RECRUITING); saveUsersToRoom(targetRoom, 4); UserJpaEntity joiningUser = roomParticipantJpaRepository.findAllByRoomId(targetRoom.getRoomId()).get(1).getUserJpaEntity(); - RoomJpaEntity room_3 = saveLiteratureRoom("문학-책", "isbn5", "방제목에-과학-포함된-문학방", LocalDate.now().plusDays(10), 8); + RoomJpaEntity room_3 = saveLiteratureRoom("문학-책", "isbn5", "방제목에-과학-포함된-문학방", LocalDate.now().plusDays(10), 8, RoomStatus.RECRUITING); saveUsersToRoom(room_3, 6); - RoomJpaEntity recruit_expired_room_4 = saveScienceRoom("과학-책", "isbn6", "모집기한-지난-과학방", LocalDate.now().minusDays(1), 8); + RoomJpaEntity recruit_expired_room_4 = saveScienceRoom("과학-책", "isbn6", "모집기한-지난-과학방", LocalDate.now().minusDays(1), 8, RoomStatus.IN_PROGRESS); saveUsersToRoom(recruit_expired_room_4, 6); //when diff --git a/src/test/java/konkuk/thip/room/adapter/in/web/RoomSearchApiTest.java b/src/test/java/konkuk/thip/room/adapter/in/web/RoomSearchApiTest.java index 70b16969d..0a45f740f 100644 --- a/src/test/java/konkuk/thip/room/adapter/in/web/RoomSearchApiTest.java +++ b/src/test/java/konkuk/thip/room/adapter/in/web/RoomSearchApiTest.java @@ -8,10 +8,11 @@ import konkuk.thip.recentSearch.adapter.out.persistence.repository.RecentSearchJpaRepository; import konkuk.thip.room.adapter.out.jpa.RoomJpaEntity; import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; +import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; import konkuk.thip.room.domain.value.Category; -import konkuk.thip.user.adapter.out.jpa.*; +import konkuk.thip.room.domain.value.RoomStatus; +import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; -import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; import konkuk.thip.user.domain.value.Alias; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; @@ -56,18 +57,32 @@ void tearDown() { userJpaRepository.deleteAllInBatch(); } - private RoomJpaEntity saveScienceRoom(String bookTitle, String roomName, LocalDate startDate, LocalDate endDate) { + private RoomJpaEntity saveScienceRecruitingRoom(String bookTitle, String roomName, LocalDate startDate, LocalDate endDate) { + BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBookWithBookTitle(bookTitle)); + + Category category = TestEntityFactory.createScienceCategory(); + return roomJpaRepository.save(TestEntityFactory.createCustomRoom(book, category, roomName, startDate, endDate, RoomStatus.RECRUITING)); + } + + private RoomJpaEntity saveScienceProgressRoom(String bookTitle, String roomName, LocalDate startDate, LocalDate endDate) { BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBookWithBookTitle(bookTitle)); Category category = TestEntityFactory.createScienceCategory(); - return roomJpaRepository.save(TestEntityFactory.createCustomRoom(book, category, roomName, startDate, endDate)); + return roomJpaRepository.save(TestEntityFactory.createCustomRoom(book, category, roomName, startDate, endDate, RoomStatus.IN_PROGRESS)); + } + + private RoomJpaEntity saveLiteratureRecruitingRoom(String bookTitle, String roomName, LocalDate startDate, LocalDate endDate) { + BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBookWithBookTitle(bookTitle)); + + Category category = TestEntityFactory.createLiteratureCategory(); + return roomJpaRepository.save(TestEntityFactory.createCustomRoom(book, category, roomName, startDate, endDate, RoomStatus.RECRUITING)); } - private RoomJpaEntity saveLiteratureRoom(String bookTitle, String roomName, LocalDate startDate, LocalDate endDate) { + private RoomJpaEntity saveLiteratureProgressRoom(String bookTitle, String roomName, LocalDate startDate, LocalDate endDate) { BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBookWithBookTitle(bookTitle)); Category category = TestEntityFactory.createLiteratureCategory(); - return roomJpaRepository.save(TestEntityFactory.createCustomRoom(book, category, roomName, startDate, endDate)); + return roomJpaRepository.save(TestEntityFactory.createCustomRoom(book, category, roomName, startDate, endDate, RoomStatus.IN_PROGRESS)); } private void updateRoomMemberCount(RoomJpaEntity roomJpaEntity, int count) { @@ -81,22 +96,22 @@ private void updateRoomMemberCount(RoomJpaEntity roomJpaEntity, int count) { @DisplayName("keyword = [과학], 카테고리 선택 X, 정렬 = [마감임박순] 일 경우, 방이름 or 책제목에 '과학'이 포함된 모집중인 방 검색 결과가 마감임박순으로 반환된다.") void search_keyword_and_sort_deadline() throws Exception { //given - RoomJpaEntity science_room_1 = saveScienceRoom("과학-책", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), LocalDate.now().plusDays(30)); + RoomJpaEntity science_room_1 = saveScienceRecruitingRoom("과학-책", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), LocalDate.now().plusDays(30)); updateRoomMemberCount(science_room_1, 4); - RoomJpaEntity science_room_2 = saveScienceRoom("과학-책", "방이름입니다", LocalDate.now().plusDays(2), LocalDate.now().plusDays(30)); + RoomJpaEntity science_room_2 = saveScienceRecruitingRoom("과학-책", "방이름입니다", LocalDate.now().plusDays(2), LocalDate.now().plusDays(30)); updateRoomMemberCount(science_room_2, 5); - RoomJpaEntity science_room_3 = saveScienceRoom("과학-책", "무슨방일까요??", LocalDate.now().plusDays(3), LocalDate.now().plusDays(30)); + RoomJpaEntity science_room_3 = saveScienceRecruitingRoom("과학-책", "무슨방일까요??", LocalDate.now().plusDays(3), LocalDate.now().plusDays(30)); updateRoomMemberCount(science_room_3, 2); - RoomJpaEntity science_room_4 = saveScienceRoom("과학-책", "과학-방-5일뒤-활동시작", LocalDate.now().plusDays(5), LocalDate.now().plusDays(30)); + RoomJpaEntity science_room_4 = saveScienceRecruitingRoom("과학-책", "과학-방-5일뒤-활동시작", LocalDate.now().plusDays(5), LocalDate.now().plusDays(30)); updateRoomMemberCount(science_room_4, 1); - RoomJpaEntity room_3 = saveLiteratureRoom("문학-책", "방제목에-과학-포함된-문학방", LocalDate.now().plusDays(10), LocalDate.now().plusDays(30)); + RoomJpaEntity room_3 = saveLiteratureRecruitingRoom("문학-책", "방제목에-과학-포함된-문학방", LocalDate.now().plusDays(10), LocalDate.now().plusDays(30)); updateRoomMemberCount(room_3, 6); - RoomJpaEntity recruit_expired_room_4 = saveScienceRoom("과학-책", "모집기한-지난-과학방", LocalDate.now().minusDays(1), LocalDate.now().plusDays(30)); + RoomJpaEntity recruit_expired_room_4 = saveScienceProgressRoom("과학-책", "모집기한-지난-과학방", LocalDate.now().minusDays(1), LocalDate.now().plusDays(30)); updateRoomMemberCount(recruit_expired_room_4, 6); //when @@ -127,22 +142,22 @@ void search_keyword_and_sort_deadline() throws Exception { @DisplayName("keyword = [과학], 카테고리 선택 X, 정렬 = [인기순] 일 경우, 방이름 or 책제목에 '과학'이 포함된 모집중인 방 검색 결과가 인기순(= 현재까지 모집된 인원 많은 순)으로 반환된다.") void search_keyword_and_sort_member_count() throws Exception { //given - RoomJpaEntity science_room_1 = saveScienceRoom("과학-책", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), LocalDate.now().plusDays(30)); + RoomJpaEntity science_room_1 = saveScienceRecruitingRoom("과학-책", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), LocalDate.now().plusDays(30)); updateRoomMemberCount(science_room_1, 4); - RoomJpaEntity science_room_2 = saveScienceRoom("과학-책", "방이름입니다", LocalDate.now().plusDays(2), LocalDate.now().plusDays(30)); + RoomJpaEntity science_room_2 = saveScienceRecruitingRoom("과학-책", "방이름입니다", LocalDate.now().plusDays(2), LocalDate.now().plusDays(30)); updateRoomMemberCount(science_room_2, 5); - RoomJpaEntity science_room_3 = saveScienceRoom("과학-책", "무슨방일까요??", LocalDate.now().plusDays(3), LocalDate.now().plusDays(30)); + RoomJpaEntity science_room_3 = saveScienceRecruitingRoom("과학-책", "무슨방일까요??", LocalDate.now().plusDays(3), LocalDate.now().plusDays(30)); updateRoomMemberCount(science_room_3, 2); - RoomJpaEntity science_room_4 = saveScienceRoom("과학-책", "과학-방-5일뒤-활동시작", LocalDate.now().plusDays(5), LocalDate.now().plusDays(30)); + RoomJpaEntity science_room_4 = saveScienceRecruitingRoom("과학-책", "과학-방-5일뒤-활동시작", LocalDate.now().plusDays(5), LocalDate.now().plusDays(30)); updateRoomMemberCount(science_room_4, 1); - RoomJpaEntity room_3 = saveLiteratureRoom("문학-책", "방제목에-과학-포함된-문학방", LocalDate.now().plusDays(10), LocalDate.now().plusDays(30)); + RoomJpaEntity room_3 = saveLiteratureRecruitingRoom("문학-책", "방제목에-과학-포함된-문학방", LocalDate.now().plusDays(10), LocalDate.now().plusDays(30)); updateRoomMemberCount(room_3, 6); - RoomJpaEntity recruit_expired_room_4 = saveScienceRoom("과학-책", "모집기한-지난-과학방", LocalDate.now().minusDays(1), LocalDate.now().plusDays(30)); + RoomJpaEntity recruit_expired_room_4 = saveScienceProgressRoom("과학-책", "모집기한-지난-과학방", LocalDate.now().minusDays(1), LocalDate.now().plusDays(30)); updateRoomMemberCount(recruit_expired_room_4, 6); //when @@ -182,16 +197,16 @@ void search_keyword_and_sort_member_count() throws Exception { @DisplayName("keyword 입력 x, 카테고리 = [과학/IT], 정렬 = [마감임박순] 일 경우, [과학/IT] 카테고리에 속하는 방 검색 결과가 반환된다.") void search_category_and_sort_deadline() throws Exception { //given - RoomJpaEntity science_room_1 = saveScienceRoom("과학-책", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), LocalDate.now().plusDays(30)); + RoomJpaEntity science_room_1 = saveScienceRecruitingRoom("과학-책", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), LocalDate.now().plusDays(30)); updateRoomMemberCount(science_room_1, 4); - RoomJpaEntity science_room_3 = saveScienceRoom("과학-책", "무슨방일까요??", LocalDate.now().plusDays(3), LocalDate.now().plusDays(30)); + RoomJpaEntity science_room_3 = saveScienceRecruitingRoom("과학-책", "무슨방일까요??", LocalDate.now().plusDays(3), LocalDate.now().plusDays(30)); updateRoomMemberCount(science_room_3, 2); - RoomJpaEntity room_3 = saveLiteratureRoom("문학-책", "방제목에-과학-포함된-문학방", LocalDate.now().plusDays(10), LocalDate.now().plusDays(30)); + RoomJpaEntity room_3 = saveLiteratureRecruitingRoom("문학-책", "방제목에-과학-포함된-문학방", LocalDate.now().plusDays(10), LocalDate.now().plusDays(30)); updateRoomMemberCount(room_3, 6); - RoomJpaEntity recruit_expired_room_4 = saveScienceRoom("과학-책", "모집기한-지난-과학방", LocalDate.now().minusDays(1), LocalDate.now().plusDays(30)); + RoomJpaEntity recruit_expired_room_4 = saveScienceProgressRoom("과학-책", "모집기한-지난-과학방", LocalDate.now().minusDays(1), LocalDate.now().plusDays(30)); updateRoomMemberCount(recruit_expired_room_4, 6); //when @@ -219,16 +234,16 @@ void search_category_and_sort_deadline() throws Exception { @DisplayName("keyword 입력 x, 카테고리 입력 x, 정렬 = [마감임박순] 일 경우, DB에 존재하는 전체 방 검색 결과가 반환된다.") void search_sort_deadline() throws Exception { //given - RoomJpaEntity science_room_1 = saveScienceRoom("과학-책", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), LocalDate.now().plusDays(30)); + RoomJpaEntity science_room_1 = saveScienceRecruitingRoom("과학-책", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), LocalDate.now().plusDays(30)); updateRoomMemberCount(science_room_1, 4); - RoomJpaEntity science_room_3 = saveScienceRoom("과학-책", "무슨방일까요??", LocalDate.now().plusDays(3), LocalDate.now().plusDays(30)); + RoomJpaEntity science_room_3 = saveScienceRecruitingRoom("과학-책", "무슨방일까요??", LocalDate.now().plusDays(3), LocalDate.now().plusDays(30)); updateRoomMemberCount(science_room_3, 2); - RoomJpaEntity room_3 = saveLiteratureRoom("문학-책", "방제목에-과학-포함된-문학방", LocalDate.now().plusDays(10), LocalDate.now().plusDays(30)); + RoomJpaEntity room_3 = saveLiteratureRecruitingRoom("문학-책", "방제목에-과학-포함된-문학방", LocalDate.now().plusDays(10), LocalDate.now().plusDays(30)); updateRoomMemberCount(room_3, 6); - RoomJpaEntity recruit_expired_room_4 = saveScienceRoom("과학-책", "모집기한-지난-과학방", LocalDate.now().minusDays(1), LocalDate.now().plusDays(30)); + RoomJpaEntity recruit_expired_room_4 = saveScienceProgressRoom("과학-책", "모집기한-지난-과학방", LocalDate.now().minusDays(1), LocalDate.now().plusDays(30)); updateRoomMemberCount(recruit_expired_room_4, 6); //when @@ -256,16 +271,16 @@ void search_sort_deadline() throws Exception { @DisplayName("keyword=[과학], category=[과학/IT], 정렬=[마감임박순] 일 경우, keyword, category 조건을 모두 만족하는 방만 반환된다.") void search_keyword_and_category() throws Exception { // given - RoomJpaEntity science_room_1 = saveScienceRoom("과학-책", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), LocalDate.now().plusDays(30)); + RoomJpaEntity science_room_1 = saveScienceRecruitingRoom("과학-책", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), LocalDate.now().plusDays(30)); updateRoomMemberCount(science_room_1, 4); - RoomJpaEntity science_room_3 = saveScienceRoom("과학-책", "무슨방일까요??", LocalDate.now().plusDays(3), LocalDate.now().plusDays(30)); + RoomJpaEntity science_room_3 = saveScienceRecruitingRoom("과학-책", "무슨방일까요??", LocalDate.now().plusDays(3), LocalDate.now().plusDays(30)); updateRoomMemberCount(science_room_3, 2); - RoomJpaEntity room_3 = saveLiteratureRoom("문학-책", "방제목에-과학-포함된-문학방", LocalDate.now().plusDays(10), LocalDate.now().plusDays(30)); + RoomJpaEntity room_3 = saveLiteratureRecruitingRoom("문학-책", "방제목에-과학-포함된-문학방", LocalDate.now().plusDays(10), LocalDate.now().plusDays(30)); updateRoomMemberCount(room_3, 6); - RoomJpaEntity recruit_expired_room_4 = saveScienceRoom("과학-책", "모집기한-지난-과학방", LocalDate.now().minusDays(1), LocalDate.now().plusDays(30)); + RoomJpaEntity recruit_expired_room_4 = saveScienceProgressRoom("과학-책", "모집기한-지난-과학방", LocalDate.now().minusDays(1), LocalDate.now().plusDays(30)); updateRoomMemberCount(recruit_expired_room_4, 6); // when @@ -296,7 +311,7 @@ void search_keyword_saved() throws Exception { // given Alias aliasJpa = TestEntityFactory.createScienceAlias(); UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(aliasJpa)); - RoomJpaEntity science_room_1 = saveScienceRoom("과학-책", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), LocalDate.now().plusDays(30)); + RoomJpaEntity science_room_1 = saveScienceRecruitingRoom("과학-책", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), LocalDate.now().plusDays(30)); updateRoomMemberCount(science_room_1, 4); // when @@ -327,18 +342,18 @@ void search_keyword_saved() throws Exception { @DisplayName("검색결과에 해당하는 방이 많은 경우, 정렬 조건 기준으로 페이징 처리한다.") void comment_show_all_page_test() throws Exception { //given - RoomJpaEntity science_room_1 = saveScienceRoom("과학-책", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), LocalDate.now().plusDays(30)); - RoomJpaEntity science_room_2 = saveScienceRoom("과학-책", "과학-방-2일뒤-활동시작", LocalDate.now().plusDays(2), LocalDate.now().plusDays(30)); - RoomJpaEntity science_room_3 = saveScienceRoom("과학-책", "과학-방-3일뒤-활동시작", LocalDate.now().plusDays(3), LocalDate.now().plusDays(30)); - RoomJpaEntity science_room_4 = saveScienceRoom("과학-책", "과학-방-4일뒤-활동시작", LocalDate.now().plusDays(4), LocalDate.now().plusDays(30)); - RoomJpaEntity science_room_5 = saveScienceRoom("과학-책", "과학-방-5일뒤-활동시작", LocalDate.now().plusDays(5), LocalDate.now().plusDays(30)); - RoomJpaEntity science_room_6 = saveScienceRoom("과학-책", "과학-방-6일뒤-활동시작", LocalDate.now().plusDays(6), LocalDate.now().plusDays(30)); - RoomJpaEntity science_room_7 = saveScienceRoom("과학-책", "과학-방-7일뒤-활동시작", LocalDate.now().plusDays(7), LocalDate.now().plusDays(30)); - RoomJpaEntity science_room_8 = saveScienceRoom("과학-책", "과학-방-8일뒤-활동시작", LocalDate.now().plusDays(8), LocalDate.now().plusDays(30)); - RoomJpaEntity science_room_9 = saveScienceRoom("과학-책", "과학-방-9일뒤-활동시작", LocalDate.now().plusDays(9), LocalDate.now().plusDays(30)); - RoomJpaEntity science_room_10 = saveScienceRoom("과학-책", "과학-방-10일뒤-활동시작", LocalDate.now().plusDays(10), LocalDate.now().plusDays(30)); - RoomJpaEntity science_room_11 = saveScienceRoom("과학-책", "과학-방-11일뒤-활동시작", LocalDate.now().plusDays(11), LocalDate.now().plusDays(30)); - RoomJpaEntity science_room_12 = saveScienceRoom("과학-책", "과학-방-12일뒤-활동시작", LocalDate.now().plusDays(12), LocalDate.now().plusDays(30)); + RoomJpaEntity science_room_1 = saveScienceRecruitingRoom("과학-책", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), LocalDate.now().plusDays(30)); + RoomJpaEntity science_room_2 = saveScienceRecruitingRoom("과학-책", "과학-방-2일뒤-활동시작", LocalDate.now().plusDays(2), LocalDate.now().plusDays(30)); + RoomJpaEntity science_room_3 = saveScienceRecruitingRoom("과학-책", "과학-방-3일뒤-활동시작", LocalDate.now().plusDays(3), LocalDate.now().plusDays(30)); + RoomJpaEntity science_room_4 = saveScienceRecruitingRoom("과학-책", "과학-방-4일뒤-활동시작", LocalDate.now().plusDays(4), LocalDate.now().plusDays(30)); + RoomJpaEntity science_room_5 = saveScienceRecruitingRoom("과학-책", "과학-방-5일뒤-활동시작", LocalDate.now().plusDays(5), LocalDate.now().plusDays(30)); + RoomJpaEntity science_room_6 = saveScienceRecruitingRoom("과학-책", "과학-방-6일뒤-활동시작", LocalDate.now().plusDays(6), LocalDate.now().plusDays(30)); + RoomJpaEntity science_room_7 = saveScienceRecruitingRoom("과학-책", "과학-방-7일뒤-활동시작", LocalDate.now().plusDays(7), LocalDate.now().plusDays(30)); + RoomJpaEntity science_room_8 = saveScienceRecruitingRoom("과학-책", "과학-방-8일뒤-활동시작", LocalDate.now().plusDays(8), LocalDate.now().plusDays(30)); + RoomJpaEntity science_room_9 = saveScienceRecruitingRoom("과학-책", "과학-방-9일뒤-활동시작", LocalDate.now().plusDays(9), LocalDate.now().plusDays(30)); + RoomJpaEntity science_room_10 = saveScienceRecruitingRoom("과학-책", "과학-방-10일뒤-활동시작", LocalDate.now().plusDays(10), LocalDate.now().plusDays(30)); + RoomJpaEntity science_room_11 = saveScienceRecruitingRoom("과학-책", "과학-방-11일뒤-활동시작", LocalDate.now().plusDays(11), LocalDate.now().plusDays(30)); + RoomJpaEntity science_room_12 = saveScienceRecruitingRoom("과학-책", "과학-방-12일뒤-활동시작", LocalDate.now().plusDays(12), LocalDate.now().plusDays(30)); //when //then MvcResult firstResult = mockMvc.perform(get("/rooms/search") diff --git a/src/test/java/konkuk/thip/room/adapter/in/web/RoomShowMineApiTest.java b/src/test/java/konkuk/thip/room/adapter/in/web/RoomShowMineApiTest.java index 2493e5ce5..c75278393 100644 --- a/src/test/java/konkuk/thip/room/adapter/in/web/RoomShowMineApiTest.java +++ b/src/test/java/konkuk/thip/room/adapter/in/web/RoomShowMineApiTest.java @@ -10,6 +10,7 @@ import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository; import konkuk.thip.room.adapter.out.persistence.repository.roomparticipant.RoomParticipantJpaRepository; import konkuk.thip.room.domain.value.Category; +import konkuk.thip.room.domain.value.RoomStatus; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; import konkuk.thip.user.domain.value.Alias; @@ -53,7 +54,7 @@ void tearDown() { userJpaRepository.deleteAllInBatch(); } - private RoomJpaEntity saveScienceRoom(String bookTitle, String isbn, String roomName, LocalDate startDate, LocalDate endDate, int recruitCount) { + private RoomJpaEntity saveScienceRoom(String bookTitle, String isbn, String roomName, LocalDate startDate, LocalDate endDate, int recruitCount, RoomStatus roomStatus) { Alias alias = TestEntityFactory.createScienceAlias(); BookJpaEntity book = bookJpaRepository.save(BookJpaEntity.builder() @@ -79,6 +80,7 @@ private RoomJpaEntity saveScienceRoom(String bookTitle, String isbn, String room .recruitCount(recruitCount) .bookJpaEntity(book) .category(category) + .roomStatus(roomStatus) .build()); } @@ -105,16 +107,16 @@ private RoomParticipantJpaEntity saveSingleUserToRoom(RoomJpaEntity roomJpaEntit @DisplayName("type 으로 playing 을 받을 경우, 해당 유저가 참여중인 방 중 [현재 진행중인 모임방]의 정보를 [활동 마감일 임박순] 으로 반환한다.") void get_my_playing_rooms() throws Exception { //given - RoomJpaEntity recruitingRoom1 = saveScienceRoom("모집중인방-책-1", "isbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruitingRoom1 = saveScienceRoom("모집중인방-책-1", "isbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruitingRoom1, 5); - RoomJpaEntity playingRoom1 = saveScienceRoom("진행중인방-책-1", "isbn2", "과학-방-5일뒤-활동마감", LocalDate.now().minusDays(5), LocalDate.now().plusDays(5), 10); + RoomJpaEntity playingRoom1 = saveScienceRoom("진행중인방-책-1", "isbn2", "과학-방-5일뒤-활동마감", LocalDate.now().minusDays(5), LocalDate.now().plusDays(5), 10, RoomStatus.IN_PROGRESS); changeRoomMemberCount(playingRoom1, 6); - RoomJpaEntity playingRoom2 = saveScienceRoom("진행중인방-책-2", "isbn3", "과학-방-10일뒤-활동마감", LocalDate.now().minusDays(5), LocalDate.now().plusDays(10), 10); + RoomJpaEntity playingRoom2 = saveScienceRoom("진행중인방-책-2", "isbn3", "과학-방-10일뒤-활동마감", LocalDate.now().minusDays(5), LocalDate.now().plusDays(10), 10, RoomStatus.IN_PROGRESS); changeRoomMemberCount(playingRoom2, 3); - RoomJpaEntity expiredRoom1 = saveScienceRoom("만료된방-책-1", "isbn4", "과학-방-5일전-활동마감", LocalDate.now().minusDays(30), LocalDate.now().minusDays(5), 10); + RoomJpaEntity expiredRoom1 = saveScienceRoom("만료된방-책-1", "isbn4", "과학-방-5일전-활동마감", LocalDate.now().minusDays(30), LocalDate.now().minusDays(5), 10, RoomStatus.EXPIRED); changeRoomMemberCount(expiredRoom1, 7); Alias scienceAlias = TestEntityFactory.createScienceAlias(); @@ -144,16 +146,16 @@ void get_my_playing_rooms() throws Exception { @DisplayName("type 으로 recruiting 을 받을 경우, 해당 유저가 참여중인 방 중 [모집중인 모임방]의 정보를 [모집 마감일 임박순] 으로 반환한다.") void get_my_recruiting_rooms() throws Exception { //given - RoomJpaEntity recruitingRoom1 = saveScienceRoom("모집중인방-책-1", "isbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruitingRoom1 = saveScienceRoom("모집중인방-책-1", "isbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruitingRoom1, 5); - RoomJpaEntity recruitingRoom2 = saveScienceRoom("모집중인방-책-2", "isbn2", "과학-방-5일뒤-활동시작", LocalDate.now().plusDays(5), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruitingRoom2 = saveScienceRoom("모집중인방-책-2", "isbn2", "과학-방-5일뒤-활동시작", LocalDate.now().plusDays(5), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruitingRoom2, 8); - RoomJpaEntity playingRoom1 = saveScienceRoom("진행중인방-책-1", "isbn3", "과학-방-5일뒤-활동마감", LocalDate.now().minusDays(5), LocalDate.now().plusDays(5), 10); + RoomJpaEntity playingRoom1 = saveScienceRoom("진행중인방-책-1", "isbn3", "과학-방-5일뒤-활동마감", LocalDate.now().minusDays(5), LocalDate.now().plusDays(5), 10, RoomStatus.IN_PROGRESS); changeRoomMemberCount(playingRoom1, 6); - RoomJpaEntity expiredRoom1 = saveScienceRoom("만료된방-책-1", "isbn4", "과학-방-5일전-활동마감", LocalDate.now().minusDays(30), LocalDate.now().minusDays(5), 10); + RoomJpaEntity expiredRoom1 = saveScienceRoom("만료된방-책-1", "isbn4", "과학-방-5일전-활동마감", LocalDate.now().minusDays(30), LocalDate.now().minusDays(5), 10, RoomStatus.EXPIRED); changeRoomMemberCount(expiredRoom1, 7); Alias scienceAlias = TestEntityFactory.createScienceAlias(); @@ -183,16 +185,16 @@ void get_my_recruiting_rooms() throws Exception { @DisplayName("type 이 주어지지 않을 경우, 해당 유저가 참여중인 방 중 [현재 진행중 + 모집중인 모임방]의 정보를 [현재 진행중 -> 모집중] 순 으로 반환한다.") void get_my_playing_and_recruiting_rooms() throws Exception { //given - RoomJpaEntity recruitingRoom1 = saveScienceRoom("모집중인방-책-1", "isbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruitingRoom1 = saveScienceRoom("모집중인방-책-1", "isbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruitingRoom1, 5); - RoomJpaEntity recruitingRoom2 = saveScienceRoom("모집중인방-책-2", "isbn2", "과학-방-5일뒤-활동시작", LocalDate.now().plusDays(5), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruitingRoom2 = saveScienceRoom("모집중인방-책-2", "isbn2", "과학-방-5일뒤-활동시작", LocalDate.now().plusDays(5), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruitingRoom2, 8); - RoomJpaEntity playingRoom1 = saveScienceRoom("진행중인방-책-1", "isbn3", "과학-방-5일뒤-활동마감", LocalDate.now().minusDays(5), LocalDate.now().plusDays(5), 10); + RoomJpaEntity playingRoom1 = saveScienceRoom("진행중인방-책-1", "isbn3", "과학-방-5일뒤-활동마감", LocalDate.now().minusDays(5), LocalDate.now().plusDays(5), 10, RoomStatus.IN_PROGRESS); changeRoomMemberCount(playingRoom1, 6); - RoomJpaEntity expiredRoom1 = saveScienceRoom("만료된방-책-1", "isbn4", "과학-방-5일전-활동마감", LocalDate.now().minusDays(30), LocalDate.now().minusDays(5), 10); + RoomJpaEntity expiredRoom1 = saveScienceRoom("만료된방-책-1", "isbn4", "과학-방-5일전-활동마감", LocalDate.now().minusDays(30), LocalDate.now().minusDays(5), 10, RoomStatus.EXPIRED); changeRoomMemberCount(expiredRoom1, 7); Alias scienceAlias = TestEntityFactory.createScienceAlias(); @@ -223,16 +225,16 @@ void get_my_playing_and_recruiting_rooms() throws Exception { @DisplayName("type 으로 expired 을 받을 경우, 해당 유저가 참여중인 방 중 [만료된 모임방]의 정보를 [활동 마감일 최신순] 으로 반환한다.") void get_my_expired_rooms() throws Exception { //given - RoomJpaEntity recruitingRoom1 = saveScienceRoom("모집중인방-책-1", "isbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruitingRoom1 = saveScienceRoom("모집중인방-책-1", "isbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruitingRoom1, 5); - RoomJpaEntity playingRoom1 = saveScienceRoom("진행중인방-책-1", "isbn2", "과학-방-5일뒤-활동마감", LocalDate.now().minusDays(5), LocalDate.now().plusDays(5), 10); + RoomJpaEntity playingRoom1 = saveScienceRoom("진행중인방-책-1", "isbn2", "과학-방-5일뒤-활동마감", LocalDate.now().minusDays(5), LocalDate.now().plusDays(5), 10, RoomStatus.IN_PROGRESS); changeRoomMemberCount(playingRoom1, 6); - RoomJpaEntity expiredRoom1 = saveScienceRoom("만료된방-책-1", "isbn3", "과학-방-5일전-활동마감", LocalDate.now().minusDays(30), LocalDate.now().minusDays(5), 10); + RoomJpaEntity expiredRoom1 = saveScienceRoom("만료된방-책-1", "isbn3", "과학-방-5일전-활동마감", LocalDate.now().minusDays(30), LocalDate.now().minusDays(5), 10, RoomStatus.EXPIRED); changeRoomMemberCount(expiredRoom1, 7); - RoomJpaEntity expiredRoom2 = saveScienceRoom("만료된방-책-2", "isbn4", "과학-방-10일전-활동마감", LocalDate.now().minusDays(30), LocalDate.now().minusDays(10), 10); + RoomJpaEntity expiredRoom2 = saveScienceRoom("만료된방-책-2", "isbn4", "과학-방-10일전-활동마감", LocalDate.now().minusDays(30), LocalDate.now().minusDays(10), 10, RoomStatus.EXPIRED); changeRoomMemberCount(expiredRoom2, 1); Alias scienceAlias = TestEntityFactory.createScienceAlias(); @@ -262,16 +264,16 @@ void get_my_expired_rooms() throws Exception { @DisplayName("유효하지 않은 type 을 받을 경우, 400 error 를 반환한다.") void get_my_rooms_wrong_type() throws Exception { //given - RoomJpaEntity recruitingRoom1 = saveScienceRoom("모집중인방-책-1", "isbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruitingRoom1 = saveScienceRoom("모집중인방-책-1", "isbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruitingRoom1, 5); - RoomJpaEntity recruitingRoom2 = saveScienceRoom("모집중인방-책-2", "isbn2", "과학-방-5일뒤-활동시작", LocalDate.now().plusDays(5), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruitingRoom2 = saveScienceRoom("모집중인방-책-2", "isbn2", "과학-방-5일뒤-활동시작", LocalDate.now().plusDays(5), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruitingRoom2, 8); - RoomJpaEntity playingRoom1 = saveScienceRoom("진행중인방-책-1", "isbn3", "과학-방-5일뒤-활동마감", LocalDate.now().minusDays(5), LocalDate.now().plusDays(5), 10); + RoomJpaEntity playingRoom1 = saveScienceRoom("진행중인방-책-1", "isbn3", "과학-방-5일뒤-활동마감", LocalDate.now().minusDays(5), LocalDate.now().plusDays(5), 10, RoomStatus.IN_PROGRESS); changeRoomMemberCount(playingRoom1, 6); - RoomJpaEntity expiredRoom1 = saveScienceRoom("만료된방-책-1", "isbn4", "과학-방-5일전-활동마감", LocalDate.now().minusDays(30), LocalDate.now().minusDays(5), 10); + RoomJpaEntity expiredRoom1 = saveScienceRoom("만료된방-책-1", "isbn4", "과학-방-5일전-활동마감", LocalDate.now().minusDays(30), LocalDate.now().minusDays(5), 10, RoomStatus.EXPIRED); changeRoomMemberCount(expiredRoom1, 7); Alias scienceAlias = TestEntityFactory.createScienceAlias(); @@ -298,40 +300,40 @@ void get_my_rooms_wrong_type() throws Exception { @DisplayName("한번에 최대 10개의 데이터만을 반환한다. 다음 페이지에 해당하는 데이터가 있을 경우, 다음 페이지의 cursor 값을 반환한다.") void get_my_rooms_page_1() throws Exception { //given - RoomJpaEntity recruitingRoom1 = saveScienceRoom("모집중인방-책-1", "isbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruitingRoom1 = saveScienceRoom("모집중인방-책-1", "isbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruitingRoom1, 5); - RoomJpaEntity recruitingRoom2 = saveScienceRoom("모집중인방-책-2", "isbn2", "과학-방-2일뒤-활동시작", LocalDate.now().plusDays(2), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruitingRoom2 = saveScienceRoom("모집중인방-책-2", "isbn2", "과학-방-2일뒤-활동시작", LocalDate.now().plusDays(2), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruitingRoom2, 8); - RoomJpaEntity recruitingRoom3 = saveScienceRoom("모집중인방-책-3", "isbn3", "과학-방-3일뒤-활동시작", LocalDate.now().plusDays(3), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruitingRoom3 = saveScienceRoom("모집중인방-책-3", "isbn3", "과학-방-3일뒤-활동시작", LocalDate.now().plusDays(3), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruitingRoom3, 8); - RoomJpaEntity recruitingRoom4 = saveScienceRoom("모집중인방-책-4", "isbn4", "과학-방-4일뒤-활동시작", LocalDate.now().plusDays(4), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruitingRoom4 = saveScienceRoom("모집중인방-책-4", "isbn4", "과학-방-4일뒤-활동시작", LocalDate.now().plusDays(4), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruitingRoom4, 8); - RoomJpaEntity recruitingRoom5 = saveScienceRoom("모집중인방-책-5", "isbn5", "과학-방-5일뒤-활동시작", LocalDate.now().plusDays(5), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruitingRoom5 = saveScienceRoom("모집중인방-책-5", "isbn5", "과학-방-5일뒤-활동시작", LocalDate.now().plusDays(5), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruitingRoom5, 8); - RoomJpaEntity recruitingRoom6 = saveScienceRoom("모집중인방-책-6", "isbn6", "과학-방-6일뒤-활동시작", LocalDate.now().plusDays(6), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruitingRoom6 = saveScienceRoom("모집중인방-책-6", "isbn6", "과학-방-6일뒤-활동시작", LocalDate.now().plusDays(6), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruitingRoom6, 8); - RoomJpaEntity recruitingRoom7 = saveScienceRoom("모집중인방-책-7", "isbn7", "과학-방-7일뒤-활동시작", LocalDate.now().plusDays(7), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruitingRoom7 = saveScienceRoom("모집중인방-책-7", "isbn7", "과학-방-7일뒤-활동시작", LocalDate.now().plusDays(7), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruitingRoom7, 8); - RoomJpaEntity recruitingRoom8 = saveScienceRoom("모집중인방-책-8", "isbn8", "과학-방-8일뒤-활동시작", LocalDate.now().plusDays(8), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruitingRoom8 = saveScienceRoom("모집중인방-책-8", "isbn8", "과학-방-8일뒤-활동시작", LocalDate.now().plusDays(8), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruitingRoom8, 8); - RoomJpaEntity recruitingRoom9 = saveScienceRoom("모집중인방-책-9", "isbn9", "과학-방-9일뒤-활동시작", LocalDate.now().plusDays(9), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruitingRoom9 = saveScienceRoom("모집중인방-책-9", "isbn9", "과학-방-9일뒤-활동시작", LocalDate.now().plusDays(9), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruitingRoom9, 8); - RoomJpaEntity recruitingRoom10 = saveScienceRoom("모집중인방-책-10", "isbn10", "과학-방-10일뒤-활동시작", LocalDate.now().plusDays(10), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruitingRoom10 = saveScienceRoom("모집중인방-책-10", "isbn10", "과학-방-10일뒤-활동시작", LocalDate.now().plusDays(10), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruitingRoom10, 8); - RoomJpaEntity recruitingRoom11 = saveScienceRoom("모집중인방-책-11", "isbn11", "과학-방-11일뒤-활동시작", LocalDate.now().plusDays(11), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruitingRoom11 = saveScienceRoom("모집중인방-책-11", "isbn11", "과학-방-11일뒤-활동시작", LocalDate.now().plusDays(11), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruitingRoom11, 8); - RoomJpaEntity recruitingRoom12 = saveScienceRoom("모집중인방-책-12", "isbn12", "과학-방-12일뒤-활동시작", LocalDate.now().plusDays(12), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruitingRoom12 = saveScienceRoom("모집중인방-책-12", "isbn12", "과학-방-12일뒤-활동시작", LocalDate.now().plusDays(12), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruitingRoom12, 8); Alias scienceAlias = TestEntityFactory.createScienceAlias(); @@ -377,40 +379,40 @@ void get_my_rooms_page_1() throws Exception { @DisplayName("cursor 값을 기준으로 해당 페이지의 데이터를 반환한다.") void get_my_rooms_page_2() throws Exception { //given - RoomJpaEntity recruitingRoom1 = saveScienceRoom("모집중인방-책-1", "isbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruitingRoom1 = saveScienceRoom("모집중인방-책-1", "isbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruitingRoom1, 5); - RoomJpaEntity recruitingRoom2 = saveScienceRoom("모집중인방-책-2", "isbn2", "과학-방-2일뒤-활동시작", LocalDate.now().plusDays(2), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruitingRoom2 = saveScienceRoom("모집중인방-책-2", "isbn2", "과학-방-2일뒤-활동시작", LocalDate.now().plusDays(2), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruitingRoom2, 8); - RoomJpaEntity recruitingRoom3 = saveScienceRoom("모집중인방-책-3", "isbn3", "과학-방-3일뒤-활동시작", LocalDate.now().plusDays(3), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruitingRoom3 = saveScienceRoom("모집중인방-책-3", "isbn3", "과학-방-3일뒤-활동시작", LocalDate.now().plusDays(3), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruitingRoom3, 8); - RoomJpaEntity recruitingRoom4 = saveScienceRoom("모집중인방-책-4", "isbn4", "과학-방-4일뒤-활동시작", LocalDate.now().plusDays(4), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruitingRoom4 = saveScienceRoom("모집중인방-책-4", "isbn4", "과학-방-4일뒤-활동시작", LocalDate.now().plusDays(4), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruitingRoom4, 8); - RoomJpaEntity recruitingRoom5 = saveScienceRoom("모집중인방-책-5", "isbn5", "과학-방-5일뒤-활동시작", LocalDate.now().plusDays(5), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruitingRoom5 = saveScienceRoom("모집중인방-책-5", "isbn5", "과학-방-5일뒤-활동시작", LocalDate.now().plusDays(5), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruitingRoom5, 8); - RoomJpaEntity recruitingRoom6 = saveScienceRoom("모집중인방-책-6", "isbn6", "과학-방-6일뒤-활동시작", LocalDate.now().plusDays(6), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruitingRoom6 = saveScienceRoom("모집중인방-책-6", "isbn6", "과학-방-6일뒤-활동시작", LocalDate.now().plusDays(6), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruitingRoom6, 8); - RoomJpaEntity recruitingRoom7 = saveScienceRoom("모집중인방-책-7", "isbn7", "과학-방-7일뒤-활동시작", LocalDate.now().plusDays(7), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruitingRoom7 = saveScienceRoom("모집중인방-책-7", "isbn7", "과학-방-7일뒤-활동시작", LocalDate.now().plusDays(7), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruitingRoom7, 8); - RoomJpaEntity recruitingRoom8 = saveScienceRoom("모집중인방-책-8", "isbn8", "과학-방-8일뒤-활동시작", LocalDate.now().plusDays(8), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruitingRoom8 = saveScienceRoom("모집중인방-책-8", "isbn8", "과학-방-8일뒤-활동시작", LocalDate.now().plusDays(8), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruitingRoom8, 8); - RoomJpaEntity recruitingRoom9 = saveScienceRoom("모집중인방-책-9", "isbn9", "과학-방-9일뒤-활동시작", LocalDate.now().plusDays(9), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruitingRoom9 = saveScienceRoom("모집중인방-책-9", "isbn9", "과학-방-9일뒤-활동시작", LocalDate.now().plusDays(9), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruitingRoom9, 8); - RoomJpaEntity recruitingRoom10 = saveScienceRoom("모집중인방-책-10", "isbn10", "과학-방-10일뒤-활동시작", LocalDate.now().plusDays(10), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruitingRoom10 = saveScienceRoom("모집중인방-책-10", "isbn10", "과학-방-10일뒤-활동시작", LocalDate.now().plusDays(10), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruitingRoom10, 8); - RoomJpaEntity recruitingRoom11 = saveScienceRoom("모집중인방-책-11", "isbn11", "과학-방-11일뒤-활동시작", LocalDate.now().plusDays(11), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruitingRoom11 = saveScienceRoom("모집중인방-책-11", "isbn11", "과학-방-11일뒤-활동시작", LocalDate.now().plusDays(11), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruitingRoom11, 8); - RoomJpaEntity recruitingRoom12 = saveScienceRoom("모집중인방-책-12", "isbn12", "과학-방-12일뒤-활동시작", LocalDate.now().plusDays(12), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruitingRoom12 = saveScienceRoom("모집중인방-책-12", "isbn12", "과학-방-12일뒤-활동시작", LocalDate.now().plusDays(12), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruitingRoom12, 8); Alias scienceAlias = TestEntityFactory.createScienceAlias(); @@ -450,16 +452,16 @@ void get_my_rooms_page_2() throws Exception { @DisplayName("유저가 나간 방(= 모집기간 중 참여 취소한 경우, 진행기간 중 방 나간 경우) 은 조회되지 않는다.") void get_my_rooms_about_exit_rooms() throws Exception { //given - RoomJpaEntity recruitingRoom1 = saveScienceRoom("모집중인방-책-1", "isbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruitingRoom1 = saveScienceRoom("모집중인방-책-1", "isbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruitingRoom1, 5); - RoomJpaEntity exitRecruitingRoom = saveScienceRoom("모집중인방-책-2", "isbn2", "참여신청하고-나간-모집중인-과학-방", LocalDate.now().plusDays(5), LocalDate.now().plusDays(30), 10); + RoomJpaEntity exitRecruitingRoom = saveScienceRoom("모집중인방-책-2", "isbn2", "참여신청하고-나간-모집중인-과학-방", LocalDate.now().plusDays(5), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(exitRecruitingRoom, 8); - RoomJpaEntity playingRoom1 = saveScienceRoom("진행중인방-책-1", "isbn3", "과학-방-5일뒤-활동마감", LocalDate.now().minusDays(5), LocalDate.now().plusDays(5), 10); + RoomJpaEntity playingRoom1 = saveScienceRoom("진행중인방-책-1", "isbn3", "과학-방-5일뒤-활동마감", LocalDate.now().minusDays(5), LocalDate.now().plusDays(5), 10, RoomStatus.IN_PROGRESS); changeRoomMemberCount(playingRoom1, 6); - RoomJpaEntity exitPlayingRoom = saveScienceRoom("진행중인방-책-2", "isbn4", "모임진행중-나간-진행중인-과학-방", LocalDate.now().minusDays(5), LocalDate.now().plusDays(5), 10); + RoomJpaEntity exitPlayingRoom = saveScienceRoom("진행중인방-책-2", "isbn4", "모임진행중-나간-진행중인-과학-방", LocalDate.now().minusDays(5), LocalDate.now().plusDays(5), 10, RoomStatus.IN_PROGRESS); changeRoomMemberCount(exitPlayingRoom, 6); Alias scienceAlias = TestEntityFactory.createScienceAlias(); @@ -497,31 +499,31 @@ void get_my_rooms_about_exit_rooms() throws Exception { void get_my_playing_and_recruiting_rooms_pagination() throws Exception { // given // 진행중인 방 6개 (endDate 임박 순서: +1d ~ +6d) - RoomJpaEntity playing1 = saveScienceRoom("진행중인방-책-P1", "pisbn1", "과학-방-1일뒤-활동마감", LocalDate.now().minusDays(10), LocalDate.now().plusDays(1), 10); + RoomJpaEntity playing1 = saveScienceRoom("진행중인방-책-P1", "pisbn1", "과학-방-1일뒤-활동마감", LocalDate.now().minusDays(10), LocalDate.now().plusDays(1), 10, RoomStatus.IN_PROGRESS); changeRoomMemberCount(playing1, 3); - RoomJpaEntity playing2 = saveScienceRoom("진행중인방-책-P2", "pisbn2", "과학-방-2일뒤-활동마감", LocalDate.now().minusDays(10), LocalDate.now().plusDays(2), 10); + RoomJpaEntity playing2 = saveScienceRoom("진행중인방-책-P2", "pisbn2", "과학-방-2일뒤-활동마감", LocalDate.now().minusDays(10), LocalDate.now().plusDays(2), 10, RoomStatus.IN_PROGRESS); changeRoomMemberCount(playing2, 4); - RoomJpaEntity playing3 = saveScienceRoom("진행중인방-책-P3", "pisbn3", "과학-방-3일뒤-활동마감", LocalDate.now().minusDays(10), LocalDate.now().plusDays(3), 10); + RoomJpaEntity playing3 = saveScienceRoom("진행중인방-책-P3", "pisbn3", "과학-방-3일뒤-활동마감", LocalDate.now().minusDays(10), LocalDate.now().plusDays(3), 10, RoomStatus.IN_PROGRESS); changeRoomMemberCount(playing3, 5); - RoomJpaEntity playing4 = saveScienceRoom("진행중인방-책-P4", "pisbn4", "과학-방-4일뒤-활동마감", LocalDate.now().minusDays(10), LocalDate.now().plusDays(4), 10); + RoomJpaEntity playing4 = saveScienceRoom("진행중인방-책-P4", "pisbn4", "과학-방-4일뒤-활동마감", LocalDate.now().minusDays(10), LocalDate.now().plusDays(4), 10, RoomStatus.IN_PROGRESS); changeRoomMemberCount(playing4, 6); - RoomJpaEntity playing5 = saveScienceRoom("진행중인방-책-P5", "pisbn5", "과학-방-5일뒤-활동마감", LocalDate.now().minusDays(10), LocalDate.now().plusDays(5), 10); + RoomJpaEntity playing5 = saveScienceRoom("진행중인방-책-P5", "pisbn5", "과학-방-5일뒤-활동마감", LocalDate.now().minusDays(10), LocalDate.now().plusDays(5), 10, RoomStatus.IN_PROGRESS); changeRoomMemberCount(playing5, 7); - RoomJpaEntity playing6 = saveScienceRoom("진행중인방-책-P6", "pisbn6", "과학-방-6일뒤-활동마감", LocalDate.now().minusDays(10), LocalDate.now().plusDays(6), 10); + RoomJpaEntity playing6 = saveScienceRoom("진행중인방-책-P6", "pisbn6", "과학-방-6일뒤-활동마감", LocalDate.now().minusDays(10), LocalDate.now().plusDays(6), 10, RoomStatus.IN_PROGRESS); changeRoomMemberCount(playing6, 8); // 모집중인 방 6개 (startDate 임박 순서: +1d ~ +6d) - RoomJpaEntity recruiting1 = saveScienceRoom("모집중인방-책-R1", "risbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruiting1 = saveScienceRoom("모집중인방-책-R1", "risbn1", "과학-방-1일뒤-활동시작", LocalDate.now().plusDays(1), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruiting1, 3); - RoomJpaEntity recruiting2 = saveScienceRoom("모집중인방-책-R2", "risbn2", "과학-방-2일뒤-활동시작", LocalDate.now().plusDays(2), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruiting2 = saveScienceRoom("모집중인방-책-R2", "risbn2", "과학-방-2일뒤-활동시작", LocalDate.now().plusDays(2), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruiting2, 4); - RoomJpaEntity recruiting3 = saveScienceRoom("모집중인방-책-R3", "risbn3", "과학-방-3일뒤-활동시작", LocalDate.now().plusDays(3), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruiting3 = saveScienceRoom("모집중인방-책-R3", "risbn3", "과학-방-3일뒤-활동시작", LocalDate.now().plusDays(3), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruiting3, 5); - RoomJpaEntity recruiting4 = saveScienceRoom("모집중인방-책-R4", "risbn4", "과학-방-4일뒤-활동시작", LocalDate.now().plusDays(4), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruiting4 = saveScienceRoom("모집중인방-책-R4", "risbn4", "과학-방-4일뒤-활동시작", LocalDate.now().plusDays(4), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruiting4, 6); - RoomJpaEntity recruiting5 = saveScienceRoom("모집중인방-책-R5", "risbn5", "과학-방-5일뒤-활동시작", LocalDate.now().plusDays(5), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruiting5 = saveScienceRoom("모집중인방-책-R5", "risbn5", "과학-방-5일뒤-활동시작", LocalDate.now().plusDays(5), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruiting5, 7); - RoomJpaEntity recruiting6 = saveScienceRoom("모집중인방-책-R6", "risbn6", "과학-방-6일뒤-활동시작", LocalDate.now().plusDays(6), LocalDate.now().plusDays(30), 10); + RoomJpaEntity recruiting6 = saveScienceRoom("모집중인방-책-R6", "risbn6", "과학-방-6일뒤-활동시작", LocalDate.now().plusDays(6), LocalDate.now().plusDays(30), 10, RoomStatus.RECRUITING); changeRoomMemberCount(recruiting6, 8); Alias alias = TestEntityFactory.createScienceAlias(); diff --git a/src/test/java/konkuk/thip/room/adapter/in/web/RoomVerifyPasswordApiTest.java b/src/test/java/konkuk/thip/room/adapter/in/web/RoomVerifyPasswordApiTest.java index 5efa7075f..dde07a0b3 100644 --- a/src/test/java/konkuk/thip/room/adapter/in/web/RoomVerifyPasswordApiTest.java +++ b/src/test/java/konkuk/thip/room/adapter/in/web/RoomVerifyPasswordApiTest.java @@ -6,6 +6,7 @@ import konkuk.thip.common.util.TestEntityFactory; import konkuk.thip.room.adapter.in.web.request.RoomVerifyPasswordRequest; import konkuk.thip.room.domain.value.Category; +import konkuk.thip.room.domain.value.RoomStatus; import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; import konkuk.thip.room.adapter.out.jpa.RoomJpaEntity; @@ -162,6 +163,7 @@ void verifyRoomPassword_recruitmentPeriodExpired() throws Exception { .startDate(LocalDate.now()) // 오늘 시작이므로 모집기간은 어제까지 .endDate(LocalDate.now().plusDays(5)) .recruitCount(3) + .roomStatus(RoomStatus.IN_PROGRESS) // 이미 시작된 방 .build() ); Long expiredRoomId = expiredRoom.getRoomId(); diff --git a/src/test/java/konkuk/thip/room/domain/RoomTest.java b/src/test/java/konkuk/thip/room/domain/RoomTest.java index a8d051334..03f76c043 100644 --- a/src/test/java/konkuk/thip/room/domain/RoomTest.java +++ b/src/test/java/konkuk/thip/room/domain/RoomTest.java @@ -3,6 +3,7 @@ import konkuk.thip.common.exception.InvalidStateException; import konkuk.thip.common.exception.code.ErrorCode; import konkuk.thip.room.domain.value.Category; +import konkuk.thip.room.domain.value.RoomStatus; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; @@ -187,7 +188,8 @@ void isRecruitmentPeriodExpired_expired() { "제목", "설명", false, "1234", start, start.plusDays(10), 5, 123L, validCategory ); - setField(room, "startDate", today); // 모집기간 만료 상태를 강제로 만든 후 검증 + setField(room, "startDate", today); + setField(room, "roomStatus", RoomStatus.IN_PROGRESS); // 모집기간 만료 상태를 강제로 만든 후 검증 assertTrue(room.isRecruitmentPeriodExpired()); } @@ -199,7 +201,8 @@ void verifyPassword_recruitmentPeriodExpired() { "제목", "설명", false, "1234", startExpired, END, 5, 123L, validCategory ); - setField(room, "startDate", today); // 모집기간 만료 상태를 강제로 만든 후 검증 + setField(room, "startDate", today); + setField(room, "roomStatus", RoomStatus.IN_PROGRESS); // 모집기간 만료 상태를 강제로 만든 후 검증 InvalidStateException ex = assertThrows(InvalidStateException.class, () -> room.verifyPassword("1234")); assertEquals(ErrorCode.ROOM_RECRUITMENT_PERIOD_EXPIRED, ex.getErrorCode()); From a2297a13729f0f00a625c5aaa633ed999051ba87 Mon Sep 17 00:00:00 2001 From: janghyunjun Date: Fri, 12 Sep 2025 17:04:46 +0900 Subject: [PATCH 07/17] =?UTF-8?q?[refactor]=20=ED=88=AC=ED=91=9C=ED=95=98?= =?UTF-8?q?=EA=B8=B0,=20=ED=88=AC=ED=91=9C=EC=82=AD=EC=A0=9C=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20api=EC=97=90=EC=84=9C=20=EB=B0=A9=20=EB=A7=8C?= =?UTF-8?q?=EB=A3=8C=20=EA=B2=80=EC=A6=9D=20(#289)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/common/swagger/SwaggerResponseDescription.java | 9 ++++++--- .../roompost/application/service/VoteDeleteService.java | 7 +++++++ .../thip/roompost/application/service/VoteService.java | 7 +++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/main/java/konkuk/thip/common/swagger/SwaggerResponseDescription.java b/src/main/java/konkuk/thip/common/swagger/SwaggerResponseDescription.java index e57e6c0da..225f0603b 100644 --- a/src/main/java/konkuk/thip/common/swagger/SwaggerResponseDescription.java +++ b/src/main/java/konkuk/thip/common/swagger/SwaggerResponseDescription.java @@ -183,12 +183,14 @@ public enum SwaggerResponseDescription { VOTE_DELETE(new LinkedHashSet<>(Set.of( ROOM_ACCESS_FORBIDDEN, VOTE_NOT_FOUND, - VOTE_ACCESS_FORBIDDEN + VOTE_ACCESS_FORBIDDEN, + ROOM_IS_EXPIRED ))), VOTE_UPDATE(new LinkedHashSet<>(Set.of( ROOM_ACCESS_FORBIDDEN, VOTE_NOT_FOUND, - VOTE_ACCESS_FORBIDDEN + VOTE_ACCESS_FORBIDDEN, + ROOM_IS_EXPIRED ))), @@ -337,7 +339,8 @@ public enum SwaggerResponseDescription { ATTENDANCE_CHECK_DELETE(new LinkedHashSet<>(Set.of( ROOM_ACCESS_FORBIDDEN, ATTENDANCE_CHECK_NOT_FOUND, - ATTENDANCE_CHECK_CAN_NOT_DELETE + ATTENDANCE_CHECK_CAN_NOT_DELETE, + ROOM_IS_EXPIRED ))), // Notiification diff --git a/src/main/java/konkuk/thip/roompost/application/service/VoteDeleteService.java b/src/main/java/konkuk/thip/roompost/application/service/VoteDeleteService.java index 5fa410ef6..1d6b371b2 100644 --- a/src/main/java/konkuk/thip/roompost/application/service/VoteDeleteService.java +++ b/src/main/java/konkuk/thip/roompost/application/service/VoteDeleteService.java @@ -3,7 +3,9 @@ import jakarta.transaction.Transactional; import konkuk.thip.comment.application.port.out.CommentCommandPort; import konkuk.thip.post.application.port.out.PostLikeCommandPort; +import konkuk.thip.room.application.port.out.RoomCommandPort; import konkuk.thip.room.application.service.validator.RoomParticipantValidator; +import konkuk.thip.room.domain.Room; import konkuk.thip.roompost.application.port.in.VoteDeleteUseCase; import konkuk.thip.roompost.application.port.in.dto.vote.VoteDeleteCommand; import konkuk.thip.roompost.application.port.out.VoteCommandPort; @@ -18,6 +20,7 @@ public class VoteDeleteService implements VoteDeleteUseCase { private final VoteCommandPort voteCommandPort; private final CommentCommandPort commentCommandPort; private final PostLikeCommandPort postLikeCommandPort; + private final RoomCommandPort roomCommandPort; private final RoomParticipantValidator roomParticipantValidator; @@ -28,6 +31,10 @@ public Long deleteVote(VoteDeleteCommand command) { // 1. 방 참여자 검증 roomParticipantValidator.validateUserIsRoomMember(command.roomId(), command.userId()); + // 1.1 방 존재 여부 및 만료 검증 + Room room = roomCommandPort.getByIdOrThrow(command.roomId()); + room.validateRoomExpired(); + // 2. 투표 조회 및 검증 Vote vote = voteCommandPort.getByIdOrThrow(command.voteId()); // 2-1. 투표 삭제 권한 검증 diff --git a/src/main/java/konkuk/thip/roompost/application/service/VoteService.java b/src/main/java/konkuk/thip/roompost/application/service/VoteService.java index 58487d2db..e0b6658e9 100644 --- a/src/main/java/konkuk/thip/roompost/application/service/VoteService.java +++ b/src/main/java/konkuk/thip/roompost/application/service/VoteService.java @@ -2,7 +2,9 @@ import konkuk.thip.common.exception.BusinessException; import konkuk.thip.common.exception.code.ErrorCode; +import konkuk.thip.room.application.port.out.RoomCommandPort; import konkuk.thip.room.application.service.validator.RoomParticipantValidator; +import konkuk.thip.room.domain.Room; import konkuk.thip.roompost.application.port.in.VoteUseCase; import konkuk.thip.roompost.application.port.in.dto.vote.VoteCommand; import konkuk.thip.roompost.application.port.in.dto.vote.VoteResult; @@ -25,6 +27,7 @@ public class VoteService implements VoteUseCase { private final VoteCommandPort voteCommandPort; private final VoteQueryPort voteQueryPort; private final RoomParticipantValidator roomParticipantValidator; + private final RoomCommandPort roomCommandPort; @Override @Transactional @@ -32,6 +35,10 @@ public VoteResult vote(VoteCommand command) { // 1. 방 참가자 검증 roomParticipantValidator.validateUserIsRoomMember(command.roomId(), command.userId()); + // 1.1 방 존재 여부 및 만료 검증 + Room room = roomCommandPort.getByIdOrThrow(command.roomId()); + room.validateRoomExpired(); + if (command.type()) { // 투표하기 voteOrUpdate(command.userId(), command.voteId(), command.voteItemId()); From 04145629482d94c47d9fdce319a5175216b3e1fa Mon Sep 17 00:00:00 2001 From: janghyunjun Date: Fri, 12 Sep 2025 17:15:48 +0900 Subject: [PATCH 08/17] =?UTF-8?q?[fix]=20=ED=88=AC=ED=91=9C=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20=EB=8B=A8=EC=9C=84=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EC=97=90=20RoomCommandPort=20Mock=20=EC=B6=94=EA=B0=80=20(#295?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/roompost/application/service/VoteServiceTest.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/test/java/konkuk/thip/roompost/application/service/VoteServiceTest.java b/src/test/java/konkuk/thip/roompost/application/service/VoteServiceTest.java index 35d593186..240de2a07 100644 --- a/src/test/java/konkuk/thip/roompost/application/service/VoteServiceTest.java +++ b/src/test/java/konkuk/thip/roompost/application/service/VoteServiceTest.java @@ -3,8 +3,8 @@ import konkuk.thip.common.exception.BusinessException; import konkuk.thip.common.exception.InvalidStateException; import konkuk.thip.common.exception.code.ErrorCode; +import konkuk.thip.room.application.port.out.RoomCommandPort; import konkuk.thip.room.application.service.validator.RoomParticipantValidator; -import konkuk.thip.roompost.application.service.VoteService; import konkuk.thip.roompost.application.port.in.dto.vote.VoteCommand; import konkuk.thip.roompost.application.port.in.dto.vote.VoteResult; import konkuk.thip.roompost.application.port.out.VoteCommandPort; @@ -30,13 +30,15 @@ class VoteServiceTest { private VoteQueryPort voteQueryPort; private RoomParticipantValidator roomParticipantValidator; private VoteService voteService; + private RoomCommandPort roomCommandPort; @BeforeEach void setUp() { voteCommandPort = mock(VoteCommandPort.class); voteQueryPort = mock(VoteQueryPort.class); roomParticipantValidator = mock(RoomParticipantValidator.class); - voteService = new VoteService(voteCommandPort, voteQueryPort, roomParticipantValidator); + roomCommandPort = mock(RoomCommandPort.class); + voteService = new VoteService(voteCommandPort, voteQueryPort, roomParticipantValidator, roomCommandPort); } private void mockVoteQueryResult(Long voteId, Long voteItemId, String itemName, boolean isVoted, int count) { From a99e536ff100abfef810bfbb51586c2fc308c964 Mon Sep 17 00:00:00 2001 From: janghyunjun Date: Fri, 12 Sep 2025 17:23:05 +0900 Subject: [PATCH 09/17] =?UTF-8?q?[fix]=20=ED=88=AC=ED=91=9C=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20=EB=8B=A8=EC=9C=84=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EC=97=90=20Room=20=EC=8A=A4=ED=85=81=20=EA=B0=9D=EC=B2=B4=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20(#295)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/roompost/application/service/VoteServiceTest.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/test/java/konkuk/thip/roompost/application/service/VoteServiceTest.java b/src/test/java/konkuk/thip/roompost/application/service/VoteServiceTest.java index 240de2a07..d8371a8b2 100644 --- a/src/test/java/konkuk/thip/roompost/application/service/VoteServiceTest.java +++ b/src/test/java/konkuk/thip/roompost/application/service/VoteServiceTest.java @@ -5,6 +5,7 @@ import konkuk.thip.common.exception.code.ErrorCode; import konkuk.thip.room.application.port.out.RoomCommandPort; import konkuk.thip.room.application.service.validator.RoomParticipantValidator; +import konkuk.thip.room.domain.Room; import konkuk.thip.roompost.application.port.in.dto.vote.VoteCommand; import konkuk.thip.roompost.application.port.in.dto.vote.VoteResult; import konkuk.thip.roompost.application.port.out.VoteCommandPort; @@ -38,6 +39,11 @@ void setUp() { voteQueryPort = mock(VoteQueryPort.class); roomParticipantValidator = mock(RoomParticipantValidator.class); roomCommandPort = mock(RoomCommandPort.class); + + Room mockRoom = mock(Room.class); + doNothing().when(mockRoom).validateRoomExpired(); + when(roomCommandPort.getByIdOrThrow(anyLong())).thenReturn(mockRoom); + voteService = new VoteService(voteCommandPort, voteQueryPort, roomParticipantValidator, roomCommandPort); } From 1f07fefcce96812580a649f62cad0472e02f9c0f Mon Sep 17 00:00:00 2001 From: janghyunjun Date: Sat, 13 Sep 2025 21:50:03 +0900 Subject: [PATCH 10/17] =?UTF-8?q?[refactor]=20RoomQueryDto=EC=97=90=20room?= =?UTF-8?q?Status=20=EC=B6=94=EA=B0=80=20(#295)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/RoomQueryRepositoryImpl.java | 18 ++++++++++++------ .../application/port/out/dto/RoomQueryDto.java | 14 +++++++++----- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomQueryRepositoryImpl.java b/src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomQueryRepositoryImpl.java index 6aeacf18f..3ff22a9e3 100644 --- a/src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomQueryRepositoryImpl.java +++ b/src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomQueryRepositoryImpl.java @@ -83,7 +83,8 @@ private QRoomQueryDto projectionForRecruitingRoomSearch() { room.recruitCount, room.memberCount, room.startDate, - room.isPublic + room.isPublic, + room.roomStatus ); } @@ -329,7 +330,8 @@ public List findRoomsByCategoryOrderByStartDateAsc(Category catego room.title, room.recruitCount, room.memberCount, - room.startDate + room.startDate, + room.roomStatus )) .from(room) .join(room.bookJpaEntity, book) @@ -348,7 +350,8 @@ public List findRoomsByCategoryOrderByMemberCount(Category categor room.title, room.recruitCount, room.memberCount, - room.startDate + room.startDate, + room.roomStatus )) .from(room) .join(room.bookJpaEntity, book) @@ -379,7 +382,8 @@ public List findRoomsByIsbnOrderByStartDateAsc(String isbn, LocalD room.recruitCount, room.memberCount, cursorExpr, - room.isPublic + room.isPublic, + room.roomStatus )) .from(room) .join(room.bookJpaEntity, book) @@ -443,7 +447,8 @@ private List fetchMyRooms( room.memberCount, room.startDate, cursorExpr, // endDate 자리에 상황별 deadline 컬럼 전달 - room.isPublic + room.isPublic, + room.roomStatus )) .from(participant) .join(participant.roomJpaEntity, room) @@ -490,7 +495,8 @@ private List fetchMyRoomsWithPriority( room.memberCount, room.startDate, cursorExpr, // endDate 자리에 상황별 deadline 컬럼 전달 - room.isPublic + room.isPublic, + room.roomStatus )) .from(participant) .join(participant.roomJpaEntity, room) diff --git a/src/main/java/konkuk/thip/room/application/port/out/dto/RoomQueryDto.java b/src/main/java/konkuk/thip/room/application/port/out/dto/RoomQueryDto.java index ac466fd11..8a65e8f80 100644 --- a/src/main/java/konkuk/thip/room/application/port/out/dto/RoomQueryDto.java +++ b/src/main/java/konkuk/thip/room/application/port/out/dto/RoomQueryDto.java @@ -1,6 +1,7 @@ package konkuk.thip.room.application.port.out.dto; import com.querydsl.core.annotations.QueryProjection; +import konkuk.thip.room.domain.value.RoomStatus; import lombok.Builder; import org.springframework.util.Assert; @@ -16,7 +17,8 @@ public record RoomQueryDto( Integer memberCount, LocalDate startDate, // 방 진행 시작일 LocalDate endDate, // 방 진행 마감일 or 방 모집 마감일 - Boolean isPublic // 공개방 여부 + Boolean isPublic, // 공개방 여부 + RoomStatus roomStatus ) { // 내가 참여한 모임방(모집중, 진행중, 모집+진행중, 완료된) 조회 시 활용 @QueryProjection @@ -36,9 +38,10 @@ public RoomQueryDto( String roomName, Integer recruitCount, Integer memberCount, - LocalDate endDate + LocalDate endDate, + RoomStatus roomStatus ) { - this(roomId, bookImageUrl, roomName, recruitCount, memberCount, null, endDate, null); + this(roomId, bookImageUrl, roomName, recruitCount, memberCount, null, endDate, null, roomStatus); } // 방 검색 시 활용 @@ -50,8 +53,9 @@ public RoomQueryDto( Integer recruitCount, Integer memberCount, LocalDate endDate, - Boolean isPublic + Boolean isPublic, + RoomStatus roomStatus ) { - this(roomId, bookImageUrl, roomName, recruitCount, memberCount, null, endDate, isPublic); + this(roomId, bookImageUrl, roomName, recruitCount, memberCount, null, endDate, isPublic, roomStatus); } } From a06af4770040ed41be2001d104b1d8174cf48804 Mon Sep 17 00:00:00 2001 From: janghyunjun Date: Sat, 13 Sep 2025 22:07:19 +0900 Subject: [PATCH 11/17] =?UTF-8?q?[refactor]=20=EC=A7=84=ED=96=89=EC=A4=91?= =?UTF-8?q?=EC=9D=B8=20=EB=B0=A9=EC=9D=B4=20=EC=95=84=EB=8B=8C=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=EC=9D=98=20=EC=97=90=EB=9F=AC=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20(#295)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/konkuk/thip/common/exception/code/ErrorCode.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/konkuk/thip/common/exception/code/ErrorCode.java b/src/main/java/konkuk/thip/common/exception/code/ErrorCode.java index f944caa6b..50f51b6d7 100644 --- a/src/main/java/konkuk/thip/common/exception/code/ErrorCode.java +++ b/src/main/java/konkuk/thip/common/exception/code/ErrorCode.java @@ -101,6 +101,7 @@ public enum ErrorCode implements ResponseCode { ROOM_MEMBER_COUNT_UNDERFLOW(HttpStatus.BAD_REQUEST, 100007, "방의 인원 수가 1 이하(방장 포함)입니다."), ROOM_IS_EXPIRED(HttpStatus.BAD_REQUEST, 100008, "방이 만료되었습니다."), ROOM_POST_TYPE_NOT_MATCH(HttpStatus.BAD_REQUEST, 100009, "일치하는 방 게시물 타입 이름이 없습니다. [RECORD, VOTE] 중 하나여야 합니다."), + ROOM_NOT_IN_PROGRESS(HttpStatus.BAD_REQUEST, 100010, "진행 중인 방이 아닙니다."), /** * 110000 : vote error From ce1956d7af8909420c66e94edf0d811a4d4dc99f Mon Sep 17 00:00:00 2001 From: janghyunjun Date: Sat, 13 Sep 2025 22:07:38 +0900 Subject: [PATCH 12/17] =?UTF-8?q?[refactor]=20=EC=A7=84=ED=96=89=EC=A4=91?= =?UTF-8?q?=EC=9D=B8=20=EB=B0=A9=EC=9D=B4=20=EC=95=84=EB=8B=8C=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0(=EB=AA=A8=EC=A7=91=20=EC=A4=91=EC=9D=B8=20=EB=B0=A9)?= =?UTF-8?q?=EC=9D=98=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20(#295)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/policy/RoomPostCommentAccessPolicy.java | 2 +- .../room/application/service/validator/RoomValidator.java | 4 ++-- src/main/java/konkuk/thip/room/domain/Room.java | 5 ++++- .../application/service/AttendanceCheckCreateService.java | 2 +- .../application/service/AttendanceCheckDeleteService.java | 2 +- .../roompost/application/service/RecordCreateService.java | 2 +- .../roompost/application/service/RecordDeleteService.java | 2 +- .../roompost/application/service/RoomPostUpdateService.java | 2 +- .../thip/roompost/application/service/VoteCreateService.java | 2 +- .../thip/roompost/application/service/VoteDeleteService.java | 2 +- .../thip/roompost/application/service/VoteService.java | 2 +- .../application/service/policy/RoomPostLikeAccessPolicy.java | 2 +- .../thip/roompost/application/service/VoteServiceTest.java | 2 +- 13 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/main/java/konkuk/thip/comment/application/service/policy/RoomPostCommentAccessPolicy.java b/src/main/java/konkuk/thip/comment/application/service/policy/RoomPostCommentAccessPolicy.java index 01b4d45aa..434448fa2 100644 --- a/src/main/java/konkuk/thip/comment/application/service/policy/RoomPostCommentAccessPolicy.java +++ b/src/main/java/konkuk/thip/comment/application/service/policy/RoomPostCommentAccessPolicy.java @@ -18,7 +18,7 @@ public class RoomPostCommentAccessPolicy implements CommentAccessPolicy { public void validateCommentAccess(CountUpdatable post, Long userId) { RoomPost roomPost = (RoomPost) post; roomParticipantValidator.validateUserIsRoomMember(roomPost.getRoomId(), userId); - roomValidator.validateRoomExpired(roomPost.getRoomId()); + roomValidator.validateRoomInProgress(roomPost.getRoomId()); } } \ No newline at end of file diff --git a/src/main/java/konkuk/thip/room/application/service/validator/RoomValidator.java b/src/main/java/konkuk/thip/room/application/service/validator/RoomValidator.java index 305d58473..b5d725f3b 100644 --- a/src/main/java/konkuk/thip/room/application/service/validator/RoomValidator.java +++ b/src/main/java/konkuk/thip/room/application/service/validator/RoomValidator.java @@ -11,9 +11,9 @@ public class RoomValidator { private final RoomCommandPort roomCommandPort; - public void validateRoomExpired(Long roomId) { + public void validateRoomInProgress(Long roomId) { Room room = roomCommandPort.getByIdOrThrow(roomId); - room.validateRoomExpired(); + room.validateRoomInProgress(); } } diff --git a/src/main/java/konkuk/thip/room/domain/Room.java b/src/main/java/konkuk/thip/room/domain/Room.java index 7dc402a83..378d87830 100644 --- a/src/main/java/konkuk/thip/room/domain/Room.java +++ b/src/main/java/konkuk/thip/room/domain/Room.java @@ -177,10 +177,13 @@ public void startRoomProgress() { roomStatus = RoomStatus.IN_PROGRESS; } - public void validateRoomExpired() { + public void validateRoomInProgress() { if (this.roomStatus == RoomStatus.EXPIRED) { throw new InvalidStateException(ErrorCode.ROOM_IS_EXPIRED); } + if (this.roomStatus != RoomStatus.IN_PROGRESS) { + throw new InvalidStateException(ErrorCode.ROOM_NOT_IN_PROGRESS); + } } } diff --git a/src/main/java/konkuk/thip/roompost/application/service/AttendanceCheckCreateService.java b/src/main/java/konkuk/thip/roompost/application/service/AttendanceCheckCreateService.java index 62321747e..f192a126b 100644 --- a/src/main/java/konkuk/thip/roompost/application/service/AttendanceCheckCreateService.java +++ b/src/main/java/konkuk/thip/roompost/application/service/AttendanceCheckCreateService.java @@ -37,7 +37,7 @@ public AttendanceCheckCreateResult create(AttendanceCheckCreateCommand command) // 1-2. 방이 만료되었는지 검증 Room room = roomCommandPort.getByIdOrThrow(command.roomId()); - room.validateRoomExpired(); + room.validateRoomInProgress(); // 2. 유저가 해당 방에서 오늘 이미 작성한 오늘의 한마디 개수 조회 int alreadyWrittenCountToday = attendanceCheckQueryPort.countAttendanceChecksOnTodayByUser(command.creatorId(), command.roomId()); diff --git a/src/main/java/konkuk/thip/roompost/application/service/AttendanceCheckDeleteService.java b/src/main/java/konkuk/thip/roompost/application/service/AttendanceCheckDeleteService.java index b4f55b53e..5642cf80e 100644 --- a/src/main/java/konkuk/thip/roompost/application/service/AttendanceCheckDeleteService.java +++ b/src/main/java/konkuk/thip/roompost/application/service/AttendanceCheckDeleteService.java @@ -26,7 +26,7 @@ public Long delete(Long creatorId, Long roomId, Long attendanceCheckId) { // 1-1. 방이 만료되었는지 검증 Room room = roomCommandPort.getByIdOrThrow(roomId); - room.validateRoomExpired(); + room.validateRoomInProgress(); // 2. creator 겁증 AttendanceCheck attendanceCheck = attendanceCheckCommandPort.getByIdOrThrow(attendanceCheckId); diff --git a/src/main/java/konkuk/thip/roompost/application/service/RecordCreateService.java b/src/main/java/konkuk/thip/roompost/application/service/RecordCreateService.java index 7e075f9cf..607c73072 100644 --- a/src/main/java/konkuk/thip/roompost/application/service/RecordCreateService.java +++ b/src/main/java/konkuk/thip/roompost/application/service/RecordCreateService.java @@ -99,7 +99,7 @@ private void validateRoomParticipant(RoomParticipant roomParticipant, boolean is private void validateRoom(Room room) { // 방이 만료되었는지 검증 - room.validateRoomExpired(); + room.validateRoomInProgress(); } private void validateRecord(Record record, Book book) { diff --git a/src/main/java/konkuk/thip/roompost/application/service/RecordDeleteService.java b/src/main/java/konkuk/thip/roompost/application/service/RecordDeleteService.java index 2f4215d2f..c40070eb8 100644 --- a/src/main/java/konkuk/thip/roompost/application/service/RecordDeleteService.java +++ b/src/main/java/konkuk/thip/roompost/application/service/RecordDeleteService.java @@ -32,7 +32,7 @@ public Long deleteRecord(RecordDeleteCommand command) { roomParticipantValidator.validateUserIsRoomMember(command.roomId(), command.userId()); Room room = roomCommandPort.getByIdOrThrow(command.roomId()); - room.validateRoomExpired(); + room.validateRoomInProgress(); // 2. 기록 조회 및 검증 Record record = recordCommandPort.getByIdOrThrow(command.recordId()); diff --git a/src/main/java/konkuk/thip/roompost/application/service/RoomPostUpdateService.java b/src/main/java/konkuk/thip/roompost/application/service/RoomPostUpdateService.java index a4a9bfc4e..adbb1c38a 100644 --- a/src/main/java/konkuk/thip/roompost/application/service/RoomPostUpdateService.java +++ b/src/main/java/konkuk/thip/roompost/application/service/RoomPostUpdateService.java @@ -65,6 +65,6 @@ public Long updateVote(VoteUpdateCommand command) { private void validateRoom(Long command) { Room room = roomCommandPort.getByIdOrThrow(command); - room.validateRoomExpired(); + room.validateRoomInProgress(); } } diff --git a/src/main/java/konkuk/thip/roompost/application/service/VoteCreateService.java b/src/main/java/konkuk/thip/roompost/application/service/VoteCreateService.java index 12991f796..7e5ff4635 100644 --- a/src/main/java/konkuk/thip/roompost/application/service/VoteCreateService.java +++ b/src/main/java/konkuk/thip/roompost/application/service/VoteCreateService.java @@ -55,7 +55,7 @@ public VoteCreateResult createVote(VoteCreateCommand command) { Room room = roomCommandPort.getByIdOrThrow(vote.getRoomId()); Book book = bookCommandPort.findById(room.getBookId()); validateVote(vote, book); - room.validateRoomExpired(); + room.validateRoomInProgress(); // 2. vote 저장 Long savedVoteId = voteCommandPort.saveVote(vote); diff --git a/src/main/java/konkuk/thip/roompost/application/service/VoteDeleteService.java b/src/main/java/konkuk/thip/roompost/application/service/VoteDeleteService.java index 1d6b371b2..35268d868 100644 --- a/src/main/java/konkuk/thip/roompost/application/service/VoteDeleteService.java +++ b/src/main/java/konkuk/thip/roompost/application/service/VoteDeleteService.java @@ -33,7 +33,7 @@ public Long deleteVote(VoteDeleteCommand command) { // 1.1 방 존재 여부 및 만료 검증 Room room = roomCommandPort.getByIdOrThrow(command.roomId()); - room.validateRoomExpired(); + room.validateRoomInProgress(); // 2. 투표 조회 및 검증 Vote vote = voteCommandPort.getByIdOrThrow(command.voteId()); diff --git a/src/main/java/konkuk/thip/roompost/application/service/VoteService.java b/src/main/java/konkuk/thip/roompost/application/service/VoteService.java index e0b6658e9..73603e3a1 100644 --- a/src/main/java/konkuk/thip/roompost/application/service/VoteService.java +++ b/src/main/java/konkuk/thip/roompost/application/service/VoteService.java @@ -37,7 +37,7 @@ public VoteResult vote(VoteCommand command) { // 1.1 방 존재 여부 및 만료 검증 Room room = roomCommandPort.getByIdOrThrow(command.roomId()); - room.validateRoomExpired(); + room.validateRoomInProgress(); if (command.type()) { // 투표하기 diff --git a/src/main/java/konkuk/thip/roompost/application/service/policy/RoomPostLikeAccessPolicy.java b/src/main/java/konkuk/thip/roompost/application/service/policy/RoomPostLikeAccessPolicy.java index bc827de00..70c696865 100644 --- a/src/main/java/konkuk/thip/roompost/application/service/policy/RoomPostLikeAccessPolicy.java +++ b/src/main/java/konkuk/thip/roompost/application/service/policy/RoomPostLikeAccessPolicy.java @@ -19,6 +19,6 @@ public class RoomPostLikeAccessPolicy implements PostLikeAccessPolicy { public void validatePostLikeAccess(CountUpdatable post, Long userId) { RoomPost roomPost = (RoomPost) post; roomParticipantValidator.validateUserIsRoomMember(roomPost.getRoomId(), userId); - roomValidator.validateRoomExpired(roomPost.getRoomId()); + roomValidator.validateRoomInProgress(roomPost.getRoomId()); } } \ No newline at end of file diff --git a/src/test/java/konkuk/thip/roompost/application/service/VoteServiceTest.java b/src/test/java/konkuk/thip/roompost/application/service/VoteServiceTest.java index d8371a8b2..7f4b85eac 100644 --- a/src/test/java/konkuk/thip/roompost/application/service/VoteServiceTest.java +++ b/src/test/java/konkuk/thip/roompost/application/service/VoteServiceTest.java @@ -41,7 +41,7 @@ void setUp() { roomCommandPort = mock(RoomCommandPort.class); Room mockRoom = mock(Room.class); - doNothing().when(mockRoom).validateRoomExpired(); + doNothing().when(mockRoom).validateRoomInProgress(); when(roomCommandPort.getByIdOrThrow(anyLong())).thenReturn(mockRoom); voteService = new VoteService(voteCommandPort, voteQueryPort, roomParticipantValidator, roomCommandPort); From 5e43d565fa6e8e797e5e7a8b3019ed06c1cccef3 Mon Sep 17 00:00:00 2001 From: janghyunjun Date: Sat, 13 Sep 2025 22:07:48 +0900 Subject: [PATCH 13/17] =?UTF-8?q?[docs]=20=EC=97=90=EB=9F=AC=EB=A9=94?= =?UTF-8?q?=EC=8B=9C=EC=A7=80=20=EC=8A=A4=EC=9B=A8=EA=B1=B0=20=EB=AA=85?= =?UTF-8?q?=EC=84=B8=20=EC=B6=94=EA=B0=80=20(#295)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../swagger/SwaggerResponseDescription.java | 36 ++++++++++++------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/src/main/java/konkuk/thip/common/swagger/SwaggerResponseDescription.java b/src/main/java/konkuk/thip/common/swagger/SwaggerResponseDescription.java index 225f0603b..477fe9fc3 100644 --- a/src/main/java/konkuk/thip/common/swagger/SwaggerResponseDescription.java +++ b/src/main/java/konkuk/thip/common/swagger/SwaggerResponseDescription.java @@ -136,7 +136,8 @@ public enum SwaggerResponseDescription { BOOK_NOT_FOUND, ROOM_IS_EXPIRED, RECORD_CANNOT_BE_OVERVIEW, - INVALID_RECORD_PAGE_RANGE + INVALID_RECORD_PAGE_RANGE, + ROOM_NOT_IN_PROGRESS ))), RECORD_SEARCH(new LinkedHashSet<>(Set.of( USER_NOT_FOUND, @@ -148,7 +149,8 @@ public enum SwaggerResponseDescription { ROOM_ACCESS_FORBIDDEN, RECORD_NOT_FOUND, RECORD_ACCESS_FORBIDDEN, - ROOM_IS_EXPIRED + ROOM_IS_EXPIRED, + ROOM_NOT_IN_PROGRESS ))), RECORD_PIN(new LinkedHashSet<>(Set.of( ROOM_ACCESS_FORBIDDEN, @@ -160,7 +162,8 @@ public enum SwaggerResponseDescription { ROOM_ACCESS_FORBIDDEN, RECORD_NOT_FOUND, RECORD_ACCESS_FORBIDDEN, - ROOM_IS_EXPIRED + ROOM_IS_EXPIRED, + ROOM_NOT_IN_PROGRESS ))), // Vote @@ -170,7 +173,8 @@ public enum SwaggerResponseDescription { BOOK_NOT_FOUND, ROOM_IS_EXPIRED, VOTE_CANNOT_BE_OVERVIEW, - INVALID_VOTE_PAGE_RANGE + INVALID_VOTE_PAGE_RANGE, + ROOM_NOT_IN_PROGRESS ))), VOTE(new LinkedHashSet<>(Set.of( ROOM_ACCESS_FORBIDDEN, @@ -178,19 +182,22 @@ public enum SwaggerResponseDescription { VOTE_ITEM_ALREADY_VOTED, VOTE_ITEM_NOT_VOTED_CANNOT_CANCEL, VOTE_ITEM_COUNT_CANNOT_BE_NEGATIVE, - ROOM_IS_EXPIRED + ROOM_IS_EXPIRED, + ROOM_NOT_IN_PROGRESS ))), VOTE_DELETE(new LinkedHashSet<>(Set.of( ROOM_ACCESS_FORBIDDEN, VOTE_NOT_FOUND, VOTE_ACCESS_FORBIDDEN, - ROOM_IS_EXPIRED + ROOM_IS_EXPIRED, + ROOM_NOT_IN_PROGRESS ))), VOTE_UPDATE(new LinkedHashSet<>(Set.of( ROOM_ACCESS_FORBIDDEN, VOTE_NOT_FOUND, VOTE_ACCESS_FORBIDDEN, - ROOM_IS_EXPIRED + ROOM_IS_EXPIRED, + ROOM_NOT_IN_PROGRESS ))), @@ -257,7 +264,8 @@ public enum SwaggerResponseDescription { INVALID_COMMENT_CREATE, FEED_ACCESS_FORBIDDEN, ROOM_ACCESS_FORBIDDEN, - ROOM_IS_EXPIRED + ROOM_IS_EXPIRED, + ROOM_NOT_IN_PROGRESS ))), CHANGE_COMMENT_LIKE_STATE(new LinkedHashSet<>(Set.of( USER_NOT_FOUND, @@ -270,7 +278,8 @@ public enum SwaggerResponseDescription { COMMENT_LIKE_COUNT_UNDERFLOW, FEED_ACCESS_FORBIDDEN, ROOM_ACCESS_FORBIDDEN, - ROOM_IS_EXPIRED + ROOM_IS_EXPIRED, + ROOM_NOT_IN_PROGRESS ))), COMMENT_DELETE(new LinkedHashSet<>(Set.of( USER_NOT_FOUND, @@ -282,7 +291,8 @@ public enum SwaggerResponseDescription { COMMENT_COUNT_UNDERFLOW, FEED_ACCESS_FORBIDDEN, ROOM_ACCESS_FORBIDDEN, - ROOM_IS_EXPIRED + ROOM_IS_EXPIRED, + ROOM_NOT_IN_PROGRESS ))), // Book @@ -329,7 +339,8 @@ public enum SwaggerResponseDescription { USER_NOT_FOUND, ATTENDANCE_CHECK_WRITE_LIMIT_EXCEEDED, ATTENDANCE_CHECK_NOT_FOUND, - ROOM_IS_EXPIRED + ROOM_IS_EXPIRED, + ROOM_NOT_IN_PROGRESS ))), ATTENDANCE_CHECK_SHOW(new LinkedHashSet<>(Set.of( @@ -340,7 +351,8 @@ public enum SwaggerResponseDescription { ROOM_ACCESS_FORBIDDEN, ATTENDANCE_CHECK_NOT_FOUND, ATTENDANCE_CHECK_CAN_NOT_DELETE, - ROOM_IS_EXPIRED + ROOM_IS_EXPIRED, + ROOM_NOT_IN_PROGRESS ))), // Notiification From d87aa324e55447175a9b4e689b40e2ca18233a3a Mon Sep 17 00:00:00 2001 From: janghyunjun Date: Sat, 13 Sep 2025 22:25:23 +0900 Subject: [PATCH 14/17] =?UTF-8?q?[test]=20TestEntityFactory=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EB=B0=A9=20=EC=83=9D=EC=84=B1=EC=8B=9C=20=EA=B8=B0?= =?UTF-8?q?=EB=B3=B8=20=EC=A7=84=ED=96=89=EC=A4=91=EC=9D=B8=20=EB=B0=A9?= =?UTF-8?q?=EC=9D=B4=20=EC=83=9D=EC=84=B1=EB=90=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20(#295)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/konkuk/thip/common/util/TestEntityFactory.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/java/konkuk/thip/common/util/TestEntityFactory.java b/src/test/java/konkuk/thip/common/util/TestEntityFactory.java index 5f165f1af..959aeb160 100644 --- a/src/test/java/konkuk/thip/common/util/TestEntityFactory.java +++ b/src/test/java/konkuk/thip/common/util/TestEntityFactory.java @@ -141,6 +141,7 @@ public static RoomJpaEntity createRoom(BookJpaEntity book, Category category) { .recruitCount(3) .bookJpaEntity(book) .category(category) + .roomStatus(RoomStatus.IN_PROGRESS) .build(); } From fbaef2e360a7d7b405e468a72097c423ca5350b7 Mon Sep 17 00:00:00 2001 From: janghyunjun Date: Sat, 13 Sep 2025 22:38:28 +0900 Subject: [PATCH 15/17] =?UTF-8?q?[chore]=20=EC=A3=BC=EC=84=9D=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=20(#295)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/RoomQueryRepositoryImpl.java | 16 +--------------- src/main/java/konkuk/thip/room/domain/Room.java | 4 ---- 2 files changed, 1 insertion(+), 19 deletions(-) diff --git a/src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomQueryRepositoryImpl.java b/src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomQueryRepositoryImpl.java index 3ff22a9e3..c791ed28e 100644 --- a/src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomQueryRepositoryImpl.java +++ b/src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomQueryRepositoryImpl.java @@ -200,11 +200,9 @@ public List findHomeJoinedRoomsByUserPercentage( // 검색 조건(where) 조립 // 유저가 참여한 방만: userId 조건 - // 활동 기간 중인 방만: startDate ≤ today ≤ endDate + // 활동 기간 중인 방만: IN_PROGRESS 상태 BooleanBuilder where = new BooleanBuilder(); where.and(participant.userJpaEntity.userId.eq(userId)); -// where.and(room.startDate.loe(LocalDate.now())); -// where.and(room.endDate.goe(LocalDate.now())); where.and(room.roomStatus.eq(RoomStatus.IN_PROGRESS)); // 활동 기간 중인 방만: IN_PROGRESS 상태 // 커서 기반 추가 조건 @@ -247,9 +245,7 @@ public List findHomeJoinedRoomsByUserPercentage( public List findRecruitingRoomsUserParticipated( Long userId, LocalDate dateCursor, Long roomIdCursor, int pageSize ) { - LocalDate today = LocalDate.now(); BooleanExpression base = participant.userJpaEntity.userId.eq(userId) -// .and(room.startDate.after(today)); // 유저가 참여한 방 && 모집중인 방 .and(room.roomStatus.eq(RoomStatus.RECRUITING)); // 유저가 참여한 방 && 모집중인 방 DateExpression cursorExpr = room.startDate; // 커서 비교는 startDate(= 모집 마감일 - 1일) OrderSpecifier[] orders = new OrderSpecifier[]{ @@ -264,10 +260,7 @@ public List findRecruitingRoomsUserParticipated( public List findPlayingRoomsUserParticipated( Long userId, LocalDate dateCursor, Long roomIdCursor, int pageSize ) { - LocalDate today = LocalDate.now(); BooleanExpression base = participant.userJpaEntity.userId.eq(userId) -// .and(room.startDate.loe(today)) -// .and(room.endDate.goe(today)); // 유저가 참여한 방 && 현재 진행중인 방 .and(room.roomStatus.eq(RoomStatus.IN_PROGRESS)); // 유저가 참여한 방 && 현재 진행중인 방 DateExpression cursorExpr = room.endDate; // 커서 비교는 endDate(= 진행 마감일) OrderSpecifier[] orders = new OrderSpecifier[]{ @@ -282,9 +275,6 @@ public List findPlayingRoomsUserParticipated( public List findPlayingAndRecruitingRoomsUserParticipated( Long userId, Integer priorityCursor, LocalDate dateCursor, Long roomIdCursor, int pageSize ) { - LocalDate today = LocalDate.now(); -// BooleanExpression playing = room.startDate.loe(today).and(room.endDate.goe(today)); -// BooleanExpression recruiting = room.startDate.after(today); BooleanExpression playing = room.roomStatus.eq(RoomStatus.IN_PROGRESS); BooleanExpression recruiting = room.roomStatus.eq(RoomStatus.RECRUITING); BooleanExpression base = participant.userJpaEntity.userId.eq(userId) @@ -308,9 +298,7 @@ public List findPlayingAndRecruitingRoomsUserParticipated( public List findExpiredRoomsUserParticipated( Long userId, LocalDate dateCursor, Long roomIdCursor, int pageSize ) { - LocalDate today = LocalDate.now(); BooleanExpression base = participant.userJpaEntity.userId.eq(userId) -// .and(room.endDate.before(today)); // 유저가 참여한 방 && 만료된 방 .and(room.roomStatus.eq(RoomStatus.EXPIRED)); // 유저가 참여한 방 && 만료된 방 DateExpression cursorExpr = room.endDate; @@ -365,7 +353,6 @@ public List findRoomsByCategoryOrderByMemberCount(Category categor public List findRoomsByIsbnOrderByStartDateAsc(String isbn, LocalDate dateCursor, Long roomIdCursor, int pageSize) { DateExpression cursorExpr = room.startDate; // 커서 비교는 startDate(= 모집 마감일 - 1일) BooleanExpression baseCondition = room.bookJpaEntity.isbn.eq(isbn) -// .and(room.startDate.after(LocalDate.now())); // 모집 마감 시각 > 현재 시각 .and(room.roomStatus.eq(RoomStatus.RECRUITING)); // 모집중인 방 @@ -395,7 +382,6 @@ public List findRoomsByIsbnOrderByStartDateAsc(String isbn, LocalD private BooleanExpression findDeadlinePopularRoomCondition(Category category, Long userId) { return room.category.eq(category) -// .and(room.startDate.after(LocalDate.now())) // 모집 마감 시각 > 현재 시각 .and(room.roomStatus.eq(RoomStatus.RECRUITING)) // 모집중인 방 .and(room.isPublic.isTrue()) // 공개 방만 조회 .and(userJoinedRoom(userId).not()); // 유저가 참여하지 않은 방만 조회 diff --git a/src/main/java/konkuk/thip/room/domain/Room.java b/src/main/java/konkuk/thip/room/domain/Room.java index 378d87830..490856180 100644 --- a/src/main/java/konkuk/thip/room/domain/Room.java +++ b/src/main/java/konkuk/thip/room/domain/Room.java @@ -141,9 +141,6 @@ ROOM_RECRUITMENT_PERIOD_EXPIRED, new IllegalArgumentException(message) } public boolean isRecruitmentPeriodExpired() { -// LocalDate today = LocalDate.now(); -// // 모집 마감일: startDate.minusDays(1) -// return today.isAfter(this.startDate.minusDays(1)); return this.roomStatus != RoomStatus.RECRUITING; } @@ -171,7 +168,6 @@ private void checkCancelPossible() { public void startRoomProgress() { validateRoomRecruitExpired(); -// validateRoomExpired(); startDate = LocalDate.now(); roomStatus = RoomStatus.IN_PROGRESS; From f25d4f25bcaf893cdf9e8e8385373e08911d795c Mon Sep 17 00:00:00 2001 From: janghyunjun Date: Sat, 13 Sep 2025 22:39:00 +0900 Subject: [PATCH 16/17] =?UTF-8?q?[refactor]=20validateRoom=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=B6=94=EC=B6=9C=20=ED=95=B4=EC=A0=9C=20?= =?UTF-8?q?(#295)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../roompost/application/service/RecordCreateService.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/main/java/konkuk/thip/roompost/application/service/RecordCreateService.java b/src/main/java/konkuk/thip/roompost/application/service/RecordCreateService.java index 607c73072..0ea804f90 100644 --- a/src/main/java/konkuk/thip/roompost/application/service/RecordCreateService.java +++ b/src/main/java/konkuk/thip/roompost/application/service/RecordCreateService.java @@ -61,7 +61,7 @@ public RecordCreateResult createRecord(RecordCreateCommand command) { Book book = bookCommandPort.findById(room.getBookId()); // 3. 유효성 검증 - validateRoom(room); + room.validateRoomInProgress(); // 방이 만료되었는지 검증 validateRoomParticipant(roomParticipant, command.isOverview()); validateRecord(record, book); @@ -97,11 +97,6 @@ private void validateRoomParticipant(RoomParticipant roomParticipant, boolean is } } - private void validateRoom(Room room) { - // 방이 만료되었는지 검증 - room.validateRoomInProgress(); - } - private void validateRecord(Record record, Book book) { // 페이지 유효성 검증 record.validatePage(book.getPageCount()); From a4819f3bf7f1c7ffac0e79878047012102a62c6e Mon Sep 17 00:00:00 2001 From: janghyunjun Date: Sun, 14 Sep 2025 00:30:10 +0900 Subject: [PATCH 17/17] =?UTF-8?q?[refactor]=20RoomStatus=20not=20null=20as?= =?UTF-8?q?sertion=20=EC=B6=94=EA=B0=80=20(#295)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../konkuk/thip/room/application/port/out/dto/RoomQueryDto.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/konkuk/thip/room/application/port/out/dto/RoomQueryDto.java b/src/main/java/konkuk/thip/room/application/port/out/dto/RoomQueryDto.java index 8a65e8f80..6a268459b 100644 --- a/src/main/java/konkuk/thip/room/application/port/out/dto/RoomQueryDto.java +++ b/src/main/java/konkuk/thip/room/application/port/out/dto/RoomQueryDto.java @@ -29,6 +29,7 @@ public record RoomQueryDto( Assert.notNull(endDate, "endDate must not be null"); Assert.notNull(recruitCount, "recruitCount must not be null"); Assert.notNull(memberCount, "memberCount must not be null"); + Assert.notNull(roomStatus, "roomStatus must not be null"); } @QueryProjection