package controllers; import javax.inject.Inject; import models.Post; import models.PostRating; import models.PostRatingPK; import models.ReputationType; import models.User; import models.dao.PostDAO; import models.dao.PostRatingDAO; import play.Logger; import play.Logger.ALogger; import play.mvc.Controller; import play.mvc.Result; import reputation.ReputationContext; import security.Authenticated; import security.RestrictApproved; import views.html.partials.rate; public class RateController extends Controller implements Constants { private ALogger log = Logger.of(RateController.class); PostDAO postDAO; PostRatingDAO postRatingDAO; ReputationHandler reputationHandler; @Inject public RateController(PostDAO postDAO, PostRatingDAO postRatingDAO, ReputationHandler reputationHandler) { super(); this.postDAO = postDAO; this.postRatingDAO = postRatingDAO; this.reputationHandler = reputationHandler; } /** * rating is done via ajax, therefore return simply the eventual rate sum */ @Authenticated @RestrictApproved public Result rateUp(Long key) { if (log.isDebugEnabled()) log.debug("rateUp <-" + key); Post post = postDAO.get(key); return rate(post, 1); } @Authenticated @RestrictApproved public Result rateDown(Long key) { if (log.isDebugEnabled()) log.debug("rateDown <-" + key); Post post = postDAO.get(key); return rate(post, -1); } public Result rate(Post post, int rating) { if (log.isDebugEnabled()) log.debug("rating : " + rating); if (log.isDebugEnabled()) log.debug("post : " + post); User user = HttpUtils.loginUser(); if (log.isDebugEnabled()) log.debug("user : " + user); if (user == null) return notFound("no user logged in"); if (post != null && user != null) { // save/update rate if (post.getRating() == null) post.setRating(0); PostRating pr = postRatingDAO.get(user, post); if (log.isDebugEnabled()) log.debug("pr : " + pr); PostRatingPK key = new PostRatingPK(user.getKey(), post.getKey()); if (pr == null) { pr = new PostRating(); pr.setValue(rating); pr.setKey(key); postRatingDAO.create(pr); post.setRating(post.getRating() + rating); } else { int ratingBefore = pr.getValue(); pr.setValue(rating); postRatingDAO.update(pr); if (log.isDebugEnabled()) log.debug("post.rating : " + post.getRating()); if (log.isDebugEnabled()) log.debug("pr.value : " + ratingBefore); post.setRating(post.getRating() - ratingBefore + rating); } postRatingDAO.resetVotedPostKeyCache(user); ReputationType repType = rating > 0 ? ReputationType.RATE_UP : ReputationType.RATE_DOWN; reputationHandler.evaluate(new ReputationContext(post), repType); if (log.isDebugEnabled()) log.debug("updating post : " + post); postDAO.update(post); if (log.isDebugEnabled()) log.debug("post : " + post); return ok(rate.render(post.getRating())); } else { if (log.isDebugEnabled()) log.debug("no user"); return TODO; } } public Result rateShow(Long postKey) { Post post = postDAO.get(postKey); if (log.isDebugEnabled()) log.debug("post : " + post); if (post != null) { return ok(rate.render(post.getRating())); } if (log.isDebugEnabled()) log.debug("no post"); return TODO; } }