From 9ceecd991bba1fd90db872290316965179a8b75f Mon Sep 17 00:00:00 2001 From: seongjunkim Date: Sat, 21 Dec 2024 13:06:06 +0900 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20=EB=82=B4=20=EA=B2=8C=EC=8B=9C?= =?UTF-8?q?=EA=B8=80=20=EC=A1=B0=ED=9A=8C=20API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bigant/gaeme/controller/BoardController.java | 7 ++++++- .../bigant/gaeme/repository/BoardRepository.java | 2 ++ .../gaeme/repository/BoardTreePathRepository.java | 2 ++ .../com/bigant/gaeme/service/BoardService.java | 15 +++++++++++++++ 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/bigant/gaeme/controller/BoardController.java b/src/main/java/com/bigant/gaeme/controller/BoardController.java index bfd50e0..65cf549 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 (token.isPresent()) { + return boardService.readMine(pageable, ancestorId, 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..0f827a1 100644 --- a/src/main/java/com/bigant/gaeme/service/BoardService.java +++ b/src/main/java/com/bigant/gaeme/service/BoardService.java @@ -89,6 +89,20 @@ public Slice readDefault(Pageable pageable, Optional ancestorId) return recentBoard(pageable); } + public Slice readMine(Pageable pageable, Optional ancestorId, Long requestId) { + if (ancestorId.isPresent()) { + Pageable newPageable = PageRequest.of(pageable.getPageNumber(), pageable.getPageSize()); + Slice boardTreePaths = boardTreePathRepository.findAllByAncestor_IdAndAncestor_User_Id(ancestorId.get(), requestId, newPageable); + + return new SliceImpl<>(boardTreePaths.map(boardTreePath -> modelMapper.map(boardTreePath.getDescendant(), BoardDto.class)).toList(), + newPageable, + boardTreePaths.hasNext()); + } + 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 +129,5 @@ public BoardDto update(Long requesterId, BoardUpdateRequestDto dto) { board.update(dto); return modelMapper.map(board, BoardDto.class); } + } From 113f8a7c5fbb1edb5f10f0f602576f82cfba4da8 Mon Sep 17 00:00:00 2001 From: seongjunkim Date: Sat, 21 Dec 2024 13:33:36 +0900 Subject: [PATCH 2/5] =?UTF-8?q?fix:=20=EB=82=B4=20=EA=B2=8C=EC=8B=9C?= =?UTF-8?q?=EA=B8=80=20=EC=A1=B0=ED=9A=8C=20API=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 중복로직이라 불필요한 부분 삭제 --- src/main/java/com/bigant/gaeme/service/BoardService.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/main/java/com/bigant/gaeme/service/BoardService.java b/src/main/java/com/bigant/gaeme/service/BoardService.java index 0f827a1..41c8cb5 100644 --- a/src/main/java/com/bigant/gaeme/service/BoardService.java +++ b/src/main/java/com/bigant/gaeme/service/BoardService.java @@ -90,14 +90,6 @@ public Slice readDefault(Pageable pageable, Optional ancestorId) } public Slice readMine(Pageable pageable, Optional ancestorId, Long requestId) { - if (ancestorId.isPresent()) { - Pageable newPageable = PageRequest.of(pageable.getPageNumber(), pageable.getPageSize()); - Slice boardTreePaths = boardTreePathRepository.findAllByAncestor_IdAndAncestor_User_Id(ancestorId.get(), requestId, newPageable); - - return new SliceImpl<>(boardTreePaths.map(boardTreePath -> modelMapper.map(boardTreePath.getDescendant(), BoardDto.class)).toList(), - newPageable, - boardTreePaths.hasNext()); - } Slice boards = boardRepository.findAllByUser_Id(requestId, pageable); return new SliceImpl<>(boards.stream().map(board -> modelMapper.map(board, BoardDto.class)).toList(), pageable, boards.hasNext()); From fc0b743315c72fffa44981c4434f8e0956f6e273 Mon Sep 17 00:00:00 2001 From: seongjunkim Date: Sat, 21 Dec 2024 13:36:18 +0900 Subject: [PATCH 3/5] =?UTF-8?q?fix:=20=EB=82=B4=20=EA=B2=8C=EC=8B=9C?= =?UTF-8?q?=EA=B8=80=20=EC=A1=B0=ED=9A=8C=20API=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 불필요한 인자 제거 --- .../java/com/bigant/gaeme/controller/BoardController.java | 4 ++-- src/main/java/com/bigant/gaeme/service/BoardService.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/bigant/gaeme/controller/BoardController.java b/src/main/java/com/bigant/gaeme/controller/BoardController.java index 65cf549..b6ae8fd 100644 --- a/src/main/java/com/bigant/gaeme/controller/BoardController.java +++ b/src/main/java/com/bigant/gaeme/controller/BoardController.java @@ -53,8 +53,8 @@ public Slice read( @RequestParam(required = false) Optional ancestorId, @RequestHeader(HttpHeaders.AUTHORIZATION) Optional token ) { - if (token.isPresent()) { - return boardService.readMine(pageable, ancestorId, jwtBuilder.decryptJwt(token.get())); + 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/service/BoardService.java b/src/main/java/com/bigant/gaeme/service/BoardService.java index 41c8cb5..7c7af80 100644 --- a/src/main/java/com/bigant/gaeme/service/BoardService.java +++ b/src/main/java/com/bigant/gaeme/service/BoardService.java @@ -89,7 +89,7 @@ public Slice readDefault(Pageable pageable, Optional ancestorId) return recentBoard(pageable); } - public Slice readMine(Pageable pageable, Optional ancestorId, Long requestId) { + 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()); From 4b3c194be5a5be378763b5b841dc47fd31ebbb02 Mon Sep 17 00:00:00 2001 From: seongjunkim Date: Sat, 21 Dec 2024 13:48:08 +0900 Subject: [PATCH 4/5] =?UTF-8?q?feat:=20=EB=82=B4=20=EA=B2=8C=EC=8B=9C?= =?UTF-8?q?=EA=B8=80=20=EC=A1=B0=ED=9A=8C=20API=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/board.adoc | 3 + .../gaeme/controller/BoardControllerTest.java | 46 +++++++++++++- .../gaeme/service/BoardServiceTest.java | 60 +++++++++++++++++-- 3 files changed, 103 insertions(+), 6 deletions(-) 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/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..d8cfb04 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()); + } + } From 15577d3fa150b7b3ef87d74a347a940d9497fe0a Mon Sep 17 00:00:00 2001 From: seongjunkim Date: Sat, 21 Dec 2024 13:55:50 +0900 Subject: [PATCH 5/5] fix: checkstyle --- src/test/java/com/bigant/gaeme/service/BoardServiceTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/bigant/gaeme/service/BoardServiceTest.java b/src/test/java/com/bigant/gaeme/service/BoardServiceTest.java index d8cfb04..d0e36a2 100644 --- a/src/test/java/com/bigant/gaeme/service/BoardServiceTest.java +++ b/src/test/java/com/bigant/gaeme/service/BoardServiceTest.java @@ -313,7 +313,7 @@ public BoardServiceTest(BoardRepository boardRepository, BoardTreePathRepository } @Test - void 내_게시글_조회_성공() { + void 본인_게시글_조회_성공() { //given User mine = TestFixture.getTestUser(); User another = TestFixture.getTestUser();