package br.com.caelum.calopsita.controller;
import static br.com.caelum.vraptor.view.Results.http;
import static br.com.caelum.vraptor.view.Results.logic;
import static br.com.caelum.vraptor.view.Results.page;
import static org.hamcrest.Matchers.anyOf;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.isIn;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import br.com.caelum.calopsita.infra.vraptor.SessionUser;
import br.com.caelum.calopsita.model.Card;
import br.com.caelum.calopsita.model.Gadgets;
import br.com.caelum.calopsita.model.Project;
import br.com.caelum.calopsita.model.User;
import br.com.caelum.vraptor.Delete;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.validator.Hibernate;
import br.com.caelum.vraptor.validator.Validations;
@Resource
public class CardsController {
private final User currentUser;
private final Validator validator;
private final Result result;
public CardsController(Result result, Validator validator, SessionUser user) {
this.result = result;
this.validator = validator;
this.currentUser = user.getUser();
}
@Path("/projects/{project.id}/cards/") @Get
public void list(Project project) {
this.result.include("project", project.load());
this.result.include("cards", project.getToDoCards());
}
@Path("/projects/{project.id}/cards/all/") @Get
public void all(Project project) {
this.result.include("project", project.load());
this.result.include("cards", project.getAllRootCards());
this.result.use(page()).of(CardsController.class).list(project);
}
@Path({ "/projects/{card.project.id}/cards/",
"/projects/{card.project.id}/cards/{card.parent.id}/subcards/"})
@Post
public void save(final Card card, List<Gadgets> gadgets) {
validator.checking(new Validations() {{
and(Hibernate.validate(card));
}});
validator.onErrorUse(logic()).forwardTo(CardsController.class).form(card.getProject());
card.setCreator(currentUser);
card.save();
if (gadgets != null) {
card.addGadgets(gadgets);
}
result.include("project", card.getProject());
}
@Path("/projects/{project.id}/cards/new/") @Get
public void form(Project project) {
this.result.include("project", project.load());
this.result.include("gadgets", Gadgets.values());
this.result.include("cardTypes", project.getCardTypes());
}
@Path("/projects/{card.project.id}/cards/{card.id}/subcards/") @Get
public void listSubcards(Card card) {
result.include("card", card.load());
result.include("cards", card.getSubcards());
result.include("project", card.getProject().load());
}
@Path("/projects/{card.project.id}/cards/{card.id}/subcards/new/") @Get
public void subcardForm(Card card) {
result.include("project", card.getProject().load());
result.include("card", card);
result.include("parent", card.load());
result.include("cardTypes", card.getProject().getCardTypes());
result.include("gadgets", Gadgets.values());
}
@Path("/projects/{card.project.id}/cards/{card.id}/") @Get
public void edit(Card card) {
result.include("card", card.load());
result.include("project", card.getProject().load());
result.include("gadgets", Gadgets.values());
result.include("cardGadgets", Gadgets.valueOf(card.getGadgets()));
result.include("cardTypes", card.getProject().getCardTypes());
}
@Path("/projects/{card.project.id}/cards/{card.id}/") @Post
public void update(Card card, List<Gadgets> gadgets) {
Card loaded = card.load();
loaded.setName(card.getName());
loaded.setDescription(card.getDescription());
Project project = loaded.getProject();
loaded.updateGadgets(gadgets);
loaded.update();
result.use(logic()).redirectTo(CardsController.class).list(project);
}
@Path("/projects/{card.project.id}/cards/{card.id}/") @Delete
public void delete(Card card, boolean deleteSubcards) {
Card loaded = card.load();
final Project project = card.getProject().load();
validator.checking(new Validations() {{
that(currentUser, anyOf(
isIn(project.getColaborators()),
is(equalTo(project.getOwner()))));
}});
validator.onErrorUse(http()).sendError(HttpServletResponse.SC_FORBIDDEN);
List<Long> deleted = new ArrayList<Long>();
deleted.add(card.getId());
if (deleteSubcards) {
deleted.addAll(loaded.deleteSubCards());
} else {
loaded.detachSubCards();
}
loaded.delete();
result.include("deleted", deleted);
}
}