package org.jvalue.ods.rest;
import com.fasterxml.jackson.core.JsonPointer;
import com.fasterxml.jackson.databind.JsonNode;
import com.google.inject.Inject;
import com.hubspot.jackson.jaxrs.PropertyFiltering;
import org.jvalue.commons.auth.RestrictedTo;
import org.jvalue.commons.auth.Role;
import org.jvalue.commons.auth.User;
import org.jvalue.commons.rest.RestUtils;
import org.jvalue.ods.api.data.Data;
import org.jvalue.ods.data.DataSourceManager;
import org.jvalue.ods.db.DataRepository;
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.QueryParam;
import javax.ws.rs.core.MediaType;
@Path(AbstractApi.BASE_URL + "/{sourceId}/data")
@Produces(MediaType.APPLICATION_JSON)
public final class DataApi extends AbstractApi {
private final DataSourceManager sourceManager;
@Inject
public DataApi(DataSourceManager sourceManager) {
this.sourceManager = sourceManager;
}
@GET
@PropertyFiltering(always = {"!result._id", "!result._rev"})
public Data getObjects(
@PathParam("sourceId") String sourceId,
@QueryParam("startId") String startId,
@QueryParam("count") int count,
@QueryParam("property") String propertyFilter) {
if (count < 1 || count > 100) throw RestUtils.createJsonFormattedException("count must be > 0 and < 100", 400);
DataRepository repository = assertIsValidSource(sourceId);
return repository.executePaginatedGet(startId, count);
}
@DELETE
public void deleteAllObjects(
@RestrictedTo(Role.ADMIN) User user,
@PathParam("sourceId") String sourceId) {
DataRepository repository = assertIsValidSource(sourceId);
repository.removeAll();
}
@GET
@Path("/{objectId}{pointer:(/.*)?}")
public JsonNode getObjectAttribute(
@PathParam("sourceId") String sourceId,
@PathParam("objectId") String domainId,
@PathParam("pointer") String pointer) {
JsonNode node = assertIsValidSource(sourceId).findByDomainId(domainId);
if (pointer.isEmpty() || pointer.equals("/")) return node;
try {
JsonPointer jsonPointer = JsonPointer.compile(pointer);
JsonNode result = node.at(jsonPointer);
if (result.isMissingNode()) throw RestUtils.createNotFoundException();
return result;
} catch (IllegalArgumentException iae) {
// thrown by JsonPointer.compile
throw RestUtils.createNotFoundException();
}
}
private DataRepository assertIsValidSource(String sourceId) {
return sourceManager.getDataRepository(sourceManager.findBySourceId(sourceId));
}
}