package br.com.caelum.calopsita.controller;
import static br.com.caelum.vraptor.view.Results.logic;
import static br.com.caelum.vraptor.view.Results.nothing;
import static br.com.caelum.vraptor.view.Results.page;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;
import static org.hamcrest.Matchers.nullValue;
import br.com.caelum.calopsita.infra.vraptor.SessionUser;
import br.com.caelum.calopsita.model.User;
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 UsersController {
private final Validator validator;
private final Result result;
private final SessionUser sessionUser;
public UsersController(Result result, Validator validator, SessionUser sessionUser) {
this.result = result;
this.validator = validator;
this.sessionUser = sessionUser;
}
@Path("/users/new/") @Get
public void formSignUp() {
}
@Path("/users/") @Post
public void save(final User user) {
validator.checking(new Validations() {
{
that(user.load(), is(nullValue()), "", "user.already.exists");
and(Hibernate.validate(user));
}
});
validator.onErrorUse(page()).of(UsersController.class).formSignUp();
user.setNewbie(true);
user.save();
sessionUser.setUser(user);
result.use(logic()).redirectTo(ProjectsController.class).list();
}
@Path("/users/login/") @Post
public void login(final User user) {
final User found = user.load();
validator.checking(new Validations() {
{
if (that(found, is(notNullValue()), "", "login.invalid")) {
that(found.getPassword(), is(equalTo(user.getPassword())), "", "login.invalid");
}
}
});
validator.onErrorUse(page()).of(HomeController.class).login();
sessionUser.setUser(found);
result.use(logic()).redirectTo(ProjectsController.class).list();
}
@Path("/users/logout/") @Get
public void logout() {
sessionUser.setUser(null);
result.use(logic()).redirectTo(HomeController.class).login();
}
@Path("/users/toggleNewbie/") @Get
public void toggleNewbie() {
User user = sessionUser.getUser().load();
user.toggleNewbie();
sessionUser.setUser(user);
result.use(nothing());
}
}