diff --git a/src/main/java/com/gamegoo/gamegoo_v2/content/board/controller/BoardController.java b/src/main/java/com/gamegoo/gamegoo_v2/content/board/controller/BoardController.java index 639025a9..1aebbcd0 100644 --- a/src/main/java/com/gamegoo/gamegoo_v2/content/board/controller/BoardController.java +++ b/src/main/java/com/gamegoo/gamegoo_v2/content/board/controller/BoardController.java @@ -10,6 +10,7 @@ import com.gamegoo.gamegoo_v2.content.board.dto.response.BoardInsertResponse; import com.gamegoo.gamegoo_v2.content.board.dto.response.BoardResponse; import com.gamegoo.gamegoo_v2.content.board.dto.response.BoardUpdateResponse; +import com.gamegoo.gamegoo_v2.content.board.dto.response.MyBoardResponse; import com.gamegoo.gamegoo_v2.content.board.service.BoardFacadeService; import com.gamegoo.gamegoo_v2.core.common.ApiResponse; import com.gamegoo.gamegoo_v2.core.common.annotation.ValidPage; @@ -110,5 +111,12 @@ public ApiResponse delete(@PathVariable Long boardId, @AuthMember Member return ApiResponse.ok("게시글을 삭제하였습니다."); } + @GetMapping("/my") + @Operation(summary = "내가 작성한 게시판 글 목록 조회 API", description = "내가 작성한 게시판 글을 조회하는 API 입니다. 페이지 당 10개의 게시물이 표시됩니다.") + @Parameter(name = "pageIdx", description = "조회할 페이지 번호를 입력해주세요.") + public ApiResponse getMyBoardList(@ValidPage @RequestParam(name = "page") Integer page, + @AuthMember Member member) { + return ApiResponse.ok(boardFacadeService.getMyBoardList(member, page)); + } } diff --git a/src/main/java/com/gamegoo/gamegoo_v2/content/board/dto/response/MyBoardListResponse.java b/src/main/java/com/gamegoo/gamegoo_v2/content/board/dto/response/MyBoardListResponse.java new file mode 100644 index 00000000..2f0b436d --- /dev/null +++ b/src/main/java/com/gamegoo/gamegoo_v2/content/board/dto/response/MyBoardListResponse.java @@ -0,0 +1,39 @@ +package com.gamegoo.gamegoo_v2.content.board.dto.response; + +import com.gamegoo.gamegoo_v2.account.member.domain.Member; +import com.gamegoo.gamegoo_v2.account.member.domain.Tier; +import com.gamegoo.gamegoo_v2.content.board.domain.Board; +import lombok.Builder; +import lombok.Getter; + +import java.time.LocalDateTime; + +@Getter +@Builder +public class MyBoardListResponse { + + long boardId; + long memberId; + Integer profileImage; + String gameName; + String tag; + Tier tier; + int rank; + String contents; + LocalDateTime createdAt; + + public static MyBoardListResponse of(Board board) { + Member member = board.getMember(); + return MyBoardListResponse.builder() + .boardId(board.getId()) + .memberId(member.getId()) + .profileImage(board.getBoardProfileImage()) + .gameName(member.getGameName()) + .tag(member.getTag()) + .tier(member.getTier()) + .rank(member.getGameRank()) + .createdAt(board.getCreatedAt()) + .build(); + } + +} diff --git a/src/main/java/com/gamegoo/gamegoo_v2/content/board/dto/response/MyBoardResponse.java b/src/main/java/com/gamegoo/gamegoo_v2/content/board/dto/response/MyBoardResponse.java new file mode 100644 index 00000000..c5a6d450 --- /dev/null +++ b/src/main/java/com/gamegoo/gamegoo_v2/content/board/dto/response/MyBoardResponse.java @@ -0,0 +1,37 @@ +package com.gamegoo.gamegoo_v2.content.board.dto.response; + +import com.gamegoo.gamegoo_v2.content.board.domain.Board; +import lombok.Builder; +import lombok.Getter; +import org.springframework.data.domain.Page; + +import java.util.List; +import java.util.stream.Collectors; + +@Getter +@Builder +public class MyBoardResponse { + + Integer totalPage; + Integer totalCount; + List myBoards; + + public static MyBoardResponse of(Page boardPage) { + // 전체 페이지/개수 추출 + int totalCount = (int) boardPage.getTotalElements(); + int totalPage = (boardPage.getTotalPages() == 0) ? 1 : boardPage.getTotalPages(); + + // Board -> MyBoardListResponse 변환 + List boardList = boardPage.getContent().stream() + .map(MyBoardListResponse::of) + .collect(Collectors.toList()); + + // DTO 생성 + return MyBoardResponse.builder() + .totalPage(totalPage) + .totalCount(totalCount) + .myBoards(boardList) + .build(); + } + +} diff --git a/src/main/java/com/gamegoo/gamegoo_v2/content/board/repository/BoardRepository.java b/src/main/java/com/gamegoo/gamegoo_v2/content/board/repository/BoardRepository.java index 10e15d11..a07e4b39 100644 --- a/src/main/java/com/gamegoo/gamegoo_v2/content/board/repository/BoardRepository.java +++ b/src/main/java/com/gamegoo/gamegoo_v2/content/board/repository/BoardRepository.java @@ -26,6 +26,8 @@ Page findByFilters(@Param("mode") Integer mode, Optional findByIdAndDeleted(Long boardId, boolean b); - + + + Page findByMemberIdAndDeletedFalse(Long memberId, Pageable pageable); } diff --git a/src/main/java/com/gamegoo/gamegoo_v2/content/board/service/BoardFacadeService.java b/src/main/java/com/gamegoo/gamegoo_v2/content/board/service/BoardFacadeService.java index ed0378a2..254bf1b6 100644 --- a/src/main/java/com/gamegoo/gamegoo_v2/content/board/service/BoardFacadeService.java +++ b/src/main/java/com/gamegoo/gamegoo_v2/content/board/service/BoardFacadeService.java @@ -11,6 +11,7 @@ import com.gamegoo.gamegoo_v2.content.board.dto.response.BoardInsertResponse; import com.gamegoo.gamegoo_v2.content.board.dto.response.BoardResponse; import com.gamegoo.gamegoo_v2.content.board.dto.response.BoardUpdateResponse; +import com.gamegoo.gamegoo_v2.content.board.dto.response.MyBoardResponse; import com.gamegoo.gamegoo_v2.core.common.annotation.ValidPage; import com.gamegoo.gamegoo_v2.social.block.service.BlockService; import com.gamegoo.gamegoo_v2.social.friend.service.FriendService; @@ -117,5 +118,13 @@ public void deleteBoard(Member member, Long boardId) { boardService.deleteBoard(boardId, member.getId()); } + /** + * 내가 작성한 게시글 목록 조회 (파사드) + */ + public MyBoardResponse getMyBoardList(Member member, int pageIdx) { + Page boardPage = boardService.getMyBoards(member.getId(), pageIdx); + return MyBoardResponse.of(boardPage); + } + } diff --git a/src/main/java/com/gamegoo/gamegoo_v2/content/board/service/BoardService.java b/src/main/java/com/gamegoo/gamegoo_v2/content/board/service/BoardService.java index be05d8ef..a87d24a0 100644 --- a/src/main/java/com/gamegoo/gamegoo_v2/content/board/service/BoardService.java +++ b/src/main/java/com/gamegoo/gamegoo_v2/content/board/service/BoardService.java @@ -23,6 +23,7 @@ public class BoardService { private final BoardRepository boardRepository; public static final int PAGE_SIZE = 20; + public static final int MY_PAGE_SIZE = 10; /** * 게시글 엔티티 생성 및 저장 @@ -112,6 +113,18 @@ public void deleteBoard(Long boardId, Long memberId) { boardRepository.save(board); } + /** + * 내가 작성한 게시글(Page) 조회 + */ + public Page getMyBoards(Long memberId, int pageIdx) { + if (pageIdx <= 0) { + throw new IllegalArgumentException("pageIdx는 1 이상의 값이어야 합니다."); + } + // PageRequest.of의 첫 번째 인자(pageIdx - 1)는 0-based index + Pageable pageable = PageRequest.of(pageIdx - 1, MY_PAGE_SIZE, Sort.by(Sort.Direction.DESC, "createdAt")); + return boardRepository.findByMemberIdAndDeletedFalse(memberId, pageable); + } + /** * Board 저장 */