diff --git a/src/main/java/com/capstone/BnagFer/domain/board/controller/BoardController.java b/src/main/java/com/capstone/BnagFer/domain/board/controller/BoardController.java index f711a753..7246495f 100644 --- a/src/main/java/com/capstone/BnagFer/domain/board/controller/BoardController.java +++ b/src/main/java/com/capstone/BnagFer/domain/board/controller/BoardController.java @@ -18,6 +18,7 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -167,4 +168,16 @@ public ApiResponse> getBlockedUsers(@LoginUser return ApiResponse.onSuccess(blockedUsers); } + @Operation(summary = "제목으로 게시판 검색", description = "제목으로 게시판을 검색. 페이징 적용, 생성 날짜 기준 내림차순 정렬.") + @GetMapping("/search") + public ApiResponse> searchTitle( + @RequestParam(value ="title",required = false) String title, + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "10") int size, + @LoginUser User user) { + Pageable pageable = PageRequest.of(page, size, Sort.by(Sort.Direction.DESC, "createdAt")); + Page boardLists = boardQueryService.searchByTitle(title, user, pageable); + return ApiResponse.onSuccess(boardLists); + } + } diff --git a/src/main/java/com/capstone/BnagFer/domain/board/repository/BoardRepository.java b/src/main/java/com/capstone/BnagFer/domain/board/repository/BoardRepository.java index 75a026eb..cb768a6c 100644 --- a/src/main/java/com/capstone/BnagFer/domain/board/repository/BoardRepository.java +++ b/src/main/java/com/capstone/BnagFer/domain/board/repository/BoardRepository.java @@ -15,4 +15,6 @@ public interface BoardRepository extends JpaRepository { Page findByUserId(Long userId, Pageable pageable); + Page findByBoardTitleContaining(String title, Pageable pageable); + } diff --git a/src/main/java/com/capstone/BnagFer/domain/board/service/BoardQueryService.java b/src/main/java/com/capstone/BnagFer/domain/board/service/BoardQueryService.java index be92438a..0971828a 100644 --- a/src/main/java/com/capstone/BnagFer/domain/board/service/BoardQueryService.java +++ b/src/main/java/com/capstone/BnagFer/domain/board/service/BoardQueryService.java @@ -76,7 +76,7 @@ public BoardDetailResponseDto getBoard(User user, Long boardId) { } Long commentCount = redisUtil.boardGetCommentCount(boardId); - if(commentCount == null){ + if (commentCount == null) { commentCount = (long) board.getComments().size(); redisUtil.boardSaveCommentCount(boardId, commentCount); } @@ -97,9 +97,20 @@ public Page getBoardsByUserId(Long userId, Pageable pageable) { return boardRepository.findByUserId(userId, pageable); } + //자유게시판 검색 기능 + public Page searchByTitle(String title, User user, Pageable pageable) { + if (title == null) title = ""; + Page byTitleContaining = boardRepository.findByBoardTitleContaining(title, pageable); + // 사용자가 차단한 다른 사용자들의 ID 목록을 가져온다 + List blockedUserIds = boardBlockRepository.findIsBlockUserIdsByBlockUserId(user.getId()); + // 차단한 사용자의 게시글이 제외된 리스트 생성 + List filteredBoards = byTitleContaining.getContent().stream() + .filter(board -> !blockedUserIds.contains(board.getUser().getId()) || board.getUser().getId().equals(user.getId())) + .map(BoardListDto::from) + .toList(); + return new PageImpl<>(filteredBoards, pageable, byTitleContaining.getTotalElements()); + } public boolean isUserBlocked(User blockUser, User isBlockedUser) { return boardBlockRepository.existsByBlockUserAndIsBlockedUser(blockUser, isBlockedUser); } - - }