package controllers.crud; import static play.data.Form.form; import java.util.Date; import java.util.List; import javax.inject.Inject; import models.User; import models.dao.UserDAO; import play.Logger; import play.Logger.ALogger; import play.data.Form; import play.libs.F; import play.libs.F.Function; import play.libs.F.Function0; import play.libs.F.Promise; import play.mvc.Call; import play.mvc.Result; import play.utils.crud.CRUDController; import com.avaje.ebean.Page; import com.restfb.DefaultFacebookClient; import com.restfb.FacebookClient; import controllers.ReputationHandler; import controllers.routes; import forms.BulkUser; public class UserCRUDController extends CRUDController<String, User> { private static final int PAGE_SIZE = 20; private static ALogger log = Logger.of(UserCRUDController.class); private UserDAO userDAO; private Form<BulkUser> bulkForm = form(BulkUser.class); private ReputationHandler reputationHandler; @Inject public UserCRUDController(UserDAO userDAO, ReputationHandler reputationHandler) { super(userDAO, form(User.class), String.class, User.class, PAGE_SIZE, "lastLogin desc"); this.userDAO = userDAO; this.reputationHandler = reputationHandler; } @Override protected String templateForForm() { return "admin.userForm"; } @Override protected String templateForList() { return "admin.userList"; } @Override protected String templateForShow() { return "admin.userShow"; } @Override protected Call toIndex() { return routes.Admin.userList(null, 0); } public Result approve(String key, int page) { if (log.isDebugEnabled()) log.debug("userApprove() <-"); User user = userDAO.get(key); user.setStatus(User.Status.APPROVED); if (log.isDebugEnabled()) log.debug("user : " + user); userDAO.update(user); return list(null, page); } public Result suspend(String key, int page) { if (log.isDebugEnabled()) log.debug("userSuspend() <-"); User user = userDAO.get(key); user.setStatus(User.Status.SUSPENDED); if (log.isDebugEnabled()) log.debug("user : " + user); userDAO.update(user); return list(null, page); } public Result recalculateReputation(final String key, final int page) { User user = userDAO.get(key); //update reputation reputationHandler.reevaluateForSubject(user); return list(null, page); } public Result list(String status, int page) { if (log.isDebugEnabled()) log.debug("list() <-"); if (log.isDebugEnabled()) log.debug("status : " + status); Page<User> p = null; if (status == null || "".equals(status)) { p = userDAO.page(page, PAGE_SIZE, "lastLogin desc"); } else { User.Status s = User.Status.valueOf(status); p = userDAO.page(page, PAGE_SIZE, "lastLogin desc", "status", s); } return ok(templateForList(), with(Page.class, p).and(String.class, status)); } protected String templateForBulkForm() { return "admin.userBulkForm"; } public Result newBulkForm() { if (log.isDebugEnabled()) log.debug("newBulkForm() <-"); return ok(templateForBulkForm(), with(Form.class, bulkForm)); } public Result createBulk() { if (log.isDebugEnabled()) log.debug("createBulk() <-"); Form<BulkUser> filledForm = bulkForm.bindFromRequest(); if (filledForm.hasErrors()) { if (log.isDebugEnabled()) log.debug("validation errors occured"); return badRequest(templateForBulkForm(), with(Form.class, bulkForm)); } else { BulkUser formModel = filledForm.get(); List<User> models = formModel.toModel(); if (log.isDebugEnabled()) log.debug("models : " + models); for (User user : models) { if (log.isDebugEnabled()) log.debug("user : " + user); User dbUser = userDAO.get(user.getKey()); if (dbUser == null) { userDAO.create(user); } } if (log.isDebugEnabled()) log.debug("entity created"); return redirect(toIndex()); } } public Promise<Result> calculateAllReputations() { Promise<Void> promise = Promise.promise(new Function0<Void>() { @Override public Void apply() throws Throwable { final List<User> users = userDAO.all(); for (User user : users) { reputationHandler.reevaluateForSubject(user); } return null; } }); return promise.map(new Function<Void, Result>() { @Override public Result apply(Void arg0) throws Throwable { return redirect(toIndex()); } }); } public Promise<Result> reload(final String key) { if (log.isDebugEnabled()) log.debug("reload <-"); Promise<Void> promise = Promise.promise(new Function0<Void>() { @Override public Void apply() throws Throwable { User user = userDAO.get(key); if (user != null) { String accessToken = user.getAccessToken(); String identifier = user.getOriginalKey(); FacebookClient facebookClient = new DefaultFacebookClient( accessToken); User fbu = facebookClient.fetchObject(identifier, User.class); fbu.setKey("facebook", identifier); if (log.isDebugEnabled()) log.debug("fbu : " + fbu); Date birthdate = fbu.getBirthdate(); String birthday = fbu.getBirthday(); if (log.isDebugEnabled()) log.debug("birthday : " + birthday); if (log.isDebugEnabled()) log.debug("birthdate : " + birthdate); user.merge(fbu); userDAO.update(user); } return null; } }); return promise.map(new F.Function<Void, Result>() { public Result apply(Void p) { return show(key); } }); } }