package fi.otavanopisto.muikku.plugins.material.rest;
import java.util.ArrayList;
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.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.core.Response;
import javax.ws.rs.core.Response.Status;
import org.apache.commons.lang3.StringUtils;
import fi.otavanopisto.muikku.plugin.PluginRESTService;
import fi.otavanopisto.muikku.plugins.material.MaterialController;
import fi.otavanopisto.muikku.plugins.material.model.Material;
import fi.otavanopisto.muikku.plugins.workspace.WorkspaceMaterialController;
import fi.otavanopisto.muikku.plugins.workspace.model.WorkspaceMaterial;
import fi.otavanopisto.muikku.plugins.workspace.model.WorkspaceNode;
import fi.otavanopisto.muikku.security.MuikkuPermissions;
import fi.otavanopisto.muikku.session.SessionController;
import fi.otavanopisto.security.rest.RESTPermit;
import fi.otavanopisto.security.rest.RESTPermit.Handling;
@RequestScoped
@Path("/materials")
@Stateful
@Produces("application/json")
public class MaterialRESTService extends PluginRESTService {
private static final long serialVersionUID = 4177181930625188454L;
@Inject
private MaterialController materialController;
@Inject
private WorkspaceMaterialController workspaceMaterialController;
@Inject
private SessionController sessionController;
@GET
// @Path("/material/{ID:[0-9]*}/workspaceMaterials/")
@Path("/material/{ID}/workspaceMaterials/")
@RESTPermit(handling = Handling.INLINE, requireLoggedIn = true)
public Response listMaterialWorkspaceMaterials(@PathParam ("ID") Long materialId) {
if (!sessionController.isLoggedIn()) {
return Response.status(Status.UNAUTHORIZED).build();
}
if (!sessionController.hasEnvironmentPermission(MuikkuPermissions.LIST_MATERIAL_WORKSPACE_MATERIALS)) {
return Response.status(Status.FORBIDDEN).build();
}
Material material = materialController.findMaterialById(materialId);
if (material == null) {
return Response.status(Status.NOT_FOUND).entity("Material not found").build();
}
List<WorkspaceMaterial> workspaceMaterials = workspaceMaterialController.listWorkspaceMaterialsByMaterial(material);
return Response.ok(createRestModel(workspaceMaterials.toArray(new WorkspaceMaterial[0]))).build();
}
@GET
@Path("/material/{ID}")
@RESTPermit (handling = Handling.INLINE, requireLoggedIn = true)
public Response findMaterial(@PathParam ("ID") Long id) {
if (!sessionController.hasEnvironmentPermission(MuikkuPermissions.MANAGE_MATERIALS)) {
return Response.status(Status.FORBIDDEN).entity("Permission denied").build();
}
Material material = materialController.findMaterialById(id);
if (material == null) {
return Response.status(Status.NOT_FOUND).entity(String.format("Material %d not found", id)).build();
}
return Response.ok(createRestModel(material)).build();
}
@PUT
@Path("/material/{ID}")
@RESTPermit (handling = Handling.INLINE, requireLoggedIn = true)
public Response updateMaterial(@PathParam ("ID") Long id, RestMaterial payload) {
if (!sessionController.hasEnvironmentPermission(MuikkuPermissions.MANAGE_MATERIALS)) {
return Response.status(Status.FORBIDDEN).entity("Permission denied").build();
}
Material material = materialController.findMaterialById(id);
if (material == null) {
return Response.status(Status.NOT_FOUND).entity(String.format("Material %d not found", id)).build();
}
if (StringUtils.isNotBlank(payload.getTitle()) && !StringUtils.equals(payload.getTitle(), material.getTitle())) {
return Response.status(Status.BAD_REQUEST).entity("Refused to update title via this REST endpoint").build();
}
if (payload.getViewRestrict() == null) {
return Response.status(Status.BAD_REQUEST).entity("Required field viewRestrict missing").build();
}
materialController.updateMaterialLicense(material, payload.getLicense());
materialController.updateMaterialViewRestrict(material, payload.getViewRestrict());
return Response.ok(createRestModel(material)).build();
}
@POST
@Path("/material/{MATERIALID}/producers")
@RESTPermit (handling = Handling.INLINE, requireLoggedIn = true)
public Response createWorkspaceMaterialProducer(@PathParam("MATERIALID") Long materialId, MaterialProducer payload) {
if (!sessionController.isLoggedIn()) {
return Response.status(Status.UNAUTHORIZED).entity("Not logged in").build();
}
if (!sessionController.hasEnvironmentPermission(MuikkuPermissions.MANAGE_MATERIAL_PRODUCERS)) {
return Response.status(Status.FORBIDDEN).entity("Permission denied").build();
}
if (StringUtils.isBlank(payload.getName())) {
return Response.status(Status.BAD_REQUEST).entity("Name is required").build();
}
Material material = materialController.findMaterialById(materialId);
if (material == null) {
return Response.status(Status.NOT_FOUND).entity(String.format("Material %d not found", materialId)).build();
}
return Response
.ok(createRestModel(materialController.createMaterialProducer(material, payload.getName())))
.build();
}
@GET
@Path("/material/{MATERIALID}/producers")
@RESTPermit (handling = Handling.INLINE, requireLoggedIn = false)
public Response listWorkspaceMaterialProducers(@PathParam("MATERIALID") Long materialId) {
Material material = materialController.findMaterialById(materialId);
if (material == null) {
return Response.status(Status.NOT_FOUND).entity(String.format("Material %d not found", materialId)).build();
}
return Response
.ok(createRestModel(materialController.listMaterialProducers(material).toArray(new fi.otavanopisto.muikku.plugins.material.model.MaterialProducer[0])))
.build();
}
@DELETE
@Path("/material/{MATERIALID}/producers/{PRODUCERID}")
@RESTPermit (handling = Handling.INLINE, requireLoggedIn = true)
public Response deleteWorkspaceMaterialProducer(@PathParam("MATERIALID") Long materialId, @PathParam("PRODUCERID") Long producerId) {
if (!sessionController.isLoggedIn()) {
return Response.status(Status.UNAUTHORIZED).entity("Not logged in").build();
}
if (!sessionController.hasEnvironmentPermission(MuikkuPermissions.MANAGE_MATERIAL_PRODUCERS)) {
return Response.status(Status.FORBIDDEN).entity("Permission denied").build();
}
Material material = materialController.findMaterialById(materialId);
if (material == null) {
return Response.status(Status.NOT_FOUND).entity(String.format("Material %d not found", materialId)).build();
}
fi.otavanopisto.muikku.plugins.material.model.MaterialProducer materialProducer = materialController.findMaterialProducer(producerId);
materialController.deleteMaterialProducer(materialProducer);
return Response
.noContent()
.build();
}
private List<MaterialProducer> createRestModel(fi.otavanopisto.muikku.plugins.material.model.MaterialProducer... producers) {
List<MaterialProducer> result = new ArrayList<>();
for (fi.otavanopisto.muikku.plugins.material.model.MaterialProducer producer : producers) {
result.add(createRestModel(producer));
}
return result;
}
private MaterialProducer createRestModel(fi.otavanopisto.muikku.plugins.material.model.MaterialProducer entity) {
Long materialId = entity.getMaterial() != null ? entity.getMaterial().getId() : null;
return new MaterialProducer(entity.getId(), entity.getName(), materialId);
}
private RestMaterial createRestModel(Material material) {
return new RestMaterial(material.getId(), material.getTitle(), material.getLicense(), material.getViewRestrict());
}
private fi.otavanopisto.muikku.plugins.workspace.rest.model.WorkspaceMaterial[] createRestModel(WorkspaceMaterial... workspaceMaterials) {
List<fi.otavanopisto.muikku.plugins.workspace.rest.model.WorkspaceMaterial> result = new ArrayList<>();
for (WorkspaceMaterial workspaceMaterial : workspaceMaterials) {
result.add(createRestModel(workspaceMaterial));
}
return result.toArray(new fi.otavanopisto.muikku.plugins.workspace.rest.model.WorkspaceMaterial[0]);
}
private fi.otavanopisto.muikku.plugins.workspace.rest.model.WorkspaceMaterial createRestModel(WorkspaceMaterial workspaceMaterial) {
WorkspaceNode workspaceNode = workspaceMaterialController.findWorkspaceNodeNextSibling(workspaceMaterial);
Long nextSiblingId = workspaceNode != null ? workspaceNode.getId() : null;
return new fi.otavanopisto.muikku.plugins.workspace.rest.model.WorkspaceMaterial(workspaceMaterial.getId(), workspaceMaterial.getMaterialId(),
workspaceMaterial.getParent() != null ? workspaceMaterial.getParent().getId() : null, nextSiblingId, workspaceMaterial.getHidden(),
workspaceMaterial.getAssignmentType(), workspaceMaterial.getCorrectAnswers(), workspaceMaterial.getPath(), workspaceMaterial.getTitle());
}
}