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 3962873..3175a6b 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 c242ce7..e9fe4ed 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 0000000..f2a6a69 --- /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 7748cde..034cc2f 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 45158bf..152f4cd 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);