package fi.otavanopisto.muikku.atests;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.Stateful;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.event.Event;
import javax.inject.Inject;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import org.apache.commons.lang3.StringUtils;
import fi.otavanopisto.muikku.controller.TagController;
import fi.otavanopisto.muikku.model.base.Tag;
import fi.otavanopisto.muikku.model.users.Flag;
import fi.otavanopisto.muikku.model.users.FlagShare;
import fi.otavanopisto.muikku.model.users.FlagStudent;
import fi.otavanopisto.muikku.model.users.UserEntity;
import fi.otavanopisto.muikku.model.users.UserGroupEntity;
import fi.otavanopisto.muikku.model.users.UserGroupUserEntity;
import fi.otavanopisto.muikku.model.users.UserSchoolDataIdentifier;
import fi.otavanopisto.muikku.model.workspace.WorkspaceEntity;
import fi.otavanopisto.muikku.model.workspace.WorkspaceRoleArchetype;
import fi.otavanopisto.muikku.model.workspace.WorkspaceUserEntity;
import fi.otavanopisto.muikku.notifier.NotifierController;
import fi.otavanopisto.muikku.plugin.PluginRESTService;
import fi.otavanopisto.muikku.plugins.announcer.AnnouncementController;
import fi.otavanopisto.muikku.plugins.announcer.model.Announcement;
import fi.otavanopisto.muikku.plugins.communicator.CommunicatorController;
import fi.otavanopisto.muikku.plugins.communicator.CommunicatorNewInboxMessageNotification;
import fi.otavanopisto.muikku.plugins.communicator.model.CommunicatorMessageCategory;
import fi.otavanopisto.muikku.plugins.communicator.model.CommunicatorMessageId;
import fi.otavanopisto.muikku.plugins.communicator.model.CommunicatorMessageRecipient;
import fi.otavanopisto.muikku.plugins.communicator.model.CommunicatorUserLabel;
import fi.otavanopisto.muikku.plugins.evaluation.EvaluationController;
import fi.otavanopisto.muikku.plugins.evaluation.model.WorkspaceMaterialEvaluation;
import fi.otavanopisto.muikku.plugins.forum.ForumController;
import fi.otavanopisto.muikku.plugins.forum.model.EnvironmentForumArea;
import fi.otavanopisto.muikku.plugins.forum.model.ForumArea;
import fi.otavanopisto.muikku.plugins.forum.model.ForumAreaGroup;
import fi.otavanopisto.muikku.plugins.forum.model.ForumThread;
import fi.otavanopisto.muikku.plugins.forum.model.ForumThreadReply;
import fi.otavanopisto.muikku.plugins.forum.model.WorkspaceForumArea;
import fi.otavanopisto.muikku.plugins.material.HtmlMaterialController;
import fi.otavanopisto.muikku.plugins.material.model.HtmlMaterial;
import fi.otavanopisto.muikku.plugins.schooldatapyramus.PyramusUpdater;
import fi.otavanopisto.muikku.plugins.search.UserIndexer;
import fi.otavanopisto.muikku.plugins.search.WorkspaceIndexer;
import fi.otavanopisto.muikku.plugins.user.UserPendingPasswordChange;
import fi.otavanopisto.muikku.plugins.user.UserPendingPasswordChangeDAO;
import fi.otavanopisto.muikku.plugins.workspace.WorkspaceMaterialContainsAnswersExeption;
import fi.otavanopisto.muikku.plugins.workspace.WorkspaceMaterialController;
import fi.otavanopisto.muikku.plugins.workspace.model.WorkspaceFolder;
import fi.otavanopisto.muikku.plugins.workspace.model.WorkspaceMaterial;
import fi.otavanopisto.muikku.plugins.workspace.model.WorkspaceMaterialAssignmentType;
import fi.otavanopisto.muikku.plugins.workspace.model.WorkspaceNode;
import fi.otavanopisto.muikku.schooldata.SchoolDataIdentifier;
import fi.otavanopisto.muikku.schooldata.WorkspaceEntityController;
import fi.otavanopisto.muikku.schooldata.events.SchoolDataWorkspaceDiscoveredEvent;
import fi.otavanopisto.muikku.session.local.LocalSession;
import fi.otavanopisto.muikku.session.local.LocalSessionController;
import fi.otavanopisto.muikku.users.FlagController;
import fi.otavanopisto.muikku.users.UserEntityController;
import fi.otavanopisto.muikku.users.UserGroupEntityController;
import fi.otavanopisto.muikku.users.WorkspaceUserEntityController;
import fi.otavanopisto.security.rest.RESTPermit;
import fi.otavanopisto.security.rest.RESTPermit.Handling;
@RequestScoped
@Path("/test")
@Stateful
@Produces("application/json")
@Consumes("application/json")
public class AcceptanceTestsRESTService extends PluginRESTService {
private static final long serialVersionUID = 4192161644908642797L;
@Inject
@LocalSession
private LocalSessionController localSessionController;
@Inject
private Logger logger;
@Inject
private CommunicatorController communicatorController;
@Inject
private WorkspaceEntityController workspaceEntityController;
@Inject
private WorkspaceUserEntityController workspaceUserEntityController;
@Inject
private UserEntityController userEntityController;
@Inject
private PyramusUpdater pyramusUpdater;
@Inject
private HtmlMaterialController htmlMaterialController;
@Inject
private WorkspaceMaterialController workspaceMaterialController;
@Inject
private UserPendingPasswordChangeDAO userPendingPasswordChangeDAO;
@Inject
private EvaluationController evaluationController;
@Inject
private ForumController forumController;
@Inject
private FlagController flagController;
@Inject
private Event<SchoolDataWorkspaceDiscoveredEvent> schoolDataWorkspaceDiscoveredEvent;
@Inject
private UserIndexer userIndexer;
@Inject
private WorkspaceIndexer workspaceIndexer;
@Inject
private AnnouncementController announcementController;
@Inject
private UserGroupEntityController userGroupEntityController;
@Inject
private TagController tagController;
@Inject
private NotifierController notifierController;
@Inject
private CommunicatorNewInboxMessageNotification communicatorNewInboxMessageNotification;
@GET
@Path("/login")
@Produces("text/plain")
@RESTPermit (handling = Handling.UNSECURED)
public Response test_login(@QueryParam ("role") String role) {
logger.log(Level.INFO, "Acceptance tests plugin logging in with role " + role);
switch (role) {
case "ENVIRONMENT-STUDENT":
localSessionController.login("PYRAMUS", "STUDENT-1");
break;
case "ENVIRONMENT-TEACHER":
localSessionController.login("PYRAMUS", "STAFF-2");
break;
case "ENVIRONMENT-MANAGER":
localSessionController.login("PYRAMUS", "STAFF-3");
break;
case "ENVIRONMENT-ADMINISTRATOR":
localSessionController.login("PYRAMUS", "STAFF-4");
break;
case "ENVIRONMENT-TRUSTED_SYSTEM":
localSessionController.login("PYRAMUS", "STAFF-5");
break;
case "PSEUDO-EVERYONE":
// Do nothing
break;
}
return Response.ok().build();
}
@GET
@Path("/reindex")
@Produces("text/plain")
@RESTPermit (handling = Handling.UNSECURED)
public Response test_reindex() {
logger.log(Level.INFO, "Acceptance tests plugin reindex task started.");
List<WorkspaceEntity> workspaceEntities = workspaceEntityController.listWorkspaceEntities();
for (int i = 0; i < workspaceEntities.size(); i++) {
WorkspaceEntity workspaceEntity = workspaceEntities.get(i);
workspaceIndexer.indexWorkspace(workspaceEntity);
}
logger.log(Level.INFO, "Reindexed " + workspaceEntities.size() + " workspaces");
List<UserEntity> users = userEntityController.listUserEntities();
for (int i = 0; i < users.size(); i++) {
UserEntity userEntity = users.get(i);
userIndexer.indexUser(userEntity);
}
logger.log(Level.INFO, "Reindexed " + users.size() + " users");
return Response.ok().build();
}
@GET
@Path("/mockimport")
@Produces("text/plain")
@RESTPermit (handling = Handling.UNSECURED)
public Response test_importmock() {
pyramusUpdater.updateUserRoles();
pyramusUpdater.updateCourses(0, 100);
pyramusUpdater.updatePersons(0, 200);
return Response.ok().build();
}
@DELETE
@Path("/communicator/messages")
@RESTPermit (handling = Handling.UNSECURED)
public Response deleteCommunicatorMessages() {
for (CommunicatorMessageRecipient x : communicatorController.listAllRecipients())
communicatorController.delete(x);
for (fi.otavanopisto.muikku.plugins.communicator.model.CommunicatorMessage message : communicatorController.listAllMessages()) {
communicatorController.delete(message);
}
for (CommunicatorMessageId x : communicatorController.listAllMessageIds())
communicatorController.delete(x);
return Response.noContent().build();
}
@POST
@Path("/communicator/labels/user/{ID}")
@RESTPermit (handling = Handling.UNSECURED)
public Response createCommunicatorUserLabel(@PathParam ("ID") Long userId, fi.otavanopisto.muikku.atests.CommunicatorUserLabelRESTModel payload) {
UserEntity userEntity = userEntityController.findUserEntityById(userId);
CommunicatorUserLabelRESTModel newUserLabel = new CommunicatorUserLabelRESTModel(null, payload.getName(), payload.getColor());
communicatorController.createUserLabel(newUserLabel.getName(), newUserLabel.getColor(), userEntity);
return Response.ok().build();
}
@DELETE
@Path("/communicator/labels/user/{ID}")
@RESTPermit (handling = Handling.UNSECURED)
public Response deleteCommunicatorUserLabels(@PathParam ("ID") Long userId) {
UserEntity userEntity = userEntityController.findUserEntityById(userId);
List<CommunicatorUserLabel> userLabels = communicatorController.listUserLabelsByUserEntity(userEntity);
for (CommunicatorUserLabel communicatorUserLabel : userLabels) {
communicatorController.delete(communicatorUserLabel);
}
return Response.noContent().build();
}
@POST
@Path("/communicator/messages")
@RESTPermit (handling = Handling.UNSECURED)
public Response createCommunicatorMessage(fi.otavanopisto.muikku.atests.CommunicatorMessage payload) {
UserEntity user = userEntityController.findUserEntityById(payload.getSenderId());
CommunicatorMessageId communicatorMessageId = communicatorController.createMessageId();
Set<Tag> tagList = parseTags(payload.getTags());
List<UserEntity> recipients = new ArrayList<UserEntity>();
for (Long recipientId : payload.getRecipientIds()) {
UserEntity recipient = userEntityController.findUserEntityById(recipientId);
if (recipient != null)
recipients.add(recipient);
}
for (Long groupId : payload.getRecipientGroupIds()) {
UserGroupEntity group = userGroupEntityController.findUserGroupEntityById(groupId);
List<UserGroupUserEntity> groupUsers = userGroupEntityController.listUserGroupUserEntitiesByUserGroupEntity(group);
for (UserGroupUserEntity groupUser : groupUsers) {
UserSchoolDataIdentifier userSchoolDataIdentifier = groupUser.getUserSchoolDataIdentifier();
UserEntity userEntity = userSchoolDataIdentifier.getUserEntity();
recipients.add(userEntity);
}
}
for (Long workspaceId : payload.getRecipientStudentsWorkspaceIds()) {
WorkspaceEntity workspaceEntity = workspaceEntityController.findWorkspaceEntityById(workspaceId);
List<WorkspaceUserEntity> workspaceUsers = workspaceUserEntityController.listWorkspaceUserEntitiesByRoleArchetype(
workspaceEntity, WorkspaceRoleArchetype.STUDENT);
for (WorkspaceUserEntity wosu : workspaceUsers) {
recipients.add(wosu.getUserSchoolDataIdentifier().getUserEntity());
}
}
for (Long workspaceId : payload.getRecipientTeachersWorkspaceIds()) {
WorkspaceEntity workspaceEntity = workspaceEntityController.findWorkspaceEntityById(workspaceId);
List<WorkspaceUserEntity> workspaceUsers = workspaceUserEntityController.listWorkspaceUserEntitiesByRoleArchetype(
workspaceEntity, WorkspaceRoleArchetype.TEACHER);
for (WorkspaceUserEntity wosu : workspaceUsers) {
recipients.add(wosu.getUserSchoolDataIdentifier().getUserEntity());
}
}
CommunicatorMessageCategory categoryEntity = communicatorController.persistCategory(payload.getCategoryName());
fi.otavanopisto.muikku.plugins.communicator.model.CommunicatorMessage message = communicatorController.createMessage(communicatorMessageId, user, recipients,
null, null, null, categoryEntity, payload.getCaption(), payload.getContent(), tagList);
Long communicatorMessageId2 = message.getCommunicatorMessageId().getId();
fi.otavanopisto.muikku.atests.CommunicatorMessage result = new fi.otavanopisto.muikku.atests.CommunicatorMessage(message.getId(), communicatorMessageId2, message.getSender(), payload.getCategoryName(), message.getCaption(), message.getContent(), message.getCreated(), payload.getTags(), payload.getRecipientIds(), payload.getRecipientGroupIds(), payload.getRecipientStudentsWorkspaceIds(), payload.getRecipientTeachersWorkspaceIds());
Map<String, Object> params = new HashMap<String, Object>();
params.put("sender", "Admin User");
params.put("subject", message.getCaption());
params.put("content", message.getContent());
params.put("url", "https://dev.muikku.fi/communicator");
notifierController.sendNotification(communicatorNewInboxMessageNotification, user, recipients, params);
return Response.ok(
result
).build();
}
@POST
@Path("/workspaces")
@RESTPermit (handling = Handling.UNSECURED)
public Response createWorkspace(fi.otavanopisto.muikku.atests.Workspace payload) {
SchoolDataWorkspaceDiscoveredEvent event = new SchoolDataWorkspaceDiscoveredEvent(payload.getSchoolDataSource(), payload.getIdentifier(), payload.getName(), null);
schoolDataWorkspaceDiscoveredEvent.fire(event);
WorkspaceEntity workspaceEntity = workspaceEntityController.findWorkspaceEntityById(event.getDiscoveredWorkspaceEntityId());
if (payload.getPublished() != null) {
workspaceEntityController.updatePublished(workspaceEntity, payload.getPublished());
}
return Response.ok(createRestEntity(workspaceEntity, payload.getName())).build();
}
@GET
@Path("/workspaces/{WORKSPACEENTITYID}/publish")
@RESTPermit (handling = Handling.UNSECURED)
public Response publishWorkspace(@PathParam ("WORKSPACEENTITYID") Long workspaceEntityId) {
WorkspaceEntity workspaceEntity = workspaceEntityController.findWorkspaceEntityById(workspaceEntityId);
if (workspaceEntity == null) {
return Response.status(404).entity("Not found").build();
}
workspaceEntityController.updatePublished(workspaceEntity, true);
return Response.noContent().build();
}
@DELETE
@Path("/workspaces/{WORKSPACEENTITYID}")
@RESTPermit (handling = Handling.UNSECURED)
public Response deleteWorkspace(@PathParam ("WORKSPACEENTITYID") Long workspaceEntityId) {
WorkspaceEntity workspaceEntity = workspaceEntityController.findWorkspaceEntityById(workspaceEntityId);
if (workspaceEntity == null) {
return Response.status(404).entity("Not found").build();
}
try {
workspaceMaterialController.deleteAllWorkspaceNodes(workspaceEntity);
} catch (WorkspaceMaterialContainsAnswersExeption e) {
return Response.status(500).entity(e.getMessage()).build();
}
List<WorkspaceUserEntity> workspaceUserEntities = workspaceUserEntityController.listWorkspaceUserEntitiesIncludeArchived(workspaceEntity);
for (WorkspaceUserEntity workspaceUserEntity : workspaceUserEntities) {
workspaceUserEntityController.deleteWorkspaceUserEntity(workspaceUserEntity);
}
workspaceEntityController.deleteWorkspaceEntity(workspaceEntity);
return Response.noContent().build();
}
@POST
@Path("/workspaces/{WORKSPACEENTITYID}/folders")
@RESTPermit (handling = Handling.UNSECURED)
public Response createWorkspaceMaterial(@PathParam ("WORKSPACEENTITYID") Long workspaceEntityId, fi.otavanopisto.muikku.atests.WorkspaceFolder payload) {
WorkspaceEntity workspaceEntity = workspaceEntityController.findWorkspaceEntityById(workspaceEntityId);
if (workspaceEntity == null) {
return Response.status(Status.NOT_FOUND).entity("Workspace entity not found").build();
}
WorkspaceNode parentNode = null;
if (payload.getParentId() != null) {
parentNode = workspaceMaterialController.findWorkspaceNodeById(payload.getParentId());
if (parentNode == null) {
return Response.status(Status.BAD_REQUEST).entity("Invalid parentId").build();
}
} else {
parentNode = workspaceMaterialController.findWorkspaceRootFolderByWorkspaceEntity(workspaceEntity);
if (parentNode == null) {
return Response.status(Status.INTERNAL_SERVER_ERROR).entity("Could not find workspace root entity").build();
}
}
WorkspaceFolder workspaceFolder = workspaceMaterialController.createWorkspaceFolder(parentNode, payload.getTitle());
if (workspaceFolder == null) {
return Response.status(Status.INTERNAL_SERVER_ERROR).entity("Could not create workspace folder").build();
}
return Response.ok(createRestEntity(workspaceFolder)).build();
}
@POST
@Path("/workspaces/{WORKSPACEID}/htmlmaterials")
@RESTPermit (handling = Handling.UNSECURED)
public Response createWorkspaceMaterial(fi.otavanopisto.muikku.atests.WorkspaceHtmlMaterial payload) {
if (payload.getParentId() == null) {
return Response.status(Status.BAD_REQUEST).entity("Mandatory parentId is missing").build();
}
HtmlMaterial htmlMaterial = htmlMaterialController.createHtmlMaterial(payload.getTitle(), payload.getHtml(), payload.getContentType(), payload.getRevisionNumber(), payload.getLicense());
WorkspaceNode parent = workspaceMaterialController.findWorkspaceNodeById(payload.getParentId());
if (parent == null) {
return Response.status(Status.BAD_REQUEST).entity("Invalid parentId").build();
}
WorkspaceMaterial workspaceMaterial = workspaceMaterialController.createWorkspaceMaterial(parent, htmlMaterial);
String assignmentType = payload.getAssignmentType();
if (StringUtils.isNotBlank(assignmentType)) {
WorkspaceMaterialAssignmentType workspaceMaterialAssignmentType = WorkspaceMaterialAssignmentType.valueOf(assignmentType);
if (workspaceMaterialAssignmentType == null) {
return Response.status(Status.BAD_REQUEST).entity(String.format("Invalid assignmentType '%s'", assignmentType)).build();
}
workspaceMaterialController.updateWorkspaceMaterialAssignmentType(workspaceMaterial, workspaceMaterialAssignmentType);
}
return Response.ok(createRestEntity(workspaceMaterial, htmlMaterial)).build();
}
@DELETE
@Path("/workspaces/{WORKSPACEENTITYID}/htmlmaterials/{WORKSPACEMATERIALID}")
@RESTPermit (handling = Handling.UNSECURED)
public Response deleteWorkspaceMaterial(@PathParam ("WORKSPACEENTITYID") Long workspaceEntityId, @PathParam ("WORKSPACEMATERIALID") Long workspaceMaterialId) {
WorkspaceMaterial workspaceMaterial = workspaceMaterialController.findWorkspaceMaterialById(workspaceMaterialId);
if (workspaceMaterial == null) {
return Response.status(Status.NOT_FOUND).entity("Not Found").build();
}
HtmlMaterial htmlMaterial = htmlMaterialController.findHtmlMaterialById(workspaceMaterial.getMaterialId());
if (htmlMaterial == null) {
return Response.status(Status.BAD_REQUEST).entity("Not a html material").build();
}
try {
workspaceMaterialController.deleteWorkspaceMaterial(workspaceMaterial, true);
} catch (WorkspaceMaterialContainsAnswersExeption e) {
return Response.status(Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
List<WorkspaceMaterialEvaluation> evaluations = evaluationController.listWorkspaceMaterialEvaluationsByWorkspaceMaterialId(workspaceMaterialId);
for (WorkspaceMaterialEvaluation evaluation : evaluations) {
evaluationController.deleteWorkspaceMaterialEvaluation(evaluation);
}
htmlMaterialController.deleteHtmlMaterial(htmlMaterial);
return Response.noContent().build();
}
@POST
@Path("/workspaces/{WORKSPACEENTITYID}/discussiongroups")
@RESTPermit (handling = Handling.UNSECURED)
public Response createWorkspaceDiscussionGroup(@PathParam ("WORKSPACEENTITYID") Long workspaceEntityId, fi.otavanopisto.muikku.atests.DiscussionGroup payload) {
WorkspaceEntity workspaceEntity = workspaceEntityController.findWorkspaceEntityById(workspaceEntityId);
if (workspaceEntity == null) {
return Response.status(Status.NOT_FOUND).entity("WorkspaceEntity not found").build();
}
if (StringUtils.isBlank(payload.getName())) {
return Response.status(Status.BAD_REQUEST).entity("Mandatory name is missing").build();
}
return Response.ok(createRestEntity(forumController.createForumAreaGroup(payload.getName()))).build();
}
@DELETE
@Path("/workspaces/{WORKSPACEENTITYID}/discussiongroups/{GROUPID}")
@RESTPermit (handling = Handling.UNSECURED)
public Response deleteWorkspaceDiscussionGroup(@PathParam ("WORKSPACEENTITYID") Long workspaceEntityId, @PathParam ("GROUPID") Long groupId) {
WorkspaceEntity workspaceEntity = workspaceEntityController.findWorkspaceEntityById(workspaceEntityId);
if (workspaceEntity == null) {
return Response.status(Status.NOT_FOUND).entity("WorkspaceEntity not found").build();
}
ForumAreaGroup group = forumController.findForumAreaGroup(groupId);
if (group == null) {
return Response.status(Status.NOT_FOUND).entity("Group not found").build();
}
forumController.deleteAreaGroup(group);
return Response.noContent().build();
}
@POST
@Path("/workspaces/{WORKSPACEENTITYID}/discussiongroups/{GROUPID}/discussions")
@RESTPermit (handling = Handling.UNSECURED)
public Response createWorkspaceDiscussion(@PathParam ("WORKSPACEENTITYID") Long workspaceEntityId, @PathParam ("GROUPID") Long groupId, fi.otavanopisto.muikku.atests.Discussion payload) {
WorkspaceEntity workspaceEntity = workspaceEntityController.findWorkspaceEntityById(workspaceEntityId);
if (workspaceEntity == null) {
return Response.status(Status.NOT_FOUND).entity("WorkspaceEntity not found").build();
}
ForumAreaGroup group = forumController.findForumAreaGroup(groupId);
if (group == null) {
return Response.status(Status.NOT_FOUND).entity("Group not found").build();
}
if (StringUtils.isBlank(payload.getName())) {
return Response.status(Status.BAD_REQUEST).entity("Mandatory name is missing").build();
}
return Response.ok(createRestEntity(forumController.createWorkspaceForumArea(workspaceEntity, payload.getName(), payload.getDescription(), group.getId()))).build();
}
@DELETE
@Path("/workspaces/{WORKSPACEENTITYID}/discussiongroups/{GROUPID}/discussions/{DISCUSSIONID}")
@RESTPermit (handling = Handling.UNSECURED)
public Response deleteWorkspaceDiscussion(@PathParam ("WORKSPACEENTITYID") Long workspaceEntityId, @PathParam ("GROUPID") Long groupId, @PathParam ("DISCUSSIONID") Long discussionId) {
WorkspaceEntity workspaceEntity = workspaceEntityController.findWorkspaceEntityById(workspaceEntityId);
if (workspaceEntity == null) {
return Response.status(Status.NOT_FOUND).entity("WorkspaceEntity not found").build();
}
ForumAreaGroup group = forumController.findForumAreaGroup(groupId);
if (group == null) {
return Response.status(Status.NOT_FOUND).entity("Group not found").build();
}
ForumArea forumArea = forumController.getForumArea(discussionId);
if (forumArea == null) {
return Response.status(Status.NOT_FOUND).entity("Discussion not found").build();
}
List<ForumThread> threads = forumController.listForumThreads(forumArea, 0, Integer.MAX_VALUE, true);
for (ForumThread thread : threads) {
List<ForumThreadReply> replies = forumController.listForumThreadReplies(thread, 0, Integer.MAX_VALUE, true);
for (ForumThreadReply reply : replies) {
forumController.deleteReply(reply);
}
forumController.deleteThread(thread);
}
forumController.deleteArea(forumArea);
return Response.noContent().build();
}
@POST
@Path("/workspaces/{WORKSPACEENTITYID}/discussiongroups/{GROUPID}/discussions/{DISCUSSIONID}/threads")
@RESTPermit (handling = Handling.UNSECURED)
public Response createWorkspaceDiscussionThread(@PathParam ("WORKSPACEENTITYID") Long workspaceEntityId, @PathParam ("GROUPID") Long groupId, @PathParam ("DISCUSSIONID") Long discussionId, fi.otavanopisto.muikku.atests.DiscussionThread payload) {
WorkspaceEntity workspaceEntity = workspaceEntityController.findWorkspaceEntityById(workspaceEntityId);
if (workspaceEntity == null) {
return Response.status(Status.NOT_FOUND).entity("WorkspaceEntity not found").build();
}
ForumAreaGroup group = forumController.findForumAreaGroup(groupId);
if (group == null) {
return Response.status(Status.NOT_FOUND).entity("Group not found").build();
}
ForumArea discussion = forumController.getForumArea(discussionId);
if (discussion == null) {
return Response.status(Status.NOT_FOUND).entity("Discussion not found").build();
}
return Response.ok(createRestEntity(forumController.createForumThread(discussion, payload.getTitle(), payload.getMessage(), payload.getSticky(), payload.getLocked()))).build();
}
@DELETE
@Path("/announcements")
@RESTPermit (handling = Handling.UNSECURED)
public Response deleteAnnouncements() {
for(Announcement announcement : announcementController.listAll()) {
announcementController.deleteAnnouncementWorkspaces(announcement);
announcementController.deleteAnnouncementTargetGroups(announcement);
announcementController.delete(announcement);
}
return Response.noContent().build();
}
@POST
@Path("/announcements")
@RESTPermit (handling = Handling.UNSECURED)
public Response createAnnouncement(fi.otavanopisto.muikku.atests.Announcement payload) {
UserEntity user = userEntityController.findUserEntityById(payload.getPublisherUserEntityId());
Announcement announcement = announcementController.createAnnouncement(user, payload.getCaption(), payload.getContent(), payload.getStartDate(), payload.getEndDate(), payload.getPubliclyVisible());
if(payload.getUserGroupEntityIds() != null) {
List<Long> userGroups = payload.getUserGroupEntityIds();
for (Long userGroupId : userGroups) {
UserGroupEntity userGroup = userGroupEntityController.findUserGroupEntityById(userGroupId);
announcementController.addAnnouncementTargetGroup(announcement, userGroup);
}
}
return Response.ok(announcement.getId()).build();
}
@PUT
@Path("/announcements/{ANNOUNCEMENTID}/workspace/{WORKSPACEID}")
@RESTPermit (handling = Handling.UNSECURED)
public Response updateAnnouncementWorkspace(@PathParam ("ANNOUNCEMENTID") Long announcementId, @PathParam ("WORKSPACEID") Long workspaceId) {
Announcement newAnnouncement = announcementController.findById(announcementId);
if (newAnnouncement == null) {
return Response.status(Status.BAD_REQUEST).entity("Announcement not found").build();
}
WorkspaceEntity workspaceEntity = workspaceEntityController.findWorkspaceEntityById(workspaceId);
if (workspaceEntity == null) {
return Response.status(Status.BAD_REQUEST).entity("Workspace not found").build();
}
announcementController.addAnnouncementWorkspace(newAnnouncement, workspaceEntity);
return Response.ok().build();
}
@POST
@Path("/flags")
@RESTPermit (handling = Handling.UNSECURED)
public Response createFlag(fi.otavanopisto.muikku.atests.Flag payload) {
if (StringUtils.isBlank(payload.getColor())) {
return Response.status(Status.BAD_REQUEST).entity("color is missing").build();
}
if (StringUtils.isBlank(payload.getName())) {
return Response.status(Status.BAD_REQUEST).entity("name is missing").build();
}
// TODO: OwnerIdentifier from payload, please.
Flag flag = flagController.createFlag(SchoolDataIdentifier.fromString("STAFF-1/PYRAMUS"), payload.getName(), payload.getColor(), payload.getDescription());
return Response.ok(createRestEntity(flag)).build();
}
@DELETE
@Path("/flags/{FLAGID}")
@RESTPermit (handling = Handling.UNSECURED)
public Response deleteFlag(@PathParam ("FLAGID") Long flagId) {
Flag flag = flagController.findFlagById(flagId);
if (flag == null) {
return Response.status(Status.BAD_REQUEST).entity("Flag not found").build();
}
flagController.deleteFlag(flag);
return Response.noContent().build();
}
@POST
@Path("/students/{ID}/flags/{FLAGID}")
@RESTPermit (handling = Handling.UNSECURED)
public Response createStudentFlag(@PathParam("ID") Long studentId, @PathParam("FLAGID") Long flagId) {
String identifier = userEntityController.findUserEntityById(studentId).getDefaultIdentifier();
SchoolDataIdentifier studentIdentifier = SchoolDataIdentifier.fromString(identifier + "/PYRAMUS");
if (studentIdentifier == null) {
return Response.status(Response.Status.BAD_REQUEST).entity("Invalid studentIdentifier").build();
}
Flag flag = flagController.findFlagById(flagId);
if (flag == null) {
return Response.status(Status.NOT_FOUND).entity(String.format("Flag #%d not found", flagId)).build();
}
return Response.ok(createRestEntity(flagController.flagStudent(flag, studentIdentifier))).build();
}
@DELETE
@Path("/students/flags/{ID}")
@RESTPermit (handling = Handling.UNSECURED)
public Response deleteStudentFlag(@PathParam("ID") Long id) {
FlagStudent flagStudent = flagController.findFlagStudentById(id);
if (flagStudent == null) {
return Response.status(Response.Status.NOT_FOUND).entity(String.format("Flag not found %d", id)).build();
}
flagController.unflagStudent(flagStudent);
return Response.noContent().build();
}
@DELETE
@Path("/flags/share/{FLAGID}")
@RESTPermit (handling = Handling.UNSECURED)
public Response deleteFlagShares(@PathParam("FLAGID") Long flagId) {
Flag flag = flagController.findFlagById(flagId);
List<FlagShare> listShares = flagController.listShares(flag);
for (FlagShare flagShare : listShares) {
flagController.deleteFlagShare(flagShare);
}
return Response.noContent().build();
}
@POST
@Path("/passwordchange/{EMAIL}")
@RESTPermit (handling = Handling.UNSECURED)
public Response createPasswordChangeEntry(@PathParam ("EMAIL") String email) {
UserEntity userEntity = userEntityController.findUserEntityByEmailAddress(email);
if (userEntity == null)
return Response.status(Status.NOT_FOUND).build();
String confirmationHash = "testtesttest";
userPendingPasswordChangeDAO.create(userEntity, confirmationHash);
return Response.noContent().build();
}
@DELETE
@Path("/passwordchange/{EMAIL}")
@RESTPermit (handling = Handling.UNSECURED)
public Response deletePasswordChangeEntry(@PathParam ("EMAIL") String email) {
UserEntity userEntity = userEntityController.findUserEntityByEmailAddress(email);
if (userEntity == null)
return Response.status(Status.NOT_FOUND).build();
UserPendingPasswordChange userPendingPasswordChange = userPendingPasswordChangeDAO.findByUserEntity(userEntity);
userPendingPasswordChangeDAO.delete(userPendingPasswordChange);
return Response.noContent().build();
}
@DELETE
@Path("/userGroups/{USERGROUPID}/{USERID}")
@RESTPermit (handling = Handling.UNSECURED)
public Response deleteUserGroupUser(@PathParam ("USERGROUPID") Long userGroupId, @PathParam ("USERID") Long userId) {
UserGroupUserEntity userGroupUser = userGroupEntityController.findUserGroupUserEntityById(userId);
userGroupEntityController.deleteUserGroupUserEntity(userGroupUser);
return Response.noContent().build();
}
@DELETE
@Path("/userGroups/{USERGROUPID}")
@RESTPermit (handling = Handling.UNSECURED)
public Response deleteUserGroup(@PathParam ("USERGROUPID") Long userGroupId) {
UserGroupEntity userGroup = userGroupEntityController.findUserGroupEntityById(userGroupId);
for(UserGroupUserEntity userGroupUser : userGroupEntityController.listUserGroupUserEntitiesByUserGroupEntity(userGroup)) {
userGroupEntityController.deleteUserGroupUserEntity(userGroupUser);
}
userGroupEntityController.deleteUserGroupEntity(userGroup);
return Response.noContent().build();
}
@DELETE
@Path("/workspaces/{WORKSPACEENTITYID}/discussiongroups/{GROUPID}/discussions/{DISCUSSIONID}/threads/{ID}")
@RESTPermit (handling = Handling.UNSECURED)
public Response deleteWorkspaceDiscussionThread(@PathParam ("WORKSPACEENTITYID") Long workspaceEntityId, @PathParam ("GROUPID") Long groupId, @PathParam ("DISCUSSIONID") Long discussionId, @PathParam ("ID") Long id) {
WorkspaceEntity workspaceEntity = workspaceEntityController.findWorkspaceEntityById(workspaceEntityId);
if (workspaceEntity == null) {
return Response.status(Status.NOT_FOUND).entity("WorkspaceEntity not found").build();
}
ForumAreaGroup group = forumController.findForumAreaGroup(groupId);
if (group == null) {
return Response.status(Status.NOT_FOUND).entity("Group not found").build();
}
ForumArea forumArea = forumController.getForumArea(discussionId);
if (forumArea == null) {
return Response.status(Status.NOT_FOUND).entity("Discussion not found").build();
}
ForumThread thread = forumController.getForumThread(id);
if (thread == null) {
return Response.status(Status.NOT_FOUND).entity("Thread not found").build();
}
forumController.deleteThread(thread);
return Response.noContent().build();
}
@POST
@Path("/discussiongroups")
@RESTPermit (handling = Handling.UNSECURED)
public Response createDiscussionGroup(fi.otavanopisto.muikku.atests.DiscussionGroup payload) {
if (StringUtils.isBlank(payload.getName())) {
return Response.status(Status.BAD_REQUEST).entity("Mandatory name is missing").build();
}
return Response.ok(createRestEntity(forumController.createForumAreaGroup(payload.getName()))).build();
}
@DELETE
@Path("/discussiongroups/{GROUPID}")
@RESTPermit (handling = Handling.UNSECURED)
public Response deleteDiscussionGroup(@PathParam ("GROUPID") Long groupId) {
ForumAreaGroup group = forumController.findForumAreaGroup(groupId);
if (group == null) {
return Response.status(Status.NOT_FOUND).entity("Group not found").build();
}
forumController.deleteAreaGroup(group);
return Response.noContent().build();
}
@POST
@Path("/discussiongroups/{GROUPID}/discussions")
@RESTPermit (handling = Handling.UNSECURED)
public Response createDiscussion(@PathParam ("GROUPID") Long groupId, fi.otavanopisto.muikku.atests.Discussion payload) {
ForumAreaGroup group = forumController.findForumAreaGroup(groupId);
if (group == null) {
return Response.status(Status.NOT_FOUND).entity("Group not found").build();
}
if (StringUtils.isBlank(payload.getName())) {
return Response.status(Status.BAD_REQUEST).entity("Mandatory name is missing").build();
}
return Response.ok(createRestEntity(forumController.createEnvironmentForumArea(payload.getName(), payload.getDescription(), group.getId()))).build();
}
@DELETE
@Path("/discussiongroups/{GROUPID}/discussions/{DISCUSSIONID}")
@RESTPermit (handling = Handling.UNSECURED)
public Response deleteDiscussion(@PathParam ("GROUPID") Long groupId, @PathParam ("DISCUSSIONID") Long discussionId) {
ForumAreaGroup group = forumController.findForumAreaGroup(groupId);
if (group == null) {
return Response.status(Status.NOT_FOUND).entity("Group not found").build();
}
ForumArea forumArea = forumController.getForumArea(discussionId);
if (forumArea == null) {
return Response.status(Status.NOT_FOUND).entity("Discussion not found").build();
}
List<ForumThread> threads = forumController.listForumThreads(forumArea, 0, Integer.MAX_VALUE, true);
for (ForumThread thread : threads) {
List<ForumThreadReply> replies = forumController.listForumThreadReplies(thread, 0, Integer.MAX_VALUE, true);
for (ForumThreadReply reply : replies) {
forumController.deleteReply(reply);
}
forumController.deleteThread(thread);
}
forumController.deleteArea(forumArea);
return Response.noContent().build();
}
@POST
@Path("/discussiongroups/{GROUPID}/discussions/{DISCUSSIONID}/threads")
@RESTPermit (handling = Handling.UNSECURED)
public Response createDiscussionThread(@PathParam ("GROUPID") Long groupId, @PathParam ("DISCUSSIONID") Long discussionId, fi.otavanopisto.muikku.atests.DiscussionThread payload) {
ForumAreaGroup group = forumController.findForumAreaGroup(groupId);
if (group == null) {
return Response.status(Status.NOT_FOUND).entity("Group not found").build();
}
ForumArea discussion = forumController.getForumArea(discussionId);
if (discussion == null) {
return Response.status(Status.NOT_FOUND).entity("Discussion not found").build();
}
return Response.ok(createRestEntity(forumController.createForumThread(discussion, payload.getTitle(), payload.getMessage(), payload.getSticky(), payload.getLocked()))).build();
}
@DELETE
@Path("/discussiongroups/{GROUPID}/discussions/{DISCUSSIONID}/threads/{ID}")
@RESTPermit (handling = Handling.UNSECURED)
public Response deleteDiscussionThread(@PathParam ("GROUPID") Long groupId, @PathParam ("DISCUSSIONID") Long discussionId, @PathParam ("ID") Long id) {
ForumAreaGroup group = forumController.findForumAreaGroup(groupId);
if (group == null) {
return Response.status(Status.NOT_FOUND).entity("Group not found").build();
}
ForumArea forumArea = forumController.getForumArea(discussionId);
if (forumArea == null) {
return Response.status(Status.NOT_FOUND).entity("Discussion not found").build();
}
ForumThread thread = forumController.getForumThread(id);
if (thread == null) {
return Response.status(Status.NOT_FOUND).entity("Thread not found").build();
}
forumController.deleteThread(thread);
return Response.noContent().build();
}
private fi.otavanopisto.muikku.atests.Workspace createRestEntity(WorkspaceEntity workspaceEntity, String name) {
return new fi.otavanopisto.muikku.atests.Workspace(workspaceEntity.getId(),
name,
workspaceEntity.getUrlName(),
workspaceEntity.getDataSource().getIdentifier(),
workspaceEntity.getIdentifier(),
workspaceEntity.getPublished());
}
private DiscussionGroup createRestEntity(ForumAreaGroup entity) {
return new DiscussionGroup(entity.getId(), entity.getName());
}
private fi.otavanopisto.muikku.atests.Discussion createRestEntity(WorkspaceForumArea entity) {
return new fi.otavanopisto.muikku.atests.Discussion(entity.getId(), entity.getName(), entity.getDescription(), entity.getGroup().getId());
}
private fi.otavanopisto.muikku.atests.Discussion createRestEntity(EnvironmentForumArea entity) {
return new fi.otavanopisto.muikku.atests.Discussion(entity.getId(), entity.getName(), entity.getDescription(), entity.getGroup().getId());
}
private fi.otavanopisto.muikku.atests.WorkspaceHtmlMaterial createRestEntity(WorkspaceMaterial workspaceMaterial, HtmlMaterial htmlMaterial) {
return new fi.otavanopisto.muikku.atests.WorkspaceHtmlMaterial(workspaceMaterial.getId(),
workspaceMaterial.getParent() != null ? workspaceMaterial.getParent().getId() : null,
workspaceMaterial.getTitle(),
htmlMaterial.getContentType(),
htmlMaterial.getHtml(),
htmlMaterial.getRevisionNumber(),
workspaceMaterial.getAssignmentType() != null ? workspaceMaterial.getAssignmentType().toString() : null,
htmlMaterial.getLicense());
}
private fi.otavanopisto.muikku.atests.WorkspaceFolder createRestEntity(WorkspaceFolder workspaceFolder) {
return new fi.otavanopisto.muikku.atests.WorkspaceFolder(workspaceFolder.getId(),
workspaceFolder.getHidden(),
workspaceFolder.getOrderNumber(),
workspaceFolder.getUrlName(),
workspaceFolder.getTitle(),
workspaceFolder.getParent() != null ? workspaceFolder.getParent().getId() : null);
}
private fi.otavanopisto.muikku.atests.DiscussionThread createRestEntity(ForumThread entity) {
return new fi.otavanopisto.muikku.atests.DiscussionThread(entity.getId(),
entity.getTitle(),
entity.getMessage(),
entity.getSticky(),
entity.getLocked());
}
private fi.otavanopisto.muikku.atests.Flag createRestEntity(Flag entity) {
return new fi.otavanopisto.muikku.atests.Flag(entity.getId(),
entity.getName(),
entity.getColor(),
entity.getDescription(),
null);
}
private fi.otavanopisto.muikku.atests.StudentFlag createRestEntity(FlagStudent flagStudent) {
SchoolDataIdentifier studentIdentifier = new SchoolDataIdentifier(flagStudent.getStudentIdentifier().getIdentifier(), flagStudent.getStudentIdentifier().getDataSource().getIdentifier());
return new fi.otavanopisto.muikku.atests.StudentFlag(flagStudent.getId(), flagStudent.getFlag().getId(), studentIdentifier.toId());
}
private Set<Tag> parseTags(Set<String> tags) {
Set<Tag> result = new HashSet<Tag>();
for (String t : tags) {
Tag tag = tagController.findTag(t);
if (tag == null)
tag = tagController.createTag(t);
result.add(tag);
}
return result;
}
}