feat: support sheet meta.

pull/755/head
ruibaby 2019-12-10 13:04:10 +08:00
parent 267e184af1
commit bc411484d6
20 changed files with 349 additions and 214 deletions

View File

@ -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;

View File

@ -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+}")

View File

@ -162,7 +162,7 @@ public class ContentArchiveController {
List<Category> categories = postCategoryService.listCategoriesBy(post.getId());
List<Tag> tags = postTagService.listTagsBy(post.getId());
List<PostMeta> metas = postMetaService.listPostMetasBy(post.getId());
List<PostMeta> metas = postMetaService.listBy(post.getId());
Page<BaseCommentVO> comments = postCommentService.pageVosBy(post.getId(), PageRequest.of(cp, optionService.getCommentPageSize(), sort));

View File

@ -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;

View File

@ -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);
}
}

View File

@ -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<PostMetaDTO, PostMeta> {
public class BaseMetaDTO implements OutputConverter<BaseMetaDTO, BaseMeta> {
private Long id;
private Integer postId;

View File

@ -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<Sheet> {
@Min(value = 0, message = "Post top priority must not be less than {value}")
private Integer topPriority = 0;
private Set<SheetMetaParam> sheetMetas;
@Override
public Sheet convertTo() {
url = StringUtils.isBlank(url) ? SlugUtils.slug(title) : SlugUtils.slug(url);
@ -69,4 +75,17 @@ public class SheetParam implements InputConverter<Sheet> {
InputConverter.super.update(sheet);
}
public Set<SheetMeta> getSheetMetas() {
Set<SheetMeta> sheetMetasSet = new HashSet<>();
if (CollectionUtils.isEmpty(sheetMetas)) {
return sheetMetasSet;
}
for (SheetMetaParam sheetMetaParam : sheetMetas) {
SheetMeta sheetMeta = sheetMetaParam.convertTo();
sheetMetasSet.add(sheetMeta);
}
return sheetMetasSet;
}
}

View File

@ -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<Long> postMetaIds;
private List<PostMetaDTO> postMetas;
private List<BaseMetaDTO> postMetas;
}

View File

@ -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<CategoryDTO> categories;
private List<PostMetaDTO> postMetas;
private List<BaseMetaDTO> postMetas;
}

View File

@ -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<Long> sheetMetaIds;
private List<BaseMetaDTO> sheetMetas;
}

View File

@ -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<PostMeta> {
/**
* Deletes post metas by post id.
*
* @param postId post id must not be null
* @return a list of post meta deleted
*/
@NonNull
List<PostMeta> 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<PostMeta> findAllByPostIdIn(@NonNull Set<Integer> postIds);
}

View File

@ -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<META extends BaseMeta> extends BaseRepositor
*/
@NonNull
List<META> 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<META> 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<META> findAllByPostIdIn(@NonNull Set<Integer> postIds);
}

View File

@ -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<PostMeta> {
/**
* 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<PostMeta> createOrUpdateByPostId(@NonNull Integer postId, Set<PostMeta> postMetas);
/**
* Lists post metas by post id.
*
* @param postId post id must not be null
* @return a list of post meta
*/
List<PostMeta> 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<PostMeta> removeByPostId(@NonNull Integer postId);
/**
* Lists post metas as map.
*
* @param postIds post ids must not be null
* @return a map of post meta
*/
Map<Integer, List<PostMeta>> listPostMetaAsMap(@NonNull Set<Integer> 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<PostMetaDTO> convertTo(@NonNull List<PostMeta> postMetaList);
}

View File

@ -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<Sheet> {
@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<SheetMeta> sheetMetas, boolean autoSave);
/**
* Updates a sheet.
*
@ -39,6 +52,16 @@ public interface SheetService extends BasePostService<Sheet> {
@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<SheetMeta> sheetMetas, boolean autoSave);
/**
* Gets by url
*
@ -92,4 +115,13 @@ public interface SheetService extends BasePostService<Sheet> {
*/
@NonNull
Page<SheetListVO> convertToListVo(@NonNull Page<Sheet> sheetPage);
/**
* Converts to detail vo.
*
* @param sheet sheet must not be null
* @return sheet detail vo
*/
@NonNull
SheetDetailVO convertToDetailVo(@NonNull Sheet sheet);
}

