package org.jvalue.ods.rest;
import com.google.inject.Inject;
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.sources.DataSource;
import org.jvalue.ods.api.views.DataView;
import org.jvalue.ods.api.views.DataViewDescription;
import org.jvalue.ods.data.DataSourceManager;
import org.jvalue.ods.data.DataViewManager;
import java.util.List;
import javax.validation.Valid;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
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}/views")
@Produces(MediaType.APPLICATION_JSON)
public final class DataViewApi extends AbstractApi {
private final DataSourceManager sourceManager;
private final DataViewManager viewManager;
@Inject
public DataViewApi(
DataSourceManager sourceManager,
DataViewManager viewManager) {
this.sourceManager = sourceManager;
this.viewManager = viewManager;
}
@GET
public List<DataView> getAllViews(@PathParam("sourceId") String sourceId) {
DataSource source = sourceManager.findBySourceId(sourceId);
return viewManager.getAll(source);
}
@GET
@Path("/{viewId}")
public Object getView(
@PathParam("sourceId") String sourceId,
@PathParam("viewId") String viewId,
@QueryParam("execute") boolean execute,
@QueryParam("argument") String argument) {
DataSource source = sourceManager.findBySourceId(sourceId);
DataView view = viewManager.get(source, viewId);
if (!execute) return view;
return viewManager.executeView(sourceManager.getDataRepository(source), view, argument);
}
@PUT
@Path("/{viewId}")
public DataView addView(
@RestrictedTo(Role.ADMIN) User user,
@PathParam("sourceId") String sourceId,
@PathParam("viewId") String viewId,
@Valid DataViewDescription viewDescription) {
DataSource source = sourceManager.findBySourceId(sourceId);
if (viewManager.contains(source, viewId))
throw RestUtils.createJsonFormattedException("data view with id " + viewId + " already exists", 409);
DataView view = new DataView(viewId, viewDescription.getMapFunction(), viewDescription.getReduceFunction());
viewManager.add(source, sourceManager.getDataRepository(source), view);
return view;
}
@DELETE
@Path("/{viewId}")
public void deleteView(
@RestrictedTo(Role.ADMIN) User user,
@PathParam("sourceId") String sourceId,
@PathParam("viewId") String viewId) {
DataSource source = sourceManager.findBySourceId(sourceId);
DataView view = viewManager.get(source, viewId);
viewManager.remove(source, sourceManager.getDataRepository(source), view);
}
}