package fi.otavanopisto.muikku.plugins.announcer; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import javax.inject.Inject; import org.apache.commons.lang3.RandomStringUtils; import fi.otavanopisto.muikku.model.users.UserEntity; import fi.otavanopisto.muikku.model.users.UserGroupEntity; import fi.otavanopisto.muikku.model.workspace.WorkspaceEntity; import fi.otavanopisto.muikku.plugins.announcer.dao.AnnouncementAttachmentDAO; import fi.otavanopisto.muikku.plugins.announcer.dao.AnnouncementDAO; import fi.otavanopisto.muikku.plugins.announcer.dao.AnnouncementEnvironmentRestriction; import fi.otavanopisto.muikku.plugins.announcer.dao.AnnouncementTimeFrame; import fi.otavanopisto.muikku.plugins.announcer.dao.AnnouncementUserGroupDAO; import fi.otavanopisto.muikku.plugins.announcer.dao.AnnouncementWorkspaceDAO; import fi.otavanopisto.muikku.plugins.announcer.model.Announcement; import fi.otavanopisto.muikku.plugins.announcer.model.AnnouncementAttachment; import fi.otavanopisto.muikku.plugins.announcer.model.AnnouncementUserGroup; import fi.otavanopisto.muikku.plugins.announcer.workspace.model.AnnouncementWorkspace; import fi.otavanopisto.muikku.schooldata.WorkspaceEntityController; import fi.otavanopisto.muikku.users.UserGroupEntityController; public class AnnouncementController { @Inject private AnnouncementDAO announcementDAO; @Inject private AnnouncementUserGroupDAO announcementUserGroupDAO; @Inject private AnnouncementWorkspaceDAO announcementWorkspaceDAO; @Inject private UserGroupEntityController userGroupEntityController; @Inject private WorkspaceEntityController workspaceEntityController; @Inject private AnnouncementAttachmentDAO announcementAttachmentDAO; public Announcement createAnnouncement(UserEntity publisher, String caption, String content, Date startDate, Date endDate, boolean publiclyVisible) { return announcementDAO.create( publisher.getId(), caption, content, new Date(), startDate, endDate, Boolean.FALSE, publiclyVisible); } public AnnouncementUserGroup addAnnouncementTargetGroup(Announcement announcement, UserGroupEntity userGroupEntity) { return announcementUserGroupDAO.create(announcement, userGroupEntity.getId(), Boolean.FALSE); } public AnnouncementWorkspace addAnnouncementWorkspace(Announcement announcement, WorkspaceEntity workspaceEntity) { return announcementWorkspaceDAO.create(announcement, workspaceEntity.getId(), Boolean.FALSE); } public Announcement updateAnnouncement(Announcement announcement, String caption, String content, Date startDate, Date endDate, boolean publiclyVisible) { announcementDAO.updateCaption(announcement, caption); announcementDAO.updateContent(announcement, content); announcementDAO.updateStartDate(announcement, startDate); announcementDAO.updateEndDate(announcement, endDate); announcementDAO.updatePubliclyVisible(announcement, publiclyVisible); return announcement; } public List<Announcement> listAnnouncements(boolean includeGroups, boolean includeWorkspaces, AnnouncementEnvironmentRestriction environment, AnnouncementTimeFrame timeFrame, UserEntity user, boolean userAsOwner, boolean onlyArchived) { List<UserGroupEntity> userGroupEntities = includeGroups ? userGroupEntityController.listUserGroupsByUserEntity(user) : Collections.emptyList(); List<WorkspaceEntity> workspaceEntities = includeWorkspaces ? workspaceEntityController.listWorkspaceEntitiesByWorkspaceUser(user) : Collections.emptyList(); List<Announcement> announcements = announcementDAO.listAnnouncements( userGroupEntities, workspaceEntities, environment, timeFrame, userAsOwner ? user : null, onlyArchived); return announcements; } public List<Announcement> listWorkspaceAnnouncements(List<WorkspaceEntity> workspaceEntities, AnnouncementEnvironmentRestriction environment, AnnouncementTimeFrame timeFrame, UserEntity user, boolean userAsOwner, boolean onlyArchived) { List<Announcement> announcements = announcementDAO.listAnnouncements( Collections.emptyList(), workspaceEntities, environment, timeFrame, userAsOwner ? user : null, onlyArchived); return announcements; } public List<Announcement> listAll() { return announcementDAO.listAll(); } public Announcement findById(Long id) { return announcementDAO.findById(id); } public List<Announcement> listActiveByWorkspaceEntities(List<WorkspaceEntity> workspaceEntities) { List<Long> workspaceEntityIds = new ArrayList<>(workspaceEntities.size()); for (WorkspaceEntity workspaceEntity : workspaceEntities) { workspaceEntityIds.add(workspaceEntity.getId()); } List<Announcement> result = new ArrayList<>(announcementDAO.listAnnouncements( Collections.emptyList(), workspaceEntities, AnnouncementEnvironmentRestriction.NONE, AnnouncementTimeFrame.CURRENT, false)); Collections.sort(result, new Comparator<Announcement>() { public int compare(Announcement o1, Announcement o2) { return o2.getStartDate().compareTo(o1.getStartDate()); } }); return result; } public List<AnnouncementUserGroup> listAnnouncementUserGroups(Announcement announcement) { return announcementUserGroupDAO.listByAnnouncementAndArchived(announcement, Boolean.FALSE); } public List<AnnouncementWorkspace> listAnnouncementWorkspaces(Announcement announcement) { return announcementWorkspaceDAO.listByAnnouncementAndArchived(announcement, Boolean.FALSE); } /** * Lists announcement workspaces and return them as sorted list so that the users' workspaces are first * * @param announcement * @param userEntity * @return */ public List<AnnouncementWorkspace> listAnnouncementWorkspacesSortByUserFirst(Announcement announcement, UserEntity userEntity) { List<WorkspaceEntity> userWorkspaces = workspaceEntityController.listWorkspaceEntitiesByWorkspaceUser(userEntity); Set<Long> userWorkspaceIds = userWorkspaces.stream().map(workspace -> workspace.getId()).collect(Collectors.toSet()); List<AnnouncementWorkspace> announcementWorkspaces = announcementWorkspaceDAO.listByAnnouncementAndArchived(announcement, Boolean.FALSE); announcementWorkspaces.sort(new Comparator<AnnouncementWorkspace>() { @Override public int compare(AnnouncementWorkspace o1, AnnouncementWorkspace o2) { boolean o1user = userWorkspaceIds.contains(o1.getWorkspaceEntityId()); boolean o2user = userWorkspaceIds.contains(o2.getWorkspaceEntityId()); if (o1user && !o2user) return -1; if (o2user && !o1user) return 1; return 0; } }); return announcementWorkspaces; } public void archive(Announcement announcement) { announcementDAO.updateArchived(announcement, Boolean.TRUE); } public void delete(Announcement announcement) { announcementDAO.delete(announcement); } public void deleteAnnouncementTargetGroups(Announcement announcement) { for (AnnouncementUserGroup announcementUserGroup : announcementUserGroupDAO.listByAnnouncementAndArchived(announcement, Boolean.FALSE)) { announcementUserGroupDAO.delete(announcementUserGroup); } } public void clearAnnouncementTargetGroups(Announcement announcement) { for (AnnouncementUserGroup announcementUserGroup : announcementUserGroupDAO.listByAnnouncementAndArchived(announcement, Boolean.FALSE)) { announcementUserGroupDAO.updateArchived(announcementUserGroup, Boolean.TRUE); } } public void clearAnnouncementWorkspaces(Announcement announcement) { for (AnnouncementWorkspace announcementWorkspace : announcementWorkspaceDAO.listByAnnouncementAndArchived(announcement, Boolean.FALSE)) { announcementWorkspaceDAO.updateArchived(announcementWorkspace, Boolean.TRUE); } } public void deleteAnnouncementWorkspaces(Announcement announcement) { for (AnnouncementWorkspace announcementWorkspace : announcementWorkspaceDAO.listByAnnouncementAndArchived(announcement, Boolean.FALSE)) { announcementWorkspaceDAO.delete(announcementWorkspace); } } public AnnouncementAttachment createAttachement(String contentType, byte[] content) { return announcementAttachmentDAO.create(RandomStringUtils.randomAlphanumeric(64), contentType, content); } public AnnouncementAttachment findAttachmentByName(String name){ return announcementAttachmentDAO.findByName(name); } }