diff --git a/src/docs/asciidoc/board.adoc b/src/docs/asciidoc/board.adoc index b3ce4b4..a180b0f 100644 --- a/src/docs/asciidoc/board.adoc +++ b/src/docs/asciidoc/board.adoc @@ -9,5 +9,8 @@ operation::board/delete[snippets="http-request,http-response,request-fields"] === 게시글 조회 operation::board/get[snippets="http-request,http-response,query-parameters"] +=== 내 게시글 조회 +operation::my-board/get[snippets="http-request,http-response,query-parameters"] + === 게시글 수정 operation::board/patch[snippets="http-request,http-response,request-fields"] \ No newline at end of file diff --git a/src/main/java/com/bigant/gaeme/controller/BoardController.java b/src/main/java/com/bigant/gaeme/controller/BoardController.java index bfd50e0..b6ae8fd 100644 --- a/src/main/java/com/bigant/gaeme/controller/BoardController.java +++ b/src/main/java/com/bigant/gaeme/controller/BoardController.java @@ -7,6 +7,7 @@ import java.util.Optional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; import org.springframework.data.domain.Sort; @@ -49,8 +50,12 @@ public BoardDto delete( @GetMapping public Slice read( @PageableDefault(sort = "createdAt", direction = Sort.Direction.DESC) Pageable pageable, - @RequestParam(required = false) Optional ancestorId + @RequestParam(required = false) Optional ancestorId, + @RequestHeader(HttpHeaders.AUTHORIZATION) Optional token ) { + if (ancestorId.isEmpty() && token.isPresent()) { + return boardService.readMine(pageable, jwtBuilder.decryptJwt(token.get())); + } return boardService.readDefault(pageable, ancestorId); } diff --git a/src/main/java/com/bigant/gaeme/repository/BoardRepository.java b/src/main/java/com/bigant/gaeme/repository/BoardRepository.java index 30d0471..3d32bb9 100644 --- a/src/main/java/com/bigant/gaeme/repository/BoardRepository.java +++ b/src/main/java/com/bigant/gaeme/repository/BoardRepository.java @@ -11,4 +11,6 @@ public interface BoardRepository extends JpaRepository { Slice findAllBy(Pageable pageable); + Slice findAllByUser_Id(Long userId, Pageable pageable); + } diff --git a/src/main/java/com/bigant/gaeme/repository/BoardTreePathRepository.java b/src/main/java/com/bigant/gaeme/repository/BoardTreePathRepository.java index 49eaab5..525f53c 100644 --- a/src/main/java/com/bigant/gaeme/repository/BoardTreePathRepository.java +++ b/src/main/java/com/bigant/gaeme/repository/BoardTreePathRepository.java @@ -10,4 +10,6 @@ public interface BoardTreePathRepository extends JpaRepository findAllByAncestor_Id(Long boardId, Pageable pageable); + Slice findAllByAncestor_IdAndAncestor_User_Id(Long boardId, Long userId, Pageable pageable); + } diff --git a/src/main/java/com/bigant/gaeme/service/BoardService.java b/src/main/java/com/bigant/gaeme/service/BoardService.java index f761111..7c7af80 100644 --- a/src/main/java/com/bigant/gaeme/service/BoardService.java +++ b/src/main/java/com/bigant/gaeme/service/BoardService.java @@ -89,6 +89,12 @@ public Slice readDefault(Pageable pageable, Optional ancestorId) return recentBoard(pageable); } + public Slice readMine(Pageable pageable, Long requestId) { + Slice boards = boardRepository.findAllByUser_Id(requestId, pageable); + + return new SliceImpl<>(boards.stream().map(board -> modelMapper.map(board, BoardDto.class)).toList(), pageable, boards.hasNext()); + } + private Slice readDescendant(Pageable pageable, Long ancestorId) { Pageable newPageable = PageRequest.of(pageable.getPageNumber(), pageable.getPageSize()); Slice boardTreePaths = boardTreePathRepository.findAllByAncestor_Id(ancestorId, newPageable); @@ -115,4 +121,5 @@ public BoardDto update(Long requesterId, BoardUpdateRequestDto dto) { board.update(dto); return modelMapper.map(board, BoardDto.class); } + } diff --git a/src/test/java/com/bigant/gaeme/controller/BoardControllerTest.java b/src/test/java/com/bigant/gaeme/controller/BoardControllerTest.java index 40210a9..accdb58 100644 --- a/src/test/java/com/bigant/gaeme/controller/BoardControllerTest.java +++ b/src/test/java/com/bigant/gaeme/controller/BoardControllerTest.java @@ -221,7 +221,7 @@ private RestDocumentationResultHandler getBoardGetResultHandler() { preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()), queryParameters(parameterWithName("pageNum").description("조회할 페이지 번호"), - parameterWithName("ancestorId").description("댓글 조회시 부모 보드 아이디")) + parameterWithName("ancestorId").optional().description("댓글 조회시 부모 보드 아이디")) ); } @@ -274,4 +274,48 @@ RestDocumentationResultHandler getBoardPatchResultHandler() { ); } + @Test + void getMyBoard() throws Exception { + //given + User testUser = TestFixture.getTestUser(); + BDDMockito.given(boardService.readMine(BDDMockito.any(), BDDMockito.any())).willReturn( + new SliceImpl<>( + List.of( + BoardDto.builder() + .user(modelMapper.map(testUser, UserDto.class)) + .id(2L) + .content("cccccc") + .likeCnt(0L) + .createdAt(LocalDateTime.now()) + .updatedAt(LocalDateTime.now()) + .isDeleted(false) + .pictureUrls(List.of()) + .build() + ), + PageRequest.of(1, 10, Sort.Direction.DESC, "createdAt"), + false + ) + ); + + //when + mvc.perform(get("/v1/board") + .param("pageNum", "1") + .header(HttpHeaders.AUTHORIZATION, "token")) + .andDo(print()) + .andExpect(status().isOk()) + .andDo(getMyBoardGetResultHandler()); + + //then + BDDMockito.then(boardService).should().readMine(BDDMockito.any(), BDDMockito.any()); + } + + private RestDocumentationResultHandler getMyBoardGetResultHandler() { + return document("my-board/get", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + queryParameters(parameterWithName("pageNum").description("조회할 페이지 번호"), + parameterWithName("ancestorId").optional().description("댓글 조회시 부모 보드 아이디")) + ); + } + } diff --git a/src/test/java/com/bigant/gaeme/service/BoardServiceTest.java b/src/test/java/com/bigant/gaeme/service/BoardServiceTest.java index b91b095..d0e36a2 100644 --- a/src/test/java/com/bigant/gaeme/service/BoardServiceTest.java +++ b/src/test/java/com/bigant/gaeme/service/BoardServiceTest.java @@ -9,7 +9,6 @@ import com.bigant.gaeme.repository.entity.Board; import com.bigant.gaeme.repository.entity.BoardTreePath; import com.bigant.gaeme.repository.entity.User; -import java.time.LocalDateTime; import java.util.List; import java.util.Optional; import org.junit.jupiter.api.Assertions; @@ -18,10 +17,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.boot.test.mock.mockito.SpyBean; -import org.springframework.data.auditing.AuditingHandler; -import org.springframework.data.auditing.DateTimeProvider; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; @@ -317,4 +312,59 @@ public BoardServiceTest(BoardRepository boardRepository, BoardTreePathRepository .build()); } + @Test + void 본인_게시글_조회_성공() { + //given + User mine = TestFixture.getTestUser(); + User another = TestFixture.getTestUser(); + another.setName("tester2"); + Board testBoard = TestFixture.getTestBoard(another); + Pageable pageable = PageRequest.of(0, 10, Sort.Direction.DESC, "createdAt"); + userRepository.save(mine); + userRepository.save(another); + boardRepository.save(Board.builder() + .user(mine) + .content("aaaaa") + .likeCnt(0L) + .build()); + boardRepository.save(Board.builder() + .user(mine) + .content("bbbbb") + .likeCnt(0L) + .build()); + boardRepository.save(Board.builder() + .user(another) + .content("cccccc") + .likeCnt(0L) + .build()); + boardRepository.save(testBoard); + + //when + Slice result = boardService.readMine(pageable, mine.getId()); + + //then + Assertions.assertEquals(List.of( + BoardDto.builder() + .user(modelMapper.map(mine, UserDto.class)) + .id(result.getContent().get(0).getId()) + .createdAt(result.getContent().get(0).getCreatedAt()) + .updatedAt(result.getContent().get(0).getUpdatedAt()) + .content("bbbbb") + .likeCnt(0L) + .pictureUrls(List.of()) + .isDeleted(false) + .build(), + BoardDto.builder() + .user(modelMapper.map(mine, UserDto.class)) + .id(result.getContent().get(1).getId()) + .createdAt(result.getContent().get(1).getCreatedAt()) + .updatedAt(result.getContent().get(1).getUpdatedAt()) + .content("aaaaa") + .likeCnt(0L) + .pictureUrls(List.of()) + .isDeleted(false) + .build() + ), result.getContent()); + } + }