Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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("존재하지 않는 게시글 카테고리입니다."));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -71,14 +73,17 @@ public ApiResponse<Void> updatePost(@PathVariable Long postId, @RequestBody Upda

@GetMapping
@Operation(summary = "고정되지 않은 모든 게시물 가져오기", description = "고정되지 않은 모든 게시물을 가져오는 로직입니다.")
public ApiResponse<Page<PostSummaryDTO>> getPosts(
public ApiResponse<CustomPageDTO<PostSummaryDTO>> 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<PostSummaryDTO> posts = announcementService.findPosts(pageable);
final Page<PostSummaryDTO> posts = announcementService.findPosts(pageable, category);
CustomPageDTO<PostSummaryDTO> customPage = new CustomPageDTO<>(posts, PostCategory.find(category));

return ApiResponse.from(HttpStatus.OK, "성공", posts);
return ApiResponse.from(HttpStatus.OK, "성공", customPage);
}

@GetMapping("/pinned")
Expand Down
Original file line number Diff line number Diff line change
@@ -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<T>(
long totalElements,
int totalPages,
boolean first,
boolean last,
int size,
int number,
PostCategory category,
List<T> content
) {
// 생성자: Page 객체를 받아 필드 초기화
public CustomPageDTO(Page<T> page, PostCategory category) {
this(
page.getTotalElements(),
page.getTotalPages(),
page.isFirst(),
page.isLast(),
page.getSize(),
page.getNumber(),
category,
page.getContent()
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<Post, Long> {

Expand Down Expand Up @@ -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<Post> findPostsByPostCategory(Pageable pageable, PostCategory postCategory);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<PostSummaryDTO> findPosts(Pageable pageable) {
public Page<PostSummaryDTO> findPosts(Pageable pageable, String category) {
if (category != null) {
final PostCategory postCategory = PostCategory.find(category);
final Page<Post> postsByPostCategory = announcementRepository.findPostsByPostCategory(pageable,
postCategory);

return postsByPostCategory.map(PostSummaryDTO::new);
}

final Page<Post> posts = announcementRepository.findAllWithoutPinned(pageable);

return posts.map(PostSummaryDTO::new);
Expand Down
Loading