package fi.otavanopisto.muikku.plugins.forum.wall;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.inject.Inject;
import fi.otavanopisto.muikku.model.users.UserEntity;
import fi.otavanopisto.muikku.model.workspace.WorkspaceEntity;
import fi.otavanopisto.muikku.plugins.forum.ForumController;
import fi.otavanopisto.muikku.plugins.forum.model.ForumArea;
import fi.otavanopisto.muikku.plugins.forum.model.ForumMessage;
import fi.otavanopisto.muikku.plugins.forum.model.ForumThread;
import fi.otavanopisto.muikku.plugins.forum.model.ForumThreadReply;
import fi.otavanopisto.muikku.plugins.forum.wall.ForumAreaSubscription;
import fi.otavanopisto.muikku.plugins.forum.wall.ForumThreadSubscription;
import fi.otavanopisto.muikku.plugins.wall.WallController;
import fi.otavanopisto.muikku.plugins.wall.WallEntryProvider;
import fi.otavanopisto.muikku.plugins.wall.WallFeedItem;
import fi.otavanopisto.muikku.plugins.wall.model.UserWall;
import fi.otavanopisto.muikku.plugins.wall.model.Wall;
import fi.otavanopisto.muikku.plugins.wall.model.WorkspaceWall;
import fi.otavanopisto.muikku.schooldata.WorkspaceController;
import fi.otavanopisto.muikku.session.SessionController;
import fi.otavanopisto.muikku.users.UserEntityController;
public class ForumWallEntryProvider implements WallEntryProvider {
@Inject
private SessionController sessionController;
@Inject
private UserEntityController userEntityController;
@Inject
private WorkspaceController workspaceController;
@Inject
private WallController wallController;
@Inject
private ForumController forumController;
@Inject
private ForumAreaSubscriptionDAO forumAreaSubscriptionDAO;
@Inject
private ForumThreadSubscriptionDAO forumThreadSubscriptionDAO;
@Override
public List<WallFeedItem> listWallEntryItems(Wall wall) {
// TODO ForumArea Rights, ForumController??, Duplicates when both types of subs
List<WallFeedItem> feedItems = new ArrayList<WallFeedItem>();
UserEntity loggedUser = sessionController.isLoggedIn() ? sessionController.getLoggedUserEntity() : null;
switch (wall.getWallType()) {
case USER:
/**
* UserWall will list
* - Threads by subscriptions if the logged user is viewing his own wall
* - Threads the wall owner has contributed in (if accessible by viewer)
*/
UserWall userWall = wallController.findUserWallById(wall.getId());
if (userWall != null) {
// User will see his own "subscriptions" but other users cannot see them
if (sessionController.isLoggedIn() && userWall.getUser().equals(loggedUser.getId())) {
List<ForumAreaSubscription> areaSubscriptions = forumAreaSubscriptionDAO.listByUser(loggedUser);
List<ForumThreadSubscription> threadSubscriptions = forumThreadSubscriptionDAO.listByUser(loggedUser);
for (ForumAreaSubscription forumAreaSubscription : areaSubscriptions) {
ForumArea forumArea = forumAreaSubscription.getForumArea();
List<ForumThread> forumThreads = forumController.listForumThreads(forumArea, 0, 25);
for (ForumThread thread : forumThreads) {
List<ForumThreadReply> replies = forumController.listForumThreadReplies(thread, 0, 25);
feedItems.add(new UserFeedForumThreadItem(thread, replies));
}
}
for (ForumThreadSubscription forumThreadSubscription : threadSubscriptions) {
ForumThread forumThread = forumThreadSubscription.getForumThread();
List<ForumThreadReply> replies = forumController.listForumThreadReplies(forumThread, 0, 25);
feedItems.add(new UserFeedForumThreadItem(forumThread, replies));
}
}
UserEntity wallUser = userEntityController.findUserEntityById(userWall.getUser());
// TODO Rights to view the forum area
// Posts
List<ForumMessage> contributedThreads = forumController.listByContributingUser(wallUser);
for (ForumMessage contributedThread : contributedThreads) {
feedItems.add(new UserFeedForumMessageItem(contributedThread));
}
}
break;
case ENVIRONMENT:
break;
case WORKSPACE:
/**
* WorkspaceWall will list
* - Forum area threads in workspace
*/
WorkspaceWall workspaceWall = wallController.findWorkspaceWallById(wall.getId());
WorkspaceEntity workspace = workspaceController.findWorkspaceEntityById(workspaceWall.getWorkspace());
List<ForumMessage> workspaceMessages = forumController.listMessagesByWorkspace(workspace);
for (ForumMessage workspaceMessage : workspaceMessages) {
feedItems.add(new UserFeedForumMessageItem(workspaceMessage));
}
break;
}
return feedItems;
}
@Override
public List<String> listRequiredJavaScripts() {
return Arrays.asList(
"scripts/gui/forum_wallentry.js"
);
}
}