View File

@ -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<META extends BaseMeta> extends CrudService<META, Long> {
/**
* 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<META> createOrUpdateByPostId(@NonNull Integer postId, Set<META> postMetas);
/**
* Remove post metas by post id.
*
* @param postId post id must not be null
* @return a list of post meta
*/
List<META> removeByPostId(@NonNull Integer postId);
/**
* Lists post metas as map.
*
* @param postIds post ids must not be null
* @return a map of post meta
*/
Map<Integer, List<META>> listPostMetaAsMap(@NonNull Set<Integer> postIds);
/**
* Lists metas by post id.
*
@ -25,7 +52,6 @@ public interface BaseMetaService<META extends BaseMeta> extends CrudService<META
@NonNull
List<META> listBy(@NonNull Integer postId);
/**
* Creates a meta by meta.
*
@ -59,4 +85,22 @@ public interface BaseMetaService<META extends BaseMeta> extends CrudService<META
* @return a map of metas
*/
Map<String, Object> convertToMap(List<META> 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<BaseMetaDTO> convertTo(@NonNull List<META> postMetaList);
}

View File

@ -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<META extends BaseMeta> extends Abstrac
this.baseMetaRepository = baseMetaRepository;
}
@Override
@Transactional
public List<META> createOrUpdateByPostId(Integer postId, Set<META> 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<META> removeByPostId(Integer postId) {
Assert.notNull(postId, "Post id must not be null of removeByPostId");
return baseMetaRepository.deleteByPostId(postId);
}
@Override
public Map<Integer, List<META>> listPostMetaAsMap(Set<Integer> postIds) {
Assert.notNull(postIds, "Post ids must not be null");
if (CollectionUtils.isEmpty(postIds)) {
return Collections.emptyMap();
}
// Find all post metas
List<META> postMetas = baseMetaRepository.findAllByPostIdIn(postIds);
// Convert to post meta map
Map<Long, META> postMetaMap = ServiceUtils.convertToMap(postMetas, META::getId);
// Create category list map
Map<Integer, List<META>> 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<META> listBy(Integer postId) {
Assert.notNull(postId, "Post id must not be null");
@ -69,4 +121,23 @@ public abstract class BaseMetaServiceImpl<META extends BaseMeta> 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<BaseMetaDTO> convertTo(List<META> postMetaList) {
if (CollectionUtils.isEmpty(postMetaList)) {
return Collections.emptyList();
}
return postMetaList.stream()
.map(this::convertTo)
.collect(Collectors.toList());
}
}

View File

@ -342,7 +342,7 @@ public abstract class BasePostServiceImpl<POST extends BasePost> 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;

View File

@ -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<PostMeta> implements PostMetaService {
private final PostMetaRepository postMetaRepository;
private final PostRepository postRepository;
public PostMetaServiceImpl(PostMetaRepository postMetaRepository,
PostRepository postRepository) {
super(postMetaRepository);
this.postMetaRepository = postMetaRepository;
public PostMetaServiceImpl(BaseMetaRepository<PostMeta> baseMetaRepository, PostRepository postRepository) {
super(baseMetaRepository);
this.postRepository = postRepository;
}
@ -44,77 +32,4 @@ public class PostMetaServiceImpl extends BaseMetaServiceImpl<PostMeta> implement
postRepository.findById(postId)
.orElseThrow(() -> new NotFoundException("查询不到该文章的信息").setErrorData(postId));
}
@Override
public List<PostMeta> createOrUpdateByPostId(Integer postId, Set<PostMeta> 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<PostMeta> listPostMetasBy(Integer postId) {
Assert.notNull(postId, "Post id must not be null");
return postMetaRepository.findAllByPostId(postId);
}
@Override
public List<PostMeta> removeByPostId(Integer postId) {
Assert.notNull(postId, "Post id must not be null of removeByPostId");
return postMetaRepository.deleteByPostId(postId);
}
@Override
public Map<Integer, List<PostMeta>> listPostMetaAsMap(Set<Integer> postIds) {
Assert.notNull(postIds, "Post ids must not be null");
if (CollectionUtils.isEmpty(postIds)) {
return Collections.emptyMap();
}
// Find all post metas
List<PostMeta> postMetas = postMetaRepository.findAllByPostIdIn(postIds);
// Convert to post meta map
Map<Long, PostMeta> postMetaMap = ServiceUtils.convertToMap(postMetas, PostMeta::getId);
// Create category list map
Map<Integer, List<PostMeta>> 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<PostMetaDTO> convertTo(List<PostMeta> postMetaList) {
if (CollectionUtils.isEmpty(postMetaList)) {
return Collections.emptyList();
}
return postMetaList.stream()
.map(this::convertTo)
.collect(Collectors.toList());
}
}

View File

@ -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<Post> implements PostSe
}
}
List<PostMeta> postMetas = postMetaService.listPostMetasBy(post.getId());
List<PostMeta> postMetas = postMetaService.listBy(post.getId());
if (postMetas.size() > 0) {
content.append("postMetas:").append("\n");
@ -378,7 +378,7 @@ public class PostServiceImpl extends BasePostServiceImpl<Post> implements PostSe
// List categories
List<Category> categories = postCategoryService.listCategoriesBy(post.getId());
// List postMetas
List<PostMeta> postMetas = postMetaService.listPostMetasBy(post.getId());
List<PostMeta> postMetas = postMetaService.listBy(post.getId());
// Convert to detail vo
return convertTo(post, tags, categories, postMetas);
}
@ -460,7 +460,7 @@ public class PostServiceImpl extends BasePostServiceImpl<Post> 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<Post> implements PostSe
postCategoryService.removeByPostId(post.getId());
postMetaService.removeByPostId(post.getId());
// List all tags
List<Tag> tags = tagService.listAllByIds(tagIds);

View File

@ -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<Sheet> implements SheetService {
@ -42,17 +43,21 @@ public class SheetServiceImpl extends BasePostServiceImpl<Sheet> 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<Sheet> implements Shee
return createdSheet;
}
@Override
public Sheet createBy(Sheet sheet, Set<SheetMeta> sheetMetas, boolean autoSave) {
Sheet createdSheet = createOrUpdateBy(sheet);
// Create sheet meta data
List<SheetMeta> 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<Sheet> implements Shee
return updatedSheet;
}
@Override
public Sheet updateBy(Sheet sheet, Set<SheetMeta> sheetMetas, boolean autoSave) {
Sheet updatedSheet = createOrUpdateBy(sheet);
// Create sheet meta data
List<SheetMeta> 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<Sheet> pageBy(Pageable pageable) {
Assert.notNull(pageable, "Page info must not be null");
@ -85,9 +123,21 @@ public class SheetServiceImpl extends BasePostServiceImpl<Sheet> 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<Sheet> 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<Sheet> implements Shee
});
}
@Override
public SheetDetailVO convertToDetailVo(Sheet sheet) {
// List sheetMetas
List<SheetMeta> sheetMetas = sheetMetaService.listBy(sheet.getId());
// Convert to detail vo
return convertTo(sheet, sheetMetas);
}
@NonNull
private SheetDetailVO convertTo(@NonNull Sheet sheet, List<SheetMeta> sheetMetas) {
Assert.notNull(sheet, "Sheet must not be null");
// Convert to base detail vo
SheetDetailVO sheetDetailVO = new SheetDetailVO().convertFrom(sheet);
Set<Long> 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() + " 已存在");
}
}
}