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 @@ -31,4 +31,6 @@ public interface BoardRepository extends JpaRepository<Board, Long> {

List<Board> findByTags_Name(String tagName);

Page<Board> findByTags_IdAndDeletedFalse(Long tagId, Pageable pageable);

}
Original file line number Diff line number Diff line change
@@ -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.*;

Expand All @@ -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<List<ResTagDto>> getAllTags() {
return ResponseEntity.ok(tagService.getAllTags());
Expand All @@ -34,8 +42,23 @@ public ResponseEntity<Map<String, Object>> searchByTagName(@RequestParam String
}

@GetMapping("/{id}")
public ResponseEntity<ResTagDto> getTagById(@PathVariable Long id) {
return ResponseEntity.ok(tagService.getTagById(id));
public ResponseEntity<ResPageBoardDto> 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
Expand All @@ -56,4 +79,4 @@ public ResponseEntity<Void> deleteTag(@PathVariable Long id) {
}


}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -16,6 +18,7 @@ public interface TagService {
ResTagDto updateTag(Long id, ReqUpdateTagDto dto);
void deleteTag(Long id);
List<ListBoardDto> getBoardsByTagName(String tagName);
PageBoardDto getTagBoardsById(Long tagId, PageBoardDataDto pageBoardDataDto);
List<ListProjectDto> getProjectsByTagName(String tagName);
List<Tag> getOrCreateTagsByNames(List<String> tagNames);
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -71,6 +79,31 @@ public List<ListBoardDto> 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<Board> 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<BoardOrderBy, String> 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<ListProjectDto> getProjectsByTagName(String tagName) {
return projectRepository.findByTags_Name(tagName)
Expand Down
Loading