diff --git a/src/main/java/cc/ryanc/halo/repository/CategoryRepository.java b/src/main/java/cc/ryanc/halo/repository/CategoryRepository.java index 87d4ca13a..1086d18ac 100644 --- a/src/main/java/cc/ryanc/halo/repository/CategoryRepository.java +++ b/src/main/java/cc/ryanc/halo/repository/CategoryRepository.java @@ -4,6 +4,8 @@ import cc.ryanc.halo.model.entity.Category; import cc.ryanc.halo.repository.base.BaseRepository; import org.springframework.lang.NonNull; +import java.util.Optional; + /** * Category repository. * @@ -26,4 +28,12 @@ public interface CategoryRepository extends BaseRepository { * @return the count */ long countById(@NonNull Integer id); + + /** + * Get category by slug name + * + * @param slugName slug name + * @return Optional of Category + */ + Optional getBySlugName(@NonNull String slugName); } diff --git a/src/main/java/cc/ryanc/halo/repository/TagRepository.java b/src/main/java/cc/ryanc/halo/repository/TagRepository.java index 11e1881e5..8ed1e14bd 100644 --- a/src/main/java/cc/ryanc/halo/repository/TagRepository.java +++ b/src/main/java/cc/ryanc/halo/repository/TagRepository.java @@ -4,6 +4,8 @@ import cc.ryanc.halo.model.entity.Tag; import cc.ryanc.halo.repository.base.BaseRepository; import org.springframework.lang.NonNull; +import java.util.Optional; + /** * Tag repository. * @@ -19,4 +21,12 @@ public interface TagRepository extends BaseRepository { * @return tag count */ long countByNameOrSlugName(@NonNull String name, @NonNull String slugName); + + /** + * Get tag by slug name + * + * @param slugName slug name + * @return Tag + */ + Optional getBySlugName(@NonNull String slugName); } diff --git a/src/main/java/cc/ryanc/halo/service/CategoryService.java b/src/main/java/cc/ryanc/halo/service/CategoryService.java index 528cca9fd..4ef4f8e10 100755 --- a/src/main/java/cc/ryanc/halo/service/CategoryService.java +++ b/src/main/java/cc/ryanc/halo/service/CategoryService.java @@ -31,4 +31,12 @@ public interface CategoryService extends CrudService { */ @NonNull List listAsTree(@NonNull Sort sort); + + /** + * Get category by slug name + * + * @param slugName slug name + * @return Category + */ + Category getBySlugName(@NonNull String slugName); } diff --git a/src/main/java/cc/ryanc/halo/service/GalleryService.java b/src/main/java/cc/ryanc/halo/service/GalleryService.java index ba887f7dc..207c128e5 100644 --- a/src/main/java/cc/ryanc/halo/service/GalleryService.java +++ b/src/main/java/cc/ryanc/halo/service/GalleryService.java @@ -1,7 +1,6 @@ package cc.ryanc.halo.service; import cc.ryanc.halo.model.dto.GalleryOutputDTO; -import cc.ryanc.halo.model.dto.LinkOutputDTO; import cc.ryanc.halo.model.entity.Gallery; import cc.ryanc.halo.service.base.CrudService; import org.springframework.data.domain.Sort; diff --git a/src/main/java/cc/ryanc/halo/service/TagService.java b/src/main/java/cc/ryanc/halo/service/TagService.java index 1cc7fe97a..b46c49482 100644 --- a/src/main/java/cc/ryanc/halo/service/TagService.java +++ b/src/main/java/cc/ryanc/halo/service/TagService.java @@ -32,4 +32,11 @@ public interface TagService extends CrudService { @NonNull List listDtos(@NonNull Sort sort); + /** + * Get tag by slug name + * + * @param slugName slug name + * @return Tag + */ + Tag getBySlugName(@NonNull String slugName); } diff --git a/src/main/java/cc/ryanc/halo/service/UserService.java b/src/main/java/cc/ryanc/halo/service/UserService.java index 7cf625e03..3f96cb770 100755 --- a/src/main/java/cc/ryanc/halo/service/UserService.java +++ b/src/main/java/cc/ryanc/halo/service/UserService.java @@ -61,6 +61,7 @@ public interface UserService extends CrudService { * @return user info * @throws NotFoundException throws when the username does not exist */ + @NonNull User getByEmailOfNonNull(@NonNull String email); /** diff --git a/src/main/java/cc/ryanc/halo/service/impl/CategoryServiceImpl.java b/src/main/java/cc/ryanc/halo/service/impl/CategoryServiceImpl.java index ac4d3f130..db68287eb 100644 --- a/src/main/java/cc/ryanc/halo/service/impl/CategoryServiceImpl.java +++ b/src/main/java/cc/ryanc/halo/service/impl/CategoryServiceImpl.java @@ -147,4 +147,15 @@ public class CategoryServiceImpl extends AbstractCrudService return topCategory; } + + /** + * Get category by slug name + * + * @param slugName slug name + * @return Category + */ + @Override + public Category getBySlugName(String slugName) { + return categoryRepository.getBySlugName(slugName).orElseThrow(() -> new NotFoundException("The Category does not exist").setErrorData(slugName)); + } } diff --git a/src/main/java/cc/ryanc/halo/service/impl/PostServiceImpl.java b/src/main/java/cc/ryanc/halo/service/impl/PostServiceImpl.java index 05c044c11..69a268d3b 100644 --- a/src/main/java/cc/ryanc/halo/service/impl/PostServiceImpl.java +++ b/src/main/java/cc/ryanc/halo/service/impl/PostServiceImpl.java @@ -8,16 +8,13 @@ import cc.ryanc.halo.model.dto.post.PostSimpleOutputDTO; import cc.ryanc.halo.model.entity.*; import cc.ryanc.halo.model.enums.PostStatus; import cc.ryanc.halo.model.enums.PostType; -import cc.ryanc.halo.model.params.PostParam; import cc.ryanc.halo.model.vo.PostListVO; import cc.ryanc.halo.repository.PostRepository; import cc.ryanc.halo.service.*; import cc.ryanc.halo.service.base.AbstractCrudService; -import cc.ryanc.halo.utils.HaloUtils; import cc.ryanc.halo.utils.MarkdownUtils; import cc.ryanc.halo.utils.ServiceUtils; 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; diff --git a/src/main/java/cc/ryanc/halo/service/impl/TagServiceImpl.java b/src/main/java/cc/ryanc/halo/service/impl/TagServiceImpl.java index 05c14bed3..02f890267 100644 --- a/src/main/java/cc/ryanc/halo/service/impl/TagServiceImpl.java +++ b/src/main/java/cc/ryanc/halo/service/impl/TagServiceImpl.java @@ -1,6 +1,7 @@ package cc.ryanc.halo.service.impl; import cc.ryanc.halo.exception.AlreadyExistsException; +import cc.ryanc.halo.exception.NotFoundException; import cc.ryanc.halo.model.dto.TagOutputDTO; import cc.ryanc.halo.model.entity.Tag; import cc.ryanc.halo.repository.TagRepository; @@ -63,4 +64,15 @@ public class TagServiceImpl extends AbstractCrudService implements // Get tag name return super.create(tag); } + + /** + * Get tag by slug name + * + * @param slugName slug name + * @return Tag + */ + @Override + public Tag getBySlugName(String slugName) { + return tagRepository.getBySlugName(slugName).orElseThrow(() -> new NotFoundException("The tag does not exist").setErrorData(slugName)); + } } diff --git a/src/main/java/cc/ryanc/halo/web/controller/admin/api/TagController.java b/src/main/java/cc/ryanc/halo/web/controller/admin/api/TagController.java index 1b5adc2f4..75f402955 100644 --- a/src/main/java/cc/ryanc/halo/web/controller/admin/api/TagController.java +++ b/src/main/java/cc/ryanc/halo/web/controller/admin/api/TagController.java @@ -13,7 +13,6 @@ import org.springframework.web.bind.annotation.*; import javax.validation.Valid; import java.util.List; -import java.util.stream.Collectors; /** * Tag controller. diff --git a/src/main/java/cc/ryanc/halo/web/controller/content/ContentTagController.java b/src/main/java/cc/ryanc/halo/web/controller/content/ContentTagController.java new file mode 100644 index 000000000..f7a28edb5 --- /dev/null +++ b/src/main/java/cc/ryanc/halo/web/controller/content/ContentTagController.java @@ -0,0 +1,98 @@ +package cc.ryanc.halo.web.controller.content; + +import cc.ryanc.halo.model.entity.Tag; +import cc.ryanc.halo.model.enums.BlogProperties; +import cc.ryanc.halo.model.vo.PostListVO; +import cc.ryanc.halo.service.PostService; +import cc.ryanc.halo.service.TagService; +import cc.ryanc.halo.web.controller.content.base.BaseContentController; +import cn.hutool.core.util.StrUtil; +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.web.SortDefault; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; + +import static cc.ryanc.halo.model.support.HaloConst.OPTIONS; +import static org.springframework.data.domain.Sort.Direction.DESC; + +/** + * Tag Controller + * + * @author : RYAN0UP + * @date : 2019-03-21 + */ +@Controller +@RequestMapping(value = "/tags") +public class ContentTagController extends BaseContentController { + + private TagService tagService; + + private PostService postService; + + public ContentTagController(TagService tagService, PostService postService) { + this.tagService = tagService; + this.postService = postService; + } + + /** + * All of tags + * + * @return template path: themes/{theme}/tags + */ + @GetMapping + public String tags() { + return this.render("tags"); + } + + /** + * List tags by tag slug + * + * @param model model + * @param slugName slug name + * @return template path: themes/{theme}/tag + */ + @GetMapping(value = "{slugName}") + public String tags(Model model, + @PathVariable("slugName") String slugName) { + return this.tags(model, slugName, 1, Sort.by(DESC, "postDate")); + } + + /** + * List tags by tag slug + * + * @param model model + * @param slugName slug name + * @param page current page + * @return template path: themes/{theme}/tag + */ + @GetMapping(value = "{slugName}/page/{page}") + public String tags(Model model, + @PathVariable("slugName") String slugName, + @PathVariable("page") Integer page, + @SortDefault(sort = "postDate", direction = DESC) Sort sort) { + final Tag tag = tagService.getBySlugName(slugName); + if (null == tag) { + return this.renderNotFound(); + } + int size = 10; + if (StrUtil.isNotBlank(OPTIONS.get(BlogProperties.INDEX_POSTS.getValue()))) { + size = Integer.parseInt(OPTIONS.get(BlogProperties.INDEX_POSTS.getValue())); + } + final Pageable pageable = PageRequest.of(page - 1, size, sort); + + // TODO get posts by tag + final Page posts; + //final int[] rainbow = PageUtil.rainbow(page, posts.getTotalPages(), 3); +// model.addAttribute("is_tags", true); +// model.addAttribute("posts", posts); +// model.addAttribute("rainbow", rainbow); +// model.addAttribute("tag", tag); + return this.render("tag"); + } +}