/*
* Copyright (c) JForum Team. All rights reserved.
*
* The software in this package is published under the terms of the LGPL
* license a copy of which has been included with this distribution in the
* license.txt file.
*
* The JForum Project
* http://www.jforum.net
*/
package net.jforum.controllers;
import java.util.Date;
import net.jforum.actions.helpers.Domain;
import net.jforum.core.SecurityConstraint;
import net.jforum.core.SessionManager;
import net.jforum.entities.Forum;
import net.jforum.entities.Topic;
import net.jforum.entities.UserSession;
import net.jforum.entities.util.PaginatedResult;
import net.jforum.entities.util.Pagination;
import net.jforum.repository.CategoryRepository;
import net.jforum.repository.ForumRepository;
import net.jforum.repository.UserRepository;
import net.jforum.security.AccessForumRule;
import net.jforum.security.AuthenticatedRule;
import net.jforum.services.MostUsersEverOnlineService;
import net.jforum.util.ConfigKeys;
import net.jforum.util.GroupInteractionFilter;
import net.jforum.util.JForumConfig;
import net.jforum.util.SecurityConstants;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
/**
* @author Rafael Steil
*/
@Resource
@Path(Domain.FORUMS)
public class ForumController {
private CategoryRepository categoryRepository;
private ForumRepository forumRepository;
private UserRepository userRepository;
private MostUsersEverOnlineService mostUsersEverOnlineService;
private JForumConfig config;
private GroupInteractionFilter groupInteractionFilter;
private final Result result;
private final UserSession userSession;
private final SessionManager sessionManager;
public ForumController(CategoryRepository categoryRepository,
ForumRepository forumRepository, UserSession userSession,
UserRepository userRepository, MostUsersEverOnlineService mostUsersEverOnlineService,
JForumConfig config, GroupInteractionFilter groupInteractionFilter,
Result result, SessionManager sessionManager) {
this.categoryRepository = categoryRepository;
this.userSession = userSession;
this.forumRepository = forumRepository;
this.userRepository = userRepository;
this.mostUsersEverOnlineService = mostUsersEverOnlineService;
this.config = config;
this.groupInteractionFilter = groupInteractionFilter;
this.result = result;
this.sessionManager = sessionManager;
}
/**
* Show the new messages since the last time the user did something in the forum
*/
@SecurityConstraint(value = AuthenticatedRule.class, displayLogin = true)
public void newMessages(int page) {
UserSession userSession = this.userSession;
int recordsPerPage = this.config.getInt(ConfigKeys.TOPICS_PER_PAGE);
PaginatedResult<Topic> newMessages = this.forumRepository.getNewMessages(new Date(userSession.getLastVisit()),
new Pagination().calculeStart(page, recordsPerPage), recordsPerPage);
Pagination pagination = new Pagination(this.config, page).forNewMessages(newMessages.getTotalRecords());
this.result.include("pagination", pagination);
this.result.include("results", newMessages.getResults());
this.result.include("categories", this.categoryRepository.getAllCategories());
}
/**
* Show topics from a forum
*/
@SecurityConstraint(value = AccessForumRule.class, displayLogin = true)
@Path({"/show/{forumId}", "/show/{forumId}/{page}"})
public void show(int forumId, int page) {
Forum forum = this.forumRepository.get(forumId);
Pagination pagination = new Pagination(this.config, page).forForum(forum);
this.result.include("forum", forum);
this.result.include("pagination", pagination);
this.result.include("isModeratorOnline", this.sessionManager.isModeratorOnline());
this.result.include("categories", this.categoryRepository.getAllCategories());
this.result.include("topics", forum.getTopics(pagination.getStart(),
pagination.getRecordsPerPage()));
}
/**
* Listing of all forums
*/
public void list() {
this.result.include("categories", this.categoryRepository.getAllCategories());
this.result.include("onlineUsers", this.sessionManager.getLoggedSessions());
this.result.include("totalRegisteredUsers", this.userRepository.getTotalUsers());
this.result.include("totalMessages", this.forumRepository.getTotalMessages());
this.result.include("totalLoggedUsers", this.sessionManager.getTotalLoggedUsers());
this.result.include("totalAnonymousUsers", this.sessionManager.getTotalAnonymousUsers());
this.result.include("lastRegisteredUser", this.userRepository.getLastRegisteredUser());
this.result.include("postsPerPage", this.config.getInt(ConfigKeys.POSTS_PER_PAGE));
this.result.include("mostUsersEverOnline", mostUsersEverOnlineService
.getMostRecentData(this.sessionManager.getTotalUsers()));
if (userSession.isLogged() && !userSession.getRoleManager().roleExists(SecurityConstants.INTERACT_OTHER_GROUPS)) {
this.groupInteractionFilter.filterForumListing(this.result, userSession);
}
}
}