diff --git a/src/main/java/cc/ryanc/halo/model/vo/ArchiveMonthVO.java b/src/main/java/cc/ryanc/halo/model/vo/ArchiveMonthVO.java index 1400f846a..1c671b7cc 100644 --- a/src/main/java/cc/ryanc/halo/model/vo/ArchiveMonthVO.java +++ b/src/main/java/cc/ryanc/halo/model/vo/ArchiveMonthVO.java @@ -4,6 +4,8 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; +import java.util.Comparator; + /** * Archive vo. * @@ -17,14 +19,17 @@ public class ArchiveMonthVO extends ArchiveYearVO { private Integer month; - @Override - public int compare(ArchiveYearVO current, ArchiveYearVO other) { - int compare = super.compare(current, other); + public static class ArchiveComparator implements Comparator { - if (compare != 0) { - return compare; + @Override + public int compare(ArchiveMonthVO left, ArchiveMonthVO right) { + int compare = right.getYear() - left.getYear(); + + if (compare != 0) { + return compare; + } + + return right.getMonth() - left.getMonth(); } - - return ((ArchiveMonthVO) current).month - ((ArchiveMonthVO) other).month; } } diff --git a/src/main/java/cc/ryanc/halo/model/vo/ArchiveYearVO.java b/src/main/java/cc/ryanc/halo/model/vo/ArchiveYearVO.java index 23225da64..7dde75e0f 100644 --- a/src/main/java/cc/ryanc/halo/model/vo/ArchiveYearVO.java +++ b/src/main/java/cc/ryanc/halo/model/vo/ArchiveYearVO.java @@ -17,14 +17,17 @@ import java.util.List; @Data @ToString @EqualsAndHashCode -public class ArchiveYearVO implements Comparator { +public class ArchiveYearVO { private Integer year; private List posts; - @Override - public int compare(ArchiveYearVO current, ArchiveYearVO other) { - return current.year - other.year; + public static class ArchiveComparator implements Comparator { + + @Override + public int compare(ArchiveYearVO left, ArchiveYearVO right) { + return right.getYear() - left.getYear(); + } } } 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 c37e72dd4..a104a0e16 100644 --- a/src/main/java/cc/ryanc/halo/service/impl/PostServiceImpl.java +++ b/src/main/java/cc/ryanc/halo/service/impl/PostServiceImpl.java @@ -263,7 +263,7 @@ public class PostServiceImpl extends AbstractCrudService implemen // Get all posts List posts = postRepository.findAllByStatus(PostStatus.PUBLISHED, Sort.by(DESC, "createTime")); - Map> yearPostMap = new HashMap<>(); + Map> yearPostMap = new HashMap<>(8); posts.forEach(post -> { Calendar calendar = DateUtils.convertTo(post.getCreateTime()); @@ -271,6 +271,7 @@ public class PostServiceImpl extends AbstractCrudService implemen .add(post); }); + List archives = new LinkedList<>(); yearPostMap.forEach((year, postList) -> { @@ -283,14 +284,42 @@ public class PostServiceImpl extends AbstractCrudService implemen archives.add(archive); }); - // TODO Sort this list and inner list + // Sort this list + archives.sort(new ArchiveYearVO.ArchiveComparator()); return archives; } @Override public List listMonthArchives() { - return null; + // Get all posts + List posts = postRepository.findAllByStatus(PostStatus.PUBLISHED, Sort.by(DESC, "createTime")); + + Map>> yearMonthPostMap = new HashMap<>(8); + + posts.forEach(post -> { + Calendar calendar = DateUtils.convertTo(post.getCreateTime()); + + yearMonthPostMap.computeIfAbsent(calendar.get(Calendar.YEAR), year -> new HashMap<>()) + .computeIfAbsent((calendar.get(Calendar.MONTH) + 1), month -> new LinkedList<>()) + .add(post); + }); + + List archives = new LinkedList<>(); + + yearMonthPostMap.forEach((year, monthPostMap) -> monthPostMap.forEach((month, postList) -> { + ArchiveMonthVO archive = new ArchiveMonthVO(); + archive.setYear(year); + archive.setMonth(month); + archive.setPosts(convertTo(postList)); + + archives.add(archive); + })); + + // Sort this list + archives.sort(new ArchiveMonthVO.ArchiveComparator()); + + return archives; } @Override