package org.iatoki.judgels.raguel.forum; import com.google.common.collect.Lists; 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.InternalLink; import org.iatoki.judgels.play.jid.BaseJidCacheService; import org.iatoki.judgels.play.template.HtmlTemplate; import org.iatoki.judgels.raguel.AbstractRaguelController; import org.iatoki.judgels.raguel.forum.module.ForumModule; import org.iatoki.judgels.raguel.forum.module.ForumModuleComparator; import org.iatoki.judgels.raguel.forum.module.ForumModules; import org.iatoki.judgels.raguel.forum.module.TabbedForumModule; import org.iatoki.judgels.raguel.forum.member.ForumMemberService; import play.api.mvc.Call; import play.i18n.Messages; import play.mvc.Result; import java.util.Collections; import java.util.List; import java.util.Stack; public abstract class AbstractForumController extends AbstractRaguelController { private final ForumMemberService forumMemberService; public AbstractForumController(BaseJidCacheService jidCacheService, BaseAvatarCacheService avatarCacheService, JophielClientAPI jophielClientAPI, JophielPublicAPI jophielPublicAPI, UserActivityMessageService userActivityMessageService, ForumMemberService forumMemberService) { super(jidCacheService, avatarCacheService, jophielClientAPI, jophielPublicAPI, userActivityMessageService); this.forumMemberService = forumMemberService; } protected boolean isCurrentUserAllowedToEnterForum(Forum forum) { if (forum.containOrInheritModule(ForumModules.MEMBER)) { Forum forumWithMember = forum.getForumOrParentWithModule(ForumModules.MEMBER); return isCurrentUserModeratorOrAdmin() || forumMemberService.isMemberInForum(forumWithMember.getJid(), getCurrentUserJid()); } return true; } protected HtmlTemplate getBaseHtmlTemplate(Forum forum) { HtmlTemplate htmlTemplate = getBaseHtmlTemplate(); fillTemplateForForumView(htmlTemplate, forum); markForumBreadcrumbs(htmlTemplate, forum); return htmlTemplate; } @Override protected HtmlTemplate getBaseHtmlTemplate() { HtmlTemplate htmlTemplate = super.getBaseHtmlTemplate(); htmlTemplate.markBreadcrumbLocation(Messages.get("forum.text.forums"), routes.ForumController.index()); return htmlTemplate; } @Override protected Result renderTemplate(HtmlTemplate template) { return super.renderTemplate(template); } protected final void markForumBreadcrumbs(HtmlTemplate htmlTemplate, Forum forum) { Stack<InternalLink> internalLinkStack = new Stack<>(); Forum currentParent = forum; while (currentParent != null) { internalLinkStack.push(new InternalLink(currentParent.getName(), routes.ForumController.viewForums(currentParent.getId()))); currentParent = currentParent.getParentForum(); } while (!internalLinkStack.isEmpty()) { InternalLink internalLink = internalLinkStack.pop(); htmlTemplate.markBreadcrumbLocation(internalLink.getLabel(), internalLink.getTarget()); } } private void fillTemplateForForumView(HtmlTemplate htmlTemplate, Forum forum) { htmlTemplate.addMainTab(Messages.get("forum.text.forums"), routes.ForumController.viewForums(forum.getId())); List<TabbedForumModule> moduleWithTabs = Lists.newArrayList(); for (ForumModule forumModule : forum.getModules()) { if ((forumModule instanceof TabbedForumModule) && (((TabbedForumModule) forumModule).isAllowedToViewTab(getCurrentUserRoles(), forum, getCurrentUserJid()))) { moduleWithTabs.add((TabbedForumModule) forumModule); } } Collections.sort(moduleWithTabs, new ForumModuleComparator()); for (TabbedForumModule forumModule : moduleWithTabs) { htmlTemplate.addMainTab(forumModule.getTabName(), forumModule.getDefaultJumpTo(forum.getId())); } Forum parentForum = forum.getParentForum(); final String parentForumName; final Call backCall; if (parentForum == null) { parentForumName = Messages.get("forum.text.home"); backCall = routes.ForumController.index(); } else { parentForumName = parentForum.getName(); backCall = routes.ForumController.viewForums(parentForum.getId()); } htmlTemplate.setMainTitle(forum.getName()); htmlTemplate.setMainBackButton(Messages.get("commons.button.backTo1", parentForumName), backCall); if (isCurrentUserModeratorOrAdmin()) { htmlTemplate.addMainButton(Messages.get("commons.button.edit"), routes.ForumController.editForumGeneralConfig(forum.getId())); htmlTemplate.addMainButton(Messages.get("commons.button.new1", Messages.get("forum.text.forum")), routes.ForumController.createForum(forum.getId())); if (forum.containModule(ForumModules.THREAD)) { htmlTemplate.addMainButton(Messages.get("commons.button.new1", Messages.get("forum.text.thread")), org.iatoki.judgels.raguel.forum.thread.routes.ForumThreadController.createForumThread(forum.getId())); } } else { if (forum.containModule(ForumModules.THREAD) && (!forum.containOrInheritModule(ForumModules.EXCLUSIVE))) { htmlTemplate.addMainButton(Messages.get("commons.button.new1", Messages.get("forum.text.thread")), org.iatoki.judgels.raguel.forum.thread.routes.ForumThreadController.createForumThread(forum.getId())); } } } }