diff --git a/src/main/java/run/halo/app/event/post/AbstractVisitEventListener.java b/src/main/java/run/halo/app/event/post/AbstractVisitEventListener.java new file mode 100644 index 0000000000000000000000000000000000000000..380b783ef0277cbdfbc8e1a247cf0ebf7f39a817 --- /dev/null +++ b/src/main/java/run/halo/app/event/post/AbstractVisitEventListener.java @@ -0,0 +1,58 @@ +package run.halo.app.event.post; + +import lombok.extern.slf4j.Slf4j; + +/** + * Abstract visit event listener. + * + * @author johnniang + * @date 19-4-24 + */ +@Slf4j +public abstract class AbstractVisitEventListener { + +// private final Map> postVisitQueueMap; +// +// private final Map postVisitTaskMap; +// +// protected final BasePostRepository basePostRepository; +// +// protected AbstractVisitEventListener(BasePostRepository basePostRepository) { +// this.basePostRepository = basePostRepository; +// } +// +// +// /** +// * Post visit task. +// */ +// private class PostVisitTask implements Runnable { +// +// private final Integer postId; +// +// private PostVisitTask(Integer postId) { +// this.postId = postId; +// } +// +// @Override +// public void run() { +// while (!Thread.currentThread().isInterrupted()) { +// try { +// BlockingQueue postVisitQueue = postVisitQueueMap.get(postId); +// Integer postId = postVisitQueue.take(); +// +// log.debug("Took a new visit for post id: [{}]", postId); +// +// // Increase the visit +// postService.increaseVisit(postId); +// +// log.debug("Increased visits for post id: [{}]", postId); +// } catch (InterruptedException e) { +// log.debug("Post visit task: " + Thread.currentThread().getName() + " was interrupted", e); +// // Ignore this exception +// } +// } +// +// log.debug("Thread: [{}] has been interrupted", Thread.currentThread().getName()); +// } +// } +} diff --git a/src/main/java/run/halo/app/service/PostService.java b/src/main/java/run/halo/app/service/PostService.java index 0aa5eef0c45039fd401f6f9422c23b60d90c3d48..148127baaabb5d06771fcd9fb2acff0cb78d0525 100755 --- a/src/main/java/run/halo/app/service/PostService.java +++ b/src/main/java/run/halo/app/service/PostService.java @@ -13,11 +13,9 @@ import run.halo.app.model.vo.ArchiveMonthVO; import run.halo.app.model.vo.ArchiveYearVO; import run.halo.app.model.vo.PostDetailVO; import run.halo.app.model.vo.PostListVO; -import run.halo.app.service.base.CrudService; +import run.halo.app.service.base.BasePostService; -import java.util.Date; import java.util.List; -import java.util.Optional; import java.util.Set; /** @@ -26,7 +24,7 @@ import java.util.Set; * @author johnniang * @author RYAN0UP */ -public interface PostService extends CrudService { +public interface PostService extends BasePostService { /** * Lists latest posts of minimal. @@ -47,26 +45,6 @@ public interface PostService extends CrudService { @NonNull Page pageLatestOfSimple(int top); - - /** - * Lists latest posts. - * - * @param top top number must not be less than 0 - * @return latest posts - */ - @NonNull - Page pageLatest(int top); - - /** - * Lists by status. - * - * @param status post status must not be null - * @param pageable page info must not be null - * @return a page of post - */ - @NonNull - Page pageBy(@NonNull PostStatus status, @NonNull Pageable pageable); - /** * Pages posts. * @@ -107,14 +85,6 @@ public interface PostService extends CrudService { @NonNull Page pageListVoBy(@NonNull PostStatus status, @NonNull Pageable pageable); - /** - * Count posts by status. - * - * @param status status - * @return posts count - */ - Long countByStatus(PostStatus status); - /** * Creates post by post param. * @@ -139,15 +109,6 @@ public interface PostService extends CrudService { @Transactional PostDetailVO updateBy(@NonNull Post postToUpdate, Set tagIds, Set categoryIds); - /** - * Get post by url. - * - * @param url post url. - * @return Post - */ - @NonNull - Post getByUrl(@NonNull String url); - /** * Gets post by post status and url. * @@ -156,6 +117,7 @@ public interface PostService extends CrudService { * @return post info */ @NonNull + @Override Post getBy(@NonNull PostStatus status, @NonNull String url); /** @@ -167,54 +129,6 @@ public interface PostService extends CrudService { @NonNull PostDetailVO getDetailVoBy(@NonNull Integer postId); - /** - * Counts visit total number. - * - * @return visit total number - */ - long countVisit(); - - /** - * Counts like total number. - * - * @return like total number - */ - long countLike(); - - /** - * Increases post visits. - * - * @param visits visits must not be less than 1 - * @param postId post id must not be null - */ - @Transactional - void increaseVisit(long visits, @NonNull Integer postId); - - /** - * Increase post likes. - * - * @param likes likes must not be less than 1 - * @param postId post id must not be null - */ - @Transactional - void increaseLike(long likes, @NonNull Integer postId); - - /** - * Increases post visits (1). - * - * @param postId post id must not be null - */ - @Transactional - void increaseVisit(@NonNull Integer postId); - - /** - * Increase post likes(1). - * - * @param postId post id must not be null - */ - @Transactional - void increaseLike(@NonNull Integer postId); - /** * Lists year archives. * @@ -249,59 +163,4 @@ public interface PostService extends CrudService { @NonNull Page convertToListVo(@NonNull Page postPage); - /** - * Lists all posts by post status. - * - * @param status post status must not be null - * @return a list of post - */ - @NonNull - List listAllBy(@NonNull PostStatus status); - - /** - * Filters post content if the password is not blank. - * - * @param post original post must not be null - * @return filtered post - */ - @NonNull - Post filterIfEncrypt(@NonNull Post post); - - /** - * Gets previous post. - * - * @param date date must not be null - * @return an optional post - */ - @NonNull - Optional getPrePost(@NonNull Date date); - - /** - * Gets next post. - * - * @param date date must not be null - * @return an optional post - */ - @NonNull - Optional getNextPost(@NonNull Date date); - - /** - * Lists previous posts. - * - * @param date date must not be null - * @param size previous max post size - * @return a list of previous post - */ - @NonNull - List listPrePosts(@NonNull Date date, int size); - - /** - * Lits next posts. - * - * @param date date must not be null - * @param size next max post size - * @return a list of next post - */ - @NonNull - List listNextPosts(@NonNull Date date, int size); } diff --git a/src/main/java/run/halo/app/service/SheetService.java b/src/main/java/run/halo/app/service/SheetService.java index 50c2301bbfde05b84fd5883fe754524db972a761..03f2074a602e96a2adf748f28cec93e86a26c810 100644 --- a/src/main/java/run/halo/app/service/SheetService.java +++ b/src/main/java/run/halo/app/service/SheetService.java @@ -1,13 +1,12 @@ package run.halo.app.service; import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; import org.springframework.lang.NonNull; import run.halo.app.model.dto.post.SheetDetailDTO; import run.halo.app.model.dto.post.SheetListDTO; import run.halo.app.model.entity.Sheet; import run.halo.app.model.enums.PostStatus; -import run.halo.app.service.base.CrudService; +import run.halo.app.service.base.BasePostService; /** * Sheet service interface. @@ -15,7 +14,7 @@ import run.halo.app.service.base.CrudService; * @author johnniang * @date 19-4-24 */ -public interface SheetService extends CrudService { +public interface SheetService extends BasePostService { /** * Creates a sheet. @@ -35,25 +34,8 @@ public interface SheetService extends CrudService { @NonNull Sheet updateBy(@NonNull Sheet sheet); - /** - * Gets a page of sheet. - * - * @param pageable page info must not be null - * @return a page of sheet - */ - @NonNull - Page pageBy(@NonNull Pageable pageable); - - /** - * Gets sheet by post status and url. - * - * @param status post status must not be null - * @param url sheet url must not be blank - * @return sheet info - */ - @NonNull - Sheet getBy(@NonNull PostStatus status, @NonNull String url); - + @Override + Sheet getBy(PostStatus status, String url); /** * Converts to detail dto. diff --git a/src/main/java/run/halo/app/service/base/BasePostService.java b/src/main/java/run/halo/app/service/base/BasePostService.java new file mode 100644 index 0000000000000000000000000000000000000000..bb36eb196ce65272535d866ead99c63b0939e411 --- /dev/null +++ b/src/main/java/run/halo/app/service/base/BasePostService.java @@ -0,0 +1,191 @@ +package run.halo.app.service.base; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.lang.NonNull; +import org.springframework.transaction.annotation.Transactional; +import run.halo.app.model.entity.BasePost; +import run.halo.app.model.enums.PostStatus; + +import java.util.Date; +import java.util.List; +import java.util.Optional; + +/** + * Base post service implementation. + * + * @author johnniang + * @date 19-4-24 + */ +public interface BasePostService extends CrudService { + + /** + * Counts visit total number. + * + * @return visit total number + */ + long countVisit(); + + /** + * Counts like total number. + * + * @return like total number + */ + long countLike(); + + /** + * Count posts by status. + * + * @param status status + * @return posts count + */ + long countByStatus(PostStatus status); + + /** + * Get post by url. + * + * @param url post url. + * @return Post + */ + @NonNull + POST getByUrl(@NonNull String url); + + /** + * Gets post by post status and url. + * + * @param status post status must not be null + * @param url post url must not be blank + * @return post info + */ + @NonNull + POST getBy(@NonNull PostStatus status, @NonNull String url); + + /** + * Lists all posts by post status. + * + * @param status post status must not be null + * @return a list of post + */ + @NonNull + List listAllBy(@NonNull PostStatus status); + + /** + * Lists previous posts. + * + * @param date date must not be null + * @param size previous max post size + * @return a list of previous post + */ + @NonNull + List listPrePosts(@NonNull Date date, int size); + + /** + * Lits next posts. + * + * @param date date must not be null + * @param size next max post size + * @return a list of next post + */ + @NonNull + List listNextPosts(@NonNull Date date, int size); + + /** + * Gets previous post. + * + * @param date date must not be null + * @return an optional post + */ + @NonNull + Optional getPrePost(@NonNull Date date); + + /** + * Gets next post. + * + * @param date date must not be null + * @return an optional post + */ + @NonNull + Optional getNextPost(@NonNull Date date); + + /** + * Lists latest posts. + * + * @param top top number must not be less than 0 + * @return latest posts + */ + @NonNull + Page pageLatest(int top); + + /** + * Gets a page of sheet. + * + * @param pageable page info must not be null + * @return a page of sheet + */ + @NonNull + Page pageBy(@NonNull Pageable pageable); + + /** + * Lists by status. + * + * @param status post status must not be null + * @param pageable page info must not be null + * @return a page of post + */ + @NonNull + Page pageBy(@NonNull PostStatus status, @NonNull Pageable pageable); + + /** + * Increases post visits. + * + * @param visits visits must not be less than 1 + * @param postId post id must not be null + */ + @Transactional + void increaseVisit(long visits, @NonNull Integer postId); + + /** + * Increase post likes. + * + * @param likes likes must not be less than 1 + * @param postId post id must not be null + */ + @Transactional + void increaseLike(long likes, @NonNull Integer postId); + + /** + * Increases post visits (1). + * + * @param postId post id must not be null + */ + @Transactional + void increaseVisit(@NonNull Integer postId); + + /** + * Increases post likes(1). + * + * @param postId post id must not be null + */ + @Transactional + void increaseLike(@NonNull Integer postId); + + + /** + * Creates or updates by post. + * + * @param post post must not be null + * @return created or updated post + */ + @NonNull + POST createOrUpdateBy(@NonNull POST post); + + /** + * Filters post content if the password is not blank. + * + * @param post original post must not be null + * @return filtered post + */ + @NonNull + POST filterIfEncrypt(@NonNull POST post); + +} diff --git a/src/main/java/run/halo/app/service/base/BaseCommentServiceImpl.java b/src/main/java/run/halo/app/service/impl/BaseCommentServiceImpl.java similarity index 99% rename from src/main/java/run/halo/app/service/base/BaseCommentServiceImpl.java rename to src/main/java/run/halo/app/service/impl/BaseCommentServiceImpl.java index 4cb8c29ecf030e1d2ca6bcba934d7d9cf825243d..e262a2af4323c07ac226feff402c98bd1b84a7c5 100644 --- a/src/main/java/run/halo/app/service/base/BaseCommentServiceImpl.java +++ b/src/main/java/run/halo/app/service/impl/BaseCommentServiceImpl.java @@ -1,4 +1,4 @@ -package run.halo.app.service.base; +package run.halo.app.service.impl; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.digest.DigestUtils; @@ -31,6 +31,8 @@ import run.halo.app.repository.base.BaseCommentRepository; import run.halo.app.security.authentication.Authentication; import run.halo.app.security.context.SecurityContextHolder; import run.halo.app.service.OptionService; +import run.halo.app.service.base.AbstractCrudService; +import run.halo.app.service.base.BaseCommentService; import run.halo.app.utils.ServiceUtils; import run.halo.app.utils.ServletUtils; diff --git a/src/main/java/run/halo/app/service/impl/BasePostServiceImpl.java b/src/main/java/run/halo/app/service/impl/BasePostServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..36e0902adc8f55461672686599894a8d1757d400 --- /dev/null +++ b/src/main/java/run/halo/app/service/impl/BasePostServiceImpl.java @@ -0,0 +1,246 @@ +package run.halo.app.service.impl; + +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +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.lang.NonNull; +import org.springframework.util.Assert; +import org.springframework.util.CollectionUtils; +import run.halo.app.exception.AlreadyExistsException; +import run.halo.app.exception.BadRequestException; +import run.halo.app.exception.NotFoundException; +import run.halo.app.model.entity.BasePost; +import run.halo.app.model.enums.PostStatus; +import run.halo.app.repository.base.BasePostRepository; +import run.halo.app.service.base.AbstractCrudService; +import run.halo.app.service.base.BasePostService; +import run.halo.app.utils.DateUtils; +import run.halo.app.utils.MarkdownUtils; +import run.halo.app.utils.ServiceUtils; + +import java.util.Date; +import java.util.List; +import java.util.Optional; + +import static org.springframework.data.domain.Sort.Direction.ASC; +import static org.springframework.data.domain.Sort.Direction.DESC; + +/** + * Base post service implementation. + * + * @author johnniang + * @date 19-4-24 + */ +@Slf4j +public abstract class BasePostServiceImpl extends AbstractCrudService implements BasePostService { + + private final BasePostRepository basePostRepository; + + public BasePostServiceImpl(BasePostRepository basePostRepository) { + super(basePostRepository); + this.basePostRepository = basePostRepository; + } + + @Override + public long countVisit() { + return Optional.ofNullable(basePostRepository.countVisit()).orElse(0L); + } + + @Override + public long countLike() { + return Optional.ofNullable(basePostRepository.countLike()).orElse(0L); + } + + @Override + public long countByStatus(PostStatus status) { + Assert.notNull(status, "Post status must not be null"); + + return basePostRepository.countByStatus(status); + } + + @Override + public POST getByUrl(String url) { + Assert.hasText(url, "Url must not be blank"); + + return basePostRepository.getByUrl(url).orElseThrow(() -> new NotFoundException("The post does not exist").setErrorData(url)); + } + + @Override + public POST getBy(PostStatus status, String url) { + Assert.notNull(status, "Post status must not be null"); + Assert.hasText(url, "Post url must not be blank"); + + Optional postOptional = basePostRepository.getByUrlAndStatus(url, status); + + return postOptional.orElseThrow(() -> new NotFoundException("The post with status " + status + " and url " + url + "was not existed").setErrorData(url)); + } + + @Override + public List listAllBy(PostStatus status) { + Assert.notNull(status, "Post status must not be null"); + + return basePostRepository.findAllByStatus(status); + } + + + @Override + public List listPrePosts(Date date, int size) { + Assert.notNull(date, "Date must not be null"); + + return basePostRepository.findAllByStatusAndCreateTimeAfter(PostStatus.PUBLISHED, + date, + PageRequest.of(0, size, Sort.by(ASC, "createTime"))) + .getContent(); + } + + @Override + public List listNextPosts(Date date, int size) { + Assert.notNull(date, "Date must not be null"); + + return basePostRepository.findAllByStatusAndCreateTimeBefore(PostStatus.PUBLISHED, + date, + PageRequest.of(0, size, Sort.by(DESC, "createTime"))) + .getContent(); + } + + @Override + public Optional getPrePost(Date date) { + List posts = listPrePosts(date, 1); + + return CollectionUtils.isEmpty(posts) ? Optional.empty() : Optional.of(posts.get(0)); + } + + @Override + public Optional getNextPost(Date date) { + List posts = listNextPosts(date, 1); + + return CollectionUtils.isEmpty(posts) ? Optional.empty() : Optional.of(posts.get(0)); + } + + @Override + public Page pageLatest(int top) { + Assert.isTrue(top > 0, "Top number must not be less than 0"); + + PageRequest latestPageable = PageRequest.of(0, top, Sort.by(DESC, "editTime")); + + return listAll(latestPageable); + } + + @Override + public Page pageBy(Pageable pageable) { + Assert.notNull(pageable, "Page info must not be null"); + + return listAll(pageable); + } + + + @Override + public Page pageBy(PostStatus status, Pageable pageable) { + Assert.notNull(status, "Post status must not be null"); + Assert.notNull(pageable, "Page info must not be null"); + + return basePostRepository.findAllByStatus(status, pageable); + } + + @Override + public void increaseVisit(long visits, Integer postId) { + Assert.isTrue(visits > 0, "Visits to increase must not be less than 1"); + Assert.notNull(postId, "Goods id must not be null"); + + long affectedRows = basePostRepository.updateVisit(visits, postId); + + if (affectedRows != 1) { + log.error("Post with id: [{}] may not be found", postId); + throw new BadRequestException("Failed to increase visits " + visits + " for post with id " + postId); + } + } + + @Override + public void increaseLike(long likes, Integer postId) { + Assert.isTrue(likes > 0, "Likes to increase must not be less than 1"); + Assert.notNull(postId, "Goods id must not be null"); + + long affectedRows = basePostRepository.updateLikes(likes, postId); + + if (affectedRows != 1) { + log.error("Post with id: [{}] may not be found", postId); + throw new BadRequestException("Failed to increase likes " + likes + " for post with id " + postId); + } + } + + @Override + public void increaseVisit(Integer postId) { + increaseVisit(1L, postId); + } + + @Override + public void increaseLike(Integer postId) { + increaseLike(1L, postId); + } + + @Override + public POST createOrUpdateBy(POST post) { + Assert.notNull(post, "Post must not be null"); + + // Check url + urlMustNotExist(post); + + // Render content + post.setFormatContent(MarkdownUtils.renderMarkdown(post.getOriginalContent())); + + // Create or update post + if (ServiceUtils.isEmptyId(post.getId())) { + // The sheet will be created + return create(post); + } + + // The sheet will be updated + // Set edit time + post.setEditTime(DateUtils.now()); + + // Update it + return update(post); + } + + @Override + public POST filterIfEncrypt(POST post) { + Assert.notNull(post, "Post must not be null"); + + if (StringUtils.isNotBlank(post.getPassword())) { + String tip = "The post is encrypted by author"; + post.setSummary(tip); + post.setOriginalContent(tip); + post.setFormatContent(tip); + } + + return post; + } + + /** + * Check if the url is exist. + * + * @param post post must not be null + */ + protected void urlMustNotExist(@NonNull POST post) { + Assert.notNull(post, "Sheet must not be null"); + // TODO Refactor this method with BasePostService + + // TODO May refactor these queries + // Get url count + long count; + if (ServiceUtils.isEmptyId(post.getId())) { + // The sheet will be created + count = basePostRepository.countByUrl(post.getUrl()); + } else { + // The sheet will be updated + count = basePostRepository.countByIdNotAndUrl(post.getId(), post.getUrl()); + } + + if (count > 0) { + throw new AlreadyExistsException("The sheet url has been exist"); + } + } +} diff --git a/src/main/java/run/halo/app/service/impl/CommentServiceImpl.java b/src/main/java/run/halo/app/service/impl/CommentServiceImpl.java index a6fe9b28823a9ef4c35f63e6ed958f57a346cf2f..a9bfc0a23cb99d7b92147cc45aa3aa25d6797789 100644 --- a/src/main/java/run/halo/app/service/impl/CommentServiceImpl.java +++ b/src/main/java/run/halo/app/service/impl/CommentServiceImpl.java @@ -21,7 +21,6 @@ import run.halo.app.security.authentication.Authentication; import run.halo.app.security.context.SecurityContextHolder; import run.halo.app.service.CommentService; import run.halo.app.service.OptionService; -import run.halo.app.service.base.BaseCommentServiceImpl; import run.halo.app.utils.ServiceUtils; import run.halo.app.utils.ValidationUtils; diff --git a/src/main/java/run/halo/app/service/impl/PostServiceImpl.java b/src/main/java/run/halo/app/service/impl/PostServiceImpl.java index 4239ed6c821f266d0c4df363aad18085fc42ccfc..505911e665ca1032e48dbf89246422704a143ec1 100644 --- a/src/main/java/run/halo/app/service/impl/PostServiceImpl.java +++ b/src/main/java/run/halo/app/service/impl/PostServiceImpl.java @@ -4,7 +4,6 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.context.ApplicationEventPublisher; 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.data.jpa.domain.Specification; @@ -15,9 +14,6 @@ import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import run.halo.app.event.logger.LogEvent; import run.halo.app.event.post.PostVisitEvent; -import run.halo.app.exception.AlreadyExistsException; -import run.halo.app.exception.BadRequestException; -import run.halo.app.exception.NotFoundException; import run.halo.app.model.dto.CategoryDTO; import run.halo.app.model.dto.TagDTO; import run.halo.app.model.dto.post.PostMinimalDTO; @@ -32,20 +28,16 @@ import run.halo.app.model.vo.PostDetailVO; import run.halo.app.model.vo.PostListVO; import run.halo.app.repository.PostRepository; import run.halo.app.service.*; -import run.halo.app.service.base.AbstractCrudService; import run.halo.app.utils.DateUtils; -import run.halo.app.utils.MarkdownUtils; import run.halo.app.utils.ServiceUtils; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import javax.persistence.criteria.Subquery; import java.util.*; -import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Collectors; -import static org.springframework.data.domain.Sort.Direction.ASC; import static org.springframework.data.domain.Sort.Direction.DESC; /** @@ -56,7 +48,7 @@ import static org.springframework.data.domain.Sort.Direction.DESC; */ @Slf4j @Service -public class PostServiceImpl extends AbstractCrudService implements PostService { +public class PostServiceImpl extends BasePostServiceImpl implements PostService { private final PostRepository postRepository; @@ -99,23 +91,6 @@ public class PostServiceImpl extends AbstractCrudService implemen return pageLatest(top).map(post -> new PostSimpleDTO().convertFrom(post)); } - @Override - public Page pageLatest(int top) { - Assert.isTrue(top > 0, "Top number must not be less than 0"); - - PageRequest latestPageable = PageRequest.of(0, top, Sort.by(DESC, "editTime")); - - return listAll(latestPageable); - } - - @Override - public Page pageBy(PostStatus status, Pageable pageable) { - Assert.notNull(status, "Post status must not be null"); - Assert.notNull(pageable, "Page info must not be null"); - - return postRepository.findAllByStatus(status, pageable); - } - @Override public Page pageBy(PostQuery postQuery, Pageable pageable) { Assert.notNull(postQuery, "Post query must not be null"); @@ -198,20 +173,9 @@ public class PostServiceImpl extends AbstractCrudService implemen return convertToListVo(postPage); } - /** - * Counts posts by status. - * - * @param status status - * @return posts count - */ - @Override - public Long countByStatus(PostStatus status) { - return postRepository.countByStatus(status); - } - @Override public PostDetailVO createBy(Post postToCreate, Set tagIds, Set categoryIds) { - return createOrUpdate(postToCreate, tagIds, categoryIds, this::create); + return createOrUpdate(postToCreate, tagIds, categoryIds); } @Override @@ -219,7 +183,7 @@ public class PostServiceImpl extends AbstractCrudService implemen // Set edit time postToUpdate.setEditTime(DateUtils.now()); - return createOrUpdate(postToUpdate, tagIds, categoryIds, this::update); + return createOrUpdate(postToUpdate, tagIds, categoryIds); } @Override @@ -244,30 +208,11 @@ public class PostServiceImpl extends AbstractCrudService implemen return updatedPost; } - private PostDetailVO createOrUpdate(@NonNull Post post, Set tagIds, Set categoryIds, @NonNull Function postOperation) { + private PostDetailVO createOrUpdate(@NonNull Post post, Set tagIds, Set categoryIds) { Assert.notNull(post, "Post param must not be null"); - Assert.notNull(postOperation, "Post operation must not be null"); - - // Check url - long count; - boolean isUpdating = post.getId() != null; - if (isUpdating) { - // For updating - count = postRepository.countByIdNotAndUrl(post.getId(), post.getUrl()); - } else { - // For creating - count = postRepository.countByUrl(post.getUrl()); - } - - if (count > 0) { - throw new AlreadyExistsException("The post url has been exist already").setErrorData(post.getUrl()); - } - - // Render content - post.setFormatContent(MarkdownUtils.renderMarkdown(post.getOriginalContent())); - // Update post - post = postOperation.apply(post); + // Create or update post + post = createOrUpdateBy(post); // List all tags List tags = tagService.listAllByIds(tagIds); @@ -291,25 +236,9 @@ public class PostServiceImpl extends AbstractCrudService implemen () -> ServiceUtils.fetchProperty(postCategories, PostCategory::getCategoryId)); } - /** - * Gets post by url. - * - * @param url post url. - * @return Post - */ - @Override - public Post getByUrl(String url) { - return postRepository.getByUrl(url).orElseThrow(() -> new NotFoundException("The post does not exist").setErrorData(url)); - } - @Override public Post getBy(PostStatus status, String url) { - Assert.notNull(status, "Post status must not be null"); - Assert.hasText(url, "Post url must not be blank"); - - Optional postOptional = postRepository.getByUrlAndStatus(url, status); - - Post post = postOptional.orElseThrow(() -> new NotFoundException("The post with status " + status + " and url " + url + "was not existed").setErrorData(url)); + Post post = super.getBy(status, url); if (PostStatus.PUBLISHED.equals(status)) { // Log it @@ -329,52 +258,6 @@ public class PostServiceImpl extends AbstractCrudService implemen return convertTo(post); } - @Override - public long countVisit() { - return Optional.ofNullable(postRepository.countVisit()).orElse(0L); - } - - @Override - public long countLike() { - return Optional.ofNullable(postRepository.countLike()).orElse(0L); - } - - @Override - public void increaseVisit(long visits, Integer postId) { - Assert.isTrue(visits > 0, "Visits to increase must not be less than 1"); - Assert.notNull(postId, "Goods id must not be null"); - - long affectedRows = postRepository.updateVisit(visits, postId); - - if (affectedRows != 1) { - log.error("Post with id: [{}] may not be found", postId); - throw new BadRequestException("Failed to increase visits " + visits + " for post with id " + postId); - } - } - - @Override - public void increaseLike(long likes, Integer postId) { - Assert.isTrue(likes > 0, "Likes to increase must not be less than 1"); - Assert.notNull(postId, "Goods id must not be null"); - - long affectedRows = postRepository.updateLikes(likes, postId); - - if (affectedRows != 1) { - log.error("Post with id: [{}] may not be found", postId); - throw new BadRequestException("Failed to increase likes " + likes + " for post with id " + postId); - } - } - - @Override - public void increaseVisit(Integer postId) { - increaseVisit(1L, postId); - } - - @Override - public void increaseLike(Integer postId) { - increaseLike(1L, postId); - } - @Override public List listYearArchives() { // Get all posts @@ -517,61 +400,6 @@ public class PostServiceImpl extends AbstractCrudService implemen }); } - @Override - public List listAllBy(PostStatus status) { - Assert.notNull(status, "Post status must not be null"); - - return postRepository.findAllByStatus(status); - } - - @Override - public Post filterIfEncrypt(Post post) { - Assert.notNull(post, "Post must not be null"); - - if (StringUtils.isNotBlank(post.getPassword())) { - String tip = "The post is encrypted by author"; - post.setSummary(tip); - post.setOriginalContent(tip); - post.setFormatContent(tip); - } - - return post; - } - - @Override - public Optional getPrePost(Date date) { - List posts = listPrePosts(date, 1); - - return CollectionUtils.isEmpty(posts) ? Optional.empty() : Optional.of(posts.get(0)); - } - - @Override - public Optional getNextPost(Date date) { - List posts = listNextPosts(date, 1); - - return CollectionUtils.isEmpty(posts) ? Optional.empty() : Optional.of(posts.get(0)); - } - - @Override - public List listPrePosts(Date date, int size) { - Assert.notNull(date, "Date must not be null"); - - return postRepository.findAllByStatusAndCreateTimeAfter(PostStatus.PUBLISHED, - date, - PageRequest.of(0, size, Sort.by(ASC, "createTime"))) - .getContent(); - } - - @Override - public List listNextPosts(Date date, int size) { - Assert.notNull(date, "Date must not be null"); - - return postRepository.findAllByStatusAndCreateTimeBefore(PostStatus.PUBLISHED, - date, - PageRequest.of(0, size, Sort.by(DESC, "createTime"))) - .getContent(); - } - /** * Converts to post minimal output dto. * diff --git a/src/main/java/run/halo/app/service/impl/SheetCommentServiceImpl.java b/src/main/java/run/halo/app/service/impl/SheetCommentServiceImpl.java index 638418205c9f656e609f534b4d8ee97a11c75d3d..a828ff5aad5ee7c0dbd36cd63a7e7b3a3fe02086 100644 --- a/src/main/java/run/halo/app/service/impl/SheetCommentServiceImpl.java +++ b/src/main/java/run/halo/app/service/impl/SheetCommentServiceImpl.java @@ -7,7 +7,6 @@ import run.halo.app.repository.PostRepository; import run.halo.app.repository.SheetCommentRepository; import run.halo.app.service.OptionService; import run.halo.app.service.SheetCommentService; -import run.halo.app.service.base.BaseCommentServiceImpl; /** * Sheet comment service implementation. diff --git a/src/main/java/run/halo/app/service/impl/SheetServiceImpl.java b/src/main/java/run/halo/app/service/impl/SheetServiceImpl.java index aeb7fc95555124bc55029f214d30e24021f5df66..e2306cc9faeefa235d5b27a56889ceb6c2564edb 100644 --- a/src/main/java/run/halo/app/service/impl/SheetServiceImpl.java +++ b/src/main/java/run/halo/app/service/impl/SheetServiceImpl.java @@ -3,11 +3,8 @@ package run.halo.app.service.impl; import org.springframework.context.ApplicationEventPublisher; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; -import org.springframework.lang.NonNull; import org.springframework.stereotype.Service; import org.springframework.util.Assert; -import run.halo.app.exception.AlreadyExistsException; -import run.halo.app.exception.NotFoundException; import run.halo.app.model.dto.post.SheetDetailDTO; import run.halo.app.model.dto.post.SheetListDTO; import run.halo.app.model.entity.Sheet; @@ -15,14 +12,10 @@ import run.halo.app.model.enums.PostStatus; import run.halo.app.repository.SheetRepository; import run.halo.app.service.SheetCommentService; import run.halo.app.service.SheetService; -import run.halo.app.service.base.AbstractCrudService; -import run.halo.app.utils.DateUtils; -import run.halo.app.utils.MarkdownUtils; import run.halo.app.utils.ServiceUtils; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.Set; /** @@ -32,7 +25,7 @@ import java.util.Set; * @date 19-4-24 */ @Service -public class SheetServiceImpl extends AbstractCrudService implements SheetService { +public class SheetServiceImpl extends BasePostServiceImpl implements SheetService { private final SheetRepository sheetRepository; @@ -75,12 +68,7 @@ public class SheetServiceImpl extends AbstractCrudService implem */ @Override public Sheet getBy(PostStatus status, String url) { - Assert.notNull(status, "Post status must not be null"); - Assert.hasText(url, "Sheet url must not be blank"); - - Optional sheetOptional = sheetRepository.getByUrlAndStatus(url, status); - - Sheet sheet = sheetOptional.orElseThrow(() -> new NotFoundException("The sheet with status " + status + " and url " + url + "was not existed").setErrorData(url)); + Sheet sheet = super.getBy(status, url); if (PostStatus.PUBLISHED.equals(status)) { // Log it @@ -118,52 +106,4 @@ public class SheetServiceImpl extends AbstractCrudService implem }); } - @NonNull - private Sheet createOrUpdateBy(@NonNull Sheet sheet) { - Assert.notNull(sheet, "Sheet must not be null"); - - // Check url - urlMustNotExist(sheet); - - // Render content - sheet.setFormatContent(MarkdownUtils.renderMarkdown(sheet.getOriginalContent())); - - // Create or update post - if (ServiceUtils.isEmptyId(sheet.getId())) { - // The sheet will be created - return create(sheet); - } - - // The sheet will be updated - // Set edit time - sheet.setEditTime(DateUtils.now()); - - // Update it - return update(sheet); - } - - /** - * Check if the url is exist. - * - * @param sheet sheet must not be null - */ - private void urlMustNotExist(@NonNull Sheet sheet) { - Assert.notNull(sheet, "Sheet must not be null"); - // TODO Refactor this method with BasePostService - - // TODO May refactor these queries - // Get url count - long count; - if (ServiceUtils.isEmptyId(sheet.getId())) { - // The sheet will be created - count = sheetRepository.countByUrl(sheet.getUrl()); - } else { - // The sheet will be updated - count = sheetRepository.countByIdNotAndUrl(sheet.getId(), sheet.getUrl()); - } - - if (count > 0) { - throw new AlreadyExistsException("The sheet url has been exist"); - } - } }