diff --git a/src/main/java/com/handong/cra/crawebbackend/board/repository/BoardRepository.java b/src/main/java/com/handong/cra/crawebbackend/board/repository/BoardRepository.java index 9ace391..7c2a721 100644 --- a/src/main/java/com/handong/cra/crawebbackend/board/repository/BoardRepository.java +++ b/src/main/java/com/handong/cra/crawebbackend/board/repository/BoardRepository.java @@ -31,4 +31,6 @@ public interface BoardRepository extends JpaRepository { List findByTags_Name(String tagName); + Page findByTags_IdAndDeletedFalse(Long tagId, Pageable pageable); + } diff --git a/src/main/java/com/handong/cra/crawebbackend/tag/controller/TagController.java b/src/main/java/com/handong/cra/crawebbackend/tag/controller/TagController.java index a15d184..693424b 100644 --- a/src/main/java/com/handong/cra/crawebbackend/tag/controller/TagController.java +++ b/src/main/java/com/handong/cra/crawebbackend/tag/controller/TagController.java @@ -1,10 +1,15 @@ package com.handong.cra.crawebbackend.tag.controller; +import com.handong.cra.crawebbackend.board.domain.BoardOrderBy; +import com.handong.cra.crawebbackend.board.dto.PageBoardDataDto; +import com.handong.cra.crawebbackend.board.dto.response.ResPageBoardDto; +import com.handong.cra.crawebbackend.exception.board.PageSizeLimitExceededException; import com.handong.cra.crawebbackend.tag.dto.request.ReqCreateTagDto; import com.handong.cra.crawebbackend.tag.dto.request.ReqUpdateTagDto; import com.handong.cra.crawebbackend.tag.dto.response.ResTagDto; import com.handong.cra.crawebbackend.tag.service.TagService; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -20,6 +25,9 @@ public class TagController { private final TagService tagService; + @Value("${spring.data.page.MAX_PER_PAGE}") + private Integer MAX_PAGE_SIZE; + @GetMapping public ResponseEntity> getAllTags() { return ResponseEntity.ok(tagService.getAllTags()); @@ -34,8 +42,23 @@ public ResponseEntity> searchByTagName(@RequestParam String } @GetMapping("/{id}") - public ResponseEntity getTagById(@PathVariable Long id) { - return ResponseEntity.ok(tagService.getTagById(id)); + public ResponseEntity getTagById( + @PathVariable Long id, + @RequestParam(required = false, defaultValue = "0") final Long page, + @RequestParam(required = false, defaultValue = "10") final Integer perPage, + @RequestParam(required = false, defaultValue = "0") final Integer orderBy, + @RequestParam(required = false, defaultValue = "true") final Boolean isASC + ) { + if (perPage > MAX_PAGE_SIZE) { + throw new PageSizeLimitExceededException(); + } + final PageBoardDataDto pageBoardDataDto = PageBoardDataDto.builder() + .page(page) + .perPage(perPage) + .orderBy(BoardOrderBy.values()[orderBy]) + .isASC(isASC) + .build(); + return ResponseEntity.ok(ResPageBoardDto.from(tagService.getTagBoardsById(id, pageBoardDataDto))); } @PostMapping @@ -56,4 +79,4 @@ public ResponseEntity deleteTag(@PathVariable Long id) { } -} \ No newline at end of file +} diff --git a/src/main/java/com/handong/cra/crawebbackend/tag/service/TagService.java b/src/main/java/com/handong/cra/crawebbackend/tag/service/TagService.java index 04dfa28..b68660e 100644 --- a/src/main/java/com/handong/cra/crawebbackend/tag/service/TagService.java +++ b/src/main/java/com/handong/cra/crawebbackend/tag/service/TagService.java @@ -1,6 +1,8 @@ package com.handong.cra.crawebbackend.tag.service; import com.handong.cra.crawebbackend.board.dto.ListBoardDto; +import com.handong.cra.crawebbackend.board.dto.PageBoardDataDto; +import com.handong.cra.crawebbackend.board.dto.PageBoardDto; import com.handong.cra.crawebbackend.project.dto.ListProjectDto; import com.handong.cra.crawebbackend.tag.domain.Tag; import com.handong.cra.crawebbackend.tag.dto.request.ReqCreateTagDto; @@ -16,6 +18,7 @@ public interface TagService { ResTagDto updateTag(Long id, ReqUpdateTagDto dto); void deleteTag(Long id); List getBoardsByTagName(String tagName); + PageBoardDto getTagBoardsById(Long tagId, PageBoardDataDto pageBoardDataDto); List getProjectsByTagName(String tagName); List getOrCreateTagsByNames(List tagNames); } diff --git a/src/main/java/com/handong/cra/crawebbackend/tag/service/TagServiceImpl.java b/src/main/java/com/handong/cra/crawebbackend/tag/service/TagServiceImpl.java index cc8f5c6..b11bd0a 100644 --- a/src/main/java/com/handong/cra/crawebbackend/tag/service/TagServiceImpl.java +++ b/src/main/java/com/handong/cra/crawebbackend/tag/service/TagServiceImpl.java @@ -1,6 +1,9 @@ package com.handong.cra.crawebbackend.tag.service; +import com.handong.cra.crawebbackend.board.domain.BoardOrderBy; import com.handong.cra.crawebbackend.board.dto.ListBoardDto; +import com.handong.cra.crawebbackend.board.dto.PageBoardDataDto; +import com.handong.cra.crawebbackend.board.dto.PageBoardDto; import com.handong.cra.crawebbackend.board.repository.BoardRepository; import com.handong.cra.crawebbackend.exception.tag.TagInvalidNameException; import com.handong.cra.crawebbackend.exception.tag.TagNotFoundException; @@ -13,9 +16,14 @@ import com.handong.cra.crawebbackend.tag.repository.TagRepository; import lombok.RequiredArgsConstructor; import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import com.handong.cra.crawebbackend.board.domain.Board; import java.util.List; import java.util.Map; import java.util.Objects; @@ -71,6 +79,31 @@ public List getBoardsByTagName(String tagName) { .toList(); } + @Override + public PageBoardDto getTagBoardsById(Long tagId, PageBoardDataDto pageBoardDataDto) { + tagRepository.findById(tagId) + .orElseThrow(TagNotFoundException::new); + final Pageable pageable = getPageable(pageBoardDataDto); + final Page boards = boardRepository.findByTags_IdAndDeletedFalse(tagId, pageable); + return PageBoardDto.builder() + .listBoardDtos(boards.stream() + .map(ListBoardDto::from) + .filter(Objects::nonNull) + .toList()) + .totalPages(boards.getTotalPages()) + .build(); + } + + private Pageable getPageable(final PageBoardDataDto pageBoardDataDto) { + final Map map = Map.of( + BoardOrderBy.DATE, "createdAt", + BoardOrderBy.LIKECOUNT, "likeCount" + ); + Sort sort = Sort.by(map.get(pageBoardDataDto.getOrderBy())); + sort = pageBoardDataDto.getIsASC() ? sort.ascending() : sort.descending(); + return PageRequest.of(Math.toIntExact(pageBoardDataDto.getPage()), pageBoardDataDto.getPerPage(), sort); + } + @Override public List getProjectsByTagName(String tagName) { return projectRepository.findByTags_Name(tagName)