Added delete methods for stock and fishery products (both also purge the products ..). When a user is assigned to a group he has the role member if in the initial organization he was an editor, admin otherwise
git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/data-catalogue/grsf-publisher-ws@133218 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
parent
8f8c0bbdd2
commit
f128ca18ab
|
@ -0,0 +1,44 @@
|
||||||
|
package org.gcube.data_catalogue.grsf_publish_ws.json.input;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
import javax.validation.constraints.Size;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bean to be used for input of delete-product methods
|
||||||
|
* @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it)
|
||||||
|
*/
|
||||||
|
@JsonIgnoreProperties(ignoreUnknown = true) // ignore in serialization/deserialization
|
||||||
|
public class DeleteProductBean {
|
||||||
|
|
||||||
|
@JsonProperty("id")
|
||||||
|
@NotNull(message="id cannot be null")
|
||||||
|
@Size(min=1, message="id cannot be empty")
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
public DeleteProductBean() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param id
|
||||||
|
*/
|
||||||
|
public DeleteProductBean(String id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(String id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "DeleteProductBean [id=" + id + "]";
|
||||||
|
}
|
||||||
|
}
|
|
@ -20,6 +20,7 @@ public class FisheryRecord extends Common{
|
||||||
@JsonProperty("fishery_name")
|
@JsonProperty("fishery_name")
|
||||||
@NotNull(message="fishery_name cannot be null")
|
@NotNull(message="fishery_name cannot be null")
|
||||||
@Size(min=1, message="fishery_name cannot be empty")
|
@Size(min=1, message="fishery_name cannot be empty")
|
||||||
|
@CustomField(key="Fishery Name")
|
||||||
private String fisheryName;
|
private String fisheryName;
|
||||||
|
|
||||||
@JsonProperty("fishery_id")
|
@JsonProperty("fishery_id")
|
||||||
|
|
|
@ -21,6 +21,7 @@ public class StockRecord extends Common{
|
||||||
@JsonProperty("stock_name")
|
@JsonProperty("stock_name")
|
||||||
@NotNull(message="stock_name cannot be null")
|
@NotNull(message="stock_name cannot be null")
|
||||||
@Size(min=2, message="stock_name cannot be empty")
|
@Size(min=2, message="stock_name cannot be empty")
|
||||||
|
@CustomField(key="Stock Name")
|
||||||
private String stockName;
|
private String stockName;
|
||||||
|
|
||||||
@JsonProperty("stock_id")
|
@JsonProperty("stock_id")
|
||||||
|
|
|
@ -6,7 +6,9 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import javax.servlet.ServletContext;
|
import javax.servlet.ServletContext;
|
||||||
|
import javax.validation.Valid;
|
||||||
import javax.ws.rs.Consumes;
|
import javax.ws.rs.Consumes;
|
||||||
|
import javax.ws.rs.DELETE;
|
||||||
import javax.ws.rs.GET;
|
import javax.ws.rs.GET;
|
||||||
import javax.ws.rs.POST;
|
import javax.ws.rs.POST;
|
||||||
import javax.ws.rs.Path;
|
import javax.ws.rs.Path;
|
||||||
|
@ -20,6 +22,7 @@ import org.gcube.common.authorization.library.provider.AuthorizationProvider;
|
||||||
import org.gcube.common.authorization.library.provider.SecurityTokenProvider;
|
import org.gcube.common.authorization.library.provider.SecurityTokenProvider;
|
||||||
import org.gcube.common.authorization.library.utils.Caller;
|
import org.gcube.common.authorization.library.utils.Caller;
|
||||||
import org.gcube.common.scope.api.ScopeProvider;
|
import org.gcube.common.scope.api.ScopeProvider;
|
||||||
|
import org.gcube.data_catalogue.grsf_publish_ws.json.input.DeleteProductBean;
|
||||||
import org.gcube.data_catalogue.grsf_publish_ws.json.input.FisheryRecord;
|
import org.gcube.data_catalogue.grsf_publish_ws.json.input.FisheryRecord;
|
||||||
import org.gcube.data_catalogue.grsf_publish_ws.json.output.ResponseCreationBean;
|
import org.gcube.data_catalogue.grsf_publish_ws.json.output.ResponseCreationBean;
|
||||||
import org.gcube.data_catalogue.grsf_publish_ws.utils.AssociationToGroupThread;
|
import org.gcube.data_catalogue.grsf_publish_ws.utils.AssociationToGroupThread;
|
||||||
|
@ -30,6 +33,8 @@ import org.gcube.datacatalogue.ckanutillibrary.models.RolesCkanGroupOrOrg;
|
||||||
import org.gcube.datacatalogue.ckanutillibrary.utils.UtilMethods;
|
import org.gcube.datacatalogue.ckanutillibrary.utils.UtilMethods;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import eu.trentorise.opendata.jackan.model.CkanDataset;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fishery web service methods
|
* Fishery web service methods
|
||||||
* @author Costantino Perciante at ISTI-CNR
|
* @author Costantino Perciante at ISTI-CNR
|
||||||
|
@ -258,5 +263,72 @@ public class GrsfPublisherFisheryService {
|
||||||
return Response.status(status).entity(responseBean).build();
|
return Response.status(status).entity(responseBean).build();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@DELETE
|
||||||
|
@Path("delete-product")
|
||||||
|
@Consumes(MediaType.APPLICATION_JSON)
|
||||||
|
@Produces(MediaType.APPLICATION_JSON)
|
||||||
|
public Response deleteFishery(@Valid DeleteProductBean recordToDelete){
|
||||||
|
|
||||||
|
// retrieve context and username
|
||||||
|
Caller caller = AuthorizationProvider.instance.get();
|
||||||
|
String username = caller.getClient().getId();
|
||||||
|
String context = ScopeProvider.instance.get();
|
||||||
|
|
||||||
|
ResponseCreationBean responseBean = new ResponseCreationBean();
|
||||||
|
Status status = Status.INTERNAL_SERVER_ERROR;
|
||||||
|
|
||||||
|
// check it is a stock ...
|
||||||
|
logger.info("Received call to delete product with id " + recordToDelete.getId() + ", checking if it is a fishery");
|
||||||
|
try{
|
||||||
|
|
||||||
|
DataCatalogue catalogue = HelperMethods.getDataCatalogueRunningInstance(context);
|
||||||
|
if(catalogue == null){
|
||||||
|
|
||||||
|
status = Status.INTERNAL_SERVER_ERROR;
|
||||||
|
responseBean.setId(null);
|
||||||
|
throw new Exception("There was a problem while serving your request");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// retrieve the catalogue instance
|
||||||
|
CkanDataset fisheryInCkan = catalogue.getDataset(recordToDelete.getId(), catalogue.getApiKeyFromUsername(username));
|
||||||
|
|
||||||
|
if(fisheryInCkan == null){
|
||||||
|
|
||||||
|
status = Status.NOT_FOUND;
|
||||||
|
responseBean.setId(null);
|
||||||
|
throw new Exception("There was a problem while serving your request. This product was not found");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// get extras and check there is the field Assessment distribution area that is mandatory for stock
|
||||||
|
if(fisheryInCkan.getExtrasAsHashMap().containsKey("Fishery Name")){
|
||||||
|
|
||||||
|
logger.warn("Ok, this is a fishery, removing it");
|
||||||
|
boolean deleted = catalogue.deleteProduct(fisheryInCkan.getId(), catalogue.getApiKeyFromUsername(username), true);
|
||||||
|
if(deleted){
|
||||||
|
logger.info("Stock DELETED AND PURGED!");
|
||||||
|
status = Status.OK;
|
||||||
|
responseBean.setId(fisheryInCkan.getId());
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
status = Status.INTERNAL_SERVER_ERROR;
|
||||||
|
throw new Exception("Request failed, sorry");
|
||||||
|
}
|
||||||
|
|
||||||
|
}else{
|
||||||
|
status = Status.BAD_REQUEST;
|
||||||
|
throw new Exception("The id you are using doesn't belong to a Fishery product!");
|
||||||
|
}
|
||||||
|
|
||||||
|
}catch(Exception e){
|
||||||
|
logger.error("Failed to delete this ");
|
||||||
|
status = Status.INTERNAL_SERVER_ERROR;
|
||||||
|
responseBean.setError(e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
return Response.status(status).entity(responseBean).build();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,9 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import javax.servlet.ServletContext;
|
import javax.servlet.ServletContext;
|
||||||
|
import javax.validation.Valid;
|
||||||
import javax.ws.rs.Consumes;
|
import javax.ws.rs.Consumes;
|
||||||
|
import javax.ws.rs.DELETE;
|
||||||
import javax.ws.rs.GET;
|
import javax.ws.rs.GET;
|
||||||
import javax.ws.rs.POST;
|
import javax.ws.rs.POST;
|
||||||
import javax.ws.rs.Path;
|
import javax.ws.rs.Path;
|
||||||
|
@ -20,6 +22,7 @@ import org.gcube.common.authorization.library.provider.AuthorizationProvider;
|
||||||
import org.gcube.common.authorization.library.provider.SecurityTokenProvider;
|
import org.gcube.common.authorization.library.provider.SecurityTokenProvider;
|
||||||
import org.gcube.common.authorization.library.utils.Caller;
|
import org.gcube.common.authorization.library.utils.Caller;
|
||||||
import org.gcube.common.scope.api.ScopeProvider;
|
import org.gcube.common.scope.api.ScopeProvider;
|
||||||
|
import org.gcube.data_catalogue.grsf_publish_ws.json.input.DeleteProductBean;
|
||||||
import org.gcube.data_catalogue.grsf_publish_ws.json.input.StockRecord;
|
import org.gcube.data_catalogue.grsf_publish_ws.json.input.StockRecord;
|
||||||
import org.gcube.data_catalogue.grsf_publish_ws.json.output.ResponseCreationBean;
|
import org.gcube.data_catalogue.grsf_publish_ws.json.output.ResponseCreationBean;
|
||||||
import org.gcube.data_catalogue.grsf_publish_ws.utils.AssociationToGroupThread;
|
import org.gcube.data_catalogue.grsf_publish_ws.utils.AssociationToGroupThread;
|
||||||
|
@ -30,6 +33,8 @@ import org.gcube.datacatalogue.ckanutillibrary.models.RolesCkanGroupOrOrg;
|
||||||
import org.gcube.datacatalogue.ckanutillibrary.utils.UtilMethods;
|
import org.gcube.datacatalogue.ckanutillibrary.utils.UtilMethods;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import eu.trentorise.opendata.jackan.model.CkanDataset;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Stock web service methods
|
* Stock web service methods
|
||||||
* @author Costantino Perciante at ISTI-CNR
|
* @author Costantino Perciante at ISTI-CNR
|
||||||
|
@ -203,7 +208,7 @@ public class GrsfPublisherStockService {
|
||||||
if(HelperMethods.existsLicenseId(record.getLicense()))
|
if(HelperMethods.existsLicenseId(record.getLicense()))
|
||||||
license = record.getLicense();
|
license = record.getLicense();
|
||||||
else throw new Exception("Please check the license id!");
|
else throw new Exception("Please check the license id!");
|
||||||
|
|
||||||
long version = record.getVersion() == null ? 1 : record.getVersion();
|
long version = record.getVersion() == null ? 1 : record.getVersion();
|
||||||
|
|
||||||
// create the product
|
// create the product
|
||||||
|
@ -250,4 +255,71 @@ public class GrsfPublisherStockService {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@DELETE
|
||||||
|
@Path("delete-product")
|
||||||
|
@Consumes(MediaType.APPLICATION_JSON)
|
||||||
|
@Produces(MediaType.APPLICATION_JSON)
|
||||||
|
public Response deleteStock(@Valid DeleteProductBean recordToDelete){
|
||||||
|
|
||||||
|
// retrieve context and username
|
||||||
|
Caller caller = AuthorizationProvider.instance.get();
|
||||||
|
String username = caller.getClient().getId();
|
||||||
|
String context = ScopeProvider.instance.get();
|
||||||
|
|
||||||
|
ResponseCreationBean responseBean = new ResponseCreationBean();
|
||||||
|
Status status = Status.INTERNAL_SERVER_ERROR;
|
||||||
|
|
||||||
|
// check it is a stock ...
|
||||||
|
logger.info("Received call to delete product with id " + recordToDelete.getId() + ", checking if it is a stock");
|
||||||
|
try{
|
||||||
|
|
||||||
|
DataCatalogue catalogue = HelperMethods.getDataCatalogueRunningInstance(context);
|
||||||
|
if(catalogue == null){
|
||||||
|
|
||||||
|
status = Status.INTERNAL_SERVER_ERROR;
|
||||||
|
responseBean.setId(null);
|
||||||
|
throw new Exception("There was a problem while serving your request");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// retrieve the catalogue instance
|
||||||
|
CkanDataset stockInCkan = catalogue.getDataset(recordToDelete.getId(), catalogue.getApiKeyFromUsername(username));
|
||||||
|
|
||||||
|
if(stockInCkan == null){
|
||||||
|
|
||||||
|
status = Status.NOT_FOUND;
|
||||||
|
responseBean.setId(null);
|
||||||
|
throw new Exception("There was a problem while serving your request. This product was not found");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// get extras and check there is the field Assessment distribution area that is mandatory for stock
|
||||||
|
if(stockInCkan.getExtrasAsHashMap().containsKey("Stock Name")){
|
||||||
|
|
||||||
|
logger.warn("Ok, this is a stock, removing it");
|
||||||
|
boolean deleted = catalogue.deleteProduct(stockInCkan.getId(), catalogue.getApiKeyFromUsername(username), true);
|
||||||
|
if(deleted){
|
||||||
|
logger.info("Stock DELETED AND PURGED!");
|
||||||
|
status = Status.OK;
|
||||||
|
responseBean.setId(stockInCkan.getId());
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
status = Status.INTERNAL_SERVER_ERROR;
|
||||||
|
throw new Exception("Request failed, sorry");
|
||||||
|
}
|
||||||
|
|
||||||
|
}else{
|
||||||
|
status = Status.BAD_REQUEST;
|
||||||
|
throw new Exception("The id you are using doesn't belong to a Stock product!");
|
||||||
|
}
|
||||||
|
|
||||||
|
}catch(Exception e){
|
||||||
|
logger.error("Failed to delete this ", e);
|
||||||
|
status = Status.INTERNAL_SERVER_ERROR;
|
||||||
|
responseBean.setError(e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
return Response.status(status).entity(responseBean).build();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,6 +47,9 @@ public class AssociationToGroupThread extends Thread {
|
||||||
// retrieve the role to be assigned according the one the user has into the organization of the dataset
|
// retrieve the role to be assigned according the one the user has into the organization of the dataset
|
||||||
RolesCkanGroupOrOrg role = RolesCkanGroupOrOrg.valueOf(catalogue.getRoleOfUserInOrganization(username, organizationId, catalogue.getApiKeyFromUsername(username)).toUpperCase());
|
RolesCkanGroupOrOrg role = RolesCkanGroupOrOrg.valueOf(catalogue.getRoleOfUserInOrganization(username, organizationId, catalogue.getApiKeyFromUsername(username)).toUpperCase());
|
||||||
|
|
||||||
|
if(!role.equals(RolesCkanGroupOrOrg.ADMIN))
|
||||||
|
role = RolesCkanGroupOrOrg.MEMBER; // decrease the role to member if it is not an admin
|
||||||
|
|
||||||
for (String groupTitle : groupsTitles) {
|
for (String groupTitle : groupsTitles) {
|
||||||
|
|
||||||
logger.debug("Setting role " + role + " into group " + groupTitle + " to user " + username);
|
logger.debug("Setting role " + role + " into group " + groupTitle + " to user " + username);
|
||||||
|
|
Loading…
Reference in New Issue