From 6744ddab2c0a667f0e89208d2e72f84cc6cc3379 Mon Sep 17 00:00:00 2001 From: ryan-dia Date: Sun, 19 Jan 2025 14:50:56 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=B9=B4=ED=85=8C=EA=B3=A0=EB=A6=AC?= =?UTF-8?q?=EB=A1=9C=EB=8F=84=20=EA=B2=8C=EC=8B=9C=EB=AC=BC=EC=9D=84=20?= =?UTF-8?q?=EA=B0=80=EC=A0=B8=EC=98=AC=20=EC=88=98=20=EC=9E=88=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/v1/announcement/PostCategory.java | 4 +-- .../controller/AnnouncementController.java | 13 +++++--- .../v1/announcement/dto/CustomPageDTO.java | 30 +++++++++++++++++++ .../repository/AnnouncementRepository.java | 10 +++++++ .../service/AnnouncementService.java | 12 ++++++-- 5 files changed, 61 insertions(+), 8 deletions(-) create mode 100644 src/main/java/run/attraction/api/v1/announcement/dto/CustomPageDTO.java diff --git a/src/main/java/run/attraction/api/v1/announcement/PostCategory.java b/src/main/java/run/attraction/api/v1/announcement/PostCategory.java index 39628732..3175a6b8 100644 --- a/src/main/java/run/attraction/api/v1/announcement/PostCategory.java +++ b/src/main/java/run/attraction/api/v1/announcement/PostCategory.java @@ -16,9 +16,9 @@ public enum PostCategory { this.name = name; } - public static PostCategory findByName(final String name) { + public static PostCategory find(final String name) { return Arrays.stream(PostCategory.values()) - .filter(postCategory -> postCategory.getName().equals(name)) + .filter(postCategory -> postCategory.name().equals(name.toUpperCase())) .findAny() .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 게시글 카테고리입니다.")); } diff --git a/src/main/java/run/attraction/api/v1/announcement/controller/AnnouncementController.java b/src/main/java/run/attraction/api/v1/announcement/controller/AnnouncementController.java index c242ce79..e9fe4ed0 100644 --- a/src/main/java/run/attraction/api/v1/announcement/controller/AnnouncementController.java +++ b/src/main/java/run/attraction/api/v1/announcement/controller/AnnouncementController.java @@ -20,6 +20,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import run.attraction.api.v1.announcement.PostCategory; +import run.attraction.api.v1.announcement.dto.CustomPageDTO; import run.attraction.api.v1.announcement.dto.PostDTO; import run.attraction.api.v1.announcement.dto.PostSummaryDTO; import run.attraction.api.v1.announcement.dto.request.PostCreateRequestDTO; @@ -71,14 +73,17 @@ public ApiResponse updatePost(@PathVariable Long postId, @RequestBody Upda @GetMapping @Operation(summary = "고정되지 않은 모든 게시물 가져오기", description = "고정되지 않은 모든 게시물을 가져오는 로직입니다.") - public ApiResponse> getPosts( + public ApiResponse> getPosts( @RequestParam(defaultValue = "0") int page, - @RequestParam(defaultValue = "10") int size + @RequestParam(defaultValue = "10") int size, + @RequestParam(required = false) String category + ) { Pageable pageable = PageRequest.of(page, size); - final Page posts = announcementService.findPosts(pageable); + final Page posts = announcementService.findPosts(pageable, category); + CustomPageDTO customPage = new CustomPageDTO<>(posts, PostCategory.find(category)); - return ApiResponse.from(HttpStatus.OK, "성공", posts); + return ApiResponse.from(HttpStatus.OK, "성공", customPage); } @GetMapping("/pinned") diff --git a/src/main/java/run/attraction/api/v1/announcement/dto/CustomPageDTO.java b/src/main/java/run/attraction/api/v1/announcement/dto/CustomPageDTO.java new file mode 100644 index 00000000..f2a6a69c --- /dev/null +++ b/src/main/java/run/attraction/api/v1/announcement/dto/CustomPageDTO.java @@ -0,0 +1,30 @@ +package run.attraction.api.v1.announcement.dto; + +import java.util.List; +import org.springframework.data.domain.Page; +import run.attraction.api.v1.announcement.PostCategory; + +public record CustomPageDTO( + long totalElements, + int totalPages, + boolean first, + boolean last, + int size, + int number, + PostCategory category, + List content +) { + // 생성자: Page 객체를 받아 필드 초기화 + public CustomPageDTO(Page page, PostCategory category) { + this( + page.getTotalElements(), + page.getTotalPages(), + page.isFirst(), + page.isLast(), + page.getSize(), + page.getNumber(), + category, + page.getContent() + ); + } +} diff --git a/src/main/java/run/attraction/api/v1/announcement/repository/AnnouncementRepository.java b/src/main/java/run/attraction/api/v1/announcement/repository/AnnouncementRepository.java index 7748cde0..034cc2f3 100644 --- a/src/main/java/run/attraction/api/v1/announcement/repository/AnnouncementRepository.java +++ b/src/main/java/run/attraction/api/v1/announcement/repository/AnnouncementRepository.java @@ -7,6 +7,7 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import run.attraction.api.v1.announcement.Post; +import run.attraction.api.v1.announcement.PostCategory; public interface AnnouncementRepository extends JpaRepository { @@ -65,4 +66,13 @@ SELECT COUNT(p) WHERE p.isPinned = true """) int countPinnedPosts(); + + + @Query(""" + SELECT p + FROM Post p + WHERE p.postCategory = :postCategory + AND p.isPinned = false + """) + Page findPostsByPostCategory(Pageable pageable, PostCategory postCategory); } diff --git a/src/main/java/run/attraction/api/v1/announcement/service/AnnouncementService.java b/src/main/java/run/attraction/api/v1/announcement/service/AnnouncementService.java index 45158bf7..152f4cdb 100644 --- a/src/main/java/run/attraction/api/v1/announcement/service/AnnouncementService.java +++ b/src/main/java/run/attraction/api/v1/announcement/service/AnnouncementService.java @@ -74,13 +74,21 @@ public void updatePostById(final Long postId, final UpdatePostRequestDTO request checkPinnedPostCount(); } - beforePost.update(request.title(), request.content(), PostCategory.valueOf(request.postCategory()), + beforePost.update(request.title(), request.content(), PostCategory.find(request.postCategory()), request.isPinned()); announcementRepository.save(beforePost); } @Transactional(readOnly = true) - public Page findPosts(Pageable pageable) { + public Page findPosts(Pageable pageable, String category) { + if (category != null) { + final PostCategory postCategory = PostCategory.find(category); + final Page postsByPostCategory = announcementRepository.findPostsByPostCategory(pageable, + postCategory); + + return postsByPostCategory.map(PostSummaryDTO::new); + } + final Page posts = announcementRepository.findAllWithoutPinned(pageable); return posts.map(PostSummaryDTO::new);