package eu.europeana.cloud.service.mcs.rest; import com.qmino.miredot.annotations.ReturnType; import eu.europeana.cloud.common.model.DataSet; import eu.europeana.cloud.common.response.ResultSlice; import eu.europeana.cloud.service.aas.authentication.SpringUserUtils; import eu.europeana.cloud.service.mcs.DataSetService; import eu.europeana.cloud.service.mcs.exception.DataSetAlreadyExistsException; import eu.europeana.cloud.service.mcs.exception.ProviderNotExistsException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Scope; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.acls.domain.BasePermission; import org.springframework.security.acls.domain.ObjectIdentityImpl; import org.springframework.security.acls.domain.PrincipalSid; import org.springframework.security.acls.model.MutableAcl; import org.springframework.security.acls.model.MutableAclService; import org.springframework.security.acls.model.ObjectIdentity; import org.springframework.stereotype.Component; import javax.ws.rs.*; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import static eu.europeana.cloud.common.web.ParamConstants.*; /** * Resource to get and create data set. */ @Path("/data-providers/{" + P_PROVIDER + "}/data-sets") @Component @Scope("request") public class DataSetsResource { @Autowired private DataSetService dataSetService; @Value("${numberOfElementsOnPage}") private int numberOfElementsOnPage; @Autowired private MutableAclService mutableAclService; private final String DATASET_CLASS_NAME = DataSet.class.getName(); /** * Returns all data sets for a provider. Result is returned in slices. * @summary get provider's data sets * * @param providerId provider id for which returned data sets will belong to (required) * @param startFrom reference to next slice of result. If not provided, * first slice of result will be returned. * @return slice of data sets for a given provider. */ @GET @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) @ReturnType("eu.europeana.cloud.common.response.ResultSlice<eu.europeana.cloud.common.model.DataSet>") public ResultSlice<DataSet> getDataSets(@PathParam(P_PROVIDER) String providerId, @QueryParam(F_START_FROM) String startFrom) { return dataSetService.getDataSets(providerId, startFrom, numberOfElementsOnPage); } /** * Creates a new data set. * * <strong>User permissions required.</strong> * * @param providerId the provider for the created data set * @param dataSetId identifier of the data set (required). * @param description description of the data set. * @return URI to the newly created data set in content-location. * @throws ProviderNotExistsException data provider does not exist. * @throws * eu.europeana.cloud.service.mcs.exception.DataSetAlreadyExistsException * data set with this id already exists * @statuscode 201 object has been created. */ @POST @PreAuthorize("isAuthenticated()") public Response createDataSet(@Context UriInfo uriInfo, @PathParam(P_PROVIDER) String providerId, @FormParam(F_DATASET) String dataSetId, @FormParam(F_DESCRIPTION) String description) throws ProviderNotExistsException, DataSetAlreadyExistsException { ParamUtil.require(F_DATASET, dataSetId); DataSet dataSet = dataSetService.createDataSet(providerId, dataSetId, description); EnrichUriUtil.enrich(uriInfo, dataSet); final Response response = Response.created(dataSet.getUri()).build(); String creatorName = SpringUserUtils.getUsername(); if (creatorName != null) { ObjectIdentity dataSetIdentity = new ObjectIdentityImpl(DATASET_CLASS_NAME, dataSetId + "/" + providerId); MutableAcl datasetAcl = mutableAclService.createAcl(dataSetIdentity); datasetAcl.insertAce(0, BasePermission.READ, new PrincipalSid(creatorName), true); datasetAcl.insertAce(1, BasePermission.WRITE, new PrincipalSid(creatorName), true); datasetAcl.insertAce(2, BasePermission.DELETE, new PrincipalSid(creatorName), true); datasetAcl.insertAce(3, BasePermission.ADMINISTRATION, new PrincipalSid(creatorName), true); mutableAclService.updateAcl(datasetAcl); } return response; } }