package controllers;
import static play.data.Form.*;
import java.util.Set;
import java.util.TreeSet;
import javax.inject.Inject;
import models.ActionType;
import models.Comment;
import models.ContentStatus;
import models.Post;
import models.User;
import models.dao.CommentDAO;
import models.dao.PostDAO;
import models.dao.PostRatingDAO;
import play.data.Form;
import play.mvc.Result;
import play.utils.crud.TemplateController;
import play.utils.dao.EntityNotFoundException;
import views.html.postShow;
import views.html.helper.H;
import com.avaje.ebean.Page;
public class CommentController extends TemplateController implements
Constants {
private CommentDAO commentDAO;
private PostDAO postDAO;
private PostRatingDAO postRatingDAO;
private ActionHandler actionHandler;
private Form<Comment> form = form(Comment.class);
@Inject
public CommentController(PostDAO postDAO, CommentDAO commentDAO,
PostRatingDAO postRatingDAO, ActionHandler actionHandler) {
this.postDAO = postDAO;
this.commentDAO = commentDAO;
this.postRatingDAO = postRatingDAO;
this.actionHandler = actionHandler;
}
public Result create(Long postKey, String title) {
if (log.isDebugEnabled())
log.debug("createComment() <-" + postKey);
Post post = postDAO.get(postKey);
if (log.isDebugEnabled())
log.debug("post : " + post);
User user = HttpUtils.loginUser();
if (user == null)
return notFound("no user logged in");
Form<Comment> filledForm = form.bindFromRequest();
if (filledForm.hasErrors() || user == null) {
if (log.isDebugEnabled())
log.debug("validation errors occured");
Set<Long> upVotes = user == null ? new TreeSet<Long>()
: postRatingDAO.getUpVotedPostKeys(user);
Set<Long> downVotes = user == null ? new TreeSet<Long>()
: postRatingDAO.getDownVotedPostKeys(user);
Page<Comment> pg = commentDAO.page(postKey, 0, COMMENTS_PER_PAGE);
return badRequest(postShow.render(post, null, filledForm, pg,
upVotes, downVotes));
} else {
Comment comment = filledForm.get();
comment.setPost(post);
comment.setCreatedBy(user);
comment.setCreatorIp(request().remoteAddress());
comment.setStatus(ContentStatus.NEW);
if (log.isDebugEnabled())
log.debug("comment : " + comment);
commentDAO.create(comment);
if (log.isDebugEnabled())
log.debug("comment created : " + comment);
actionHandler.perform(user, comment, ActionType.CREATE_COMMENT);
final Long key = post.getKey();
return redirect(routes.App.postShow(key, title, 0));
}
}
public Result editForm(Long postKey, Long commentKey) {
if (log.isDebugEnabled())
log.debug("editCommentForm() <-");
Post post = postDAO.get(postKey);
if (log.isDebugEnabled())
log.debug("post : " + post);
Comment comment = commentDAO.get(commentKey);
if (log.isDebugEnabled())
log.debug("comment : " + comment);
User user = HttpUtils.loginUser();
if (user == null)
return notFound("no user logged in");
Set<Long> upVotes = user == null ? new TreeSet<Long>() : postRatingDAO
.getUpVotedPostKeys(user);
Set<Long> downVotes = user == null ? new TreeSet<Long>()
: postRatingDAO.getDownVotedPostKeys(user);
Form<Comment> filledForm = form.fill(comment);
Page<Comment> pg = commentDAO.page(postKey, 0, COMMENTS_PER_PAGE);
return ok(postShow.render(post, commentKey, filledForm, pg, upVotes,
downVotes));
}
public Result update(Long postKey, Long commentKey) {
if (log.isDebugEnabled())
log.debug("updateComment() <-");
User user = HttpUtils.loginUser();
if (user == null)
return notFound("no user logged in");
Post post = postDAO.get(postKey);
if (log.isDebugEnabled())
log.debug("post : " + post);
Comment original = commentDAO.get(commentKey);
Form<Comment> filledForm = form.fill(original).bindFromRequest();
if (filledForm.hasErrors() || user == null) {
if (log.isDebugEnabled())
log.debug("validation errors occured");
Set<Long> upVotes = user == null ? new TreeSet<Long>()
: postRatingDAO.getUpVotedPostKeys(user);
Set<Long> downVotes = user == null ? new TreeSet<Long>()
: postRatingDAO.getDownVotedPostKeys(user);
Page<Comment> pg = commentDAO.page(postKey, 0, COMMENTS_PER_PAGE);
return badRequest(postShow.render(post, commentKey, filledForm, pg,
upVotes, downVotes));
} else {
final Comment commentData = commentDAO.get(commentKey);
Comment comment = filledForm.get();
comment.setCreatedBy(commentData.getCreatedBy());
comment.setCreatedOn(commentData.getCreatedOn());
comment.setCreatorIp(commentData.getCreatorIp());
comment.setUpdatedBy(user);
comment.setModifierIp(request().remoteAddress());
comment.setKey(commentKey);
comment.setRevision(commentData.getRevision());
comment.setStatus(ContentStatus.UPDATED);
//comment.u
if (log.isDebugEnabled())
log.debug("comment : " + comment);
commentDAO.update(comment);
if (log.isDebugEnabled())
log.debug("entity updated");
final Long key = post.getKey();
final String title = H.sanitizeURL(post.getTitle());
return redirect(routes.App.postShow(key, title, 0));
}
}
public Result delete(Long postKey, Long commentKey) {
if (log.isDebugEnabled())
log.debug("deleteComment() <-");
Post post = postDAO.get(postKey);
if (log.isDebugEnabled())
log.debug("post : " + post);
try {
commentDAO.remove(commentKey);
} catch (EntityNotFoundException e) {
return notFound("not found:" + postKey);
}
if (log.isDebugEnabled())
log.debug("entity deleted");
final Long key = post.getKey();
final String title = H.sanitizeURL(post.getTitle());
return redirect(routes.App.postShow(key, title, 0));
}
}