package br.com.caelum.calopsita.controller;
import static br.com.caelum.vraptor.view.Results.logic;
import static br.com.caelum.vraptor.view.Results.page;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import java.util.List;
import br.com.caelum.calopsita.infra.vraptor.SessionUser;
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 ProjectsController {
private final User currentUser;
private final Validator validator;
private final Result result;
public ProjectsController(Validator validator, Result result, SessionUser user) {
this.result = result;
this.validator = validator;
this.currentUser = user.getUser();
}
@Path("/projects/new/") @Get
public void form() {
}
@Path("/projects/{project.id}/edit/") @Get
public Project edit(Project project) {
return project.load();
}
@Path("/projects/") @Post
public void save(final Project project) {
project.setOwner(currentUser);
validator.checking(new Validations() {{
and(Hibernate.validate(project));
}});
validator.onErrorUse(page()).of(ProjectsController.class).form();
project.save();
result.use(logic()).redirectTo(ProjectsController.class).list();
}
@Path("/projects/{project.id}/") @Post
public void update(Project project) {
final Project loaded = project.load();
validator.checking(new Validations() {{
that(loaded.getOwner(), equalTo(currentUser));
}});
validator.onErrorUse(page()).forward("/WEB-INF/jsp/projects/delete.invalid.jsp");
loaded.setDescription(project.getDescription());
result.use(logic()).redirectTo(ProjectsController.class).edit(loaded);
}
@Path("/projects/{project.id}/") @Delete
public void delete(Project project) {
final Project loaded = project.load();
validator.checking(new Validations() {{
that(currentUser, is(loaded.getOwner()));
}});
validator.onErrorUse(page()).forward("/WEB-INF/jsp/projects/delete.invalid.jsp");
loaded.delete();
result.use(logic()).redirectTo(ProjectsController.class).list();
}
@Path({"/projects/", "/"}) @Get
public List<Project> list() {
return currentUser.getProjects();
}
@Path("/projects/{project.id}/colaborators/") @Get
public Project listColaborators(Project project) {
return project.load();
}
@Path("/projects/{project.id}/colaborators/") @Post
public void addColaborator(Project project, User colaborator) {
Project loaded = project.load();
loaded.getColaborators().add(colaborator);
result.use(logic()).redirectTo(ProjectsController.class).listColaborators(project);
}
}