package de.codecentric.moviedatabase.movies.controller;
import static de.codecentric.roca.core.LinkBuilder.linkTo;
import java.util.List;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import de.codecentric.moviedatabase.movies.domain.Tag;
import de.codecentric.moviedatabase.movies.model.MovieForm;
import de.codecentric.moviedatabase.movies.service.MovieService;
import de.codecentric.roca.core.Link;
import de.codecentric.roca.core.LinkBuilder;
import de.codecentric.roca.core.Resource;
@RequestMapping(value = "/movies", headers={"X-Requested-With!=XMLHttpRequest", "Accept=text/html"})
public class MovieController extends AbstractMovieController{
private String navigationBaseUrl;
public MovieController(MovieService movieService,
TagResourceAssembler tagResourceAssembler,
MovieResourceAssembler movieResourceAssembler, String navigationBaseUrl) {
super(movieService, tagResourceAssembler, movieResourceAssembler, false);
this.navigationBaseUrl = navigationBaseUrl;
}
//################### side- and searchbar data ###########################
@ModelAttribute("tagsAll")
public List<Resource<Tag>> getAllTags(){
List<Tag> tags = movieService.findAllTags();
return tagResourceAssembler.toResource(tags);
}
@ModelAttribute("linkNewMovie")
public Link getLinkNewMovie(){
return linkTo(MoviePathFragment.MOVIES).path(MoviePathFragment.NEW).withRel(MovieRelation.NEW);
}
@ModelAttribute("linkTagsAll")
public Link getLinkTagsAll(){
return linkTo(MoviePathFragment.TAGS).withRel(MovieRelation.SELF);
}
@ModelAttribute("linkNavigation")
public Link getLinkNavigation(@RequestParam(required = false) String searchString, HttpServletRequest request){
Link searchLink = linkTo(request.getContextPath()).path(MoviePathFragment.MOVIES).withRel(MovieRelation.SEARCH);
LinkBuilder navigationLinkBuilder = linkTo(navigationBaseUrl).path(MoviePathFragment.NAVIGATION).requestParam(MovieRequestParameter.SEARCH_URL, searchLink.getHref())
.requestParam(MovieRequestParameter.ACTIVE, "movies");
if (searchString != null){
return navigationLinkBuilder.requestParam(MovieRequestParameter.SEARCH_STRING, searchString).withRel(MovieRelation.NAVIGATION);
} else {
return navigationLinkBuilder.withRel(MovieRelation.NAVIGATION);
}
}
//################## movies #################################################
@RequestMapping(method = RequestMethod.POST)
public String createMovie(MovieForm movieForm) {
doCreateMovie(movieForm);
if (movieForm.isAddAnotherMovie()){
return "redirect:/movies/new";
}
return "redirect:/movies";
}
//####################### movie ############################################
@RequestMapping(value = "/{id}", method = RequestMethod.PUT)
public String editMovie(@PathVariable UUID id, MovieForm movieForm) {
doEditMovie(id, movieForm);
return "redirect:/movies/{id}";
}
//####################### comments ############################################
@RequestMapping(value = "/{id}/comments", method = RequestMethod.POST)
public String createComment(@PathVariable UUID id, @RequestParam String content, Model model) {
doCreateComment(id, content);
return "redirect:/movies/{id}/comments";
}
//######################## tags ##############################################
@RequestMapping(value = "/{id}/tags", method = RequestMethod.POST)
public String addTagToMovie(@PathVariable UUID id, @RequestParam Tag tag) {
doAddTagToMovie(id, tag);
return "redirect:/movies/{id}/tags";
}
@RequestMapping(value = "/{id}/tags/{tag}", method = RequestMethod.DELETE)
public String removeTagFromMovie(@PathVariable UUID id, @PathVariable Tag tag) {
doRemoveTagFromMovie(id, tag);
return "redirect:/movies/{id}/tags";
}
}