diff --git a/src/main/java/run/halo/app/controller/admin/api/PostController.java b/src/main/java/run/halo/app/controller/admin/api/PostController.java index d261cb7dc..b60250598 100644 --- a/src/main/java/run/halo/app/controller/admin/api/PostController.java +++ b/src/main/java/run/halo/app/controller/admin/api/PostController.java @@ -3,11 +3,8 @@ package run.halo.app.controller.admin.api; import cn.hutool.core.util.IdUtil; import io.swagger.annotations.ApiOperation; 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.PageableDefault; -import org.springframework.data.web.SortDefault; import org.springframework.web.bind.annotation.*; import run.halo.app.cache.StringCacheStore; import run.halo.app.model.dto.post.BasePostMinimalDTO; diff --git a/src/main/java/run/halo/app/controller/admin/api/SheetController.java b/src/main/java/run/halo/app/controller/admin/api/SheetController.java index 653774037..a6409f419 100644 --- a/src/main/java/run/halo/app/controller/admin/api/SheetController.java +++ b/src/main/java/run/halo/app/controller/admin/api/SheetController.java @@ -8,10 +8,10 @@ import org.springframework.data.web.PageableDefault; import org.springframework.web.bind.annotation.*; import run.halo.app.cache.StringCacheStore; import run.halo.app.model.dto.InternalSheetDTO; -import run.halo.app.model.dto.post.BasePostDetailDTO; import run.halo.app.model.entity.Sheet; import run.halo.app.model.enums.PostStatus; import run.halo.app.model.params.SheetParam; +import run.halo.app.model.vo.SheetDetailVO; import run.halo.app.model.vo.SheetListVO; import run.halo.app.service.OptionService; import run.halo.app.service.SheetService; @@ -49,9 +49,9 @@ public class SheetController { @GetMapping("{sheetId:\\d+}") @ApiOperation("Gets a sheet") - public BasePostDetailDTO getBy(@PathVariable("sheetId") Integer sheetId) { + public SheetDetailVO getBy(@PathVariable("sheetId") Integer sheetId) { Sheet sheet = sheetService.getById(sheetId); - return sheetService.convertToDetail(sheet); + return sheetService.convertToDetailVo(sheet); } @GetMapping @@ -69,15 +69,15 @@ public class SheetController { @PostMapping @ApiOperation("Creates a sheet") - public BasePostDetailDTO createBy(@RequestBody @Valid SheetParam sheetParam, - @RequestParam(value = "autoSave", required = false, defaultValue = "false") Boolean autoSave) { - Sheet sheet = sheetService.createBy(sheetParam.convertTo(), autoSave); - return sheetService.convertToDetail(sheet); + public SheetDetailVO createBy(@RequestBody @Valid SheetParam sheetParam, + @RequestParam(value = "autoSave", required = false, defaultValue = "false") Boolean autoSave) { + Sheet sheet = sheetService.createBy(sheetParam.convertTo(), sheetParam.getSheetMetas(), autoSave); + return sheetService.convertToDetailVo(sheet); } @PutMapping("{sheetId:\\d+}") @ApiOperation("Updates a sheet") - public BasePostDetailDTO updateBy( + public SheetDetailVO updateBy( @PathVariable("sheetId") Integer sheetId, @RequestBody @Valid SheetParam sheetParam, @RequestParam(value = "autoSave", required = false, defaultValue = "false") Boolean autoSave) { @@ -85,9 +85,9 @@ public class SheetController { sheetParam.update(sheetToUpdate); - Sheet sheet = sheetService.updateBy(sheetToUpdate, autoSave); + Sheet sheet = sheetService.updateBy(sheetToUpdate, sheetParam.getSheetMetas(), autoSave); - return sheetService.convertToDetail(sheet); + return sheetService.convertToDetailVo(sheet); } @PutMapping("{sheetId:\\d+}/{status}") @@ -105,9 +105,9 @@ public class SheetController { @DeleteMapping("{sheetId:\\d+}") @ApiOperation("Deletes a sheet") - public BasePostDetailDTO deleteBy(@PathVariable("sheetId") Integer sheetId) { + public SheetDetailVO deleteBy(@PathVariable("sheetId") Integer sheetId) { Sheet sheet = sheetService.removeById(sheetId); - return sheetService.convertToDetail(sheet); + return sheetService.convertToDetailVo(sheet); } @GetMapping("preview/{sheetId:\\d+}") diff --git a/src/main/java/run/halo/app/controller/content/ContentArchiveController.java b/src/main/java/run/halo/app/controller/content/ContentArchiveController.java index ae5790468..7774efd2e 100644 --- a/src/main/java/run/halo/app/controller/content/ContentArchiveController.java +++ b/src/main/java/run/halo/app/controller/content/ContentArchiveController.java @@ -162,7 +162,7 @@ public class ContentArchiveController { List categories = postCategoryService.listCategoriesBy(post.getId()); List tags = postTagService.listTagsBy(post.getId()); - List metas = postMetaService.listPostMetasBy(post.getId()); + List metas = postMetaService.listBy(post.getId()); Page comments = postCommentService.pageVosBy(post.getId(), PageRequest.of(cp, optionService.getCommentPageSize(), sort)); diff --git a/src/main/java/run/halo/app/handler/file/QiniuOssFileHandler.java b/src/main/java/run/halo/app/handler/file/QiniuOssFileHandler.java index d456cbbaa..991397cc1 100644 --- a/src/main/java/run/halo/app/handler/file/QiniuOssFileHandler.java +++ b/src/main/java/run/halo/app/handler/file/QiniuOssFileHandler.java @@ -25,7 +25,6 @@ import run.halo.app.utils.FilenameUtils; import run.halo.app.utils.ImageUtils; import run.halo.app.utils.JsonUtils; -import java.awt.image.BufferedImage; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; diff --git a/src/main/java/run/halo/app/handler/file/UpOssFileHandler.java b/src/main/java/run/halo/app/handler/file/UpOssFileHandler.java index 43cee4926..0f36ef599 100644 --- a/src/main/java/run/halo/app/handler/file/UpOssFileHandler.java +++ b/src/main/java/run/halo/app/handler/file/UpOssFileHandler.java @@ -89,9 +89,9 @@ public class UpOssFileHandler implements FileHandler { BufferedImage image = ImageUtils.getImageFromFile(file.getInputStream(), extension); uploadResult.setWidth(image.getWidth()); uploadResult.setHeight(image.getHeight()); - if(ImageUtils.EXTENSION_ICO.equals(extension)){ + if (ImageUtils.EXTENSION_ICO.equals(extension)) { uploadResult.setThumbPath(filePath); - }else { + } else { uploadResult.setThumbPath(StringUtils.isBlank(thumbnailStyleRule) ? filePath : filePath + thumbnailStyleRule); } } diff --git a/src/main/java/run/halo/app/model/dto/PostMetaDTO.java b/src/main/java/run/halo/app/model/dto/BaseMetaDTO.java similarity index 66% rename from src/main/java/run/halo/app/model/dto/PostMetaDTO.java rename to src/main/java/run/halo/app/model/dto/BaseMetaDTO.java index 02516c2c4..b1322fd57 100644 --- a/src/main/java/run/halo/app/model/dto/PostMetaDTO.java +++ b/src/main/java/run/halo/app/model/dto/BaseMetaDTO.java @@ -4,20 +4,20 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; import run.halo.app.model.dto.base.OutputConverter; -import run.halo.app.model.entity.PostMeta; +import run.halo.app.model.entity.BaseMeta; import java.util.Date; /** - * Post meta output dto. + * Base meta Dto. * - * @author guqing - * @date 2019-11-30 + * @author ryanwang + * @date 2019-12-10 */ @Data @ToString @EqualsAndHashCode -public class PostMetaDTO implements OutputConverter { +public class BaseMetaDTO implements OutputConverter { private Long id; private Integer postId; diff --git a/src/main/java/run/halo/app/model/params/SheetParam.java b/src/main/java/run/halo/app/model/params/SheetParam.java index 933246bab..e0808eb24 100644 --- a/src/main/java/run/halo/app/model/params/SheetParam.java +++ b/src/main/java/run/halo/app/model/params/SheetParam.java @@ -2,8 +2,10 @@ package run.halo.app.model.params; import lombok.Data; import org.apache.commons.lang3.StringUtils; +import org.springframework.util.CollectionUtils; import run.halo.app.model.dto.base.InputConverter; import run.halo.app.model.entity.Sheet; +import run.halo.app.model.entity.SheetMeta; import run.halo.app.model.enums.PostStatus; import run.halo.app.utils.SlugUtils; @@ -11,6 +13,8 @@ import javax.validation.constraints.Min; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; import java.util.Date; +import java.util.HashSet; +import java.util.Set; /** * Sheet param. @@ -48,6 +52,8 @@ public class SheetParam implements InputConverter { @Min(value = 0, message = "Post top priority must not be less than {value}") private Integer topPriority = 0; + private Set sheetMetas; + @Override public Sheet convertTo() { url = StringUtils.isBlank(url) ? SlugUtils.slug(title) : SlugUtils.slug(url); @@ -69,4 +75,17 @@ public class SheetParam implements InputConverter { InputConverter.super.update(sheet); } + + public Set getSheetMetas() { + Set sheetMetasSet = new HashSet<>(); + if (CollectionUtils.isEmpty(sheetMetas)) { + return sheetMetasSet; + } + + for (SheetMetaParam sheetMetaParam : sheetMetas) { + SheetMeta sheetMeta = sheetMetaParam.convertTo(); + sheetMetasSet.add(sheetMeta); + } + return sheetMetasSet; + } } diff --git a/src/main/java/run/halo/app/model/vo/PostDetailVO.java b/src/main/java/run/halo/app/model/vo/PostDetailVO.java index ee1cb10b2..f8dec0f63 100644 --- a/src/main/java/run/halo/app/model/vo/PostDetailVO.java +++ b/src/main/java/run/halo/app/model/vo/PostDetailVO.java @@ -3,8 +3,8 @@ package run.halo.app.model.vo; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; +import run.halo.app.model.dto.BaseMetaDTO; import run.halo.app.model.dto.CategoryDTO; -import run.halo.app.model.dto.PostMetaDTO; import run.halo.app.model.dto.TagDTO; import run.halo.app.model.dto.post.BasePostDetailDTO; @@ -33,6 +33,6 @@ public class PostDetailVO extends BasePostDetailDTO { private Set postMetaIds; - private List postMetas; + private List postMetas; } diff --git a/src/main/java/run/halo/app/model/vo/PostListVO.java b/src/main/java/run/halo/app/model/vo/PostListVO.java index bbc58519d..80db07fb0 100644 --- a/src/main/java/run/halo/app/model/vo/PostListVO.java +++ b/src/main/java/run/halo/app/model/vo/PostListVO.java @@ -2,8 +2,8 @@ package run.halo.app.model.vo; import lombok.Data; import lombok.EqualsAndHashCode; +import run.halo.app.model.dto.BaseMetaDTO; import run.halo.app.model.dto.CategoryDTO; -import run.halo.app.model.dto.PostMetaDTO; import run.halo.app.model.dto.TagDTO; import run.halo.app.model.dto.post.BasePostSimpleDTO; @@ -26,5 +26,5 @@ public class PostListVO extends BasePostSimpleDTO { private List categories; - private List postMetas; + private List postMetas; } diff --git a/src/main/java/run/halo/app/model/vo/SheetDetailVO.java b/src/main/java/run/halo/app/model/vo/SheetDetailVO.java new file mode 100644 index 000000000..a8289525b --- /dev/null +++ b/src/main/java/run/halo/app/model/vo/SheetDetailVO.java @@ -0,0 +1,26 @@ +package run.halo.app.model.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import run.halo.app.model.dto.BaseMetaDTO; +import run.halo.app.model.dto.post.BasePostDetailDTO; + +import java.util.List; +import java.util.Set; + +/** + * Sheet detail VO. + * + * @author ryanwang + * @date 2019-12-10 + */ +@Data +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = true) +public class SheetDetailVO extends BasePostDetailDTO { + + private Set sheetMetaIds; + + private List sheetMetas; +} diff --git a/src/main/java/run/halo/app/repository/PostMetaRepository.java b/src/main/java/run/halo/app/repository/PostMetaRepository.java index ff97abf34..5fda8fa0e 100644 --- a/src/main/java/run/halo/app/repository/PostMetaRepository.java +++ b/src/main/java/run/halo/app/repository/PostMetaRepository.java @@ -1,12 +1,8 @@ package run.halo.app.repository; -import org.springframework.lang.NonNull; import run.halo.app.model.entity.PostMeta; import run.halo.app.repository.base.BaseMetaRepository; -import java.util.List; -import java.util.Set; - /** * PostMeta repository. * @@ -17,20 +13,4 @@ import java.util.Set; */ public interface PostMetaRepository extends BaseMetaRepository { - /** - * Deletes post metas by post id. - * - * @param postId post id must not be null - * @return a list of post meta deleted - */ - @NonNull - List deleteByPostId(@NonNull Integer postId); - - /** - * Finds all post metas by post id. - * @param postIds post id must not be null - * @return a list of post meta - */ - @NonNull - List findAllByPostIdIn(@NonNull Set postIds); } diff --git a/src/main/java/run/halo/app/repository/base/BaseMetaRepository.java b/src/main/java/run/halo/app/repository/base/BaseMetaRepository.java index 297ad38f7..5d4041793 100644 --- a/src/main/java/run/halo/app/repository/base/BaseMetaRepository.java +++ b/src/main/java/run/halo/app/repository/base/BaseMetaRepository.java @@ -6,6 +6,7 @@ import org.springframework.lang.NonNull; import run.halo.app.model.entity.BaseMeta; import java.util.List; +import java.util.Set; /** * Base meta repository. @@ -25,4 +26,22 @@ public interface BaseMetaRepository extends BaseRepositor */ @NonNull List findAllByPostId(@NonNull Integer postId); + + /** + * Deletes post metas by post id. + * + * @param postId post id must not be null + * @return a list of post meta deleted + */ + @NonNull + List deleteByPostId(@NonNull Integer postId); + + /** + * Finds all post metas by post id. + * + * @param postIds post id must not be null + * @return a list of post meta + */ + @NonNull + List findAllByPostIdIn(@NonNull Set postIds); } diff --git a/src/main/java/run/halo/app/service/PostMetaService.java b/src/main/java/run/halo/app/service/PostMetaService.java index 00a4c0440..5b02b7a89 100644 --- a/src/main/java/run/halo/app/service/PostMetaService.java +++ b/src/main/java/run/halo/app/service/PostMetaService.java @@ -1,14 +1,8 @@ package run.halo.app.service; -import org.springframework.lang.NonNull; -import run.halo.app.model.dto.PostMetaDTO; import run.halo.app.model.entity.PostMeta; import run.halo.app.service.base.BaseMetaService; -import java.util.List; -import java.util.Map; -import java.util.Set; - /** * Post meta service interface. * @@ -18,55 +12,4 @@ import java.util.Set; * @date 2019-08-04 */ public interface PostMetaService extends BaseMetaService { - - /** - * Creates by post metas and post id. - * - * @param postId post id must not be null - * @param postMetas post metas must not be null - * @return a list of post meta - */ - List createOrUpdateByPostId(@NonNull Integer postId, Set postMetas); - - /** - * Lists post metas by post id. - * - * @param postId post id must not be null - * @return a list of post meta - */ - List listPostMetasBy(@NonNull Integer postId); - - /** - * Remove post metas by post id. - * - * @param postId post id must not be null - * @return a list of post meta - */ - List removeByPostId(@NonNull Integer postId); - - /** - * Lists post metas as map. - * - * @param postIds post ids must not be null - * @return a map of post meta - */ - Map> listPostMetaAsMap(@NonNull Set postIds); - - /** - * Convert PostMeta to PostMetaDTO. - * - * @param postMeta post meta must not be null - * @return post meta vo - */ - @NonNull - PostMetaDTO convertTo(@NonNull PostMeta postMeta); - - /** - * Convert list of PostMeta to list of PostMetaDTO. - * - * @param postMetaList post meta list must not be null - * @return a list of post meta dto - */ - @NonNull - List convertTo(@NonNull List postMetaList); } diff --git a/src/main/java/run/halo/app/service/SheetService.java b/src/main/java/run/halo/app/service/SheetService.java index be3bbb26e..e426e42f8 100644 --- a/src/main/java/run/halo/app/service/SheetService.java +++ b/src/main/java/run/halo/app/service/SheetService.java @@ -4,11 +4,14 @@ import org.springframework.data.domain.Page; import org.springframework.lang.NonNull; import run.halo.app.model.dto.InternalSheetDTO; import run.halo.app.model.entity.Sheet; +import run.halo.app.model.entity.SheetMeta; import run.halo.app.model.enums.PostStatus; +import run.halo.app.model.vo.SheetDetailVO; import run.halo.app.model.vo.SheetListVO; import run.halo.app.service.base.BasePostService; import java.util.List; +import java.util.Set; /** * Sheet service interface. @@ -29,6 +32,16 @@ public interface SheetService extends BasePostService { @NonNull Sheet createBy(@NonNull Sheet sheet, boolean autoSave); + /** + * Creates a sheet. + * + * @param sheet sheet must not be null + * @param sheetMetas sheet metas + * @param autoSave autoSave + * @return created sheet + */ + Sheet createBy(@NonNull Sheet sheet, Set sheetMetas, boolean autoSave); + /** * Updates a sheet. * @@ -39,6 +52,16 @@ public interface SheetService extends BasePostService { @NonNull Sheet updateBy(@NonNull Sheet sheet, boolean autoSave); + /** + * Updates a sheet. + * + * @param sheet sheet must not be null + * @param sheetMetas sheet metas + * @param autoSave autoSave + * @return updated sheet + */ + Sheet updateBy(@NonNull Sheet sheet, Set sheetMetas, boolean autoSave); + /** * Gets by url * @@ -92,4 +115,13 @@ public interface SheetService extends BasePostService { */ @NonNull Page convertToListVo(@NonNull Page sheetPage); + + /** + * Converts to detail vo. + * + * @param sheet sheet must not be null + * @return sheet detail vo + */ + @NonNull + SheetDetailVO convertToDetailVo(@NonNull Sheet sheet); } diff --git a/src/main/java/run/halo/app/service/base/BaseMetaService.java b/src/main/java/run/halo/app/service/base/BaseMetaService.java index a368f2b5a..ce434414b 100644 --- a/src/main/java/run/halo/app/service/base/BaseMetaService.java +++ b/src/main/java/run/halo/app/service/base/BaseMetaService.java @@ -1,11 +1,13 @@ package run.halo.app.service.base; import org.springframework.lang.NonNull; +import run.halo.app.model.dto.BaseMetaDTO; import run.halo.app.model.entity.BaseMeta; import run.halo.app.model.params.BaseMetaParam; import java.util.List; import java.util.Map; +import java.util.Set; /** * Base meta service interface. @@ -16,6 +18,31 @@ import java.util.Map; */ public interface BaseMetaService extends CrudService { + /** + * Creates by post metas and post id. + * + * @param postId post id must not be null + * @param postMetas post metas must not be null + * @return a list of post meta + */ + List createOrUpdateByPostId(@NonNull Integer postId, Set postMetas); + + /** + * Remove post metas by post id. + * + * @param postId post id must not be null + * @return a list of post meta + */ + List removeByPostId(@NonNull Integer postId); + + /** + * Lists post metas as map. + * + * @param postIds post ids must not be null + * @return a map of post meta + */ + Map> listPostMetaAsMap(@NonNull Set postIds); + /** * Lists metas by post id. * @@ -25,7 +52,6 @@ public interface BaseMetaService extends CrudService listBy(@NonNull Integer postId); - /** * Creates a meta by meta. * @@ -59,4 +85,22 @@ public interface BaseMetaService extends CrudService convertToMap(List metas); + + /** + * Convert PostMeta to PostMetaDTO. + * + * @param postMeta post meta must not be null + * @return post meta vo + */ + @NonNull + BaseMetaDTO convertTo(@NonNull META postMeta); + + /** + * Convert list of PostMeta to list of PostMetaDTO. + * + * @param postMetaList post meta list must not be null + * @return a list of post meta dto + */ + @NonNull + List convertTo(@NonNull List postMetaList); } diff --git a/src/main/java/run/halo/app/service/impl/BaseMetaServiceImpl.java b/src/main/java/run/halo/app/service/impl/BaseMetaServiceImpl.java index 9ea1c9b7e..0e4daafbf 100644 --- a/src/main/java/run/halo/app/service/impl/BaseMetaServiceImpl.java +++ b/src/main/java/run/halo/app/service/impl/BaseMetaServiceImpl.java @@ -1,8 +1,11 @@ package run.halo.app.service.impl; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; +import run.halo.app.model.dto.BaseMetaDTO; import run.halo.app.model.entity.BaseMeta; import run.halo.app.model.params.BaseMetaParam; import run.halo.app.repository.base.BaseMetaRepository; @@ -10,10 +13,8 @@ import run.halo.app.service.base.AbstractCrudService; import run.halo.app.service.base.BaseMetaService; import run.halo.app.utils.ServiceUtils; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; /** * Base meta service implementation. @@ -33,6 +34,57 @@ public abstract class BaseMetaServiceImpl extends Abstrac this.baseMetaRepository = baseMetaRepository; } + @Override + @Transactional + public List createOrUpdateByPostId(Integer postId, Set postMetas) { + Assert.notNull(postId, "Post id must not be null"); + + // firstly remove post metas by post id + removeByPostId(postId); + + if (CollectionUtils.isEmpty(postMetas)) { + return Collections.emptyList(); + } + + // Save post metas + postMetas.forEach(postMeta -> { + if (StringUtils.isNotEmpty(postMeta.getValue()) && StringUtils.isNotEmpty(postMeta.getKey())) { + postMeta.setPostId(postId); + baseMetaRepository.save(postMeta); + } + }); + return new ArrayList<>(postMetas); + } + + @Override + public List removeByPostId(Integer postId) { + Assert.notNull(postId, "Post id must not be null of removeByPostId"); + return baseMetaRepository.deleteByPostId(postId); + } + + @Override + public Map> listPostMetaAsMap(Set postIds) { + Assert.notNull(postIds, "Post ids must not be null"); + if (CollectionUtils.isEmpty(postIds)) { + return Collections.emptyMap(); + } + + // Find all post metas + List postMetas = baseMetaRepository.findAllByPostIdIn(postIds); + + // Convert to post meta map + Map postMetaMap = ServiceUtils.convertToMap(postMetas, META::getId); + + // Create category list map + Map> postMetaListMap = new HashMap<>(); + + // Foreach and collect + postMetas.forEach(postMeta -> postMetaListMap.computeIfAbsent(postMeta.getPostId(), postId -> new LinkedList<>()) + .add(postMetaMap.get(postMeta.getId()))); + + return postMetaListMap; + } + @Override public List listBy(Integer postId) { Assert.notNull(postId, "Post id must not be null"); @@ -69,4 +121,23 @@ public abstract class BaseMetaServiceImpl extends Abstrac return result; } + + + @Override + public BaseMetaDTO convertTo(META postMeta) { + Assert.notNull(postMeta, "Category must not be null"); + + return new BaseMetaDTO().convertFrom(postMeta); + } + + @Override + public List convertTo(List postMetaList) { + if (CollectionUtils.isEmpty(postMetaList)) { + return Collections.emptyList(); + } + + return postMetaList.stream() + .map(this::convertTo) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/run/halo/app/service/impl/BasePostServiceImpl.java b/src/main/java/run/halo/app/service/impl/BasePostServiceImpl.java index d81f180c5..f6a71aeac 100644 --- a/src/main/java/run/halo/app/service/impl/BasePostServiceImpl.java +++ b/src/main/java/run/halo/app/service/impl/BasePostServiceImpl.java @@ -342,7 +342,7 @@ public abstract class BasePostServiceImpl extends Abstrac * @param post post must not be null */ protected void urlMustNotExist(@NonNull POST post) { - Assert.notNull(post, "Sheet must not be null"); + Assert.notNull(post, "Post must not be null"); // Get url count boolean exist; diff --git a/src/main/java/run/halo/app/service/impl/PostMetaServiceImpl.java b/src/main/java/run/halo/app/service/impl/PostMetaServiceImpl.java index a5e3291ff..ab5bd0480 100644 --- a/src/main/java/run/halo/app/service/impl/PostMetaServiceImpl.java +++ b/src/main/java/run/halo/app/service/impl/PostMetaServiceImpl.java @@ -1,20 +1,12 @@ package run.halo.app.service.impl; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; -import org.springframework.util.Assert; -import org.springframework.util.CollectionUtils; import run.halo.app.exception.NotFoundException; -import run.halo.app.model.dto.PostMetaDTO; import run.halo.app.model.entity.PostMeta; -import run.halo.app.repository.PostMetaRepository; import run.halo.app.repository.PostRepository; +import run.halo.app.repository.base.BaseMetaRepository; import run.halo.app.service.PostMetaService; -import run.halo.app.utils.ServiceUtils; - -import java.util.*; -import java.util.stream.Collectors; /** * Post meta service implementation class. @@ -28,14 +20,10 @@ import java.util.stream.Collectors; @Service public class PostMetaServiceImpl extends BaseMetaServiceImpl implements PostMetaService { - private final PostMetaRepository postMetaRepository; - private final PostRepository postRepository; - public PostMetaServiceImpl(PostMetaRepository postMetaRepository, - PostRepository postRepository) { - super(postMetaRepository); - this.postMetaRepository = postMetaRepository; + public PostMetaServiceImpl(BaseMetaRepository baseMetaRepository, PostRepository postRepository) { + super(baseMetaRepository); this.postRepository = postRepository; } @@ -44,77 +32,4 @@ public class PostMetaServiceImpl extends BaseMetaServiceImpl implement postRepository.findById(postId) .orElseThrow(() -> new NotFoundException("查询不到该文章的信息").setErrorData(postId)); } - - @Override - public List createOrUpdateByPostId(Integer postId, Set postMetas) { - Assert.notNull(postId, "Post id must not be null"); - if (CollectionUtils.isEmpty(postMetas)) { - return Collections.emptyList(); - } - - // firstly remove post metas by post id - removeByPostId(postId); - - // Save post metas - postMetas.forEach(postMeta -> { - if (StringUtils.isNotEmpty(postMeta.getValue()) && StringUtils.isNotEmpty(postMeta.getKey())) { - postMeta.setPostId(postId); - postMetaRepository.save(postMeta); - } - }); - return new ArrayList<>(postMetas); - } - - @Override - public List listPostMetasBy(Integer postId) { - Assert.notNull(postId, "Post id must not be null"); - return postMetaRepository.findAllByPostId(postId); - } - - @Override - public List removeByPostId(Integer postId) { - Assert.notNull(postId, "Post id must not be null of removeByPostId"); - return postMetaRepository.deleteByPostId(postId); - } - - @Override - public Map> listPostMetaAsMap(Set postIds) { - Assert.notNull(postIds, "Post ids must not be null"); - if (CollectionUtils.isEmpty(postIds)) { - return Collections.emptyMap(); - } - - // Find all post metas - List postMetas = postMetaRepository.findAllByPostIdIn(postIds); - - // Convert to post meta map - Map postMetaMap = ServiceUtils.convertToMap(postMetas, PostMeta::getId); - - // Create category list map - Map> postMetaListMap = new HashMap<>(); - - // Foreach and collect - postMetas.forEach(postMeta -> postMetaListMap.computeIfAbsent(postMeta.getPostId(), postId -> new LinkedList<>()) - .add(postMetaMap.get(postMeta.getId()))); - - return postMetaListMap; - } - - @Override - public PostMetaDTO convertTo(PostMeta postMeta) { - Assert.notNull(postMeta, "Category must not be null"); - - return new PostMetaDTO().convertFrom(postMeta); - } - - @Override - public List convertTo(List postMetaList) { - if (CollectionUtils.isEmpty(postMetaList)) { - return Collections.emptyList(); - } - - return postMetaList.stream() - .map(this::convertTo) - .collect(Collectors.toList()); - } } 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 8b1fbbee9..21c9f86f6 100644 --- a/src/main/java/run/halo/app/service/impl/PostServiceImpl.java +++ b/src/main/java/run/halo/app/service/impl/PostServiceImpl.java @@ -17,8 +17,8 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import run.halo.app.event.logger.LogEvent; import run.halo.app.event.post.PostVisitEvent; +import run.halo.app.model.dto.BaseMetaDTO; import run.halo.app.model.dto.CategoryDTO; -import run.halo.app.model.dto.PostMetaDTO; import run.halo.app.model.dto.TagDTO; import run.halo.app.model.entity.*; import run.halo.app.model.enums.LogType; @@ -357,7 +357,7 @@ public class PostServiceImpl extends BasePostServiceImpl implements PostSe } } - List postMetas = postMetaService.listPostMetasBy(post.getId()); + List postMetas = postMetaService.listBy(post.getId()); if (postMetas.size() > 0) { content.append("postMetas:").append("\n"); @@ -378,7 +378,7 @@ public class PostServiceImpl extends BasePostServiceImpl implements PostSe // List categories List categories = postCategoryService.listCategoriesBy(post.getId()); // List postMetas - List postMetas = postMetaService.listPostMetasBy(post.getId()); + List postMetas = postMetaService.listBy(post.getId()); // Convert to detail vo return convertTo(post, tags, categories, postMetas); } @@ -460,7 +460,7 @@ public class PostServiceImpl extends BasePostServiceImpl implements PostSe .orElseGet(LinkedList::new) .stream() .filter(Objects::nonNull) - .map(postMeta -> (PostMetaDTO) new PostMetaDTO().convertFrom(postMeta)) + .map(postMeta -> (BaseMetaDTO) new BaseMetaDTO().convertFrom(postMeta)) .collect(Collectors.toList())); // Set comment count @@ -557,8 +557,6 @@ public class PostServiceImpl extends BasePostServiceImpl implements PostSe postCategoryService.removeByPostId(post.getId()); - postMetaService.removeByPostId(post.getId()); - // List all tags List tags = tagService.listAllByIds(tagIds); 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 ddb5f9e32..269206b6b 100644 --- a/src/main/java/run/halo/app/service/impl/SheetServiceImpl.java +++ b/src/main/java/run/halo/app/service/impl/SheetServiceImpl.java @@ -1,30 +1,30 @@ package run.halo.app.service.impl; import cn.hutool.core.text.StrBuilder; +import lombok.extern.slf4j.Slf4j; 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.event.logger.LogEvent; import run.halo.app.event.post.SheetVisitEvent; +import run.halo.app.exception.AlreadyExistsException; +import run.halo.app.exception.NotFoundException; import run.halo.app.model.dto.InternalSheetDTO; import run.halo.app.model.entity.Sheet; +import run.halo.app.model.entity.SheetMeta; import run.halo.app.model.enums.LogType; import run.halo.app.model.enums.PostStatus; +import run.halo.app.model.vo.SheetDetailVO; import run.halo.app.model.vo.SheetListVO; import run.halo.app.repository.SheetRepository; -import run.halo.app.service.OptionService; -import run.halo.app.service.SheetCommentService; -import run.halo.app.service.SheetService; -import run.halo.app.service.ThemeService; +import run.halo.app.service.*; import run.halo.app.utils.MarkdownUtils; import run.halo.app.utils.ServiceUtils; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; /** * Sheet service implementation. @@ -33,6 +33,7 @@ import java.util.Set; * @author ryanwang * @date 2019-04-24 */ +@Slf4j @Service public class SheetServiceImpl extends BasePostServiceImpl implements SheetService { @@ -42,17 +43,21 @@ public class SheetServiceImpl extends BasePostServiceImpl implements Shee private final SheetCommentService sheetCommentService; + private final SheetMetaService sheetMetaService; + private final ThemeService themeService; public SheetServiceImpl(SheetRepository sheetRepository, ApplicationEventPublisher eventPublisher, SheetCommentService sheetCommentService, OptionService optionService, + SheetMetaService sheetMetaService, ThemeService themeService) { super(sheetRepository, optionService); this.sheetRepository = sheetRepository; this.eventPublisher = eventPublisher; this.sheetCommentService = sheetCommentService; + this.sheetMetaService = sheetMetaService; this.themeService = themeService; } @@ -67,6 +72,22 @@ public class SheetServiceImpl extends BasePostServiceImpl implements Shee return createdSheet; } + @Override + public Sheet createBy(Sheet sheet, Set sheetMetas, boolean autoSave) { + Sheet createdSheet = createOrUpdateBy(sheet); + + // Create sheet meta data + List sheetMetaList = sheetMetaService.createOrUpdateByPostId(sheet.getId(), sheetMetas); + log.debug("Created sheet metas: [{}]", sheetMetaList); + + if (!autoSave) { + // Log the creation + LogEvent logEvent = new LogEvent(this, createdSheet.getId().toString(), LogType.SHEET_PUBLISHED, createdSheet.getTitle()); + eventPublisher.publishEvent(logEvent); + } + return createdSheet; + } + @Override public Sheet updateBy(Sheet sheet, boolean autoSave) { Sheet updatedSheet = createOrUpdateBy(sheet); @@ -78,6 +99,23 @@ public class SheetServiceImpl extends BasePostServiceImpl implements Shee return updatedSheet; } + @Override + public Sheet updateBy(Sheet sheet, Set sheetMetas, boolean autoSave) { + + Sheet updatedSheet = createOrUpdateBy(sheet); + + // Create sheet meta data + List sheetMetaList = sheetMetaService.createOrUpdateByPostId(updatedSheet.getId(), sheetMetas); + log.debug("Created sheet metas: [{}]", sheetMetaList); + + if (!autoSave) { + // Log the creation + LogEvent logEvent = new LogEvent(this, updatedSheet.getId().toString(), LogType.SHEET_EDITED, updatedSheet.getTitle()); + eventPublisher.publishEvent(logEvent); + } + return updatedSheet; + } + @Override public Page pageBy(Pageable pageable) { Assert.notNull(pageable, "Page info must not be null"); @@ -85,9 +123,21 @@ public class SheetServiceImpl extends BasePostServiceImpl implements Shee return listAll(pageable); } + @Override + public Sheet getByUrl(String url) { + Assert.hasText(url, "Url must not be blank"); + + return sheetRepository.getByUrl(url).orElseThrow(() -> new NotFoundException("查询不到该页面的信息").setErrorData(url)); + } + @Override public Sheet getBy(PostStatus status, String url) { - Sheet sheet = super.getBy(status, url); + Assert.notNull(status, "Post status must not be null"); + Assert.hasText(url, "Post url must not be blank"); + + Optional postOptional = sheetRepository.getByUrlAndStatus(url, status); + + Sheet sheet = postOptional.orElseThrow(() -> new NotFoundException("查询不到该页面的信息").setErrorData(url)); if (PostStatus.PUBLISHED.equals(status)) { // Log it @@ -199,4 +249,46 @@ public class SheetServiceImpl extends BasePostServiceImpl implements Shee }); } + @Override + public SheetDetailVO convertToDetailVo(Sheet sheet) { + // List sheetMetas + List sheetMetas = sheetMetaService.listBy(sheet.getId()); + // Convert to detail vo + return convertTo(sheet, sheetMetas); + } + + @NonNull + private SheetDetailVO convertTo(@NonNull Sheet sheet, List sheetMetas) { + Assert.notNull(sheet, "Sheet must not be null"); + + // Convert to base detail vo + SheetDetailVO sheetDetailVO = new SheetDetailVO().convertFrom(sheet); + + Set sheetMetaIds = ServiceUtils.fetchProperty(sheetMetas, SheetMeta::getId); + + // Get sheet meta ids + sheetDetailVO.setSheetMetaIds(sheetMetaIds); + sheetDetailVO.setSheetMetas(sheetMetaService.convertTo(sheetMetas)); + return sheetDetailVO; + } + + @Override + protected void urlMustNotExist(Sheet sheet) { + Assert.notNull(sheet, "Sheet must not be null"); + + // Get url count + boolean exist; + + if (ServiceUtils.isEmptyId(sheet.getId())) { + // The sheet will be created + exist = sheetRepository.existsByUrl(sheet.getUrl()); + } else { + // The sheet will be updated + exist = sheetRepository.existsByIdNotAndUrl(sheet.getId(), sheet.getUrl()); + } + + if (exist) { + throw new AlreadyExistsException("页面路径 " + sheet.getUrl() + " 已存在"); + } + } }