package bo.gotthardt.rest;
import bo.gotthardt.AccessibleBy;
import bo.gotthardt.Persistable;
import bo.gotthardt.exception.WebAppPreconditions;
import bo.gotthardt.jersey.parameters.ListFiltering;
import bo.gotthardt.model.User;
import com.google.common.base.Predicate;
import com.google.common.collect.Collections2;
import com.google.common.collect.Lists;
import io.dropwizard.auth.Auth;
import lombok.RequiredArgsConstructor;
import javax.ws.rs.*;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import java.util.List;
import java.util.UUID;
/**
* @author Bo Gotthardt
*/
@Produces(MediaType.APPLICATION_JSON)
@RequiredArgsConstructor
public class RestrictedRestResource<P extends Persistable & AccessibleBy<User>> {
private final CrudService<P> service;
@GET
@Path("/{id}")
public P one(@Auth User user, @PathParam("id") UUID id) {
P item = service.fetchById(id);
WebAppPreconditions.assertAccessTo(user, item);
return item;
}
@GET
public List<P> many(@Auth final User user, @Context ListFiltering filtering) {
List<P> items = service.fetchByFilter(filtering);
return Lists.newArrayList(Collections2.filter(items, new Predicate<P>() {
@Override
public boolean apply(P input) {
return input.isAccessibleBy(user);
}
}));
}
// @POST
// @Consumes(MediaType.APPLICATION_JSON)
// public P create(@Auth User user, @Valid P item) {
// // TODO
// return service.create(item);
// }
//
// @PUT
// @Path("/{id}")
// @Consumes(MediaType.APPLICATION_JSON)
// public P update(@Auth User user, @Valid P item, @PathParam("id") long id) {
// WebAppPreconditions.assertAccessTo(user, item);
//
// return service.update(id, item);
// }
@DELETE
@Path("/{id}")
public void delete(@Auth User user, @PathParam("id") UUID id) {
P item = service.fetchById(id);
WebAppPreconditions.assertAccessTo(user, item);
service.delete(id);
}
}