Support querying multi post statuses (#1527)

* feat: post page list supports multiple status queries
pull/1534/head
guqing 2021-11-14 18:48:47 +08:00 committed by GitHub
parent 62c84e9215
commit 641e03e401
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 48 additions and 4 deletions

View File

@ -5,6 +5,7 @@ import static org.springframework.data.domain.Sort.Direction.DESC;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.List; import java.util.List;
import java.util.Set;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
@ -44,6 +45,7 @@ import run.halo.app.service.PostService;
* *
* @author johnniang * @author johnniang
* @author ryanwang * @author ryanwang
* @author guqing
* @date 2019-04-02 * @date 2019-04-02
*/ */
@RestController("ApiContentPostController") @RestController("ApiContentPostController")
@ -83,7 +85,7 @@ public class PostController {
PostQuery postQuery = new PostQuery(); PostQuery postQuery = new PostQuery();
postQuery.setKeyword(keyword); postQuery.setKeyword(keyword);
postQuery.setCategoryId(categoryId); postQuery.setCategoryId(categoryId);
postQuery.setStatus(PostStatus.PUBLISHED); postQuery.setStatuses(Set.of(PostStatus.PUBLISHED));
Page<Post> postPage = postService.pageBy(postQuery, pageable); Page<Post> postPage = postService.pageBy(postQuery, pageable);
return postService.convertToListVo(postPage, true); return postService.convertToListVo(postPage, true);
} }

View File

@ -1,12 +1,16 @@
package run.halo.app.model.params; package run.halo.app.model.params;
import java.util.HashSet;
import java.util.Set;
import lombok.Data; import lombok.Data;
import org.springframework.util.CollectionUtils;
import run.halo.app.model.enums.PostStatus; import run.halo.app.model.enums.PostStatus;
/** /**
* Post query. * Post query.
* *
* @author johnniang * @author johnniang
* @author guqing
* @date 4/10/19 * @date 4/10/19
*/ */
@Data @Data
@ -20,11 +24,46 @@ public class PostQuery {
/** /**
* Post status. * Post status.
*/ */
@Deprecated(forRemoval = true, since = "1.5.0")
private PostStatus status; private PostStatus status;
/**
* Post statuses.
*/
private Set<PostStatus> statuses;
/** /**
* Category id. * Category id.
*/ */
private Integer categoryId; private Integer categoryId;
/**
* This method is deprecated in version 1.5.0, and it is recommended to use
* <code>getStatuses()</code> method.
*
* @see #getStatuses()
* @return post status.
*/
@Deprecated
public PostStatus getStatus() {
return status;
}
/**
* In order to be compatible with status, this method will return the combined results
* of status and statuses before status is removed.
*
* @return a combined status set of status and statues
*/
public Set<PostStatus> getStatuses() {
Set<PostStatus> statuses = new HashSet<>();
// Need to be compatible with status parameter values due to historical reasons.
if (this.status != null) {
statuses.add(this.status);
}
if (!CollectionUtils.isEmpty(this.statuses)) {
statuses.addAll(this.statuses);
}
return statuses;
}
} }

View File

@ -16,11 +16,13 @@ import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.persistence.criteria.CriteriaBuilder.In;
import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root; import javax.persistence.criteria.Root;
import javax.persistence.criteria.Subquery; import javax.persistence.criteria.Subquery;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisher;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
@ -149,7 +151,7 @@ public class PostServiceImpl extends BasePostServiceImpl<Post> implements PostSe
PostQuery postQuery = new PostQuery(); PostQuery postQuery = new PostQuery();
postQuery.setKeyword(keyword); postQuery.setKeyword(keyword);
postQuery.setStatus(PostStatus.PUBLISHED); postQuery.setStatuses(Set.of(PostStatus.PUBLISHED));
// Build specification and find all // Build specification and find all
return postRepository.findAll(buildSpecByQuery(postQuery), pageable); return postRepository.findAll(buildSpecByQuery(postQuery), pageable);
@ -808,8 +810,9 @@ public class PostServiceImpl extends BasePostServiceImpl<Post> implements PostSe
return (root, query, criteriaBuilder) -> { return (root, query, criteriaBuilder) -> {
List<Predicate> predicates = new LinkedList<>(); List<Predicate> predicates = new LinkedList<>();
if (postQuery.getStatus() != null) { Set<PostStatus> statuses = postQuery.getStatuses();
predicates.add(criteriaBuilder.equal(root.get("status"), postQuery.getStatus())); if (!CollectionUtils.isEmpty(statuses)) {
predicates.add(root.get("status").in(statuses));
} }
if (postQuery.getCategoryId() != null) { if (postQuery.getCategoryId() != null) {