feat: add pagination for tags

This commit is contained in:
Tim
2025-09-12 17:16:59 +08:00
parent c3758cafe8
commit ebf04a284f
7 changed files with 146 additions and 37 deletions

View File

@@ -13,6 +13,7 @@ import com.openisle.service.PostService;
import com.openisle.service.TagService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import org.springframework.data.domain.Page;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Content;
@@ -80,7 +81,18 @@ public class TagController {
@ApiResponse(responseCode = "200", description = "List of tags",
content = @Content(array = @ArraySchema(schema = @Schema(implementation = TagDto.class))))
public List<TagDto> list(@RequestParam(value = "keyword", required = false) String keyword,
@RequestParam(value = "limit", required = false) Integer limit) {
@RequestParam(value = "limit", required = false) Integer limit,
@RequestParam(value = "page", required = false) Integer page,
@RequestParam(value = "pageSize", required = false) Integer pageSize) {
if (page != null && pageSize != null) {
Page<Tag> tagPage = tagService.searchTags(keyword, page, pageSize);
List<Tag> tags = tagPage.getContent();
List<Long> tagIds = tags.stream().map(Tag::getId).toList();
Map<Long, Long> postCntByTagIds = postService.countPostsByTagIds(tagIds);
return tags.stream()
.map(t -> tagMapper.toDto(t, postCntByTagIds.getOrDefault(t.getId(), 0L)))
.collect(Collectors.toList());
}
List<Tag> tags = tagService.searchTags(keyword);
List<Long> tagIds = tags.stream().map(Tag::getId).toList();
Map<Long, Long> postCntByTagIds = postService.countPostsByTagIds(tagIds);

View File

@@ -4,6 +4,7 @@ import com.openisle.model.Tag;
import com.openisle.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Page;
import java.util.List;
import java.util.Optional;
@@ -14,6 +15,9 @@ public interface TagRepository extends JpaRepository<Tag, Long> {
List<Tag> findByApprovedTrue();
List<Tag> findByNameContainingIgnoreCaseAndApprovedTrue(String keyword);
Page<Tag> findByApprovedTrue(Pageable pageable);
Page<Tag> findByNameContainingIgnoreCaseAndApprovedTrue(String keyword, Pageable pageable);
List<Tag> findByCreatorOrderByCreatedAtDesc(User creator, Pageable pageable);
List<Tag> findByCreator(User creator);

View File

@@ -9,6 +9,7 @@ import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Page;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@@ -108,6 +109,14 @@ public class TagService {
return tagRepository.findByNameContainingIgnoreCaseAndApprovedTrue(keyword);
}
public Page<Tag> searchTags(String keyword, int page, int pageSize) {
Pageable pageable = PageRequest.of(page, pageSize);
if (keyword == null || keyword.isBlank()) {
return tagRepository.findByApprovedTrue(pageable);
}
return tagRepository.findByNameContainingIgnoreCaseAndApprovedTrue(keyword, pageable);
}
public List<Tag> getRecentTagsByUser(String username, int limit) {
User user = userRepository.findByUsername(username)
.orElseThrow(() -> new com.openisle.exception.NotFoundException("User not found"));