diff --git a/src/main/java/gaji/service/domain/room/repository/RoomEventRepository.java b/src/main/java/gaji/service/domain/room/repository/RoomEventRepository.java index 3334482f..eb340b53 100644 --- a/src/main/java/gaji/service/domain/room/repository/RoomEventRepository.java +++ b/src/main/java/gaji/service/domain/room/repository/RoomEventRepository.java @@ -15,6 +15,4 @@ public interface RoomEventRepository extends JpaRepository { Optional findRoomEventById(Long roomId); List findByRoom(Room room); - - int countByRoomId(Long roomId); } diff --git a/src/main/java/gaji/service/domain/room/repository/RoomNoticeRepository.java b/src/main/java/gaji/service/domain/room/repository/RoomNoticeRepository.java index 341773c4..502aa90a 100644 --- a/src/main/java/gaji/service/domain/room/repository/RoomNoticeRepository.java +++ b/src/main/java/gaji/service/domain/room/repository/RoomNoticeRepository.java @@ -1,18 +1,36 @@ package gaji.service.domain.room.repository; import gaji.service.domain.room.entity.RoomNotice; +import gaji.service.domain.room.web.dto.RoomResponseDto; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Optional; + @Repository public interface RoomNoticeRepository extends JpaRepository { - @Modifying - @Query("UPDATE RoomNotice rn SET rn.confirmCount = rn.confirmCount + 1 WHERE rn.id = :noticeId") - void incrementConfirmCount(Long noticeId); + @Query("SELECT NEW gaji.service.domain.room.web.dto.RoomResponseDto$NoticeDto(" + + "rn.id, sm.user.name, rn.title, rn.body, CAST(COUNT(nc) AS Long), rn.createdAt, rn.viewCount) " + + "FROM RoomNotice rn " + + "JOIN rn.studyMate sm " + + "LEFT JOIN NoticeConfirmation nc ON nc.roomNotice.id = rn.id " + + "WHERE sm.room.id = :roomId AND rn.createdAt <= :lastCreatedAt " + + "GROUP BY rn.id, sm.user.name, rn.title, rn.body, rn.createdAt, rn.viewCount " + + "ORDER BY rn.createdAt DESC, rn.id DESC") + List findNoticeSummariesForInfiniteScroll( + @Param("roomId") Long roomId, + @Param("lastCreatedAt") LocalDateTime lastCreatedAt, + Pageable pageable); - @Modifying - @Query("UPDATE RoomNotice rn SET rn.confirmCount = rn.confirmCount - 1 WHERE rn.id = :noticeId AND rn.confirmCount > 0") - void decrementConfirmCount(Long noticeId); + @Query("SELECT CASE " + + "WHEN EXISTS (SELECT 1 FROM RoomNotice rn WHERE rn.studyMate.room.id = :roomId AND rn.id = :noticeId) " + + "THEN (SELECT rn.createdAt FROM RoomNotice rn WHERE rn.studyMate.room.id = :roomId AND rn.id = :noticeId) " + + "ELSE (SELECT MAX(rn.createdAt) FROM RoomNotice rn WHERE rn.studyMate.room.id = :roomId) " + + "END") + Optional findCreatedAtByIdOrEarliest(@Param("roomId") Long roomId, @Param("noticeId") Long noticeId); } diff --git a/src/main/java/gaji/service/domain/room/service/RoomQueryService.java b/src/main/java/gaji/service/domain/room/service/RoomQueryService.java index 9c4cc63c..c9a259ec 100644 --- a/src/main/java/gaji/service/domain/room/service/RoomQueryService.java +++ b/src/main/java/gaji/service/domain/room/service/RoomQueryService.java @@ -3,7 +3,6 @@ import gaji.service.domain.room.entity.Room; import gaji.service.domain.room.entity.RoomEvent; import gaji.service.domain.room.web.dto.RoomResponseDto; -import gaji.service.domain.user.entity.User; import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -14,9 +13,13 @@ public interface RoomQueryService { RoomEvent findRoomEventByRoomIdAndWeeks(Long roomId, Integer weeks); - List getNotices(Long roomId, int page, int size); +// List getNotices(Long roomId, int page, int size); +// +// RoomResponseDto.NoticeDto getNoticeDetail(Long roomId, Long noticeId); +// +// List getNextNotices(Long roomId, Long lastNoticeId, int size); - RoomResponseDto.NoticeDto getNoticeDetail(Long roomId, Long noticeId); + List getNextNotices(Long roomId, Long lastNoticeId, int size); @Transactional(readOnly = true) RoomResponseDto.WeeklyStudyInfoDTO getWeeklyStudyInfo(Long roomId, Integer weeks); diff --git a/src/main/java/gaji/service/domain/room/service/RoomQueryServiceImpl.java b/src/main/java/gaji/service/domain/room/service/RoomQueryServiceImpl.java index 8b1a66a9..d9b33bc1 100644 --- a/src/main/java/gaji/service/domain/room/service/RoomQueryServiceImpl.java +++ b/src/main/java/gaji/service/domain/room/service/RoomQueryServiceImpl.java @@ -6,14 +6,17 @@ import gaji.service.domain.room.entity.RoomEvent; import gaji.service.domain.room.repository.*; import gaji.service.domain.room.web.dto.RoomResponseDto; -import gaji.service.domain.user.entity.User; +import gaji.service.global.converter.DateConverter; import gaji.service.global.exception.RestApiException; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.security.web.access.WebInvocationPrivilegeEvaluator; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.webjars.NotFoundException; +import java.time.LocalDateTime; import java.util.List; import java.util.stream.Collectors; @@ -29,6 +32,7 @@ public class RoomQueryServiceImpl implements RoomQueryService { private final WeeklyUserProgressRepository weeklyUserProgressRepository; private final NoticeConfirmationRepository noticeConfirmationRepository; private final WebInvocationPrivilegeEvaluator privilegeEvaluator; + private final RoomNoticeRepository roomNoticeRepository; // @Override // public RoomEvent findRoomEventById(Long roomId){ @@ -49,28 +53,32 @@ public RoomEvent findRoomEventByRoomIdAndWeeks(Long roomId, Integer weeks) { .orElseThrow(() -> new RestApiException(RoomErrorStatus._ROOM_EVENT_NOT_FOUND)); } - @Override - public List getNotices(Long roomId, int page, int size) { - return roomQueryRepository.getNotices(roomId, page, size); - } +// @Override +// public List getNotices(Long roomId, int page, int size) { +// return roomQueryRepository.getNotices(roomId, page, size); +// } @Override - @Transactional(readOnly = false) // readOnly = false로 설정 - public RoomResponseDto.NoticeDto getNoticeDetail(Long roomId, Long noticeId) { - RoomResponseDto.NoticeDto notice = roomQueryRepository.getNotices(roomId, 1, Integer.MAX_VALUE).stream() - .filter(n -> n.getId().equals(noticeId)) - .findFirst() - .orElseThrow(() -> new NotFoundException("Notice not found")); - - // viewCount 증가 - roomQueryRepository.incrementViewCount (noticeId); - - // 증가된 viewCount를 반영하기 위해 notice 객체 업데이트 - notice.setViewCount(notice.getViewCount() + 1); - - return notice; + public List getNextNotices(Long roomId, Long lastNoticeId, int size) { + LocalDateTime lastCreatedAt; + if (lastNoticeId == 0) { + lastCreatedAt = LocalDateTime.now(); + } else { + lastCreatedAt = roomNoticeRepository.findCreatedAtByIdOrEarliest(roomId, lastNoticeId) + .orElseThrow(() -> new RestApiException(RoomErrorStatus._NOTICE_NOT_FOUND)); + } + + Sort sort = Sort.by(Sort.Direction.DESC, "createdAt", "id"); + Pageable pageable = PageRequest.of(0, size, sort); + + List notices = roomNoticeRepository.findNoticeSummariesForInfiniteScroll(roomId, lastCreatedAt, pageable); + + LocalDateTime now = LocalDateTime.now(); + for (RoomResponseDto.NoticeDto notice : notices) { + notice.setTimeSincePosted(DateConverter.convertToRelativeTimeFormat(notice.getCreatedAt())); + } + return notices; } - @Override @Transactional(readOnly = true) public RoomResponseDto.WeeklyStudyInfoDTO getWeeklyStudyInfo(Long roomId, Integer weeks) { @@ -105,7 +113,7 @@ public List getUserProgressByRoomEventId(Long r public RoomResponseDto.RoomMainDto getMainStudyRoom(Long roomId) { RoomResponseDto.RoomMainDto mainStudyRoom = roomQueryRepository.getMainStudyRoom(roomId); - return mainStudyRoom.setWeekCount(roomEventRepository.countByRoomId(roomId)); + return mainStudyRoom; } @Override diff --git a/src/main/java/gaji/service/domain/room/web/controller/RoomNoticeController.java b/src/main/java/gaji/service/domain/room/web/controller/RoomNoticeController.java index 7ce4ee57..6b921e00 100644 --- a/src/main/java/gaji/service/domain/room/web/controller/RoomNoticeController.java +++ b/src/main/java/gaji/service/domain/room/web/controller/RoomNoticeController.java @@ -9,6 +9,8 @@ import gaji.service.global.base.BaseResponse; import gaji.service.jwt.service.TokenProviderService; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.responses.ApiResponse; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; @@ -40,17 +42,17 @@ public BaseResponse NoticeController( } @GetMapping("/{roomId}/notices") - @Operation(summary = "스터디룸 공지 목록 조회 API") - public BaseResponse getNotices( - @PathVariable Long roomId, - @RequestParam(defaultValue = "1") int page, - @RequestParam(defaultValue = "5") int size) { - List notices = roomQueryService.getNotices(roomId, page, size); - return BaseResponse.onSuccess( - new RoomResponseDto.NoticeDtoList(notices) - ); + @Operation(summary = "스터디룸 공지 무한 스크롤 조회", description = "공지를 무한 스크롤 방식으로 조회합니다.") + @ApiResponse(responseCode = "200", description = "조회 성공") + public BaseResponse> getNextNotices( + @PathVariable @Parameter(description = "스터디룸 ID") Long roomId, + @RequestParam @Parameter(description = "마지막으로 로드된 공지 ID") Long lastNoticeId, + @RequestParam(defaultValue = "5") @Parameter(description = "조회할 공지 수") int size) { + List notices = roomQueryService.getNextNotices(roomId, lastNoticeId, size); + return BaseResponse.onSuccess(notices); } + // @GetMapping("/notice/{noticeId}") // @Operation(summary = "특정 공지사항을 조회하는 API") // public ResponseEntity getNoticeDetail( diff --git a/src/main/java/gaji/service/domain/room/web/dto/RoomResponseDto.java b/src/main/java/gaji/service/domain/room/web/dto/RoomResponseDto.java index f09967ec..77b6c177 100644 --- a/src/main/java/gaji/service/domain/room/web/dto/RoomResponseDto.java +++ b/src/main/java/gaji/service/domain/room/web/dto/RoomResponseDto.java @@ -110,7 +110,6 @@ public static class RoomNoticeDto { @Builder @Getter @NoArgsConstructor - @AllArgsConstructor public static class RoomMainDto { private String name; private LocalDate startDay; @@ -119,7 +118,6 @@ public static class RoomMainDto { private LocalDate recruitEndDay; private Long daysLeftForRecruit; private Long applicantCount; - private int weekCount; public RoomMainDto(String name, LocalDate startDay, LocalDate endDay, LocalDate recruitStartDay, LocalDate recruitEndDay, @@ -132,12 +130,6 @@ public RoomMainDto(String name, LocalDate startDay, LocalDate endDay, this.applicantCount = applicantCount; this.daysLeftForRecruit = Math.max(daysLeftForRecruit, 0L); } - - public RoomMainDto setWeekCount(int weekCount){ - this.weekCount=weekCount; - return this; - } - } @Builder diff --git a/src/main/java/gaji/service/domain/roomBoard/repository/RoomBoardRepository.java b/src/main/java/gaji/service/domain/roomBoard/repository/RoomBoardRepository.java index f88e4b48..7ad757d6 100644 --- a/src/main/java/gaji/service/domain/roomBoard/repository/RoomBoardRepository.java +++ b/src/main/java/gaji/service/domain/roomBoard/repository/RoomBoardRepository.java @@ -1,5 +1,6 @@ package gaji.service.domain.roomBoard.repository; +import gaji.service.domain.enums.RoomPostType; import gaji.service.domain.roomBoard.entity.RoomBoard; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -8,5 +9,6 @@ @Repository public interface RoomBoardRepository extends JpaRepository { + Optional findRoomBoardByRoomIdAndRoomPostType(Long roomId, RoomPostType roomPostType); Optional findByRoomId(Long roomId); } diff --git a/src/main/java/gaji/service/domain/roomBoard/repository/RoomInfo/RoomInfoPostRepository.java b/src/main/java/gaji/service/domain/roomBoard/repository/RoomInfo/RoomInfoPostRepository.java index debb6537..a565eec2 100644 --- a/src/main/java/gaji/service/domain/roomBoard/repository/RoomInfo/RoomInfoPostRepository.java +++ b/src/main/java/gaji/service/domain/roomBoard/repository/RoomInfo/RoomInfoPostRepository.java @@ -8,18 +8,26 @@ import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.time.LocalDateTime; import java.util.List; +import java.util.Optional; @Repository public interface RoomInfoPostRepository extends JpaRepository { @Query("SELECT new gaji.service.domain.roomBoard.web.dto.RoomPostResponseDto$InfoPostSummaryDto(" + "r.id, r.title, r.studyMate.user.nickname, r.createdAt, r.viewCount, SIZE(r.infoPostCommentList)) " + "FROM RoomInfoPost r " + - "WHERE r.roomBoard.id = :boardId AND r.id < :lastPostId " + - "ORDER BY r.createdAt DESC") + "WHERE r.roomBoard.id = :boardId AND r.createdAt <= :lastCreatedAt " + + "ORDER BY r.createdAt DESC, r.id DESC") List findInfoPostSummariesForInfiniteScroll( @Param("boardId") Long boardId, - @Param("lastPostId") Long lastPostId, + @Param("lastCreatedAt") LocalDateTime lastCreatedAt, Pageable pageable); + @Query("SELECT CASE " + + "WHEN EXISTS (SELECT 1 FROM RoomInfoPost r WHERE r.roomBoard.id = :boardId AND r.id = :postId) " + + "THEN (SELECT r.createdAt FROM RoomInfoPost r WHERE r.roomBoard.id = :boardId AND r.id = :postId) " + + "ELSE (SELECT MAX(r.createdAt) FROM RoomInfoPost r WHERE r.roomBoard.id = :boardId) " + + "END") + Optional findCreatedAtByIdOrEarliest(@Param("boardId") Long boardId, @Param("postId") Long postId); } diff --git a/src/main/java/gaji/service/domain/roomBoard/repository/RoomPost/RoomPostRepository.java b/src/main/java/gaji/service/domain/roomBoard/repository/RoomPost/RoomPostRepository.java index b7167798..1cfcc61b 100644 --- a/src/main/java/gaji/service/domain/roomBoard/repository/RoomPost/RoomPostRepository.java +++ b/src/main/java/gaji/service/domain/roomBoard/repository/RoomPost/RoomPostRepository.java @@ -8,17 +8,27 @@ import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.time.LocalDateTime; import java.util.List; +import java.util.Optional; @Repository public interface RoomPostRepository extends JpaRepository { @Query("SELECT new gaji.service.domain.roomBoard.web.dto.RoomPostResponseDto$PostSummaryDto(" + "r.id, r.title, r.studyMate.user.nickname, r.createdAt, r.viewCount, SIZE(r.postCommentList)) " + "FROM RoomPost r " + - "WHERE r.roomBoard.id = :boardId AND r.id < :lastPostId " + - "ORDER BY r.createdAt DESC") + "WHERE r.roomBoard.id = :boardId AND r.createdAt <= :lastCreatedAt " + + "ORDER BY r.createdAt DESC, r.id DESC") List findPostSummariesForInfiniteScroll( @Param("boardId") Long boardId, - @Param("lastPostId") Long lastPostId, + @Param("lastCreatedAt") LocalDateTime lastCreatedAt, Pageable pageable); + + @Query("SELECT CASE " + + "WHEN EXISTS (SELECT 1 FROM RoomPost r WHERE r.roomBoard.id = :boardId AND r.id = :postId) " + + "THEN (SELECT r.createdAt FROM RoomPost r WHERE r.roomBoard.id = :boardId AND r.id = :postId) " + + "ELSE (SELECT MAX(r.createdAt) FROM RoomPost r WHERE r.roomBoard.id = :boardId) " + + "END") + Optional findCreatedAtByIdOrEarliest(@Param("boardId") Long boardId, @Param("postId") Long postId); + } diff --git a/src/main/java/gaji/service/domain/roomBoard/repository/RoomTrouble/RoomTroublePostRepository.java b/src/main/java/gaji/service/domain/roomBoard/repository/RoomTrouble/RoomTroublePostRepository.java index 5b5dbdb5..a6ac8b0f 100644 --- a/src/main/java/gaji/service/domain/roomBoard/repository/RoomTrouble/RoomTroublePostRepository.java +++ b/src/main/java/gaji/service/domain/roomBoard/repository/RoomTrouble/RoomTroublePostRepository.java @@ -8,17 +8,25 @@ import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.time.LocalDateTime; import java.util.List; +import java.util.Optional; @Repository public interface RoomTroublePostRepository extends JpaRepository { @Query("SELECT new gaji.service.domain.roomBoard.web.dto.RoomPostResponseDto$TroublePostSummaryDto(" + "r.id, r.title, r.studyMate.user.nickname, r.createdAt, r.viewCount, SIZE(r.troublePostCommentList)) " + "FROM RoomTroublePost r " + - "WHERE r.roomBoard.id = :boardId AND r.id < :lastPostId " + - "ORDER BY r.createdAt DESC") + "WHERE r.roomBoard.id = :boardId AND r.createdAt <= :lastCreatedAt " + + "ORDER BY r.createdAt DESC, r.id DESC") List findTroublePostSummariesForInfiniteScroll( @Param("boardId") Long boardId, - @Param("lastPostId") Long lastPostId, + @Param("lastCreatedAt") LocalDateTime lastCreatedAt, Pageable pageable); -} + + @Query("SELECT CASE " + + "WHEN EXISTS (SELECT 1 FROM RoomTroublePost r WHERE r.roomBoard.id = :boardId AND r.id = :postId) " + + "THEN (SELECT r.createdAt FROM RoomTroublePost r WHERE r.roomBoard.id = :boardId AND r.id = :postId) " + + "ELSE (SELECT MAX(r.createdAt) FROM RoomTroublePost r WHERE r.roomBoard.id = :boardId) " + + "END") + Optional findCreatedAtByIdOrEarliest(@Param("boardId") Long boardId, @Param("postId") Long postId);} diff --git a/src/main/java/gaji/service/domain/roomBoard/repository/RoomTrouble/TroublePostCommentRepository.java b/src/main/java/gaji/service/domain/roomBoard/repository/RoomTrouble/TroublePostCommentRepository.java index e50e40b4..29a34816 100644 --- a/src/main/java/gaji/service/domain/roomBoard/repository/RoomTrouble/TroublePostCommentRepository.java +++ b/src/main/java/gaji/service/domain/roomBoard/repository/RoomTrouble/TroublePostCommentRepository.java @@ -27,4 +27,5 @@ List findCommentsWithReplies(@Param("postId") Long postId, "AND c.isReply = false " + "ORDER BY c.createdAt ASC, c.id ASC") Page findOldestComments(@Param("postId") Long postId, Pageable pageable); + } diff --git a/src/main/java/gaji/service/domain/roomBoard/service/RoomInfo/RoomInfoPostCommandServiceImpl.java b/src/main/java/gaji/service/domain/roomBoard/service/RoomInfo/RoomInfoPostCommandServiceImpl.java index 93e984ff..b0f5d1cd 100644 --- a/src/main/java/gaji/service/domain/roomBoard/service/RoomInfo/RoomInfoPostCommandServiceImpl.java +++ b/src/main/java/gaji/service/domain/roomBoard/service/RoomInfo/RoomInfoPostCommandServiceImpl.java @@ -51,11 +51,11 @@ public RoomPostResponseDto.toCreateRoomInfoPostIdDTO createRoomInfoPostIdDTO(Lon StudyMate studyMate = studyMateQueryService.findByUserIdAndRoomId(user.getId(), roomId); // 스터디룸 게시판 확인 또는 생성 - RoomBoard roomBoard = roomBoardRepository.findByRoomId(roomId) + RoomBoard roomBoard = roomBoardRepository.findRoomBoardByRoomIdAndRoomPostType(roomId, RoomPostType.ROOM_INFORMATION_POST) .orElseGet(() -> { RoomBoard newRoomBoard = RoomBoard.builder() .room(room) - .roomPostType(RoomPostType.ROOM_TROUBLE_POST) + .roomPostType(RoomPostType.ROOM_INFORMATION_POST) .name(room.getName()) .build(); return roomBoardRepository.save(newRoomBoard); diff --git a/src/main/java/gaji/service/domain/roomBoard/service/RoomInfo/RoomInfoPostQueryServiceImpl.java b/src/main/java/gaji/service/domain/roomBoard/service/RoomInfo/RoomInfoPostQueryServiceImpl.java index eb06edce..317bc428 100644 --- a/src/main/java/gaji/service/domain/roomBoard/service/RoomInfo/RoomInfoPostQueryServiceImpl.java +++ b/src/main/java/gaji/service/domain/roomBoard/service/RoomInfo/RoomInfoPostQueryServiceImpl.java @@ -1,8 +1,11 @@ package gaji.service.domain.roomBoard.service.RoomInfo; +import gaji.service.domain.enums.RoomPostType; import gaji.service.domain.roomBoard.code.RoomPostErrorStatus; +import gaji.service.domain.roomBoard.entity.RoomBoard; import gaji.service.domain.roomBoard.entity.RoomInfo.InfoPostComment; import gaji.service.domain.roomBoard.entity.RoomInfo.RoomInfoPost; +import gaji.service.domain.roomBoard.repository.RoomBoardRepository; import gaji.service.domain.roomBoard.repository.RoomInfo.InfoPostCommentRepository; import gaji.service.domain.roomBoard.repository.RoomInfo.RoomInfoPostRepository; import gaji.service.domain.roomBoard.web.dto.RoomPostResponseDto; @@ -13,6 +16,7 @@ import org.springframework.data.domain.*; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @@ -24,6 +28,7 @@ public class RoomInfoPostQueryServiceImpl implements RoomInfoPostQueryService{ private final RoomInfoPostRepository roomInfoPostRepository; private final InfoPostCommentRepository infoPostCommentRepository; private final StudyMateQueryService studyMateQueryService; + private final RoomBoardRepository roomBoardRepository; @Override public RoomInfoPost findInfoPostById(Long PostId){ return roomInfoPostRepository.findById(PostId) @@ -44,9 +49,20 @@ public InfoPostComment findPostCommentById(Long troublePostId) { } @Override - public List getNextPosts(Long boardId, Long lastPostId, int size) { - Pageable pageable = PageRequest.of(0, size, Sort.by(Sort.Direction.DESC, "createdAt")); - return roomInfoPostRepository.findInfoPostSummariesForInfiniteScroll(boardId, lastPostId,pageable); + public List getNextPosts(Long roomId, Long lastPostId, int size) { + RoomBoard roomBoard = roomBoardRepository.findRoomBoardByRoomIdAndRoomPostType(roomId, RoomPostType.ROOM_INFORMATION_POST) + .orElseThrow(() -> new RestApiException(RoomPostErrorStatus._ROOM_BOARD_NOT_FOUND)); + + LocalDateTime lastCreatedAt; + if (lastPostId == 0) { + lastCreatedAt = LocalDateTime.now(); + } else { + lastCreatedAt = roomInfoPostRepository.findCreatedAtByIdOrEarliest(roomBoard.getId(), lastPostId) + .orElseThrow(() -> new RestApiException(RoomPostErrorStatus._POST_NOT_FOUND)); + } + + Pageable pageable = PageRequest.of(0, size, Sort.by(Sort.Direction.DESC, "createdAt", "id")); + return roomInfoPostRepository.findInfoPostSummariesForInfiniteScroll(roomBoard.getId(), lastCreatedAt, pageable); } diff --git a/src/main/java/gaji/service/domain/roomBoard/service/RoomPost/RoomPostCommandServiceImpl.java b/src/main/java/gaji/service/domain/roomBoard/service/RoomPost/RoomPostCommandServiceImpl.java index 3be8b1c0..111e23fe 100644 --- a/src/main/java/gaji/service/domain/roomBoard/service/RoomPost/RoomPostCommandServiceImpl.java +++ b/src/main/java/gaji/service/domain/roomBoard/service/RoomPost/RoomPostCommandServiceImpl.java @@ -51,7 +51,7 @@ public RoomPostResponseDto.toCreateRoomPostIdDTO createRoomPost(Long roomId, Lon StudyMate studyMate = studyMateQueryService.findByUserIdAndRoomId(user.getId(), roomId); // 스터디룸 게시판 확인 또는 생성 - RoomBoard roomBoard = roomBoardRepository.findByRoomId(roomId) + RoomBoard roomBoard = roomBoardRepository.findRoomBoardByRoomIdAndRoomPostType(roomId,RoomPostType.ROOM_POST) .orElseGet(() -> { RoomBoard newRoomBoard = RoomBoard.builder() .room(room) diff --git a/src/main/java/gaji/service/domain/roomBoard/service/RoomPost/RoomPostQueryService.java b/src/main/java/gaji/service/domain/roomBoard/service/RoomPost/RoomPostQueryService.java index 44757a3f..1432b643 100644 --- a/src/main/java/gaji/service/domain/roomBoard/service/RoomPost/RoomPostQueryService.java +++ b/src/main/java/gaji/service/domain/roomBoard/service/RoomPost/RoomPostQueryService.java @@ -13,7 +13,8 @@ public interface RoomPostQueryService { // List getPaginatedTroublePosts(Long boardId, int page, int size); - List getNextPosts(Long boardId, Long lastPostId, int size); + + List getNextPosts(Long roomId, Long lastPostId, int size); RoomPost findPostById(Long PostId); diff --git a/src/main/java/gaji/service/domain/roomBoard/service/RoomPost/RoomPostQueryServiceImpl.java b/src/main/java/gaji/service/domain/roomBoard/service/RoomPost/RoomPostQueryServiceImpl.java index d79669cf..8c901dfe 100644 --- a/src/main/java/gaji/service/domain/roomBoard/service/RoomPost/RoomPostQueryServiceImpl.java +++ b/src/main/java/gaji/service/domain/roomBoard/service/RoomPost/RoomPostQueryServiceImpl.java @@ -1,8 +1,11 @@ package gaji.service.domain.roomBoard.service.RoomPost; +import gaji.service.domain.enums.RoomPostType; import gaji.service.domain.roomBoard.code.RoomPostErrorStatus; +import gaji.service.domain.roomBoard.entity.RoomBoard; import gaji.service.domain.roomBoard.entity.RoomPost.PostComment; import gaji.service.domain.roomBoard.entity.RoomPost.RoomPost; +import gaji.service.domain.roomBoard.repository.RoomBoardRepository; import gaji.service.domain.roomBoard.repository.RoomPost.PostCommentRepository; import gaji.service.domain.roomBoard.repository.RoomPost.RoomPostQueryRepository; import gaji.service.domain.roomBoard.repository.RoomPost.RoomPostRepository; @@ -14,6 +17,7 @@ import org.springframework.data.domain.*; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @@ -26,6 +30,7 @@ public class RoomPostQueryServiceImpl implements RoomPostQueryService { private final RoomPostRepository roomPostRepository; private final PostCommentRepository postCommentRepository; private final StudyMateQueryService studyMateQueryService; + private final RoomBoardRepository roomBoardRepository; @Override public List getTop3RecentPosts(Long roomId) { @@ -33,11 +38,21 @@ public List getTop3RecentPosts(Long roomId) { } @Override - public List getNextPosts(Long boardId, Long lastPostId, int size) { - Pageable pageable = PageRequest.of(0, size, Sort.by(Sort.Direction.DESC, "createdAt")); - return roomPostRepository.findPostSummariesForInfiniteScroll(boardId, lastPostId,pageable); + public List getNextPosts(Long roomId, Long lastPostId, int size) { + RoomBoard roomBoard = roomBoardRepository.findRoomBoardByRoomIdAndRoomPostType(roomId, RoomPostType.ROOM_POST) + .orElseThrow(() -> new RestApiException(RoomPostErrorStatus._ROOM_BOARD_NOT_FOUND)); + + LocalDateTime lastCreatedAt; + if (lastPostId == 0) { + lastCreatedAt = LocalDateTime.now(); + } else { + lastCreatedAt = roomPostRepository.findCreatedAtByIdOrEarliest(roomBoard.getId(), lastPostId) + .orElseThrow(() -> new RestApiException(RoomPostErrorStatus._POST_NOT_FOUND)); + } + + Pageable pageable = PageRequest.of(0, size, Sort.by(Sort.Direction.DESC, "createdAt", "id")); + return roomPostRepository.findPostSummariesForInfiniteScroll(roomBoard.getId(), lastCreatedAt, pageable); } - @Override public RoomPost findPostById(Long PostId){ return roomPostRepository.findById(PostId) diff --git a/src/main/java/gaji/service/domain/roomBoard/service/RoomTrouble/RoomTroublePostCommandServiceImpl.java b/src/main/java/gaji/service/domain/roomBoard/service/RoomTrouble/RoomTroublePostCommandServiceImpl.java index 5b3f74e1..44dbaace 100644 --- a/src/main/java/gaji/service/domain/roomBoard/service/RoomTrouble/RoomTroublePostCommandServiceImpl.java +++ b/src/main/java/gaji/service/domain/roomBoard/service/RoomTrouble/RoomTroublePostCommandServiceImpl.java @@ -68,7 +68,7 @@ public RoomPostResponseDto.toCreateRoomTroublePostIdDTO createRoomTroublePost(Lo StudyMate studyMate = studyMateQueryService.findByUserIdAndRoomId(user.getId(), roomId); // 스터디룸 게시판 확인 또는 생성 - RoomBoard roomBoard = roomBoardRepository.findByRoomId(roomId) + RoomBoard roomBoard = roomBoardRepository.findRoomBoardByRoomIdAndRoomPostType(roomId , RoomPostType.ROOM_TROUBLE_POST) .orElseGet(() -> { RoomBoard newRoomBoard = RoomBoard.builder() .room(room) diff --git a/src/main/java/gaji/service/domain/roomBoard/service/RoomTrouble/RoomTroublePostQueryServiceImpl.java b/src/main/java/gaji/service/domain/roomBoard/service/RoomTrouble/RoomTroublePostQueryServiceImpl.java index 148c93a3..66b0ffc6 100644 --- a/src/main/java/gaji/service/domain/roomBoard/service/RoomTrouble/RoomTroublePostQueryServiceImpl.java +++ b/src/main/java/gaji/service/domain/roomBoard/service/RoomTrouble/RoomTroublePostQueryServiceImpl.java @@ -1,8 +1,11 @@ package gaji.service.domain.roomBoard.service.RoomTrouble; +import gaji.service.domain.enums.RoomPostType; import gaji.service.domain.roomBoard.code.RoomPostErrorStatus; +import gaji.service.domain.roomBoard.entity.RoomBoard; import gaji.service.domain.roomBoard.entity.RoomTrouble.RoomTroublePost; import gaji.service.domain.roomBoard.entity.RoomTrouble.TroublePostComment; +import gaji.service.domain.roomBoard.repository.RoomBoardRepository; import gaji.service.domain.roomBoard.repository.RoomTrouble.RoomTroublePostRepository; import gaji.service.domain.roomBoard.repository.RoomTrouble.TroublePostCommentRepository; import gaji.service.domain.roomBoard.web.dto.RoomPostResponseDto; @@ -13,6 +16,7 @@ import org.springframework.data.domain.*; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @@ -24,6 +28,7 @@ public class RoomTroublePostQueryServiceImpl implements RoomTroublePostQueryServ private final TroublePostCommentRepository troublePostCommentRepository; private final RoomTroublePostRepository roomTroublePostRepository; private final StudyMateQueryService studyMateQueryService; + private final RoomBoardRepository roomBoardRepository; @Override public TroublePostComment findCommentByCommentId(Long commentId){ @@ -38,9 +43,20 @@ public TroublePostComment findTroublePostCommentById(Long troublePostId) { } @Override - public List getNextTroublePosts(Long boardId, Long lastPostId, int size) { - Pageable pageable = PageRequest.of(0, size, Sort.by(Sort.Direction.DESC, "createdAt")); - return roomTroublePostRepository.findTroublePostSummariesForInfiniteScroll(boardId, lastPostId,pageable); + public List getNextTroublePosts(Long roomId, Long lastPostId, int size) { + RoomBoard roomBoard = roomBoardRepository.findRoomBoardByRoomIdAndRoomPostType(roomId, RoomPostType.ROOM_TROUBLE_POST) + .orElseThrow(() -> new RestApiException(RoomPostErrorStatus._ROOM_BOARD_NOT_FOUND)); + + LocalDateTime lastCreatedAt; + if (lastPostId == 0) { + lastCreatedAt = LocalDateTime.now(); + } else { + lastCreatedAt = roomTroublePostRepository.findCreatedAtByIdOrEarliest(roomBoard.getId(), lastPostId) + .orElseThrow(() -> new RestApiException(RoomPostErrorStatus._POST_NOT_FOUND)); + } + + Pageable pageable = PageRequest.of(0, size, Sort.by(Sort.Direction.DESC, "createdAt", "id")); + return roomTroublePostRepository.findTroublePostSummariesForInfiniteScroll(roomBoard.getId(), lastCreatedAt, pageable); } diff --git a/src/main/java/gaji/service/domain/roomBoard/web/controller/RoomInfoPostController.java b/src/main/java/gaji/service/domain/roomBoard/web/controller/RoomInfoPostController.java index ad78f9b1..eeaac3be 100644 --- a/src/main/java/gaji/service/domain/roomBoard/web/controller/RoomInfoPostController.java +++ b/src/main/java/gaji/service/domain/roomBoard/web/controller/RoomInfoPostController.java @@ -146,17 +146,15 @@ public BaseResponse removeBookmark( return BaseResponse.onSuccess( "북마크가 성공적으로 삭제되었습니다."); } - @GetMapping("/{boardId}/info") + @GetMapping("/{roomId}/info/list") @Operation(summary = "게시글 무한 스크롤 조회", description = "게시글을 무한 스크롤 방식으로 조회합니다.") @ApiResponse(responseCode = "200", description = "조회 성공") - public BaseResponse> getNextTroublePosts( - @PathVariable @Parameter(description = "게시판 ID") Long boardId, + public BaseResponse> getNextInfoPosts( + @PathVariable @Parameter(description = "스터디룸 ID") Long roomId, @RequestParam @Parameter(description = "마지막으로 로드된 게시글 ID") Long lastPostId, @RequestParam(defaultValue = "10") @Parameter(description = "조회할 게시글 수") int size) { - List posts = - roomInfoPostQueryService.getNextPosts(boardId, lastPostId, size); - + roomInfoPostQueryService.getNextPosts(roomId, lastPostId, size); return BaseResponse.onSuccess(posts); } diff --git a/src/main/java/gaji/service/domain/roomBoard/web/controller/RoomPostController.java b/src/main/java/gaji/service/domain/roomBoard/web/controller/RoomPostController.java index dc43b7a1..94da029f 100644 --- a/src/main/java/gaji/service/domain/roomBoard/web/controller/RoomPostController.java +++ b/src/main/java/gaji/service/domain/roomBoard/web/controller/RoomPostController.java @@ -147,20 +147,31 @@ public BaseResponse removeBookmark( return BaseResponse.onSuccess( "북마크가 성공적으로 삭제되었습니다."); } - @GetMapping("/{boardId}/post") +// @GetMapping("/{roomId}/post/list") +// @Operation(summary = "게시글 무한 스크롤 조회", description = "게시글을 무한 스크롤 방식으로 조회합니다.") +// @ApiResponse(responseCode = "200", description = "조회 성공") +// public BaseResponse> getNextPosts( +// @PathVariable @Parameter(description = "스터디룸 ID") Long roomId, +// @RequestParam @Parameter(description = "마지막으로 로드된 게시글 ID") Long lastPostId, +// @RequestParam(defaultValue = "10") @Parameter(description = "조회할 게시글 수") int size) { +// +// List posts = +// roomPostQueryService.getNextPosts(roomId, lastPostId, size); +// +// return BaseResponse.onSuccess(posts); +// } + + @GetMapping("/{roomId}/post/list") @Operation(summary = "게시글 무한 스크롤 조회", description = "게시글을 무한 스크롤 방식으로 조회합니다.") @ApiResponse(responseCode = "200", description = "조회 성공") public BaseResponse> getNextPosts( - @PathVariable @Parameter(description = "게시판 ID") Long boardId, + @PathVariable @Parameter(description = "스터디룸 ID") Long roomId, @RequestParam @Parameter(description = "마지막으로 로드된 게시글 ID") Long lastPostId, @RequestParam(defaultValue = "10") @Parameter(description = "조회할 게시글 수") int size) { - List posts = - roomPostQueryService.getNextPosts(boardId, lastPostId, size); - + roomPostQueryService.getNextPosts(roomId, lastPostId, size); return BaseResponse.onSuccess(posts); } - @PostMapping("/post/comments/{commentId}/replies") @Operation(summary = "게시글 댓글의 답글 작성 API") public BaseResponse addReply( diff --git a/src/main/java/gaji/service/domain/roomBoard/web/controller/RoomTroublePostController.java b/src/main/java/gaji/service/domain/roomBoard/web/controller/RoomTroublePostController.java index d1f68787..4d565907 100644 --- a/src/main/java/gaji/service/domain/roomBoard/web/controller/RoomTroublePostController.java +++ b/src/main/java/gaji/service/domain/roomBoard/web/controller/RoomTroublePostController.java @@ -159,17 +159,15 @@ public BaseResponse addReply( return BaseResponse.onSuccess(RoomPostConverter.toWriteCommentDto(replyComment)); } - @GetMapping("/{boardId}/trouble") + @GetMapping("/{roomId}/trouble/list") @Operation(summary = "트러블 슈팅 게시글 무한 스크롤 조회", description = "트러블 슈팅 게시글을 무한 스크롤 방식으로 조회합니다.") @ApiResponse(responseCode = "200", description = "조회 성공") public BaseResponse> getNextTroublePosts( - @PathVariable @Parameter(description = "게시판 ID") Long boardId, + @PathVariable @Parameter(description = "게시판 ID") Long roomId, @RequestParam @Parameter(description = "마지막으로 로드된 게시글 ID") Long lastPostId, @RequestParam(defaultValue = "10") @Parameter(description = "조회할 게시글 수") int size) { - - List posts = - roomTroublePostQueryService.getNextTroublePosts(boardId, lastPostId, size); - + List posts; + posts = roomTroublePostQueryService.getNextTroublePosts(roomId, lastPostId, size); return BaseResponse.onSuccess(posts); }