diff --git a/src/main/java/run/halo/app/model/entity/BaseComment.java b/src/main/java/run/halo/app/model/entity/BaseComment.java index df25c6f7c..11287907f 100644 --- a/src/main/java/run/halo/app/model/entity/BaseComment.java +++ b/src/main/java/run/halo/app/model/entity/BaseComment.java @@ -103,7 +103,6 @@ public class BaseComment extends BaseEntity { @Override public void prePersist() { super.prePersist(); - id = null; if (parentId == null || parentId < 0) { parentId = 0L; diff --git a/src/main/java/run/halo/app/service/impl/RecoveryServiceImpl.java b/src/main/java/run/halo/app/service/impl/RecoveryServiceImpl.java index bb8b038a5..4dbf6e447 100644 --- a/src/main/java/run/halo/app/service/impl/RecoveryServiceImpl.java +++ b/src/main/java/run/halo/app/service/impl/RecoveryServiceImpl.java @@ -1,5 +1,6 @@ package run.halo.app.service.impl; +import cn.hutool.core.lang.Assert; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.lang.NonNull; @@ -10,6 +11,7 @@ import org.springframework.web.multipart.MultipartFile; import run.halo.app.exception.ServiceException; import run.halo.app.model.entity.*; import run.halo.app.model.enums.AttachmentType; +import run.halo.app.model.enums.CommentStatus; import run.halo.app.model.enums.PostStatus; import run.halo.app.service.*; import run.halo.app.utils.BeanUtils; @@ -19,6 +21,7 @@ import java.io.IOException; import java.io.InputStreamReader; import java.text.SimpleDateFormat; import java.util.*; +import java.util.stream.Collectors; /** * Recovery service implementation. @@ -139,7 +142,7 @@ public class RecoveryServiceImpl implements RecoveryService { post.setFormatContent(postMap.getOrDefault("postContent", "").toString()); post.setSummary(postMap.getOrDefault("postSummary", "").toString()); post.setThumbnail(postMap.getOrDefault("postThumbnail", "").toString()); - post.setVisits(getLongOrDefault(postMap.get("postViews").toString(), 0L)); + post.setVisits(getLongOrDefault(postMap.getOrDefault("postViews", "").toString(), 0L)); post.setDisallowComment(false); post.setTemplate(postMap.getOrDefault("customTpl", "").toString()); @@ -150,19 +153,19 @@ public class RecoveryServiceImpl implements RecoveryService { } // Set create time - Long createTime = getLongOrDefault(postMap.get("postDate").toString(), 0L); + Long createTime = getLongOrDefault(postMap.getOrDefault("postDate", "").toString(), 0L); if (createTime != 0L) { post.setCreateTime(new Date(createTime)); } // Set update time - Long updateTime = getLongOrDefault(postMap.get("postUpdate").toString(), 0L); + Long updateTime = getLongOrDefault(postMap.getOrDefault("postUpdate", "").toString(), 0L); if (updateTime != 0L) { post.setUpdateTime(new Date(updateTime)); } // Set status (default draft) - Integer postStatus = getIntegerOrDefault(postMap.get("postStatus").toString(), 1); + Integer postStatus = getIntegerOrDefault(postMap.getOrDefault("postStatus", "").toString(), 1); if (postStatus == 0) { post.setStatus(PostStatus.PUBLISHED); } else if (postStatus == 1) { @@ -199,6 +202,19 @@ public class RecoveryServiceImpl implements RecoveryService { Object commentsObject = postMap.get("comments"); // TODO Handle comments + List baseComments = handleComment(commentsObject, createdPost.getId()); + + List postComments = baseComments.stream() + .map(baseComment -> BeanUtils.transformFrom(baseComment, PostComment.class)) + .collect(Collectors.toList()); + + try { + // Create comments + List createdPostComments = postCommentService.createInBatch(postComments); + } catch (Exception e) { + log.warn("Failed to create post comments for post with id " + createdPost.getId(), e); + // Ignore this exception + } return createdPost; } @@ -212,10 +228,69 @@ public class RecoveryServiceImpl implements RecoveryService { Object commentsObject = postMap.get("comments"); // TODO Handle comments + List baseComments = handleComment(commentsObject, createdSheet.getId()); + + List sheetComments = baseComments.stream() + .map(baseComment -> BeanUtils.transformFrom(baseComment, SheetComment.class)) + .collect(Collectors.toList()); + + // Create comments + try { + sheetCommentService.createInBatch(sheetComments); + } catch (Exception e) { + log.warn("Failed to create sheet comments for sheet with id " + createdSheet.getId(), e); + // Ignore this exception + } return createdSheet; } + private List handleComment(@Nullable Object commentsObject, @NonNull Integer postId) { + Assert.notNull(postId, "Post id must not be null"); + + if (!(commentsObject instanceof List)) { + return Collections.emptyList(); + } + + List commentObjectList = (List) commentsObject; + + List result = new LinkedList<>(); + + commentObjectList.forEach(commentObject -> { + if (!(commentObject instanceof Map)) { + return; + } + + Map commentMap = (Map) commentObject; + + BaseComment baseComment = new BaseComment(); + baseComment.setId(getLongOrDefault(commentMap.getOrDefault("commentId", "").toString(), null)); + baseComment.setAuthor(commentMap.getOrDefault("commentAuthor", "").toString()); + baseComment.setEmail(commentMap.getOrDefault("commentAuthorEmail", "").toString()); + baseComment.setIpAddress(commentMap.getOrDefault("commentAuthorIp", "").toString()); + baseComment.setAuthorUrl(commentMap.getOrDefault("commentAuthorUrl", "").toString()); + baseComment.setGavatarMd5(commentMap.getOrDefault("commentAuthorAvatarMd5", "").toString()); + baseComment.setContent(commentMap.getOrDefault("commentContent", "").toString()); + baseComment.setUserAgent(commentMap.getOrDefault("commentAgent", "").toString()); + baseComment.setIsAdmin(getBooleanOrDefault(commentMap.getOrDefault("isAdmin", "").toString(), false)); + baseComment.setPostId(postId); + baseComment.setParentId(getLongOrDefault(commentMap.getOrDefault("commentParent", "").toString(), 0L)); + + Integer commentStatus = getIntegerOrDefault(commentMap.getOrDefault("commentStatus", "").toString(), 1); + if (commentStatus == 0) { + baseComment.setStatus(CommentStatus.PUBLISHED); + } else if (commentStatus == 1) { + baseComment.setStatus(CommentStatus.AUDITING); + } else { + baseComment.setStatus(CommentStatus.RECYCLE); + } + + result.add(baseComment); + }); + + return result; + } + @NonNull private List handleMenus(@Nullable Object menusObject) { @@ -390,7 +465,7 @@ public class RecoveryServiceImpl implements RecoveryService { } @NonNull - private Integer getIntegerOrDefault(@Nullable String numberString, int defaultNumber) { + private Integer getIntegerOrDefault(@Nullable String numberString, @Nullable Integer defaultNumber) { try { return Integer.valueOf(numberString); } catch (Exception e) { @@ -400,7 +475,7 @@ public class RecoveryServiceImpl implements RecoveryService { } @NonNull - private Long getLongOrDefault(@Nullable String numberString, long defaultNumber) { + private Long getLongOrDefault(@Nullable String numberString, @Nullable Long defaultNumber) { try { return Long.valueOf(numberString); } catch (Exception e) { @@ -409,4 +484,23 @@ public class RecoveryServiceImpl implements RecoveryService { } } + private Boolean getBooleanOrDefault(@Nullable String boolString, @Nullable Boolean defaultValue) { + if (StringUtils.equalsIgnoreCase(boolString, "0")) { + return false; + } + + if (StringUtils.equalsIgnoreCase(boolString, "1")) { + return true; + } + + if (StringUtils.equalsIgnoreCase(boolString, "true")) { + return true; + } + + if (StringUtils.equalsIgnoreCase(boolString, "false")) { + return false; + } + + return defaultValue; + } }