package org.jvalue.ods.rest;
import com.fasterxml.jackson.databind.JsonNode;
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.sources.DataSourceDescription;
import org.jvalue.ods.data.DataSourceManager;
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.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path(AbstractApi.BASE_URL)
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public final class DataSourceApi extends AbstractApi {
private final DataSourceManager sourceManager;
@Inject
public DataSourceApi(DataSourceManager sourceManager) {
this.sourceManager = sourceManager;
}
@GET
public List<DataSource> getAllSources() {
return sourceManager.getAll();
}
@GET
@Path("/{sourceId}")
public DataSource getSource(@PathParam("sourceId") String sourceId) {
return sourceManager.findBySourceId(sourceId);
}
@GET
@Path("/{sourceId}/schema")
public JsonNode getSourceSchema(@PathParam("sourceId") String sourceId) {
return sourceManager.findBySourceId(sourceId).getSchema();
}
@PUT
@Path("/{sourceId}")
public DataSource addSource(
@RestrictedTo(Role.ADMIN) User user,
@PathParam("sourceId") String sourceId,
@Valid DataSourceDescription sourceDescription) {
if (sourceManager.isValidSourceId(sourceId))
throw RestUtils.createJsonFormattedException("source with id " + sourceId + " already exists", 409);
DataSource source = new DataSource(
sourceId,
sourceDescription.getDomainIdKey(),
sourceDescription.getSchema(),
sourceDescription.getMetaData());
sourceManager.add(source);
return source;
}
@DELETE
@Path("/{sourceId}")
public void deleteSource(
@RestrictedTo(Role.ADMIN) User user,
@PathParam("sourceId") String sourceId) {
sourceManager.remove(sourceManager.findBySourceId(sourceId));
}
}