package org.iatoki.judgels.raguel.forum.thread;
import org.iatoki.judgels.api.jophiel.JophielClientAPI;
import org.iatoki.judgels.api.jophiel.JophielPublicAPI;
import org.iatoki.judgels.jophiel.avatar.BaseAvatarCacheService;
import org.iatoki.judgels.jophiel.activity.UserActivityMessageService;
import org.iatoki.judgels.play.Page;
import org.iatoki.judgels.play.jid.BaseJidCacheService;
import org.iatoki.judgels.play.template.HtmlTemplate;
import org.iatoki.judgels.raguel.forum.AbstractForumController;
import org.iatoki.judgels.raguel.forum.Forum;
import org.iatoki.judgels.raguel.forum.ForumNotFoundException;
import org.iatoki.judgels.raguel.controllers.securities.Authenticated;
import org.iatoki.judgels.raguel.controllers.securities.Authorized;
import org.iatoki.judgels.raguel.controllers.securities.HasRole;
import org.iatoki.judgels.raguel.controllers.securities.LoggedIn;
import org.iatoki.judgels.raguel.forum.module.ForumModules;
import org.iatoki.judgels.raguel.forum.member.ForumMemberService;
import org.iatoki.judgels.raguel.forum.ForumService;
import org.iatoki.judgels.raguel.forum.thread.post.ThreadPostService;
import org.iatoki.judgels.raguel.forum.thread.html.createForumThreadView;
import org.iatoki.judgels.raguel.forum.thread.html.listThreadsView;
import play.data.Form;
import play.db.jpa.Transactional;
import play.filters.csrf.AddCSRFToken;
import play.filters.csrf.RequireCSRFCheck;
import play.i18n.Messages;
import play.mvc.Result;
import play.twirl.api.Html;
import javax.inject.Inject;
public final class ForumThreadController extends AbstractForumController {
private static final long PAGE_SIZE = 20;
private final ForumService forumService;
private final ForumThreadService forumThreadService;
private final ThreadPostService threadPostService;
@Inject
public ForumThreadController(BaseJidCacheService jidCacheService, BaseAvatarCacheService avatarCacheService, JophielClientAPI jophielClientAPI, JophielPublicAPI jophielPublicAPI, UserActivityMessageService userActivityMessageService, ForumMemberService forumMemberService, ForumService forumService, ForumThreadService forumThreadService, ThreadPostService threadPostService) {
super(jidCacheService, avatarCacheService, jophielClientAPI, jophielPublicAPI, userActivityMessageService, forumMemberService);
this.forumService = forumService;
this.forumThreadService = forumThreadService;
this.threadPostService = threadPostService;
}
@Authenticated(value = {LoggedIn.class, HasRole.class})
@Authorized(value = {"moderator", "admin"})
@Transactional(readOnly = true)
public Result viewThreads(long forumId) throws ForumNotFoundException {
return listThreads(forumId, 0, "timeUpdate", "desc", "");
}
@Authenticated(value = {LoggedIn.class, HasRole.class})
@Authorized(value = {"moderator", "admin"})
@Transactional(readOnly = true)
public Result listThreads(long forumId, long pageIndex, String orderBy, String orderDir, String filterString) throws ForumNotFoundException {
Forum forum = forumService.findForumById(forumId);
if (!forum.containModule(ForumModules.THREAD)) {
return redirect(org.iatoki.judgels.raguel.forum.routes.ForumController.viewForums(forum.getId()));
}
if (!isCurrentUserAllowedToEnterForum(forum)) {
return redirect(org.iatoki.judgels.raguel.forum.routes.ForumController.viewForums(forum.getId()));
}
return showListForumsThreads(forum, pageIndex, orderBy, orderDir, filterString);
}
@Authenticated(value = {LoggedIn.class, HasRole.class})
@Transactional(readOnly = true)
@AddCSRFToken
public Result createForumThread(long forumId) throws ForumNotFoundException {
Forum forum = forumService.findForumById(forumId);
if (!forum.containModule(ForumModules.THREAD)) {
return redirect(org.iatoki.judgels.raguel.forum.routes.ForumController.viewForums(forum.getId()));
}
if (forum.containOrInheritModule(ForumModules.EXCLUSIVE) && !isCurrentUserModeratorOrAdmin()) {
return redirect(org.iatoki.judgels.raguel.forum.routes.ForumController.viewForums(forum.getId()));
}
if (!isCurrentUserAllowedToEnterForum(forum)) {
return redirect(org.iatoki.judgels.raguel.forum.routes.ForumController.viewForums(forum.getId()));
}
Form<ForumThreadCreateForm> forumThreadCreateForm = Form.form(ForumThreadCreateForm.class);
return showCreateForumThread(forum, forumThreadCreateForm);
}
@Authenticated(value = {LoggedIn.class, HasRole.class})
@Transactional
@RequireCSRFCheck
public Result postCreateForumThread(long forumId) throws ForumNotFoundException {
Forum forum = forumService.findForumById(forumId);
if (!forum.containModule(ForumModules.THREAD)) {
return redirect(org.iatoki.judgels.raguel.forum.routes.ForumController.viewForums(forum.getId()));
}
if (forum.containOrInheritModule(ForumModules.EXCLUSIVE) && !isCurrentUserModeratorOrAdmin()) {
return redirect(org.iatoki.judgels.raguel.forum.routes.ForumController.viewForums(forum.getId()));
}
if (!isCurrentUserAllowedToEnterForum(forum)) {
return redirect(org.iatoki.judgels.raguel.forum.routes.ForumController.viewForums(forum.getId()));
}
Form<ForumThreadCreateForm> forumThreadCreateForm = Form.form(ForumThreadCreateForm.class).bindFromRequest();
if (formHasErrors(forumThreadCreateForm)) {
return showCreateForumThread(forum, forumThreadCreateForm);
}
ForumThreadCreateForm forumThreadCreateData = forumThreadCreateForm.get();
ForumThread forumThread = forumThreadService.createForumThread(forum, forumThreadCreateData.name, getCurrentUserJid(), getCurrentUserIpAddress());
threadPostService.createPost(forumThread, getCurrentUserJid(), forumThreadCreateData.name, forumThreadCreateData.content, getCurrentUserIpAddress());
return redirect(org.iatoki.judgels.raguel.forum.thread.post.routes.ThreadPostController.viewThreadPosts(forumThread.getId()));
}
@Override
protected HtmlTemplate getBaseHtmlTemplate(Forum forum) {
HtmlTemplate htmlTemplate = super.getBaseHtmlTemplate(forum);
htmlTemplate.markBreadcrumbLocation(Messages.get("forum.text.threads"), routes.ForumThreadController.viewThreads(forum.getId()));
return htmlTemplate;
}
private Result showListForumsThreads(Forum forum, long pageIndex, String orderBy, String orderDir, String filterString) throws ForumNotFoundException {
HtmlTemplate htmlTemplate = getBaseHtmlTemplate(forum);
Page<ForumThread> pageOfForumThreads = forumThreadService.getPageOfForumThreads(forum, pageIndex, PAGE_SIZE, orderBy, orderDir, filterString);
Html content = listThreadsView.render(forum, pageOfForumThreads, orderBy, orderDir, filterString);
htmlTemplate.setContent(content);
return renderTemplate(htmlTemplate);
}
private Result showCreateForumThread(Forum forum, Form<ForumThreadCreateForm> forumThreadCreateForm) {
HtmlTemplate htmlTemplate = getBaseHtmlTemplate(forum);
Html content = createForumThreadView.render(forum, forumThreadCreateForm);
htmlTemplate.setContent(content);
return renderTemplate(htmlTemplate);
}
}