package controllers;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import javax.inject.Inject;
import models.Action;
import models.Comment;
import models.Post;
import models.SecurityRole;
import models.User;
import models.UserFollow;
import models.UserReputation;
import models.dao.CommentDAO;
import models.dao.PostDAO;
import models.dao.PostRatingDAO;
import models.dao.SecurityRoleDAO;
import models.dao.ActionDAO;
import models.dao.UserDAO;
import models.dao.UserFollowDAO;
import models.dao.UserReputationDAO;
import play.Logger;
import play.Logger.ALogger;
import play.mvc.Result;
import play.utils.crud.TemplateController;
import views.html.userFollowShow;
import views.html.userShow;
import views.html.userShowComments;
import views.html.userShowRoles;
import views.html.userShowVotedPages;
import views.html.userShowPosts;
import com.avaje.ebean.Page;
public class UserController extends TemplateController {
private static ALogger log = Logger.of(UserController.class);
private PostRatingDAO postRatingDAO;
private UserDAO userDAO;
private UserFollowDAO userFollowDAO;
private SecurityRoleDAO securityRoleDAO;
private PostDAO postDAO;
private CommentDAO commentDAO;
private ActionDAO userActionDAO;
private UserReputationDAO userReputationDAO;
@Inject
public UserController(UserDAO userDAO, PostRatingDAO postRatingDAO, UserFollowDAO userFollowDAO,
SecurityRoleDAO securityRoleDAO, PostDAO postDAO, CommentDAO commentDAO, ActionDAO userActionDAO,
UserReputationDAO userReputationDAO) {
this.userDAO = userDAO;
this.postRatingDAO = postRatingDAO;
this.userFollowDAO = userFollowDAO;
this.securityRoleDAO = securityRoleDAO;
this.postDAO = postDAO;
this.commentDAO = commentDAO;
this.userActionDAO = userActionDAO;
this.userReputationDAO = userReputationDAO;
}
public Result show(String key, String tab, int votedPageNumber) {
if (log.isDebugEnabled())
log.debug("show() <- " + key);
User loginUser = HttpUtils.loginUser();
User userToShow = null;
if (null != key)
userToShow = userDAO.get(key);
return show(loginUser, userToShow, tab, votedPageNumber);
}
public Result showSelf() {
if (log.isDebugEnabled())
log.debug("showSelf() <-");
User loginUser = HttpUtils.loginUser(ctx());
return show(loginUser, loginUser, null, 0);
}
private Result show(User loginUser, User userToShow, String tab, int pageNumber) {
Page<Post> postPage = null;
Page<Action> actionPage = null;
Page<Comment> commentPage = null;
Set<Long> upVotes = userToShow == null ? new TreeSet<Long>() : postRatingDAO.getUpVotedPostKeys(userToShow);
Set<Long> downVotes = userToShow == null ? new TreeSet<Long>() : postRatingDAO.getDownVotedPostKeys(userToShow);
List<SecurityRole> allRoles = securityRoleDAO.all();
List<SecurityRole> userRoles = new ArrayList<SecurityRole>();
UserReputation reputation = userReputationDAO.get(userToShow);
if (log.isDebugEnabled())
log.debug("user : " + loginUser);
if (loginUser == null || userToShow == null) {
return badRequest(userShow.render(userToShow, reputation, false, tab, upVotes, downVotes, false, 0, 0,
actionPage));
}
boolean selfPage = false;
if (loginUser != null && userToShow != null && (loginUser.getKey() + "").equals(userToShow.getKey())) {
selfPage = true;
}
boolean following = false;
if (loginUser != null && userToShow != null) {
String sourceKey = loginUser.getKey();
String targetKey = userToShow.getKey();
UserFollow follow = userFollowDAO.get(sourceKey, targetKey);
following = follow != null;
}
int followerCount = userFollowDAO.getFollowerCount(userToShow);
int followingCount = userFollowDAO.getFollowingCount(userToShow);
if (tab == null || tab.toString().equals("") || tab.toString().equals(Constants.TIMELINE)) {
actionPage = userActionDAO.getActionsCreatedBy(new ArrayList<String>(Arrays.asList(userToShow.getKey())),
pageNumber, Constants.ACTIONS_PER_PAGE);
return ok(userShow.render(userToShow, reputation, selfPage, tab, upVotes, downVotes, following,
followerCount, followingCount, actionPage));
} else if (tab.toString().equals(Constants.POSTS)) {
postPage = postDAO.getPostsCreatedBy(new ArrayList<String>(Arrays.asList(userToShow.getKey())), pageNumber,
Constants.POSTS_PER_PAGE);
return ok(userShowPosts.render(userToShow, reputation, selfPage, tab, upVotes, downVotes, following,
followerCount, followingCount, postPage));
} else if (tab.toString().equals(Constants.COMMENTS)) {
commentPage = commentDAO.getCommentsBy(userToShow.getKey(), pageNumber, Constants.COMMENTS_PER_PAGE);
return ok(userShowComments.render(userToShow, reputation, selfPage, tab, following, followerCount,
followingCount, commentPage));
} else if (tab.toString().equals(Constants.ROLES)) {
userRoles = userToShow.getSecurityRoles();
return ok(userShowRoles.render(userToShow, reputation, selfPage, following, followerCount, followingCount,
allRoles, userRoles));
} else if (tab.toString().equals(Constants.VOTED_POSTS)) {
postPage = postRatingDAO.getUpVotedPosts(userToShow, pageNumber);
return ok(userShowVotedPages.render(userToShow, reputation, selfPage, tab, upVotes, downVotes, following,
followerCount, followingCount, postPage));
}
return badRequest(userShow.render(userToShow, reputation, false, tab, upVotes, downVotes, false, 0, 0,
actionPage));
}
public Result showFollowers(String key, int page) {
User user = HttpUtils.loginUser();
if (user == null)
return notFound("no user logged in");
User userToShow = null;
if (null != key)
userToShow = userDAO.get(key);
Page<User> pg = userFollowDAO.getFollowerUsers(userToShow, page);
List<String> followingUserKeys = userFollowDAO.getAllFollowingsKeys(user);
boolean isFollowingPage = false;
return ok(userFollowShow.render(pg, userToShow, followingUserKeys, isFollowingPage));
}
public Result showFollowings(String key, int page) {
User user = HttpUtils.loginUser();
if (user == null)
return notFound("no user logged in");
User userToShow = null;
if (null != key)
userToShow = userDAO.get(key);
Page<User> pg = userFollowDAO.getFollowingUsers(userToShow, page);
List<String> followingUserKeys = userFollowDAO.getAllFollowingsKeys(user);
boolean isFollowingPage = true;
return ok(userFollowShow.render(pg, userToShow, followingUserKeys, isFollowingPage));
}
}