package com.raysmond.blog.admin.controllers;
import com.raysmond.blog.forms.PostForm;
import com.raysmond.blog.models.Post;
import com.raysmond.blog.models.Tag;
import com.raysmond.blog.models.User;
import com.raysmond.blog.models.support.PostFormat;
import com.raysmond.blog.models.support.PostStatus;
import com.raysmond.blog.repositories.PostRepository;
import com.raysmond.blog.repositories.UserRepository;
import com.raysmond.blog.services.PostService;
import com.raysmond.blog.services.TagService;
import com.raysmond.blog.utils.DTOUtil;
import org.hibernate.Hibernate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.validation.Valid;
import java.security.Principal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import static org.springframework.web.bind.annotation.RequestMethod.*;
/**
* @author Raysmond<i@raysmond.com>
*/
@Controller("adminPostController")
@RequestMapping("admin/posts")
public class PostController {
@Autowired
private PostRepository postRepository;
@Autowired
private PostService postService;
@Autowired
private UserRepository userRepository;
private static final int PAGE_SIZE = 20;
@RequestMapping(value = "")
public String index(@RequestParam(defaultValue = "0") int page, Model model){
Page<Post> posts = postRepository.findAll(new PageRequest(page, PAGE_SIZE, Sort.Direction.DESC, "id"));
model.addAttribute("totalPages", posts.getTotalPages());
model.addAttribute("page", page);
model.addAttribute("posts", posts);
return "admin/posts/index";
}
@RequestMapping(value = "new")
public String newPost(Model model){
PostForm postForm = DTOUtil.map(new Post(), PostForm.class);
postForm.setPostTags("");
model.addAttribute("postForm", postForm);
model.addAttribute("postFormats", PostFormat.values());
model.addAttribute("postStatus", PostStatus.values());
return "admin/posts/new";
}
@RequestMapping(value = "{postId:[0-9]+}/edit")
public String editPost(@PathVariable Long postId, Model model){
Post post = postRepository.findOne(postId);
PostForm postForm = DTOUtil.map(post, PostForm.class);
postForm.setPostTags(postService.getTagNames(post.getTags()));
model.addAttribute("post", post);
model.addAttribute("postForm", postForm);
model.addAttribute("postFormats", PostFormat.values());
model.addAttribute("postStatus", PostStatus.values());
return "admin/posts/edit";
}
@RequestMapping(value = "{postId:[0-9]+}/delete", method = {DELETE, POST})
public String deletePost(@PathVariable Long postId){
postService.deletePost(postRepository.findOne(postId));
return "redirect:/admin/posts";
}
@RequestMapping(value = "", method = POST)
public String create(Principal principal, @Valid PostForm postForm, Errors errors, Model model){
if (errors.hasErrors()) {
model.addAttribute("postFormats", PostFormat.values());
model.addAttribute("postStatus", PostStatus.values());
return "admin/posts/new";
} else {
Post post = DTOUtil.map(postForm, Post.class);
post.setUser(userRepository.findByEmail(principal.getName()));
post.setTags(postService.parseTagNames(postForm.getPostTags()));
postService.createPost(post);
return "redirect:/admin/posts";
}
}
@RequestMapping(value = "{postId:[0-9]+}", method = {PUT, POST})
public String update(@PathVariable Long postId, @Valid PostForm postForm, Errors errors, Model model){
if (errors.hasErrors()){
model.addAttribute("postFormats", PostFormat.values());
model.addAttribute("postStatus", PostStatus.values());
return "admin/posts_edit";
} else {
Post post = postRepository.findOne(postId);
DTOUtil.mapTo(postForm, post);
post.setTags(postService.parseTagNames(postForm.getPostTags()));
postService.updatePost(post);
return "redirect:/admin/posts";
}
}
}