package com.github.windbender.resources; import java.net.URI; import java.util.List; import javax.validation.Valid; 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.WebApplicationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.github.windbender.auth.Priv; import com.github.windbender.auth.SessionAuth; import com.github.windbender.auth.SessionCurProj; import com.github.windbender.auth.SessionUser; import com.github.windbender.core.SessionFilteredAuthorization; import com.github.windbender.dao.CameraDAO; import com.github.windbender.dao.ProjectDAO; import com.github.windbender.domain.Camera; import com.github.windbender.domain.Project; import com.github.windbender.domain.User; import com.sun.jersey.api.ConflictException; import com.yammer.dropwizard.hibernate.UnitOfWork; import com.yammer.metrics.annotation.Timed; @Path("/cameras/") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) public class CameraResource { Logger log = LoggerFactory.getLogger(CameraResource.class); CameraDAO cd; ProjectDAO pd; public CameraResource(CameraDAO cd, ProjectDAO pd) { this.cd = cd; this.pd = pd; } @GET @Timed @UnitOfWork public List<Camera> list( @SessionAuth(required = { Priv.ADMIN }) SessionFilteredAuthorization auths, @SessionUser User user, @SessionCurProj Project currentProject) { Project p = pd.findById(currentProject.getId()); List<Camera> l = cd.findAllInProject(p); return l; } @GET @Timed @UnitOfWork @Path("{id}") public Camera fetch( @SessionAuth(required = { Priv.ADMIN }) SessionFilteredAuthorization auths, @SessionUser User user, @SessionCurProj Project currentProject, @PathParam("id") Long cameraId) { Camera c = cd.findById(cameraId); if (!c.getProject().getId().equals(currentProject.getId())) throw new WebApplicationException(Response.Status.FORBIDDEN); return c; } @POST @Timed @UnitOfWork public Response add( @SessionAuth(required = { Priv.ADMIN }) SessionFilteredAuthorization auths, @SessionUser User user, @SessionCurProj Project currentProject, @Valid Camera camera) { log.info("Ok we have the following session user " + user); Project p = pd.findById(currentProject.getId()); if (p == null) throw new WebApplicationException(Response.Status.FORBIDDEN); camera.setProject(p); Camera newCamera = cd.save(camera); URI uri = UriBuilder.fromResource(CameraResource.class).build( newCamera.getId()); log.info("the response uri will be " + uri); return Response.created(uri).build(); } @PUT @Timed @Path("{id}") @UnitOfWork public Response update( @SessionAuth(required = { Priv.ADMIN }) SessionFilteredAuthorization auths, @SessionUser User user, @SessionCurProj Project currentProject, @PathParam("id") Long id, @Valid Camera camera) { Project p = pd.findById(currentProject.getId()); if (p == null) throw new WebApplicationException(Response.Status.FORBIDDEN); if (!p.getId().equals(camera.getProject().getId())) throw new WebApplicationException(Response.Status.FORBIDDEN); Camera newCamera = cd.save(camera); // URI uri = UriBuilder.fromResource(CameraResource.class).build( newCamera.getId()); log.info("the response uri will be " + uri); return Response.created(uri).build(); } @DELETE @Timed @Path("{id}") @Consumes(MediaType.TEXT_PLAIN) @UnitOfWork public Response delete( @SessionAuth(required = { Priv.ADMIN }) SessionFilteredAuthorization auths, @SessionUser User user, @SessionCurProj Project currentProject, @PathParam("id") Long id) { Project p = pd.findById(currentProject.getId()); Camera deleteableCamera = cd.findById(id); if(p.getId() != deleteableCamera.getProject().getId()) throw new WebApplicationException(Response.Status.FORBIDDEN); cd.delete(id); return Response.ok().build(); } }