package sagan.blog.support; import sagan.blog.Post; import sagan.support.DateFactory; import sagan.team.MemberProfile; import sagan.team.support.TeamRepository; import java.util.Date; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service class PostFormAdapter { private static final int SUMMARY_LENGTH = 500; private final PostContentRenderer renderer; private final PostSummary postSummary; private final DateFactory dateFactory; private final TeamRepository teamRepository; @Autowired public PostFormAdapter(PostContentRenderer renderer, PostSummary postSummary, DateFactory dateFactory, TeamRepository teamRepository) { this.renderer = renderer; this.postSummary = postSummary; this.dateFactory = dateFactory; this.teamRepository = teamRepository; } public Post createPostFromPostForm(PostForm postForm, String username) { String content = postForm.getContent(); Post post = new Post(postForm.getTitle(), content, postForm.getCategory(), postForm.getFormat()); MemberProfile profile = teamRepository.findByUsername(username); post.setAuthor(profile); post.setCreatedAt(createdDate(postForm, dateFactory.now())); setPostProperties(postForm, content, post); return post; } public void updatePostFromPostForm(Post post, PostForm postForm) { String content = postForm.getContent(); post.addPublicSlugAlias(post.getPublicSlug()); post.setTitle(postForm.getTitle()); post.setRawContent(content); post.setCategory(postForm.getCategory()); post.setFormat(postForm.getFormat()); post.setCreatedAt(createdDate(postForm, post.getCreatedAt())); setPostProperties(postForm, content, post); } private Date createdDate(PostForm postForm, Date defaultDate) { Date createdAt = postForm.getCreatedAt(); if (createdAt == null) { createdAt = defaultDate; } return createdAt; } private void setPostProperties(PostForm postForm, String content, Post post) { String rendered = null; if (renderer instanceof FormatAwarePostContentRenderer) { rendered = ((FormatAwarePostContentRenderer)renderer).render(content, post.getFormat()); } else { // Keep the option open of reverting to the old PostContentRenderer rendered = renderer.render(content); } post.setRenderedContent(rendered); summarize(post); post.setBroadcast(postForm.isBroadcast()); post.setDraft(postForm.isDraft()); post.setPublishAt(publishDate(postForm)); } private Date publishDate(PostForm postForm) { if (!postForm.isDraft() && postForm.getPublishAt() == null) { return dateFactory.now(); } else { return postForm.getPublishAt(); } } public void summarize(Post post) { String summary = postSummary.forContent(post.getRenderedContent(), SUMMARY_LENGTH); post.setRenderedSummary(summary); } public void refreshPost(Post post) { post.setRenderedContent(renderer.render(post.getRawContent())); summarize(post); } }