package fi.otavanopisto.muikku.plugins.guider;
import java.util.List;
import javax.ejb.Stateful;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.StreamingOutput;
import fi.otavanopisto.muikku.model.users.UserEntity;
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.plugin.PluginRESTService;
import fi.otavanopisto.muikku.plugins.assessmentrequest.AssessmentRequestController;
import fi.otavanopisto.muikku.plugins.assessmentrequest.WorkspaceAssessmentState;
import fi.otavanopisto.muikku.plugins.transcriptofrecords.TranscriptOfRecordsFileController;
import fi.otavanopisto.muikku.plugins.transcriptofrecords.model.TranscriptOfRecordsFile;
import fi.otavanopisto.muikku.schooldata.RestCatchSchoolDataExceptions;
import fi.otavanopisto.muikku.schooldata.SchoolDataIdentifier;
import fi.otavanopisto.muikku.schooldata.WorkspaceEntityController;
import fi.otavanopisto.muikku.session.SessionController;
import fi.otavanopisto.muikku.users.UserEntityController;
import fi.otavanopisto.muikku.users.WorkspaceUserEntityController;
import fi.otavanopisto.security.rest.RESTPermit;
import fi.otavanopisto.security.rest.RESTPermit.Handling;
@RequestScoped
@Stateful
@Produces("application/json")
@Path ("/guider")
@RestCatchSchoolDataExceptions
public class GuiderRESTService extends PluginRESTService {
private static final long serialVersionUID = -5286350366083446537L;
@Inject
private WorkspaceEntityController workspaceEntityController;
@Inject
private WorkspaceUserEntityController workspaceUserEntityController;
@Inject
private SessionController sessionController;
@Inject
private GuiderController guiderController;
@Inject
private AssessmentRequestController assessmentRequestController;
@Inject
private TranscriptOfRecordsFileController torFileController;
@Inject
private UserEntityController userEntityController;
@GET
@Path("/workspaces/{WORKSPACEENTITYID}/activity")
@RESTPermit (handling = Handling.INLINE, requireLoggedIn = true)
public Response getWorkspaceAssessmentsStudyProgressAnalysis(@PathParam("WORKSPACEENTITYID") Long workspaceEntityId) {
SchoolDataIdentifier userIdentifier = sessionController.getLoggedUser();
if (userIdentifier == null) {
return Response.status(Status.BAD_REQUEST).entity("Invalid userIdentifier").build();
}
WorkspaceEntity workspaceEntity = workspaceEntityController.findWorkspaceEntityById(workspaceEntityId);
if (workspaceEntity == null) {
return Response.status(Status.NOT_FOUND).entity("WorkspaceEntity not found").build();
}
GuiderStudentWorkspaceActivity activity = guiderController.getStudentWorkspaceActivity(workspaceEntity, userIdentifier);
if (activity == null) {
return Response.status(Status.INTERNAL_SERVER_ERROR).entity(String.format("Failed to analyze assignments progress for student %s in workspace %d", userIdentifier, workspaceEntity.getId())).build();
}
WorkspaceAssessmentState assessmentState = WorkspaceAssessmentState.UNASSESSED;
WorkspaceUserEntity workspaceUserEntity = workspaceUserEntityController.findWorkspaceUserEntityByWorkspaceAndUserIdentifier(workspaceEntity, userIdentifier);
if (workspaceUserEntity != null && workspaceUserEntity.getWorkspaceUserRole().getArchetype() == WorkspaceRoleArchetype.STUDENT) {
assessmentState = assessmentRequestController.getWorkspaceAssessmentState(workspaceUserEntity);
}
return Response.ok(toRestModel(activity, assessmentState)).build();
}
@GET
@Path("/workspaces/{WORKSPACEENTITYID}/studentactivity/{USERIDENTIFIER}")
@RESTPermit (GuiderPermissions.GUIDER_FIND_STUDENT_WORKSPACE_ACTIVITY)
public Response getWorkspaceAssessmentsStudyProgressAnalysis(@PathParam("WORKSPACEENTITYID") Long workspaceEntityId, @PathParam("USERIDENTIFIER") String userId) {
SchoolDataIdentifier userIdentifier = SchoolDataIdentifier.fromId(userId);
if (userIdentifier == null) {
return Response.status(Status.BAD_REQUEST).entity("Invalid userIdentifier").build();
}
WorkspaceEntity workspaceEntity = workspaceEntityController.findWorkspaceEntityById(workspaceEntityId);
if (workspaceEntity == null) {
return Response.status(Status.NOT_FOUND).entity("WorkspaceEntity not found").build();
}
WorkspaceUserEntity workspaceUserEntity = workspaceUserEntityController.findWorkspaceUserEntityByWorkspaceAndUserIdentifier(workspaceEntity, userIdentifier);
if (workspaceUserEntity == null) {
return Response.status(Status.NOT_FOUND).entity("WorkspaceUserEntity not found").build();
}
GuiderStudentWorkspaceActivity activity = guiderController.getStudentWorkspaceActivity(workspaceEntity, userIdentifier);
if (activity == null) {
return Response.status(Status.INTERNAL_SERVER_ERROR).entity(String.format("Failed to analyze assignments progress for student %s in workspace %d", userIdentifier, workspaceEntity.getId())).build();
}
WorkspaceAssessmentState assessmentState = assessmentRequestController.getWorkspaceAssessmentState(workspaceUserEntity);
return Response.ok(toRestModel(activity, assessmentState)).build();
}
@GET
@Path("/users/{IDENTIFIER}/files")
@RESTPermit(GuiderPermissions.GUIDER_LIST_TORFILES)
public Response listTranscriptOfRecordsFiles(@PathParam("IDENTIFIER") String identifierString) {
SchoolDataIdentifier identifier = SchoolDataIdentifier.fromId(identifierString);
UserEntity ue = userEntityController.findUserEntityByUserIdentifier(identifier);
if (ue == null) {
return Response.status(Status.NOT_FOUND).entity("User entity not found").build();
}
List<TranscriptOfRecordsFile> torFiles = torFileController.listFiles(ue);
return Response.ok().entity(torFiles).build();
}
@DELETE
@Path("/files/{ID}")
@RESTPermit(GuiderPermissions.GUIDER_DELETE_TORFILE)
public Response deleteTranscriptOfRecordsFile(@PathParam("ID") Long fileId) {
TranscriptOfRecordsFile file = torFileController.findFileById(fileId);
if (file == null) {
return Response.status(Status.NOT_FOUND).entity("file not found").build();
}
torFileController.delete(file);
return Response.status(Status.NO_CONTENT).build();
}
@GET
@Path("/files/{ID}/content")
@RESTPermit(GuiderPermissions.GUIDER_GET_TORFILE_CONTENT)
public Response getTranscriptOfRecordsFileContent(@PathParam("ID") Long fileId) {
TranscriptOfRecordsFile file = torFileController .findFileById(fileId);
if (file == null) {
return Response.status(Status.NOT_FOUND).entity("File not found").build();
}
StreamingOutput output = s -> torFileController.outputFileToStream(file, s);
String contentType = file.getContentType();
return Response.ok().type(contentType).entity(output).build();
}
private GuiderStudentWorkspaceActivityRestModel toRestModel(GuiderStudentWorkspaceActivity activity, WorkspaceAssessmentState assessmentState) {
GuiderStudentWorkspaceActivityRestModel model = new GuiderStudentWorkspaceActivityRestModel(
activity.getLastVisit(),
activity.getNumVisits(),
activity.getJournalEntryCount(),
activity.getLastJournalEntry(),
activity.getEvaluables().getUnanswered(),
activity.getEvaluables().getAnswered(),
activity.getEvaluables().getAnsweredLastDate(),
activity.getEvaluables().getSubmitted(),
activity.getEvaluables().getSubmittedLastDate(),
activity.getEvaluables().getPassed(),
activity.getEvaluables().getPassedLastDate(),
activity.getEvaluables().getFailed(),
activity.getEvaluables().getFailedLastDate(),
activity.getEvaluables().getIncomplete(),
activity.getEvaluables().getIncompleteLastDate(),
activity.getEvaluables().getDonePercent(),
activity.getExercises().getUnanswered(),
activity.getExercises().getAnswered(),
activity.getExercises().getAnsweredLastDate(),
activity.getExercises().getDonePercent(),
assessmentState);
return model;
}
}